diff --git a/.gitignore b/.gitignore index d5af4f7f61348537a2d01f9ee356f9cfb1e19c34..1b9e692a37af46fdb04e318d79eb08ac8e6e6eb5 100644 --- a/.gitignore +++ b/.gitignore @@ -177,6 +177,8 @@ cython_debug/ # Sqlite *.db +#temp files to test telemetry +src/telemetry/backend/tempFiles/ # TeraFlowSDN-generated files tfs_runtime_env_vars.sh tfs_runtime_env_vars*.sh diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index aa5009dc82f49783a871223ac52ac337fe52e33c..53763f5e156a173f8f5cc3f76de58dd0fb7a89d6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. + # stages of the cicd pipeline stages: #- dependencies @@ -19,6 +20,12 @@ stages: - unit_test - end2end_test +workflow: + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' + when: always + - when: never + # include the individual .gitlab-ci.yml of each micro-service and tests include: #- local: '/manifests/.gitlab-ci.yml' diff --git a/deploy/tfs.sh b/deploy/tfs.sh index cd27f903c4c0c938ae374e18f77cdae14e665641..e11717394b8b90f5b617fce547211f985ac0bf08 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -133,7 +133,7 @@ kubectl create secret generic crdb-data --namespace ${TFS_K8S_NAMESPACE} --type= printf "\n" echo ">>> Create Secret with Apache Kafka..." -KFK_SERVER_PORT=$(kubectl --namespace ${KFK_NAMESPACE} get service kafka-public -o 'jsonpath={.spec.ports[0].port}') +KFK_SERVER_PORT=$(kubectl --namespace ${KFK_NAMESPACE} get service kafka-service -o 'jsonpath={.spec.ports[0].port}') kubectl create secret generic kfk-kpi-data --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ --from-literal=KFK_NAMESPACE=${KFK_NAMESPACE} \ --from-literal=KFK_SERVER_PORT=${KFK_SERVER_PORT} diff --git a/hackfest/mock_osm/__main__.py b/hackfest/mock_osm/__main__.py index 8d4d101118aeb81bcb0d3882affce354b644102d..28227f47b9cf3eaa7980e445d2d09cac0d26d302 100644 --- a/hackfest/mock_osm/__main__.py +++ b/hackfest/mock_osm/__main__.py @@ -15,6 +15,7 @@ import cmd, logging from .MockOSM import MockOSM +logging.basicConfig(level=logging.DEBUG) LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/manifests/kafka/single-node.yaml b/manifests/kafka/single-node.yaml index 85ab01f219aa5eac17be08254e43e676a73df59e..6eb9bd03c1c9f3224853a7e4155c6b9101d5154b 100644 --- a/manifests/kafka/single-node.yaml +++ b/manifests/kafka/single-node.yaml @@ -15,7 +15,7 @@ apiVersion: v1 kind: Service metadata: - name: kafka-public + name: kafka-service labels: app.kubernetes.io/component: message-broker app.kubernetes.io/instance: kafka @@ -50,7 +50,7 @@ spec: app.kubernetes.io/component: message-broker app.kubernetes.io/instance: kafka app.kubernetes.io/name: kafka - serviceName: "kafka-public" + serviceName: "kafka-service" replicas: 1 minReadySeconds: 5 template: @@ -83,7 +83,7 @@ spec: - name: KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP value: "PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT" - name: KAFKA_CFG_ADVERTISED_LISTENERS - value: "PLAINTEXT://kafka-public.kafka.svc.cluster.local:9092,EXTERNAL://localhost:9094" + value: "PLAINTEXT://kafka-service.kafka.svc.cluster.local:9092,EXTERNAL://localhost:9094" - name: KAFKA_CFG_CONTROLLER_LISTENER_NAMES value: "CONTROLLER" - name: KAFKA_CFG_CONTROLLER_QUORUM_VOTERS diff --git a/manifests/metallb.yaml b/manifests/metallb.yaml index 162768aca24df3a0f1b37362c65687e7f2da565b..60b82297e43934fca7f599eee64df61d035be7dc 100644 --- a/manifests/metallb.yaml +++ b/manifests/metallb.yaml @@ -17,7 +17,7 @@ apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: - name: my-ip-pool + name: metallb-address-pool namespace: metallb-system spec: addresses: diff --git a/manifests/telemetryservice.yaml b/manifests/telemetryservice.yaml index 2add96516b0747ea8f3c9f6200e2bc676de6a3db..935267250169a3dd13d37afb8a0f17aab50b5c76 100644 --- a/manifests/telemetryservice.yaml +++ b/manifests/telemetryservice.yaml @@ -95,7 +95,7 @@ metadata: app: telemetryservice spec: type: LoadBalancer - loadBalancerIP: 192.168.5.250 + loadBalancerIP: _LOAD_BALANCER_IP_ externalTrafficPolicy: Local selector: app: telemetryservice diff --git a/my_deploy.sh b/my_deploy.sh index ac9167832a13a942d3c816808ffdfb3263123ab2..24e1f6902adca8233f22521f69cc66029e59b486 100644 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -20,7 +20,7 @@ export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/" # Set the list of components, separated by spaces, you want to build images for, and deploy. -export TFS_COMPONENTS="context device pathcomp opticalcontroller service nbi webui" +export TFS_COMPONENTS="context device pathcomp service nbi webui" # Uncomment to activate Monitoring (old) #export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring" @@ -143,7 +143,7 @@ export CRDB_PASSWORD="tfs123" export CRDB_DEPLOY_MODE="single" # Disable flag for dropping database, if it exists. -export CRDB_DROP_DATABASE_IF_EXISTS="YES" +export CRDB_DROP_DATABASE_IF_EXISTS="" # Disable flag for re-deploying CockroachDB from scratch. export CRDB_REDEPLOY="" diff --git a/proto/analytics_frontend.proto b/proto/analytics_frontend.proto index 5a3980ff52a961b4218a6b039920441ba7b9eeb7..b1bdfac0ab8fa392b8e22a7e7276a815b1272bf3 100644 --- a/proto/analytics_frontend.proto +++ b/proto/analytics_frontend.proto @@ -39,7 +39,7 @@ enum AnalyzerOperationMode { message Analyzer { AnalyzerId analyzer_id = 1; string algorithm_name = 2; // The algorithm to be executed - float duration_s = 3; // Termiate the data analytics thread after duration (seconds); 0 = infinity time + float duration_s = 3; // Terminate the data analytics thread after duration (seconds); 0 = infinity time repeated kpi_manager.KpiId input_kpi_ids = 4; // The KPI Ids to be processed by the analyzer repeated kpi_manager.KpiId output_kpi_ids = 5; // The KPI Ids produced by the analyzer AnalyzerOperationMode operation_mode = 6; // Operation mode of the analyzer diff --git a/proto/automation.proto b/proto/automation.proto index 3525d41b90d3f5eeb6aa64e050a8d71cd5d97812..4c628b76fc131868f17ba50c8c49330183852dba 100644 --- a/proto/automation.proto +++ b/proto/automation.proto @@ -37,15 +37,11 @@ enum ZSMServiceStateEnum { ZSM_REMOVED = 5; // ZSM loop is removed } -enum ZSMTypeEnum { - ZSMTYPE_UNKNOWN = 0; -} - message ZSMCreateRequest { - context.ServiceId target_service_id = 1; - context.ServiceId telemetry_service_id = 2; + context.ServiceId target_service_id = 1; + context.ServiceId telemetry_service_id = 2; analytics_frontend.Analyzer analyzer = 3; - policy.PolicyRuleService policy = 4; + policy.PolicyRuleService policy = 4; } // A unique identifier per ZSM service @@ -62,9 +58,6 @@ message ZSMServiceState { // Basic ZSM service attributes message ZSMService { ZSMServiceID zsmServiceId = 1; - context.ServiceId serviceId = 2; policy.PolicyRuleList policyList = 3; - - // TODO: When new Analytics and updated Monitoring are in place, add the necessary binding to them } diff --git a/proto/context.proto b/proto/context.proto index 320e553c59a9da18f4869041d16f637873bb937e..3eebb54d48726e9d77c82f31c850105b9eecb591 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 { @@ -358,6 +359,7 @@ enum ServiceTypeEnum { SERVICETYPE_IP_LINK = 11; SERVICETYPE_TAPI_LSP = 12; SERVICETYPE_IPOWDM = 13; + SERVICETYPE_UPF = 14; } enum ServiceStatusEnum { diff --git a/proto/ip_link.proto b/proto/ip_link.proto index a4f00b0de4c2be5f1d3873bc9f1589c576b93f9c..9b4294162a35c7403323f029113f1b4c4d8680bc 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/kpi_sample_types.proto b/proto/kpi_sample_types.proto index 19cd59f15f49da8d38a77086149de33a4d886a18..a8e25e809c80ce06b2939c8030b96c154a222de3 100644 --- a/proto/kpi_sample_types.proto +++ b/proto/kpi_sample_types.proto @@ -32,6 +32,7 @@ enum KpiSampleType { KPISAMPLETYPE_OPTICAL_SECURITY_STATUS = 501; //. can be used by both optical and L3 without any issue KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT = 502; + KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER = 503; KPISAMPLETYPE_L3_UNIQUE_ATTACK_CONNS = 601; KPISAMPLETYPE_L3_TOTAL_DROPPED_PACKTS = 602; diff --git a/proto/policy.proto b/proto/policy.proto index 51ea63b7f3754ef7e3fa48a6a50ebd21c8d496cf..9389f6f1064cda67b5c7356d03cf25a6bc710bef 100644 --- a/proto/policy.proto +++ b/proto/policy.proto @@ -16,9 +16,7 @@ syntax = "proto3"; package policy; import "context.proto"; -import "policy_condition.proto"; import "policy_action.proto"; -import "monitoring.proto"; // to be migrated to: "kpi_manager.proto" service PolicyService { rpc PolicyAddService (PolicyRuleService) returns (PolicyRuleState) {} @@ -36,8 +34,8 @@ enum PolicyRuleStateEnum { POLICY_FAILED = 1; // Rule failed POLICY_INSERTED = 2; // Rule is just inserted POLICY_VALIDATED = 3; // Rule content is correct - POLICY_PROVISIONED = 4; // Rule subscribed to Monitoring - POLICY_ACTIVE = 5; // Rule is currently active (alarm is just thrown by Monitoring) + POLICY_PROVISIONED = 4; // Rule subscribed to Analyzer + POLICY_ACTIVE = 5; // Rule is currently active (alarm is just thrown by Analyzer) POLICY_ENFORCED = 6; // Rule action is successfully enforced POLICY_INEFFECTIVE = 7; // The applied rule action did not work as expected POLICY_EFFECTIVE = 8; // The applied rule action did work as expected @@ -45,24 +43,26 @@ enum PolicyRuleStateEnum { POLICY_REMOVED = 10; // Operator requires to remove a policy } +message PolicyRuleState { + PolicyRuleStateEnum policyRuleState = 1; + string policyRuleStateMessage = 2; +} + message PolicyRuleId { context.Uuid uuid = 1; } -message PolicyRuleState { - PolicyRuleStateEnum policyRuleState = 1; - string policyRuleStateMessage = 2; +message PolicyRuleKpiId { + context.Uuid policyRuleKpiUuid = 1; // Same as defined in kpi_manager.proto } // Basic policy rule attributes message PolicyRuleBasic { - PolicyRuleId policyRuleId = 1; - PolicyRuleState policyRuleState = 2; //policy.proto:58:12: Explicit 'optional' labels are disallowed in the Proto3 syntax. To define 'optional' fields in Proto3, simply remove the 'optional' label, as fields are 'optional' by default. - uint32 priority = 3; - monitoring.KpiId kpiId = 4; // to be migrated to: "kpi_manager.KpiId" - - // Event-Condition-Action (ECA) model - repeated PolicyRuleAction actionList = 5; // One or more actions should be applied + PolicyRuleId policyRuleId = 1; // Unique rule ID + PolicyRuleState policyRuleState = 2; // Rule lifecycle information + uint32 policyRulePriority = 3; // The priority of this rule + repeated PolicyRuleAction actionList = 4; // One or more actions should be applied + repeated PolicyRuleKpiId policyRuleKpiList = 5; // List of KPIs associated with this policy } // Service-oriented policy rule diff --git a/proto/policy_action.proto b/proto/policy_action.proto index 0724c33dd1e6a5f1b440c051b03febb24571207f..15db58c3fe63bc1ec956f62b9714f3597b04ee3a 100644 --- a/proto/policy_action.proto +++ b/proto/policy_action.proto @@ -35,8 +35,3 @@ message PolicyRuleActionConfig { string action_key = 1; string action_value = 2; } - -// message PolicyRuleAction { -// PolicyRuleActionEnum action = 1; -// repeated string parameters = 2; -// } diff --git a/proto/policy_condition.proto b/proto/policy_condition.proto deleted file mode 100644 index a5904eeb06cf41ff652ade6dcea32359983c4d1b..0000000000000000000000000000000000000000 --- a/proto/policy_condition.proto +++ /dev/null @@ -1,43 +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. - -syntax = "proto3"; -package policy; - -import "monitoring.proto"; // to be migrated to: "kpi_manager.proto" - -// Condition -message PolicyRuleCondition { - monitoring.KpiId kpiId = 1; // to be migrated to: "kpi_manager.KpiId" - NumericalOperator numericalOperator = 2; - monitoring.KpiValue kpiValue = 3; -} - -// Operator to be used when comparing Kpis with condition values -enum NumericalOperator { - POLICYRULE_CONDITION_NUMERICAL_UNDEFINED = 0; // Kpi numerical operator undefined - POLICYRULE_CONDITION_NUMERICAL_EQUAL = 1; // Kpi is equal with value - POLICYRULE_CONDITION_NUMERICAL_NOT_EQUAL = 2; // Kpi is not equal with value - POLICYRULE_CONDITION_NUMERICAL_LESS_THAN = 3; // Kpi is less than value - POLICYRULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL = 4; // Kpi is less than or equal with value - POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN = 5; // Kpi is greater than value - POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL = 6; // Kpi is less than or equal with value -} - -// Operator to be used when evaluating each condition -enum BooleanOperator { - POLICYRULE_CONDITION_BOOLEAN_UNDEFINED = 0; // Boolean operator undefined - POLICYRULE_CONDITION_BOOLEAN_AND = 1; // Boolean AND operator - POLICYRULE_CONDITION_BOOLEAN_OR = 2; // Boolean OR operator -} \ No newline at end of file diff --git a/proto/tapi_lsp.proto b/proto/tapi_lsp.proto index 8db84cf7cab2ada5362df99b08f283b45845307a..da9f1a739b88ccce30bf2853784b83413506590d 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/scripts/run_tests_locally-analytics-backend.sh b/scripts/run_tests_locally-analytics-backend.sh index 44e26bacbe8478582f89b2744cc7b813889d340c..fae768939d1f476815bda56acdf8a765f604be1d 100755 --- a/scripts/run_tests_locally-analytics-backend.sh +++ b/scripts/run_tests_locally-analytics-backend.sh @@ -19,7 +19,7 @@ PROJECTDIR=`pwd` cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc -export KFK_SERVER_ADDRESS='127.0.0.1:9094' +export KFK_SERVER_ADDRESS='127.0.0.1:9092' CRDB_SQL_ADDRESS=$(kubectl get service cockroachdb-public --namespace crdb -o jsonpath='{.spec.clusterIP}') export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_analytics?sslmode=require" @@ -28,4 +28,4 @@ export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_analytic # analytics/backend/tests/test_backend.py python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \ - analytics/backend/tests/test_backend.py::test_start_analytics_backend_for_mgon_agent \ No newline at end of file + analytics/backend/tests/test_backend.py::test_start_analytics_backend_for_mgon_agent diff --git a/scripts/run_tests_locally-analytics-frontend.sh b/scripts/run_tests_locally-analytics-frontend.sh index 4d999f6256f65b873401ea24abcd331413819fb0..4a90ec0600ced8ddc336e8f9435f8023910a9d34 100755 --- a/scripts/run_tests_locally-analytics-frontend.sh +++ b/scripts/run_tests_locally-analytics-frontend.sh @@ -19,7 +19,7 @@ PROJECTDIR=`pwd` cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc -export KFK_SERVER_ADDRESS='127.0.0.1:9094' +export KFK_SERVER_ADDRESS='127.0.0.1:9092' CRDB_SQL_ADDRESS=$(kubectl get service cockroachdb-public --namespace crdb -o jsonpath='{.spec.clusterIP}') export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_analytics?sslmode=require" 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 0000000000000000000000000000000000000000..974d584b195a8337ee239caab935120e697c2a31 --- /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/scripts/run_tests_locally-telemetry-gnmi.sh b/scripts/run_tests_locally-telemetry-gnmi.sh index 965141e56a5868e95ea39cf528358e1d5fa576ec..6825e42a51bfe414d37e4031d9f17438d92ffe89 100755 --- a/scripts/run_tests_locally-telemetry-gnmi.sh +++ b/scripts/run_tests_locally-telemetry-gnmi.sh @@ -17,7 +17,7 @@ PROJECTDIR=`pwd` cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc -export KFK_SERVER_ADDRESS='127.0.0.1:9094' +export KFK_SERVER_ADDRESS='127.0.0.1:9092' # This is unit test (should be tested with container-lab running) python3 -m pytest --log-level=info --log-cli-level=info --verbose \ diff --git a/scripts/show_logs_policy.sh b/scripts/show_logs_policy.sh new file mode 100755 index 0000000000000000000000000000000000000000..ee4fae277690b7aadd6eb42bda5791a28b86987c --- /dev/null +++ b/scripts/show_logs_policy.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. + +######################################################################################################################## +# Define your deployment settings here +######################################################################################################################## + +# If not already set, set the name of the Kubernetes namespace to deploy to. +export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"} + +######################################################################################################################## +# Automated steps start here +######################################################################################################################## + +kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/policyservice diff --git a/scripts/update_license_headers.py b/scripts/update_license_headers.py index ae4dad716842dec309786d9bed81483a4e6cdcc2..c7c821aa4578b37a32ea62aa4163132fc3ca6a1f 100644 --- a/scripts/update_license_headers.py +++ b/scripts/update_license_headers.py @@ -94,7 +94,9 @@ def skip_file(file_path : str) -> bool: if file_path.endswith('references_probes_libraries.txt'): return True return False if '/nbi/service/ietf_network/bindings/' in file_path: return True - if '/nbi/service/ietf_network_slice/bindings/' in file_path: return True + if '/nbi/service/ietf_network_slice/bindings/' in file_path: + if file_path.endswith('.py'): return False + return True if '/nbi/service/ietf_l3vpn/yang/' in file_path: return True if '/nbi/service/ietf_network/yang/' in file_path: return True if '/tests/tools/mock_qkd_nodes/yang/' in file_path: return True @@ -120,6 +122,30 @@ def process_file( file_path : str, file_no_header : TextIOWrapper, file_skipped : TextIOWrapper, file_updated : TextIOWrapper ) -> None: if skip_file(file_path): + # silent skips + if file_path.startswith('./.git'): return + if file_path.startswith('./libyang'): return + if file_path.startswith('./tmp'): return + if file_path.startswith('./hackfest/kafka/kafka_2.13-2.8.0/'): return + if file_path.startswith('./hackfest/tapi/server/tapi_server/'): return + if '/__pycache__/' in file_path: return + if '/nbi/service/ietf_network/bindings/' in file_path: return + if '/target/classes/' in file_path: return + if '/target/generated-classes/' in file_path: return + if '/target/generated-sources/' in file_path: return + if '/target/test-classes/' in file_path: return + if '/git/openconfig/public/' in file_path: return + if file_path.endswith('.class'): return + if file_path.endswith('.csv'): return + if file_path.endswith('.jar'): return + if file_path.endswith('.json'): return + if file_path.endswith('.pyc'): return + if file_path.endswith('.png'): return + if file_path.endswith('.zip'): return + if file_path.endswith('_pb2.py'): return + if file_path.endswith('_grpc.py'): return + + # verbose skip file_skipped.write(file_path + '\n') return diff --git a/src/analytics/backend/service/AnalyticsBackendService.py b/src/analytics/backend/service/AnalyticsBackendService.py index e0c0b0d2bca878f08e261d1b729902e16e7e12d5..6d4f64bef13ccf8ac24b6c0d7fb5a58516a3d8b9 100755 --- a/src/analytics/backend/service/AnalyticsBackendService.py +++ b/src/analytics/backend/service/AnalyticsBackendService.py @@ -26,7 +26,6 @@ from common.Settings import get_service_port_grpc from analytics.backend.service.Streamer import DaskStreamer from analytics.backend.service.AnalyzerHelper import AnalyzerHelper - LOGGER = logging.getLogger(__name__) class AnalyticsBackendService(GenericGrpcService): @@ -69,29 +68,29 @@ class AnalyticsBackendService(GenericGrpcService): if message is None: continue elif message.error(): - if message.error().code() == KafkaError._PARTITION_EOF: - LOGGER.warning(f"Consumer reached end of topic {message.topic()}/{message.partition()}") - break - elif message.error().code() == KafkaError.UNKNOWN_TOPIC_OR_PART: - LOGGER.error(f"Subscribed topic {message.topic()} does not exist. May be topic does not have any messages.") - continue - elif message.error(): - raise KafkaException(message.error()) + if message.error().code() == KafkaError._PARTITION_EOF: + LOGGER.warning(f"Consumer reached end of topic {message.topic()}/{message.partition()}") + break + elif message.error().code() == KafkaError.UNKNOWN_TOPIC_OR_PART: + LOGGER.error(f"Subscribed topic {message.topic()} does not exist. May be topic does not have any messages.") + continue + elif message.error(): + raise KafkaException(message.error()) try: - analyzer = json.loads(message.value().decode('utf-8')) + analyzer = json.loads(message.value().decode('utf-8')) analyzer_uuid = message.key().decode('utf-8') - LOGGER.info('Recevied Analyzer: {:} - {:}'.format(analyzer_uuid, analyzer)) + LOGGER.info('Received Analyzer: {:} - {:}'.format(analyzer_uuid, analyzer)) if analyzer["algo_name"] is None and analyzer["oper_mode"] is None: if self.StopStreamer(analyzer_uuid): - LOGGER.info("Dask Streamer stopped.") + LOGGER.info("Dask Streamer stopped") else: LOGGER.warning("Failed to stop Dask Streamer. May be already terminated...") else: if self.StartStreamer(analyzer_uuid, analyzer): - LOGGER.info("Dask Streamer started.") + LOGGER.info("Dask Streamer started") else: - LOGGER.warning("Failed to start Dask Streamer.") + LOGGER.warning("Failed to start Dask Streamer") except Exception as e: LOGGER.warning("Unable to consume message from topic: {:}. ERROR: {:}".format(KafkaTopic.ANALYTICS_REQUEST.value, e)) @@ -103,6 +102,7 @@ class AnalyticsBackendService(GenericGrpcService): if analyzer_uuid in self.active_streamers: LOGGER.warning("Dask Streamer already running with the given analyzer_uuid: {:}".format(analyzer_uuid)) return False + LOGGER.info(f"Start Streamer for Analyzer:\n{analyzer}") try: streamer = DaskStreamer( key = analyzer_uuid, @@ -116,7 +116,7 @@ class AnalyticsBackendService(GenericGrpcService): producer_instance = self.central_producer, ) streamer.start() - LOGGER.info(f"Streamer started with analyzer Id: {analyzer_uuid}") + LOGGER.info(f"Streamer started with analyzer ID: {analyzer_uuid}") # Stop the streamer after the given duration duration = analyzer['duration'] @@ -125,11 +125,10 @@ class AnalyticsBackendService(GenericGrpcService): time.sleep(duration) LOGGER.warning(f"Execution duration ({duration}) completed of Analyzer: {analyzer_uuid}") if not self.StopStreamer(analyzer_uuid): - LOGGER.warning("Failed to stop Dask Streamer. Streamer may be already terminated.") + LOGGER.warning("Failed to stop Dask Streamer. Streamer may already be terminated") duration_thread = threading.Thread( - target=stop_after_duration, daemon=True, name=f"stop_after_duration_{analyzer_uuid}" - ) + target=stop_after_duration, daemon=True, name=f"stop_after_duration_{analyzer_uuid}") duration_thread.start() self.active_streamers[analyzer_uuid] = streamer @@ -151,10 +150,10 @@ class AnalyticsBackendService(GenericGrpcService): streamer.stop() streamer.join() del self.active_streamers[analyzer_uuid] - LOGGER.info(f"Streamer with analyzer_uuid '{analyzer_uuid}' has been trerminated sucessfully.") + LOGGER.info(f"Streamer with analyzer_uuid '{analyzer_uuid}' has been successfully terminated") return True except: - LOGGER.exception("Failed to stop Dask Streamer.") + LOGGER.exception("Failed to stop Dask Streamer") return False def close(self): @@ -164,13 +163,13 @@ class AnalyticsBackendService(GenericGrpcService): if self.central_producer: try: self.central_producer.flush() - LOGGER.info("Kafka producer flushed and closed.") + LOGGER.info("Kafka producer flushed and closed") except: LOGGER.exception("Error closing Kafka producer") if self.cluster: try: self.cluster.close() - LOGGER.info("Dask cluster closed.") + LOGGER.info("Dask cluster closed") except: LOGGER.exception("Error closing Dask cluster") diff --git a/src/analytics/backend/service/AnalyzerHandlers.py b/src/analytics/backend/service/AnalyzerHandlers.py index 894f3742351990e08fe9569b6aaa545821164c13..03e5260a07e5725a3245a44fd0c7fe58360812fc 100644 --- a/src/analytics/backend/service/AnalyzerHandlers.py +++ b/src/analytics/backend/service/AnalyzerHandlers.py @@ -13,16 +13,15 @@ # limitations under the License. import logging -from enum import Enum import pandas as pd +from enum import Enum from collections import defaultdict logger = logging.getLogger(__name__) - class Handlers(Enum): AGGREGATION_HANDLER = "AggregationHandler" - AGGREGATION_HANDLER_THREE_TO_ONE = "AggregationHandlerThreeToOne" + AGGREGATION_HANDLER_MANY_TO_ONE = "AggregationHandlerManyToOne" UNSUPPORTED_HANDLER = "UnsupportedHandler" @classmethod @@ -30,23 +29,30 @@ class Handlers(Enum): return handler_name in cls._value2member_map_ def select_handler(handler_name): - if handler_name == "AggregationHandler": - return aggregation_handler - elif handler_name == "AggregationHandlerThreeToOne": - return aggregation_handler_three_to_one - else: - return "UnsupportedHandler" + try: + logger.info(f"Aggregation handler: {handler_name}") + handler_enum = Handlers(handler_name) # auto-validates + return HANDLER_FUNCTIONS[handler_enum] + except (ValueError, KeyError): + logger.error("Unsupported handler") + raise ValueError(f"Unsupported handler: {handler_name}") + +def transform_data(record : pd.DataFrame, value_key : str) -> pd.DataFrame: + new_value_key = 'value' + return record.rename(columns={value_key: new_value_key}) + +def find(data, type, value): + return next((item for item in data if item[type] == value), None) -# This method is top-level and should not be part of the class due to serialization issues. def threshold_handler(key, aggregated_df, thresholds): """ - Apply thresholds (TH-Fall and TH-Raise) based on the thresholds dictionary + Apply thresholds (value_threshold_low and value_threshold_high) based on the thresholds dictionary on the aggregated DataFrame. Args: key (str): Key for the aggregated DataFrame. aggregated_df (pd.DataFrame): DataFrame with aggregated metrics. - thresholds (dict): Thresholds dictionary with keys in the format '' and values as (fail_th, raise_th). + thresholds (dict): Thresholds dictionary with keys in the format '' and values as (value_threshold_low, value_threshold_high). Returns: pd.DataFrame: DataFrame with additional threshold columns. @@ -56,105 +62,123 @@ def threshold_handler(key, aggregated_df, thresholds): if metric_name not in aggregated_df.columns: logger.warning(f"Metric '{metric_name}' does not exist in the DataFrame for key: {key}. Skipping threshold application.") continue - + + logger.info(f"[Threshold] Metric: {metric_name}") + logger.info(f"[Threshold] Value range: {threshold_values}") + # Ensure the threshold values are valid (check for tuple specifically) if isinstance(threshold_values, list) and len(threshold_values) == 2: - fail_th, raise_th = threshold_values + fall_th, raise_th = threshold_values # Add threshold columns with updated naming - aggregated_df[f"{metric_name}_TH_RAISE"] = aggregated_df[metric_name] > raise_th - aggregated_df[f"{metric_name}_TH_FALL"] = aggregated_df[metric_name] < fail_th + aggregated_df[f"value_threshold_low"] = aggregated_df[metric_name] < fall_th + aggregated_df[f"value_threshold_high"] = aggregated_df[metric_name] > raise_th else: logger.warning(f"Threshold values for '{metric_name}' ({threshold_values}) are not a list of length 2. Skipping threshold application.") + logger.info(f"[AggregatedDF]: {aggregated_df}") return aggregated_df -def aggregation_handler( - batch_type_name, key, batch, input_kpi_list, output_kpi_list, thresholds - ): +def aggregation_handler(key, batch, input_kpi_list, output_kpi_list, thresholds): """ Process a batch of data and calculate aggregated values for each input KPI - and maps them to the output KPIs. """ + and maps them to the output KPIs. + """ - logger.info(f"({batch_type_name}) Processing batch for key: {key}") + logger.info("AggregationHandler starts") if not batch: - logger.info("Empty batch received. Skipping processing.") + logger.warning("Empty batch received. Skipping processing") + return [] + + logger.info(f"Processing {len(batch)} records for key: {key}") + + # Convert data into a DataFrame + df = pd.DataFrame(batch) + + # Filter the DataFrame to retain rows where kpi_id is in the input list (subscribed endpoints only) + df = df[df['kpi_id'].isin(input_kpi_list)].copy() + + if df.empty: + logger.warning(f"No data available for KPIs: {input_kpi_list}. Skipping processing") return [] - else: - logger.info(f" >>>>> Processing {len(batch)} records for key: {key}") - - # Convert data into a DataFrame - df = pd.DataFrame(batch) - - # Filter the DataFrame to retain rows where kpi_id is in the input list (subscribed endpoints only) - df = df[df['kpi_id'].isin(input_kpi_list)].copy() - - if df.empty: - logger.warning(f"No data available for KPIs: {input_kpi_list}. Skipping processing.") - return [] - - # Define all possible aggregation methods - aggregation_methods = { - "min" : ('kpi_value', 'min'), - "max" : ('kpi_value', 'max'), - "avg" : ('kpi_value', 'mean'), - "first" : ('kpi_value', lambda x: x.iloc[0]), - "last" : ('kpi_value', lambda x: x.iloc[-1]), - "variance": ('kpi_value', 'var'), - "count" : ('kpi_value', 'count'), - "range" : ('kpi_value', lambda x: x.max() - x.min()), - "sum" : ('kpi_value', 'sum'), - } - - results = [] - - # Process each KPI-specific task parameter - for kpi_index, kpi_id in enumerate(input_kpi_list): - - # logger.info(f"1.Processing KPI: {kpi_id}") - kpi_task_parameters = thresholds["task_parameter"][kpi_index] - - # Get valid task parameters for this KPI - valid_task_parameters = [ - method for method in kpi_task_parameters.keys() - if method in aggregation_methods - ] - # Select the aggregation methods based on valid task parameters - selected_methods = {method: aggregation_methods[method] for method in valid_task_parameters} + # Define all possible aggregation methods + aggregation_methods = { + "min" : ('kpi_value', 'min'), + "max" : ('kpi_value', 'max'), + "avg" : ('kpi_value', 'mean'), + "first" : ('kpi_value', lambda x: x.iloc[0]), + "last" : ('kpi_value', lambda x: x.iloc[-1]), + "variance": ('kpi_value', 'var'), + "count" : ('kpi_value', 'count'), + "range" : ('kpi_value', lambda x: x.max() - x.min()), + "sum" : ('kpi_value', 'sum'), + } + + results = [] + + # Process each KPI-specific task parameter + for kpi_index, kpi_id in enumerate(input_kpi_list): + logger.debug(f"Processing KPI: {kpi_id}") + kpi_task_parameters = thresholds["task_parameter"][kpi_index] + logger.debug(f"KPI task parameters: {kpi_task_parameters}") - # logger.info(f"2. Processing KPI: {kpi_id} with task parameters: {kpi_task_parameters}") - kpi_df = df[df['kpi_id'] == kpi_id] + # Get valid task parameters for this KPI + valid_task_parameters = [ + method for method in kpi_task_parameters.keys() + if method in aggregation_methods + ] - # Check if kpi_df is not empty before applying the aggregation methods - if not kpi_df.empty: - agg_df = kpi_df.groupby('kpi_id').agg(**selected_methods).reset_index() + # Select the aggregation methods based on valid task parameters + selected_methods = {method: aggregation_methods[method] for method in valid_task_parameters} + logger.debug(f"Processing methods: {selected_methods}") - # logger.info(f"3. Aggregated DataFrame for KPI: {kpi_id}: {agg_df}") + kpi_df = df[df['kpi_id'] == kpi_id] + logger.debug(f"KPI data frame:\n{kpi_df}") - agg_df['kpi_id'] = output_kpi_list[kpi_index] + # Check if kpi_df is not empty before applying the aggregation methods + if not kpi_df.empty: + agg_df = kpi_df.groupby('kpi_id').agg(**selected_methods).reset_index() + logger.debug(f"Aggregated DataFrame for KPI {kpi_id}:\n{agg_df}") - # logger.info(f"4. Applying thresholds for df: {agg_df['kpi_id']}") - record = threshold_handler(key, agg_df, kpi_task_parameters) + agg_df['kpi_id'] = output_kpi_list[kpi_index] + record = threshold_handler(key, agg_df, kpi_task_parameters) - results.extend(record.to_dict(orient='records')) - else: - logger.warning(f"No data available for KPIs: {kpi_id}. Skipping aggregation.") - continue - if results: - return results + # Make the data frame agnostic to the aggregation method + value_key = list(selected_methods.keys())[0] + upd_record = transform_data(record, value_key) + + # Store the record + results.extend(upd_record.to_dict(orient='records')) else: - return [] + logger.warning(f"No data available for KPIs: {kpi_id}. Skipping aggregation") + continue -def find(data , type , value): - return next((item for item in data if item[type] == value), None) + if results: + logger.info(f"Aggregation result: {results}") + return results + else: + return [] + +def aggregation_handler_many_to_one(key, batch, input_kpi_list, output_kpi_list, thresholds): + logger.info("AggregationHandlerManyToOne starts") + if not batch: + logger.warning("Empty batch received. Skipping processing.") + return [] + logger.info(f"Processing {len(batch)} records for key: {key}") -def aggregation_handler_three_to_one( - batch_type_name, key, batch, input_kpi_list, output_kpi_list, thresholds -): + kpi_task_parameters = None + for kpi_index, kpi_id in enumerate(input_kpi_list): + logger.debug(f"Processing KPI: {kpi_id}") + kpi_task_parameters = thresholds["task_parameter"][kpi_index] + logger.debug(f"KPI task parameters: {kpi_task_parameters}") + + threshold_high, threshold_low = None, None + for _, threshold_values in kpi_task_parameters.items(): + if isinstance(threshold_values, list) and len(threshold_values) == 2: + threshold_low, threshold_high = threshold_values # Group and sum - # Track sum and count sum_dict = defaultdict(int) count_dict = defaultdict(int) @@ -173,13 +197,18 @@ def aggregation_handler_three_to_one( result = { "kpi_id": output_kpi_list[0], - "avg": total_kpi_metric, - "THRESHOLD_RAISE": bool(total_kpi_metric > 2600), - "THRESHOLD_FALL": bool(total_kpi_metric < 699) + "value": total_kpi_metric, + "value_threshold_high": bool(total_kpi_metric > threshold_high), + "value_threshold_low": bool(total_kpi_metric < threshold_low) } results = [] results.append(result) - logger.warning(f"result : {result}.") + logger.info(f"Aggregation result: {result}") return results + +HANDLER_FUNCTIONS = { + Handlers.AGGREGATION_HANDLER: aggregation_handler, + Handlers.AGGREGATION_HANDLER_MANY_TO_ONE: aggregation_handler_many_to_one +} diff --git a/src/analytics/backend/service/Streamer.py b/src/analytics/backend/service/Streamer.py index aef093fb577a291bff09fa2338104d80efb8c4b6..a8c9bffc6a3c918573ac9a1cbbcb274d0276ba8b 100644 --- a/src/analytics/backend/service/Streamer.py +++ b/src/analytics/backend/service/Streamer.py @@ -19,21 +19,20 @@ import logging from confluent_kafka import KafkaException, KafkaError from common.tools.kafka.Variables import KafkaTopic -from analytics.backend.service.AnalyzerHandlers import Handlers, aggregation_handler, aggregation_handler_three_to_one , select_handler +from analytics.backend.service.AnalyzerHandlers import Handlers, select_handler, aggregation_handler from analytics.backend.service.AnalyzerHelper import AnalyzerHelper - logger = logging.getLogger(__name__) - class DaskStreamer(threading.Thread): - def __init__(self, key, input_kpis, output_kpis, thresholds, + def __init__( + self, key, input_kpis, output_kpis, thresholds, batch_size = 5, batch_duration = None, window_size = None, cluster_instance = None, producer_instance = AnalyzerHelper.initialize_kafka_producer() - ) -> None: + ) -> None: super().__init__() self.key = key self.input_kpis = input_kpis @@ -45,6 +44,14 @@ class DaskStreamer(threading.Thread): self.running = True self.batch = [] + logger.info(f"Dask Streamer key: {self.key}") + logger.info(f"Dask Streamer input KPIs: {self.input_kpis}") + logger.info(f"Dask Streamer output KPIs: {self.output_kpis}") + logger.info(f"Dask Streamer thresholds: {self.thresholds}") + logger.info(f"Dask Streamer window size: {self.window_size}") + logger.info(f"Dask Streamer batch size: {self.batch_size}") + logger.info(f"Dask Streamer batch duration: {self.batch_duration}") + # Initialize Kafka and Dask components self.client = AnalyzerHelper.initialize_dask_client(cluster_instance) self.consumer = AnalyzerHelper.initialize_kafka_consumer() # Single-threaded consumer @@ -55,7 +62,7 @@ class DaskStreamer(threading.Thread): def run(self): """Main method to start the DaskStreamer.""" try: - logger.info("Starting Dask Streamer") + logger.info("Dask Streamer started") last_batch_time = time.time() while True: if not self.consumer: @@ -69,7 +76,7 @@ class DaskStreamer(threading.Thread): break message = self.consumer.poll(timeout=1.0) if message is None: - # logger.info("No new messages received.") + logger.debug("No new messages received.") continue if message.error(): if message.error().code() == KafkaError._PARTITION_EOF: @@ -85,7 +92,12 @@ class DaskStreamer(threading.Thread): except json.JSONDecodeError: logger.error(f"Failed to decode message: {message.value()}") continue - self.batch.append(value) + # This streamer is only meant to serve a list of input KPIs + if value["kpi_id"] in self.input_kpis: + self.batch.append(value) + # Ignore the rest.. + else: + continue # Window size has a precedence over batch size if self.batch_duration is None: @@ -106,18 +118,32 @@ class DaskStreamer(threading.Thread): logger.exception(f"Error in Dask streaming process: {e}") finally: self.stop() - logger.info(">>> Exiting Dask Streamer...") + logger.info("Exiting Dask Streamer...") def task_handler_selector(self): """Select the task handler based on the task type.""" logger.info(f"Batch to be processed: {self.batch}") - if Handlers.is_valid_handler(self.thresholds["task_type"]): + handler_name = self.thresholds["task_type"] + if Handlers.is_valid_handler(handler_name): if self.client is not None and self.client.status == 'running': + logger.info(f"Selecting the handler for key {self.key}") + logger.info(f"|--> Input KPIs {self.input_kpis}") + logger.info(f"|--> Output KPIs {self.output_kpis}") + logger.info(f"|--> Thresholds {self.thresholds}") try: - future = self.client.submit(select_handler(self.thresholds["task_type"]), "batch size", - self.key, - self.batch, self.input_kpis, self.output_kpis, self.thresholds) - future.add_done_callback(lambda fut: self.produce_result(fut.result(), KafkaTopic.ALARMS.value)) + handler_fn = select_handler(handler_name) + future = self.client.submit( + handler_fn, + self.key, + self.batch, + self.input_kpis, + self.output_kpis, + self.thresholds + ) + logger.info(f"|--> Handler result {future.result()}") + future.add_done_callback( + lambda fut: self.produce_result(fut.result(), KafkaTopic.ALARMS.value) + ) except Exception as e: logger.error( f"Failed to submit task to Dask client or unable to process future. See error for detail: {e}") @@ -132,6 +158,10 @@ class DaskStreamer(threading.Thread): logger.warning("Nothing to produce. Skipping.") return for record in result: + # Filter out records not related with the output KPI of interest + if record["kpi_id"] not in self.output_kpis: + continue + logger.info(f"Kafka Alarm - Record: {record}") try: self.producer.produce( destination_topic, diff --git a/src/analytics/backend/tests/test_backend.py b/src/analytics/backend/tests/test_backend.py index a44351c035881aa072e477e49a6370234689c0c1..9c3fd42cce192139d6c8fc73043fbe3de8dedb86 100644 --- a/src/analytics/backend/tests/test_backend.py +++ b/src/analytics/backend/tests/test_backend.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import time import json import pytest import logging @@ -22,7 +21,6 @@ from unittest.mock import MagicMock, patch from .messages_analyzer import get_batch, get_input_kpi_list, get_output_kpi_list, get_thresholds, \ get_windows_size, get_batch_size, get_agg_df, get_duration -from common.tools.kafka.Variables import KafkaTopic from analytics.backend.service.Streamer import DaskStreamer from analytics.backend.service.AnalyzerHandlers import aggregation_handler, threshold_handler from analytics.backend.service.AnalyticsBackendService import AnalyticsBackendService @@ -193,7 +191,8 @@ def test_produce_result(dask_streamer): """Test if produce_result sends records to Kafka.""" result = [{"kpi_id": "kpi1", "value": 100}] with patch('analytics.backend.service.AnalyzerHelper.AnalyzerHelper.delivery_report', return_value=None) as mock_delivery_report, \ - patch.object(dask_streamer.producer, 'produce') as mock_produce: + patch.object(dask_streamer.producer, 'produce') as mock_produce: + dask_streamer.output_kpis = ['kpi1'] dask_streamer.produce_result(result, "test_topic") mock_produce.assert_called_once_with( "test_topic", @@ -221,6 +220,8 @@ def test_run_with_valid_consumer(dask_streamer): with patch.object(dask_streamer.consumer, 'poll') as mock_poll, \ patch.object(dask_streamer, 'task_handler_selector') as mock_task_handler_selector: + dask_streamer.input_kpis = ['kpi1', 'kpi2'] + # Simulate valid messages without errors mock_message_1 = MagicMock() mock_message_1.value.return_value = b'{"kpi_id": "kpi1", "value": 100}' @@ -261,7 +262,7 @@ def test_aggregation_handler(): # Test aggregation_handler aggregated_df = aggregation_handler( - "test_batch", "test_key", batch, input_kpi_list, output_kpi_list, thresholds + "test_key", batch, input_kpi_list, output_kpi_list, thresholds ) assert isinstance(aggregated_df, list) assert all(isinstance(item, dict) for item in aggregated_df) @@ -276,7 +277,7 @@ def test_threshold_handler(): result = threshold_handler("test_key", agg_df, thresholds["task_parameter"][0]) assert isinstance(result, pd.DataFrame) - assert result.shape == (1, 7) + assert result.shape == (1, 5) ########################### diff --git a/src/analytics/frontend/tests/test_frontend.py b/src/analytics/frontend/tests/test_frontend.py index bc210889a2ba395f6dcc28294a35e6aa83a923c7..6532d6ee3a0f1a10a61d4f0619ba53b0bd0c3f8f 100644 --- a/src/analytics/frontend/tests/test_frontend.py +++ b/src/analytics/frontend/tests/test_frontend.py @@ -138,7 +138,7 @@ def test_StartAnalyzer_MGON_Agent(analyticsFrontend_client): added_analyzer_id = analyticsFrontend_client.StartAnalyzer(create_analyzer_for_mgon_agent()) LOGGER.debug(str(added_analyzer_id)) LOGGER.info("waiting for timer to complete 3000 seconds ...") - time.sleep(3000) + time.sleep(60) LOGGER.info('--> StopAnalyzer after timer completion') response = analyticsFrontend_client.StopAnalyzer(added_analyzer_id) LOGGER.debug(str(response)) diff --git a/src/automation/README.md b/src/automation/README.md new file mode 100644 index 0000000000000000000000000000000000000000..b946732e1815581d2430be1e86f5bd84014255c3 --- /dev/null +++ b/src/automation/README.md @@ -0,0 +1,116 @@ +# ETSI TFS Automation Service + +The Automation service exposes a gPRC API with the following methods: +- ZSMCreate +- ZSMDelete +- ZSMGetById +- ZSMGetByService + +To Invoke this API follow the steps below: + +## Install grpcurl + +```bash +curl -sSL "https://github.com/fullstorydev/grpcurl/releases/download/v1.8.7/grpcurl_1.8.7_linux_x86_64.tar.gz" | sudo tar -xz -C /usr/local/bin +``` + +## Fetch available methods around Automation + +```bash +cd ~/tfs-ctrl/ +grpcurl -import-path ./proto -proto automation.proto list +grpcurl -import-path ./proto -proto automation.proto describe automation.AutomationService +grpcurl -import-path ./proto -proto automation.proto describe automation.AutomationService.ZSMCreate +``` + +## Try an example ZSMCreate + +TFS tests are now augmented with a new Automation example that shows the way to trigger a ZSM loop creaiton. +The following script invokes Automation on top of a specific example topology. + +```bash +bash src/tests/automation/run_test_automation.sh +``` + +More details are provided in `src/tests/automation/README.md` + +## Important Services + +WebUI + +``` +http://10.10.10.41/webui/ +``` + +Grafana + +``` +http://10.10.10.41/grafana +``` + +Prometheus + +``` +http://10.10.10.41:30090/ +``` + +## Check Kafka topics + +The following commands may help you debug a closed loop that involves Telemetry, Analytics, Policy, all managed by Automation. +Kafka is a key element for Automation as the KPIs managed by Analyzer create alarms that propagate to Policy via a dedicated Kafka topic. +Checking this topic is key for ensuring proper communication between Analytics and Policy. + +Get all pods in Kafka namespace: + +```bash +kubectl get pods -n kafka + +NAME READY STATUS RESTARTS AGE +kafka-0 1/1 Running 2 (90d ago) 104d +kafka-broker-5f9656cc68-d8fzz 1/1 Running 13 (44h ago) 429d +zookeeper-8664c6774d-nvbgg 1/1 Running 6 (90d ago) 429d +``` + +Query Kafka from within the Kafka broker's pod: + +```bash +kubectl exec -it kafka-0 -n kafka -- \ + kafka-consumer-groups.sh \ + --bootstrap-server kafka-service.kafka.svc.cluster.local:9092 \ + --list + +Output> + backend + KpiValueWriter + analytics-backend + policy +``` + +Now let's see the consumer groups. + +```bash +kubectl exec -it kafka-0 -n kafka -- \ + kafka-consumer-groups.sh \ + --bootstrap-server kafka-service.kafka.svc.cluster.local:9092 \ + --list + +Output> + backend + KpiValueWriter + analytics-backend + policy +``` + +Let's describe the policy group: + +```bash +kubectl exec -it kafka-0 -n kafka -- \ + kafka-consumer-groups.sh \ + --bootstrap-server kafka-service.kafka.svc.cluster.local:9092 \ + --describe \ + --group policy + +Output> +GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID +policy topic_alarms 0 40 41 1 kafka-consumer-topic_alarms-c8f09ac5-8c44-42ec-a13b-1af2c47fb86c /10.1.181.228 kafka-consumer-topic_alarms +``` diff --git a/src/automation/client/AutomationClient.py b/src/automation/client/AutomationClient.py new file mode 100644 index 0000000000000000000000000000000000000000..64a8d425e6e4387feefeae86ad15df6d13566cd9 --- /dev/null +++ b/src/automation/client/AutomationClient.py @@ -0,0 +1,54 @@ +# 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.automation_pb2_grpc import AutomationServiceStub +from common.proto.automation_pb2 import ZSMCreateRequest, ZSMService +from common.tools.client.RetryDecorator import retry, delay_exponential +from common.tools.grpc.Tools import grpc_message_to_json_string + +LOGGER = logging.getLogger(__name__) +MAX_RETRIES = 15 +DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) +RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') + +class AutomationClient: + def __init__(self, host=None, port=None): + if not host: host = get_service_host(ServiceNameEnum.AUTOMATION) + if not port: port = get_service_port_grpc(ServiceNameEnum.AUTOMATION) + self.endpoint = '{:s}:{:s}'.format(str(host), str(port)) + LOGGER.info('Creating channel to {:s}...'.format(str(self.endpoint))) + self.channel = None + self.stub = None + self.openconfig_stub = None + self.connect() + LOGGER.info('Channel created') + + def connect(self): + self.channel = grpc.insecure_channel(self.endpoint) + self.stub = AutomationServiceStub(self.channel) + + def close(self): + if self.channel is not None: self.channel.close() + self.channel = None + self.stub = None + + @RETRY_DECORATOR + def ZSMCreate(self, request : ZSMCreateRequest) -> ZSMService: # type: ignore + LOGGER.info('ZSMCreate request: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.ZSMCreate(request) + LOGGER.info('ZSMCreate result: {:s}'.format(grpc_message_to_json_string(response))) + return response diff --git a/src/automation/client/PolicyClient.py b/src/automation/client/PolicyClient.py index 7b66049398fa7c6f5b4684245b8e1a18ad81bca7..f2cc50c15faec03cca26fac9800a4a0e02b33041 100644 --- a/src/automation/client/PolicyClient.py +++ b/src/automation/client/PolicyClient.py @@ -47,8 +47,8 @@ class PolicyClient: self.stub = None @RETRY_DECORATOR - def PolicyAddService(self, request : PolicyRuleService) -> PolicyRuleState: - LOGGER.debug('AddPolicy request: {:s}'.format(grpc_message_to_json_string(request))) + def PolicyAddService(self, request : PolicyRuleService) -> PolicyRuleState: # type: ignore + LOGGER.info('AddPolicy request: {:s}'.format(grpc_message_to_json_string(request))) response = self.stub.PolicyAddService(request) - LOGGER.debug('AddPolicy result: {:s}'.format(grpc_message_to_json_string(response))) + LOGGER.info('AddPolicy result: {:s}'.format(grpc_message_to_json_string(response))) return response diff --git a/src/automation/service/AutomationServiceServicerImpl.py b/src/automation/service/AutomationServiceServicerImpl.py index 187eba055cdfd614abd680cc8ef34ebe5911fe3a..11b4d5e6a70349718d28e0d7b6653e4fa98971ff 100644 --- a/src/automation/service/AutomationServiceServicerImpl.py +++ b/src/automation/service/AutomationServiceServicerImpl.py @@ -13,7 +13,6 @@ # limitations under the License. import grpc, logging -from uuid import uuid4 from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method from common.proto.automation_pb2_grpc import AutomationServiceServicer from common.method_wrappers.ServiceExceptions import NotFoundException @@ -23,7 +22,7 @@ from automation.service.database.AutomationDB import AutomationDB from automation.service.database.AutomationModel import AutomationModel from automation.service.zsm_handlers import ZSM_SERVICE_HANDLERS from automation.service.zsm_handler_api.ZSMFilterFields import ( - ZSMFilterFieldEnum, #TELEMETRY_SERVICE_TYPE_VALUES, TARGET_SERVICE_TYPE_VALUES, + ZSMFilterFieldEnum, ZSM_FILTER_FIELD_ALLOWED_VALUES ) from context.client.ContextClient import ContextClient @@ -38,27 +37,31 @@ class AutomationServiceServicerImpl(AutomationServiceServicer): @safe_and_metered_rpc_method(METRICS_POOL,LOGGER) def ZSMCreate(self, request : ZSMCreateRequest, context : grpc.ServicerContext) -> ZSMService: - LOGGER.info("Received gRPC message object: {:}".format(request)) + LOGGER.info("Received gRPC message object:\n{:}".format(request)) context_client = ContextClient() targetService = context_client.GetService(request.target_service_id) telemetryService = context_client.GetService(request.telemetry_service_id) + LOGGER.info(f"Target service type: {targetService.service_type}") + LOGGER.info(f"Telemetry service type: {telemetryService.service_type}") handler_cls = self.get_service_handler_based_on_service_types( targetService.service_type, telemetryService.service_type, ZSM_SERVICE_HANDLERS ) + response = None if handler_cls: handler_obj = handler_cls() # instantiate it - handler_obj.zsmCreate(request, context) + response = handler_obj.zsmCreate(request, context) else: - LOGGER.info("No matching handler found.") + LOGGER.info("No matching handler found") - response = ZSMService() - automation_id = str(uuid4()) - zsm_to_insert = AutomationModel.convert_Automation_to_row(automation_id , "Test Description") - if self.automation_db_obj.add_row_to_db(zsm_to_insert): - response.zsmServiceId.uuid.uuid = automation_id + zsm_to_insert = AutomationModel.convert_Automation_to_row( + response.zsmServiceId.uuid.uuid, "ZSM service" + ) + if not self.automation_db_obj.add_row_to_db(zsm_to_insert): + LOGGER.error("Failed to insert new ZSM service") + return response return response @@ -76,7 +79,7 @@ class AutomationServiceServicerImpl(AutomationServiceServicer): zsmServiceState = ZSMServiceState() zsmServiceState.zsmServiceState = 5 - zsmServiceState.zsmServiceStateMessage = "Removed id: {:}".format(request) + zsmServiceState.zsmServiceStateMessage = "Removed ZSM ID: {:}".format(request) return zsmServiceState @@ -86,21 +89,23 @@ class AutomationServiceServicerImpl(AutomationServiceServicer): zsm_id_to_search = request.uuid.uuid row = self.automation_db_obj.search_db_row_by_id(AutomationModel, 'zsm_id', zsm_id_to_search) if row is None: - LOGGER.info('No matching row found zsm id: {:}'.format(zsm_id_to_search)) - raise NotFoundException('ZsmID', zsm_id_to_search) + LOGGER.info('No matching row found for ZSM ID: {:}'.format(zsm_id_to_search)) + raise NotFoundException('ZSM ID', zsm_id_to_search) response = AutomationModel.convert_row_to_Automation(row) return response @safe_and_metered_rpc_method(METRICS_POOL,LOGGER) def ZSMGetByService(self, request : ServiceId, context : grpc.ServicerContext) -> ZSMService: - LOGGER.info('NOT IMPLEMENTED ZSMGetByService') + LOGGER.info('ZSMGetByService is not implemented') return ZSMService() def get_service_handler_based_on_service_types( - self, targetServiceType ,telemetryServiceType , ZSM_SERVICE_HANDLERS + self, targetServiceType, telemetryServiceType, ZSM_SERVICE_HANDLERS ): flag = True for handler_cls, filters in ZSM_SERVICE_HANDLERS: + LOGGER.info(f"Handler: {handler_cls}") # <<--P4INTZSMPlugin + LOGGER.info(f"Filters: {filters}") # <--ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY for filter in filters: flag = self.check_if_requested_services_pass_filter_criteria( filter, targetServiceType, telemetryServiceType @@ -114,6 +119,7 @@ class AutomationServiceServicerImpl(AutomationServiceServicer): ): flag = True for filter_key, filter_value in filter.items(): + LOGGER.info(f"Filter value: {filter_value}") # <--ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY if filter_value in ZSM_FILTER_FIELD_ALLOWED_VALUES[filter_key.value]: if filter_key.value == ZSMFilterFieldEnum.TARGET_SERVICE_TYPE.value: if filter_value != targetServiceType: diff --git a/src/automation/service/__main__.py b/src/automation/service/__main__.py index d8ea030baaa8f06841c5e701c0287f3f735c18d4..a43b64d0ee9caeff9c96e0c8c7fda906f3c1bb95 100644 --- a/src/automation/service/__main__.py +++ b/src/automation/service/__main__.py @@ -14,7 +14,6 @@ import logging, signal, sys, threading from prometheus_client import start_http_server -from automation.service.EventEngine import EventEngine from common.Constants import ServiceNameEnum from common.Settings import ( ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, @@ -22,8 +21,6 @@ from common.Settings import ( wait_for_environment_variables ) from .AutomationService import AutomationService -from common.tools.database.GenericDatabase import Database -from automation.service.database.AutomationModel import AutomationModel from .database.Engine import Engine from .database.models._Base import rebuild_database @@ -34,11 +31,11 @@ LOGGER = logging.getLogger(__name__) terminate = threading.Event() def signal_handler(signal, frame): # pylint: disable=redefined-outer-name,unused-argument - LOGGER.warning('Terminate signal received') + LOGGER.warning("Terminate signal received") terminate.set() def main(): - LOGGER.info('Starting...') + LOGGER.info("Starting...") wait_for_environment_variables([ get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_HOST ), @@ -63,16 +60,17 @@ def main(): start_http_server(metrics_port) # Get Database Engine instance and initialize database, if needed - LOGGER.info('Getting SQLAlchemy DB Engine...') + LOGGER.info("Getting SQLAlchemy DB Engine...") db_engine = Engine.get_engine() if db_engine is None: - LOGGER.error('Unable to get SQLAlchemy DB Engine...') + LOGGER.error("Unable to get SQLAlchemy DB Engine...") return -1 + # Create the database try: Engine.create_database(db_engine) - except: # pylint: disable=bare-except # pragma: no cover - LOGGER.exception('Failed to check/create the database: {:s}'.format(str(db_engine.url))) + except Exception as ex: + LOGGER.exception(f"Failed to check/create the database: {str(db_engine.url)}") rebuild_database(db_engine) @@ -83,12 +81,18 @@ def main(): # Wait for Ctrl+C or termination signal while not terminate.wait(timeout=1.0): pass - LOGGER.info('Terminating...') + LOGGER.info("Terminating...") grpc_service.stop() - event_engine.stop() + # event_engine.stop() - LOGGER.info('Bye') + # Drop the database + try: + Engine.drop_database(db_engine) + except Exception as ex: + LOGGER.exception(f"Failed to check/create the database: {str(db_engine.url)}") + + LOGGER.info("Bye") return 0 -if __name__ == '__main__': +if __name__ == "__main__": sys.exit(main()) diff --git a/src/automation/service/database/AutomationDB.py b/src/automation/service/database/AutomationDB.py index 0491cb590d1789f79af8508a44aa9baf93bbeff3..08670989e27812a7cd2f728f2fd5ba4e71e255f6 100644 --- a/src/automation/service/database/AutomationDB.py +++ b/src/automation/service/database/AutomationDB.py @@ -15,12 +15,11 @@ import logging from common.method_wrappers.Decorator import MetricsPool from common.tools.database.GenericDatabase import Database -from common.method_wrappers.ServiceExceptions import OperationFailedException -LOGGER = logging.getLogger(__name__) +LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('Automation', 'Database') class AutomationDB(Database): def __init__(self, model) -> None: - LOGGER.info('Init AutomationService') + LOGGER.info('Init Automation database') super().__init__(model) diff --git a/src/automation/service/database/AutomationModel.py b/src/automation/service/database/AutomationModel.py index 156acbb93615be5e00bede49154271cb158b316d..89e940673daffdab3362751aad603a117ab4d92c 100644 --- a/src/automation/service/database/AutomationModel.py +++ b/src/automation/service/database/AutomationModel.py @@ -14,26 +14,24 @@ import logging from sqlalchemy.dialects.postgresql import UUID -from sqlalchemy import Column, Integer, String, Text -from sqlalchemy.orm import registry +from sqlalchemy import Column, Text from .models._Base import _Base from common.proto.automation_pb2 import ZSMService -logging.basicConfig(level=logging.INFO) LOGGER = logging.getLogger(__name__) class AutomationModel(_Base): __tablename__ = 'automation' zsm_id = Column(UUID(as_uuid=False), primary_key=True) - zsm_description = Column(Text , nullable=False) + zsm_description = Column(Text, nullable=False) # helps in logging the information def __repr__(self): return (f"") @classmethod - def convert_Automation_to_row(cls, uuid , zsm_description): + def convert_Automation_to_row(cls, uuid, zsm_description): """ Create an instance of Automation from a request object. Args: request: The request object containing the data. @@ -47,10 +45,10 @@ class AutomationModel(_Base): @classmethod def convert_row_to_Automation(cls, row): """ - Create and return a dictionary representation of a Automation instance. + Create and return a dictionary representation of an Automation instance. Args: row: The Automation instance (row) containing the data. Returns: Automation object """ response = ZSMService() - response.zsmServiceId.uuid.uuid = row.zsm_id + response.zsmServiceId.uuid.uuid = row.zsm_id return response diff --git a/src/automation/service/database/models/_Base.py b/src/automation/service/database/models/_Base.py index 06c5f6b02597802e0dcb1f3a5f941c977eb126a8..7c019cdd75ce0ac3c7c14dc05d5020c608eaab11 100644 --- a/src/automation/service/database/models/_Base.py +++ b/src/automation/service/database/models/_Base.py @@ -14,9 +14,7 @@ import sqlalchemy from typing import Any, List -from sqlalchemy.orm import Session, sessionmaker, declarative_base -from sqlalchemy.sql import text -from sqlalchemy_cockroachdb import run_transaction +from sqlalchemy.orm import declarative_base _Base = declarative_base() diff --git a/src/automation/service/zsm_handler_api/ZSMFilterFields.py b/src/automation/service/zsm_handler_api/ZSMFilterFields.py index 7b00de5bc474f8ac4a6a711acf9f7200723ddaae..e6c2fb8441dfd0c01d0ea28f57584ad3e711a38b 100644 --- a/src/automation/service/zsm_handler_api/ZSMFilterFields.py +++ b/src/automation/service/zsm_handler_api/ZSMFilterFields.py @@ -16,19 +16,21 @@ from enum import Enum from common.proto.context_pb2 import ServiceTypeEnum class ZSMFilterFieldEnum(Enum): - TARGET_SERVICE_TYPE = 'target_service_type' + TARGET_SERVICE_TYPE = 'target_service_type' TELEMETRY_SERVICE_TYPE = 'telemetry_service_type' TARGET_SERVICE_TYPE_VALUES = { - ServiceTypeEnum.SERVICETYPE_L2NM + ServiceTypeEnum.SERVICETYPE_L2NM, + ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY, } TELEMETRY_SERVICE_TYPE_VALUES = { - ServiceTypeEnum.SERVICETYPE_INT + ServiceTypeEnum.SERVICETYPE_INT, + ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY, } # Maps filter fields to allowed values per Filter field. # If no restriction (free text) None is specified ZSM_FILTER_FIELD_ALLOWED_VALUES = { - ZSMFilterFieldEnum.TARGET_SERVICE_TYPE.value : TARGET_SERVICE_TYPE_VALUES, + ZSMFilterFieldEnum.TARGET_SERVICE_TYPE.value : TARGET_SERVICE_TYPE_VALUES, ZSMFilterFieldEnum.TELEMETRY_SERVICE_TYPE.value : TELEMETRY_SERVICE_TYPE_VALUES, } diff --git a/src/automation/service/zsm_handler_api/_ZSMHandler.py b/src/automation/service/zsm_handler_api/_ZSMHandler.py index e79601cf755ced11f734bdfa7f12f63d857b25cd..7dbcb467b1f6ec064663f55d828db671e6142803 100644 --- a/src/automation/service/zsm_handler_api/_ZSMHandler.py +++ b/src/automation/service/zsm_handler_api/_ZSMHandler.py @@ -13,26 +13,23 @@ # limitations under the License. import grpc , logging -from common.proto.automation_pb2 import ( - ZSMCreateRequest, #ZSMService, - ZSMServiceID, #ZSMServiceState, -) +from common.proto.automation_pb2 import ZSMCreateRequest, ZSMServiceID from common.proto.context_pb2 import ServiceId LOGGER = logging.getLogger(__name__) class _ZSMHandler: def __init__(self): - LOGGER.info('Init Scenario') + LOGGER.info('ZSM init') - def zsmCreate(self, request : ZSMCreateRequest, context : grpc.ServicerContext): + def zsmCreate(self, request : ZSMCreateRequest, context : grpc.ServicerContext): # type: ignore LOGGER.info('zsmCreate method') - def zsmDelete(self, request : ZSMServiceID, context : grpc.ServicerContext): + def zsmDelete(self, request : ZSMServiceID, context : grpc.ServicerContext): # type: ignore LOGGER.info('zsmDelete method') - def zsmGetById(self, request : ZSMServiceID, context : grpc.ServicerContext): + def zsmGetById(self, request : ZSMServiceID, context : grpc.ServicerContext): # type: ignore LOGGER.info('zsmGetById method') - def zsmGetByService(self, request : ServiceId, context : grpc.ServicerContext): + def zsmGetByService(self, request : ServiceId, context : grpc.ServicerContext): # type: ignore LOGGER.info('zsmGetByService method') diff --git a/src/automation/service/zsm_handlers/OpticalZSMPlugin.py b/src/automation/service/zsm_handlers/OpticalZSMPlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..6baacfde6d14bdd7c090237d8dca76944ec23e69 --- /dev/null +++ b/src/automation/service/zsm_handlers/OpticalZSMPlugin.py @@ -0,0 +1,104 @@ +# 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 uuid import uuid4 +from common.proto.analytics_frontend_pb2 import AnalyzerId +from common.proto.policy_pb2 import PolicyRuleState +from common.proto.automation_pb2 import ZSMCreateRequest, ZSMService + +from analytics.frontend.client.AnalyticsFrontendClient import AnalyticsFrontendClient +from automation.client.PolicyClient import PolicyClient +from context.client.ContextClient import ContextClient +from automation.service.zsm_handler_api._ZSMHandler import _ZSMHandler + + +LOGGER = logging.getLogger(__name__) + + +class OpticalZSMPlugin(_ZSMHandler): + def __init__(self): + LOGGER.info('Init OpticalZSMPlugin') + + def zsmCreate(self, request : ZSMCreateRequest, context : grpc.ServicerContext): # type: ignore + context_client = ContextClient() + policy_client = PolicyClient() + analytics_frontend_client = AnalyticsFrontendClient() + + # Verify the input target service ID + try: + target_service_id = context_client.GetService(request.target_service_id) + except grpc.RpcError as ex: + LOGGER.exception(f'Unable to get target service:\n{str(target_service_id)}') + if ex.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member + context_client.close() + return self._zsm_create_response_empty() + + # Verify the input telemetry service ID + try: + telemetry_service_id = context_client.GetService(request.telemetry_service_id) + except grpc.RpcError as ex: + LOGGER.exception(f'Unable to get telemetry service:\n{str(telemetry_service_id)}') + if ex.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member + context_client.close() + return self._zsm_create_response_empty() + + # Start an analyzer + try: + analyzer_id: AnalyzerId = analytics_frontend_client.StartAnalyzer(request.analyzer) # type: ignore + LOGGER.info('Analyzer_id:\n{:s}'.format(str(analyzer_id))) + except grpc.RpcError as ex: + LOGGER.exception(f'Unable to start Analyzer:\n{str(request.analyzer)}') + if ex.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member + context_client.close() + analytics_frontend_client.close() + return self._zsm_create_response_empty() + + # Create a policy + try: + LOGGER.info(f'Policy:\n{str(request.policy)}') + policy_rule_state: PolicyRuleState = policy_client.PolicyAddService(request.policy) # type: ignore + LOGGER.info(f'Policy rule state:\n{policy_rule_state}') + except Exception as ex: + LOGGER.exception(f'Unable to create policy:\n{str(request.policy)}') + LOGGER.exception(ex.code()) + # ToDo: Investigate why PolicyAddService throws exception + # if ex.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member + # context_client.close() + # policy_client.close() + # return self._zsm_create_response_empty() + + context_client.close() + analytics_frontend_client.close() + policy_client.close() + return self._zsm_create_response(request) + + def zsmDelete(self): + LOGGER.info('zsmDelete method') + + def zsmGetById(self): + LOGGER.info('zsmGetById method') + + def zsmGetByService(self): + LOGGER.info('zsmGetByService method') + + def _zsm_create_response(self, request): + response = ZSMService() + automation_id = str(uuid4()) + response.zsmServiceId.uuid.uuid = automation_id + response.serviceId.service_uuid.uuid = request.target_service_id.service_uuid.uuid + return response + + def _zsm_create_response_empty(self): + return ZSMService() diff --git a/src/automation/service/zsm_handlers/P4INTZSMPlugin.py b/src/automation/service/zsm_handlers/P4INTZSMPlugin.py index a16979530a6bc407cd32891ff1c965d432a2242c..74694a37686b8c7ff4c5cbf6e11723a2a768f50b 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. @@ -12,7 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -import grpc , logging +import grpc, logging +from uuid import uuid4 from common.proto.analytics_frontend_pb2 import AnalyzerId from common.proto.policy_pb2 import PolicyRuleState from common.proto.automation_pb2 import ZSMCreateRequest, ZSMService @@ -21,7 +22,7 @@ from analytics.frontend.client.AnalyticsFrontendClient import AnalyticsFrontendC from automation.client.PolicyClient import PolicyClient from context.client.ContextClient import ContextClient from automation.service.zsm_handler_api._ZSMHandler import _ZSMHandler -from common.proto.policy_condition_pb2 import PolicyRuleCondition + LOGGER = logging.getLogger(__name__) @@ -29,8 +30,7 @@ class P4INTZSMPlugin(_ZSMHandler): def __init__(self): LOGGER.info('Init P4INTZSMPlugin') - def zsmCreate(self,request : ZSMCreateRequest, context : grpc.ServicerContext): - # check that service does not exist + def zsmCreate(self, request : ZSMCreateRequest, context : grpc.ServicerContext): # type: ignore context_client = ContextClient() policy_client = PolicyClient() analytics_frontend_client = AnalyticsFrontendClient() @@ -39,55 +39,49 @@ class P4INTZSMPlugin(_ZSMHandler): try: target_service_id = context_client.GetService(request.target_service_id) except grpc.RpcError as ex: + LOGGER.exception(f'Unable to get target service:\n{str(target_service_id)}') if ex.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member - LOGGER.exception('Unable to get target service({:s})'.format(str(target_service_id))) context_client.close() - return None + return self._zsm_create_response_empty() # Verify the input telemetry service ID try: telemetry_service_id = context_client.GetService(request.telemetry_service_id) except grpc.RpcError as ex: + LOGGER.exception(f'Unable to get telemetry service:\n{str(telemetry_service_id)}') if ex.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member - LOGGER.exception('Unable to get telemetry service({:s})'.format(str(telemetry_service_id))) context_client.close() - return None + return self._zsm_create_response_empty() # Start an analyzer try: - analyzer_id_lat: AnalyzerId = analytics_frontend_client.StartAnalyzer(request.analyzer) # type: ignore - LOGGER.info('analyzer_id_lat({:s})'.format(str(analyzer_id_lat))) + analyzer_id: AnalyzerId = analytics_frontend_client.StartAnalyzer(request.analyzer) # type: ignore + LOGGER.info('Analyzer_id:\n{:s}'.format(str(analyzer_id))) except grpc.RpcError as ex: + LOGGER.exception(f'Unable to start Analyzer:\n{str(request.analyzer)}') if ex.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member - LOGGER.exception('Unable to start analyzer({:s})'.format(str(request.analyzer))) context_client.close() analytics_frontend_client.close() - return None + return self._zsm_create_response_empty() # Create a policy try: - LOGGER.info('policy({:s})'.format(str(request.policy))) - # PolicyRuleCondition - policyRuleCondition = PolicyRuleCondition() - # policyRuleCondition.kpiId.kpi_id.uuid = request.analyzer.output_kpi_ids[0].kpi_id.uuid - # policyRuleCondition.numericalOperator = 5 - # policyRuleCondition.kpiValue.floatVal = 300 - # request.policy.policyRuleBasic.conditionList.append(policyRuleCondition) - LOGGER.info('policy after({:s})'.format(str(request.policy))) - + LOGGER.info(f'Policy:\n{str(request.policy)}') policy_rule_state: PolicyRuleState = policy_client.PolicyAddService(request.policy) # type: ignore - LOGGER.info('policy_rule_state({:s})'.format(str(policy_rule_state))) - except grpc.RpcError as ex: - if ex.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member - LOGGER.exception('Unable to create policy({:s})'.format(str(request.policy))) + LOGGER.info(f'Policy rule state:\n{policy_rule_state}') + except Exception as ex: + LOGGER.exception(f'Unable to create policy:\n{str(request.policy)}') + LOGGER.exception(ex.code()) + # ToDo: Investigate why PolicyAddService throws exception + # if ex.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member context_client.close() policy_client.close() - return None + return self._zsm_create_response_empty() context_client.close() analytics_frontend_client.close() policy_client.close() - return ZSMService() + return self._zsm_create_response(request) def zsmDelete(self): LOGGER.info('zsmDelete method') @@ -97,3 +91,13 @@ class P4INTZSMPlugin(_ZSMHandler): def zsmGetByService(self): LOGGER.info('zsmGetByService method') + + def _zsm_create_response(self, request): + response = ZSMService() + automation_id = str(uuid4()) + response.zsmServiceId.uuid.uuid = automation_id + response.serviceId.service_uuid.uuid = request.target_service_id.service_uuid.uuid + return response + + def _zsm_create_response_empty(self): + return ZSMService() \ No newline at end of file diff --git a/src/automation/service/zsm_handlers/__init__.py b/src/automation/service/zsm_handlers/__init__.py index ae96f895eec410ee2788e47cfedb5abf8353af3a..79e703ba8e860e13f43cb7f207b11fd5f26b38ba 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. @@ -15,12 +15,19 @@ from common.proto.context_pb2 import ServiceTypeEnum from ..zsm_handler_api.ZSMFilterFields import ZSMFilterFieldEnum from automation.service.zsm_handlers.P4INTZSMPlugin import P4INTZSMPlugin +from automation.service.zsm_handlers.OpticalZSMPlugin import OpticalZSMPlugin ZSM_SERVICE_HANDLERS = [ (P4INTZSMPlugin, [ { - ZSMFilterFieldEnum.TARGET_SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_L2NM, + ZSMFilterFieldEnum.TARGET_SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_L2NM, ZSMFilterFieldEnum.TELEMETRY_SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_INT, } + ]), + (OpticalZSMPlugin, [ + { + ZSMFilterFieldEnum.TARGET_SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY, + ZSMFilterFieldEnum.TELEMETRY_SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY, + } ]) ] diff --git a/src/automation/tests/test_automation_handlers.py b/src/automation/tests/test_automation_handlers.py index 16fbcb255bbfb03829f48ed8901cb23c5161deaa..516a6b5e05fb6dd292fcb67fe276dfdec1af4455 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. @@ -38,7 +38,7 @@ ZSM_SERVICE_HANDLERS = [ def test_get_service_handler_based_on_service_types(): automation = AutomationServiceServicerImpl() - handler_cls = automation.get_service_handler_based_on_service_types(ServiceTypeEnum.SERVICETYPE_INT, ServiceTypeEnum.SERVICETYPE_L2NM , ZSM_SERVICE_HANDLERS) + handler_cls = automation.get_service_handler_based_on_service_types(ServiceTypeEnum.SERVICETYPE_INT, ServiceTypeEnum.SERVICETYPE_L2NM, ZSM_SERVICE_HANDLERS) if handler_cls: assert True else: @@ -48,7 +48,7 @@ def test_get_service_handler_based_on_service_types(): def test_get_service_handler_based_on_service_types_error(): automation = AutomationServiceServicerImpl() - handler_cls = automation.get_service_handler_based_on_service_types(ServiceTypeEnum.SERVICETYPE_INT , ServiceTypeEnum.SERVICETYPE_L2NM , ZSM_SERVICE_HANDLERS) + handler_cls = automation.get_service_handler_based_on_service_types(ServiceTypeEnum.SERVICETYPE_INT, ServiceTypeEnum.SERVICETYPE_L2NM, ZSM_SERVICE_HANDLERS) if handler_cls: assert True else: @@ -61,7 +61,7 @@ def test_check_if_requested_services_pass_filter_criteria(): } automation = AutomationServiceServicerImpl() - flag = automation.check_if_requested_services_pass_filter_criteria(filter , ServiceTypeEnum.SERVICETYPE_L2NM , ServiceTypeEnum.SERVICETYPE_INT) + flag = automation.check_if_requested_services_pass_filter_criteria(filter, ServiceTypeEnum.SERVICETYPE_L2NM, ServiceTypeEnum.SERVICETYPE_INT) if flag: assert True @@ -75,7 +75,7 @@ def test_check_if_requested_services_pass_filter_criteria_error(): } automation = AutomationServiceServicerImpl() - flag = automation.check_if_requested_services_pass_filter_criteria(filter , ServiceTypeEnum.SERVICETYPE_INT , ServiceTypeEnum.SERVICETYPE_L2NM) + flag = automation.check_if_requested_services_pass_filter_criteria(filter, ServiceTypeEnum.SERVICETYPE_INT, ServiceTypeEnum.SERVICETYPE_L2NM) if flag: assert False diff --git a/src/common/DeviceTypes.py b/src/common/DeviceTypes.py index a8006b3da7dba0dc990574ff07f08816a6257712..8e1cf6758082dd408a8e05d49dd053f3f218ec8c 100644 --- a/src/common/DeviceTypes.py +++ b/src/common/DeviceTypes.py @@ -33,10 +33,14 @@ 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' EMULATED_XR_CONSTELLATION = 'emu-xr-constellation' + EMULATED_ORAN_DU = 'oran-du' + EMULATED_ORAN_CU = 'oran-cu' + EMULATED_ORAN_CN = 'oran-cn' # Real device types CLIENT = 'client' @@ -51,6 +55,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' diff --git a/src/common/tools/context_queries/Slice.py b/src/common/tools/context_queries/Slice.py index 4635bfa2c3649fae143c377031ac35c1be790ca5..ee5a0ac94ff6b025e6493045f7b5d9e37c1b8969 100644 --- a/src/common/tools/context_queries/Slice.py +++ b/src/common/tools/context_queries/Slice.py @@ -144,7 +144,7 @@ def get_slice_by_defualt_id( include_subslice_ids=include_subslice_ids, include_config_rules=include_config_rules) -def get_slice_by_defualt_name( +def get_slice_by_default_name( context_client : ContextClient, slice_name : str, context_uuid : str = DEFAULT_CONTEXT_NAME, rw_copy : bool = False, include_endpoint_ids : bool = True, include_constraints : bool = True, include_service_ids : bool = True, include_subslice_ids : bool = True, include_config_rules : bool = True diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index 5de78ef231b21d9e24efb90dfc1630f31d86a2f6..5a8e6821510b911cfd8e8a02c02e8f769fb39f77 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -18,13 +18,11 @@ from kafka.admin import KafkaAdminClient, NewTopic from kafka.errors import TopicAlreadyExistsError from common.Settings import get_setting - LOGGER = logging.getLogger(__name__) -KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-public.{:s}.svc.cluster.local:{:s}' +KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' KAFKA_TOPIC_NUM_PARTITIONS = 1 KAFKA_TOPIC_REPLICATION_FACTOR = 1 -#KAFKA_TOPIC_LIST_TIMEOUT = 5 KAFKA_TOPIC_CREATE_REQUEST_TIMEOUT = 60_000 # ms KAFKA_TOPIC_CREATE_WAIT_ITERATIONS = 10 KAFKA_TOPIC_CREATE_WAIT_TIME = 1 @@ -69,8 +67,6 @@ class KafkaTopic(Enum): LOGGER.debug('Kafka server address: {:s}'.format(str(KafkaConfig.get_kafka_address()))) kafka_admin_client = KafkaConfig.get_admin_client() - #topic_metadata = kafka_admin_client.list_topics(timeout=KAFKA_TOPIC_LIST_TIMEOUT) - #existing_topics = set(topic_metadata.topics.keys()) existing_topics = set(kafka_admin_client.list_topics()) LOGGER.debug('Existing Kafka topics: {:s}'.format(str(existing_topics))) @@ -122,8 +118,6 @@ class KafkaTopic(Enum): desired_topics = {topic.value for topic in KafkaTopic} missing_topics = set() for _ in range(KAFKA_TOPIC_CREATE_WAIT_ITERATIONS): - #topic_metadata = kafka_admin_client.list_topics(timeout=KAFKA_TOPIC_LIST_TIMEOUT) - #existing_topics = set(topic_metadata.topics.keys()) existing_topics = set(kafka_admin_client.list_topics()) LOGGER.debug('existing_topics={:s}'.format(str(existing_topics))) missing_topics = desired_topics.difference(existing_topics) diff --git a/src/common/tools/object_factory/PolicyRule.py b/src/common/tools/object_factory/PolicyRule.py index 7622cedb7338a93e8a314baa2c33e645b29e72de..371fc816d5c415979625a9206e81ceade7843b0d 100644 --- a/src/common/tools/object_factory/PolicyRule.py +++ b/src/common/tools/object_factory/PolicyRule.py @@ -22,19 +22,23 @@ def json_policyrule_id(policyrule_uuid : str) -> Dict: return {'uuid': {'uuid': policyrule_uuid}} def json_policyrule( - policyrule_uuid : str, policy_priority : int = 1, policy_kpi_id : str = '', - policy_state : PolicyRuleStateEnum = PolicyRuleStateEnum.POLICY_UNDEFINED, policy_state_message : str = '', - action_list : List[Dict] = [], service_id : Optional[Dict] = None, device_id_list : List[Dict] = [] + policyrule_uuid : str, + state : PolicyRuleStateEnum = PolicyRuleStateEnum.POLICY_UNDEFINED, state_message : str = '', + priority : int = 1, action_list : List[Dict] = [], list_kpi_id : List[str] = list(), + service_id : Optional[Dict] = None, device_id_list : List[Dict] = [] ) -> Dict: basic = { 'policyRuleId': json_policyrule_id(policyrule_uuid), 'policyRuleState': { - 'policyRuleState': policy_state, - 'policyRuleStateMessage': policy_state_message, + 'policyRuleState': state, + 'policyRuleStateMessage': state_message, }, - 'priority': policy_priority, - 'kpiId': {'kpi_id': {'uuid': policy_kpi_id}}, + 'policyRulePriority': priority, 'actionList': action_list, + 'policyRuleKpiList': [ + {'policyRuleKpiUuid': {'uuid': kpi_id}} + for kpi_id in list_kpi_id + ], } result = {} diff --git a/src/common/tools/rest_conf/client/RestConfClient.py b/src/common/tools/rest_conf/client/RestConfClient.py index 088bb4ae14c4308d11c07f4efb6e6ed1817995eb..953e68716b5c522145570aaa773c0942eb2fd6c5 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( 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 e3e4d0f452434509f8caa083fb39d529e4f7efbd..04a8b8bd9cb4dca5908029918393abfa27780b38 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 89cb8206e9d2126e6e5ef78b9a9fa89a940cf038..0dff60d3a7075a43d3b3abf70be1039d54461560 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 58384299cba8dfbee37dc776863d180153e83b45..1da9f7069b23e6034efc3406f24e7f14182c8137 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 9df57528f93a9e599da259d30d9fb88f618346a9..22e5b63d7c15e67fb54ab157c13c784e95972b54 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 f31305280e45cf2ec00756cb4c2c4116e869246f..ff9ddee50923278e86c8ad52fb6f68f358dbbd2b 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/common/type_checkers/Assertions.py b/src/common/type_checkers/Assertions.py index 478186059c542dec6d6197f8bce2addccfc25200..4ceb620a5430ecae9bc34d93678b9d4b048d4d8e 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/OpticalBand.py b/src/context/service/database/OpticalBand.py index 08b88d55b1e8023b2c82b9b2e933bd0a231859b8..6057adaadc5dcde14f9fb95f2a4b82cc51a7d04c 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/PolicyRule.py b/src/context/service/database/PolicyRule.py index 3a02e187e98cd504dcce39bedd802068a6862505..e488ac61455d8ebc95c26087f5ff50ab6e68da68 100644 --- a/src/context/service/database/PolicyRule.py +++ b/src/context/service/database/PolicyRule.py @@ -82,18 +82,22 @@ def policyrule_set(db_engine : Engine, messagebroker : MessageBroker, request : 'actionList': json_policyrule_basic.get('actionList', []), }, sort_keys=True) + policyrule_list_kpi_id = [ + kpi_id.policyRuleKpiUuid.uuid for kpi_id in policyrule_basic.policyRuleKpiList + ] + now = datetime.datetime.now(datetime.timezone.utc) policyrule_data = [{ - 'policyrule_uuid' : policyrule_uuid, - 'policyrule_kind' : policyrule_kind, - 'policyrule_state' : policyrule_state, - 'policyrule_state_msg': policyrule_state_msg, - 'policyrule_priority' : policyrule_basic.priority, - 'policyrule_kpi_id' : policyrule_basic.kpiId.kpi_id.uuid, - 'policyrule_eca_data' : policyrule_eca_data, - 'created_at' : now, - 'updated_at' : now, + 'policyrule_uuid' : policyrule_uuid, + 'policyrule_kind' : policyrule_kind, + 'policyrule_state' : policyrule_state, + 'policyrule_state_msg' : policyrule_state_msg, + 'policyrule_priority' : policyrule_basic.policyRulePriority, + 'policyrule_list_kpi_id' : policyrule_list_kpi_id, + 'policyrule_eca_data' : policyrule_eca_data, + 'created_at' : now, + 'updated_at' : now, }] policyrule_service_uuid = None @@ -117,12 +121,12 @@ def policyrule_set(db_engine : Engine, messagebroker : MessageBroker, request : stmt = stmt.on_conflict_do_update( index_elements=[PolicyRuleModel.policyrule_uuid], set_=dict( - policyrule_state = stmt.excluded.policyrule_state, - policyrule_state_msg = stmt.excluded.policyrule_state_msg, - policyrule_priority = stmt.excluded.policyrule_priority, - policyrule_kpi_id = stmt.excluded.policyrule_kpi_id, - policyrule_eca_data = stmt.excluded.policyrule_eca_data, - updated_at = stmt.excluded.updated_at, + policyrule_state = stmt.excluded.policyrule_state, + policyrule_state_msg = stmt.excluded.policyrule_state_msg, + policyrule_priority = stmt.excluded.policyrule_priority, + policyrule_list_kpi_id = stmt.excluded.policyrule_list_kpi_id, + policyrule_eca_data = stmt.excluded.policyrule_eca_data, + updated_at = stmt.excluded.updated_at, ) ) stmt = stmt.returning(PolicyRuleModel.created_at, PolicyRuleModel.updated_at) diff --git a/src/context/service/database/models/OpticalConfig/OpticalBandModel.py b/src/context/service/database/models/OpticalConfig/OpticalBandModel.py index 735869738053644d1d282a6b13fc9f31bc0d88e1..ba69d508d0e0dedfab2cb204a5f19b9c3f1f732e 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/context/service/database/models/PolicyRuleModel.py b/src/context/service/database/models/PolicyRuleModel.py index 4f6ead28037b5f293503b8f35ca84de33a77e93a..f8ead47dc8a84fd68f3b167671538d88fc1e13de 100644 --- a/src/context/service/database/models/PolicyRuleModel.py +++ b/src/context/service/database/models/PolicyRuleModel.py @@ -14,7 +14,7 @@ import enum, json from sqlalchemy import CheckConstraint, Column, DateTime, Enum, ForeignKey, Integer, String -from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.dialects.postgresql import ARRAY, UUID from sqlalchemy.orm import relationship from typing import Dict from .enums.PolicyRuleState import ORM_PolicyRuleStateEnum @@ -33,7 +33,7 @@ class PolicyRuleModel(_Base): policyrule_state = Column(Enum(ORM_PolicyRuleStateEnum), nullable=False) policyrule_state_msg = Column(String, nullable=False) policyrule_priority = Column(Integer, nullable=False) - policyrule_kpi_id = Column(String, nullable=False) + policyrule_list_kpi_id = Column(ARRAY(String, dimensions=1), nullable=False) policyrule_service_uuid = Column(ForeignKey('service.service_uuid', ondelete='RESTRICT'), nullable=True, index=True) policyrule_eca_data = Column(String, nullable=False) created_at = Column(DateTime, nullable=False) @@ -50,20 +50,30 @@ class PolicyRuleModel(_Base): return {'uuid': {'uuid': self.policyrule_uuid}} def dump(self) -> Dict: - # Load JSON-encoded Event-Condition-Action (ECA) model data and populate with policy basic details + # Load JSON-encoded Event-Condition-Action (ECA) model data policyrule_basic = json.loads(self.policyrule_eca_data) + + # Populate policy rule basic details policyrule_basic.update({ 'policyRuleId': self.dump_id(), 'policyRuleState': { 'policyRuleState': self.policyrule_state.value, 'policyRuleStateMessage': self.policyrule_state_msg, }, - 'priority': self.policyrule_priority, - 'kpiId': {'kpi_id': {'uuid': self.policyrule_kpi_id}}, + 'policyRulePriority': self.policyrule_priority, + 'policyRuleKpiList': [ + {'policyRuleKpiUuid': {'uuid': kpi_id}} + for kpi_id in self.policyrule_list_kpi_id + ] }) + + # Compose final Policy Rule result = { 'policyRuleBasic': policyrule_basic, - 'deviceList': [{'device_uuid': {'uuid': pr_d.device_uuid}} for pr_d in self.policyrule_devices], + 'deviceList': [ + {'device_uuid': {'uuid': pr_d.device_uuid}} + for pr_d in self.policyrule_devices + ], } if self.policyrule_kind == PolicyRuleKindEnum.SERVICE: result['serviceId'] = self.policyrule_service.dump_id() diff --git a/src/context/service/database/models/enums/DeviceDriver.py b/src/context/service/database/models/enums/DeviceDriver.py index faa8ace3af721368e843fd95a604f029d5534371..7f45d82ec6b264761fbb92fb19d1f21afcb868ea 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/context/service/database/models/enums/ServiceType.py b/src/context/service/database/models/enums/ServiceType.py index c672d160ff194f35b085971a0639f8d6c8470307..cf24a000f7a7dbedf58ac96800965e84b3081c40 100644 --- a/src/context/service/database/models/enums/ServiceType.py +++ b/src/context/service/database/models/enums/ServiceType.py @@ -36,6 +36,7 @@ class ORM_ServiceTypeEnum(enum.Enum): IP_LINK = ServiceTypeEnum.SERVICETYPE_IP_LINK IPOWDM = ServiceTypeEnum.SERVICETYPE_IPOWDM TAPI_LSP = ServiceTypeEnum.SERVICETYPE_TAPI_LSP + UPF = ServiceTypeEnum.SERVICETYPE_UPF grpc_to_enum__service_type = functools.partial( grpc_to_enum, ServiceTypeEnum, ORM_ServiceTypeEnum) diff --git a/src/context/tests/Objects.py b/src/context/tests/Objects.py index 2e7852548501dac4b334007ad49684bccbc0c33d..63155ca7d3a71c1e481b9d1c5712cefaffe35cf0 100644 --- a/src/context/tests/Objects.py +++ b/src/context/tests/Objects.py @@ -186,4 +186,4 @@ CONNECTION_R1_R3_NAME, CONNECTION_R1_R3_ID, CONNECTION_R1_R3 = compose_connectio # ----- PolicyRule ------------------------------------------------------------------------------------------------------- POLICYRULE_NAME = 'my-device-policy' POLICYRULE_ID = json_policyrule_id(POLICYRULE_NAME) -POLICYRULE = json_policyrule(POLICYRULE_NAME, policy_priority=1, policy_kpi_id='my-kpi-id') +POLICYRULE = json_policyrule(POLICYRULE_NAME, priority=1, list_kpi_id=['my-kpi-id-1']) diff --git a/src/context/tests/test_policy.py b/src/context/tests/test_policy.py index 45592308c11bbeb47d5eb3139a04b2eec793f0c9..65b097bb0e26950c128a5f7a7a581dc84fe89d45 100644 --- a/src/context/tests/test_policy.py +++ b/src/context/tests/test_policy.py @@ -45,9 +45,11 @@ def test_policy(context_client : ContextClient): # ----- Get when the object exists --------------------------------------------------------------------------------- response = context_client.GetPolicyRule(PolicyRuleId(**POLICYRULE_ID)) - assert response.device.policyRuleBasic.policyRuleId.uuid.uuid == policyrule_uuid - assert response.device.policyRuleBasic.priority == 1 - assert response.device.policyRuleBasic.kpiId.kpi_id.uuid == 'my-kpi-id' + policy_basic = response.device.policyRuleBasic + assert policy_basic.policyRuleId.uuid.uuid == policyrule_uuid + assert policy_basic.policyRulePriority == 1 + assert len(policy_basic.policyRuleKpiList) == 1 + assert policy_basic.policyRuleKpiList[0].policyRuleKpiUuid.uuid == 'my-kpi-id-1' # ----- List when the object exists -------------------------------------------------------------------------------- response = context_client.ListPolicyRuleIds(Empty()) @@ -56,16 +58,21 @@ def test_policy(context_client : ContextClient): response = context_client.ListPolicyRules(Empty()) assert len(response.policyRules) == 1 - assert response.policyRules[0].device.policyRuleBasic.policyRuleId.uuid.uuid == policyrule_uuid - assert response.policyRules[0].device.policyRuleBasic.priority == 1 - assert response.policyRules[0].device.policyRuleBasic.kpiId.kpi_id.uuid == 'my-kpi-id' + policy_basic = response.policyRules[0].device.policyRuleBasic + assert policy_basic.policyRuleId.uuid.uuid == policyrule_uuid + assert policy_basic.policyRulePriority == 1 + assert len(policy_basic.policyRuleKpiList) == 1 + assert policy_basic.policyRuleKpiList[0].policyRuleKpiUuid.uuid == 'my-kpi-id-1' # ----- Update the object ------------------------------------------------------------------------------------------ new_policy_priority = 100 - new_policy_kpi_id = 'new-kpi-id' + new_policy_list_kpi_id = ['my-kpi-id-1', 'my-kpi-id-2'] POLICYRULE_UPDATED = copy.deepcopy(POLICYRULE) - POLICYRULE_UPDATED['device']['policyRuleBasic']['priority'] = new_policy_priority - POLICYRULE_UPDATED['device']['policyRuleBasic']['kpiId']['kpi_id']['uuid'] = new_policy_kpi_id + POLICYRULE_UPDATED['device']['policyRuleBasic']['policyRulePriority'] = new_policy_priority + POLICYRULE_UPDATED['device']['policyRuleBasic']['policyRuleKpiList'] = [ + {'policyRuleKpiUuid': {'uuid': kpi_id}} + for kpi_id in new_policy_list_kpi_id + ] response = context_client.SetPolicyRule(PolicyRule(**POLICYRULE_UPDATED)) assert response.uuid.uuid == policyrule_uuid @@ -80,9 +87,12 @@ def test_policy(context_client : ContextClient): response = context_client.ListPolicyRules(Empty()) assert len(response.policyRules) == 1 - assert response.policyRules[0].device.policyRuleBasic.policyRuleId.uuid.uuid == policyrule_uuid - assert response.policyRules[0].device.policyRuleBasic.priority == new_policy_priority - assert response.policyRules[0].device.policyRuleBasic.kpiId.kpi_id.uuid == new_policy_kpi_id + policy_basic = response.policyRules[0].device.policyRuleBasic + assert policy_basic.policyRuleId.uuid.uuid == policyrule_uuid + assert policy_basic.policyRulePriority == new_policy_priority + assert len(policy_basic.policyRuleKpiList) == 2 + for i,kpi_id in enumerate(new_policy_list_kpi_id): + assert policy_basic.policyRuleKpiList[i].policyRuleKpiUuid.uuid == kpi_id # ----- Remove the object ------------------------------------------------------------------------------------------ context_client.RemovePolicyRule(PolicyRuleId(**POLICYRULE_ID)) diff --git a/src/device/service/driver_api/DriverFactory.py b/src/device/service/driver_api/DriverFactory.py index 38ae0ac562bce400ce4fd57d06c93d09a682a3a0..fefa3cd919bf3ec13302c13b8cac703a5faf948c 100644 --- a/src/device/service/driver_api/DriverFactory.py +++ b/src/device/service/driver_api/DriverFactory.py @@ -14,8 +14,7 @@ import logging from enum import Enum -from typing import Any, Dict, Iterable, List, Optional, Set, Tuple, Type -from ._Driver import _Driver +from typing import TYPE_CHECKING, Any, Dict, Iterable, List, Optional, Set, Tuple, Type from .Exceptions import ( AmbiguousFilterException, EmptyFilterFieldException, UnsatisfiedFilterException, UnsupportedDriverClassException, @@ -23,12 +22,20 @@ from .Exceptions import ( ) from .FilterFields import FILTER_FIELD_ALLOWED_VALUES, FilterFieldEnum +if TYPE_CHECKING: + from ._Driver import _Driver + LOGGER = logging.getLogger(__name__) SUPPORTED_FILTER_FIELDS = set(FILTER_FIELD_ALLOWED_VALUES.keys()) +def check_is_class_valid(driver_class : Type['_Driver']) -> None: + from ._Driver import _Driver + if not issubclass(driver_class, _Driver): + raise UnsupportedDriverClassException(str(driver_class)) + def sanitize_filter_fields( filter_fields : Dict[FilterFieldEnum, Any], driver_name : Optional[str] = None ) -> Dict[FilterFieldEnum, Any]: @@ -67,14 +74,13 @@ def sanitize_filter_fields( class DriverFactory: def __init__( - self, drivers : List[Tuple[Type[_Driver], List[Dict[FilterFieldEnum, Any]]]] + self, drivers : List[Tuple[Type['_Driver'], List[Dict[FilterFieldEnum, Any]]]] ) -> None: - self.__drivers : List[Tuple[Type[_Driver], Dict[FilterFieldEnum, Any]]] = list() + self.__drivers : List[Tuple[Type['_Driver'], Dict[FilterFieldEnum, Any]]] = list() for driver_class,filter_field_sets in drivers: - #if not issubclass(driver_class, _Driver): - # raise UnsupportedDriverClassException(str(driver_class)) - driver_name = driver_class #.__name__ + check_is_class_valid(driver_class) + driver_name = driver_class.__name__ for filter_fields in filter_field_sets: filter_fields = {k.value:v for k,v in filter_fields.items()} @@ -86,7 +92,7 @@ class DriverFactory: def is_driver_compatible( self, driver_filter_fields : Dict[FilterFieldEnum, Any], - selection_filter_fields : Dict[FilterFieldEnum, Any] + selection_filter_fields : Dict[FilterFieldEnum, Any] ) -> bool: # by construction empty driver_filter_fields are not allowed # by construction empty selection_filter_fields are not allowed @@ -102,7 +108,7 @@ class DriverFactory: return True - def get_driver_class(self, **selection_filter_fields) -> _Driver: + def get_driver_class(self, **selection_filter_fields) -> '_Driver': sanitized_filter_fields = sanitize_filter_fields(selection_filter_fields) compatible_drivers : List[Tuple[Type[_Driver], Dict[FilterFieldEnum, Any]]] = [ diff --git a/src/device/service/driver_api/Exceptions.py b/src/device/service/driver_api/Exceptions.py index 8f33ebc57d040b3906997cfbc73a1d79a02dab41..86c2afcef1833efa0311278318388ebe930abbf5 100644 --- a/src/device/service/driver_api/Exceptions.py +++ b/src/device/service/driver_api/Exceptions.py @@ -13,22 +13,22 @@ # limitations under the License. class UnsatisfiedFilterException(Exception): - def __init__(self, filter_fields): + def __init__(self, filter_fields) -> None: msg = 'No Driver satisfies FilterFields({:s})' super().__init__(msg.format(str(filter_fields))) class AmbiguousFilterException(Exception): - def __init__(self, filter_fields, compatible_drivers): + def __init__(self, filter_fields, compatible_drivers) -> None: msg = 'Multiple Drivers satisfy FilterFields({:s}): {:s}' super().__init__(msg.format(str(filter_fields), str(compatible_drivers))) class UnsupportedDriverClassException(Exception): - def __init__(self, driver_class_name): + def __init__(self, driver_class_name) -> None: msg = 'Class({:s}) is not a subclass of _Driver' super().__init__(msg.format(str(driver_class_name))) class EmptyFilterFieldException(Exception): - def __init__(self, filter_fields, driver_class_name=None): + def __init__(self, filter_fields, driver_class_name=None) -> None: if driver_class_name: msg = 'Empty FilterField({:s}) specified by Driver({:s}) is not supported' msg = msg.format(str(filter_fields), str(driver_class_name)) @@ -38,7 +38,7 @@ class EmptyFilterFieldException(Exception): super().__init__(msg) class UnsupportedFilterFieldException(Exception): - def __init__(self, unsupported_filter_fields, driver_class_name=None): + def __init__(self, unsupported_filter_fields, driver_class_name=None) -> None: if driver_class_name: msg = 'FilterFields({:s}) specified by Driver({:s}) are not supported' msg = msg.format(str(unsupported_filter_fields), str(driver_class_name)) @@ -48,7 +48,9 @@ class UnsupportedFilterFieldException(Exception): super().__init__(msg) class UnsupportedFilterFieldValueException(Exception): - def __init__(self, filter_field_name, filter_field_value, allowed_filter_field_values, driver_class_name=None): + def __init__( + self, filter_field_name, filter_field_value, allowed_filter_field_values, driver_class_name=None + ) -> None: if driver_class_name: msg = 'FilterField({:s}={:s}) specified by Driver({:s}) is not supported. Allowed values are {:s}' msg = msg.format( @@ -60,24 +62,24 @@ class UnsupportedFilterFieldValueException(Exception): super().__init__(msg) class DriverInstanceCacheTerminatedException(Exception): - def __init__(self): + def __init__(self) -> None: msg = 'DriverInstanceCache is terminated. No new instances can be processed.' super().__init__(msg) class UnsupportedResourceKeyException(Exception): - def __init__(self, resource_key): + def __init__(self, resource_key) -> None: msg = 'ResourceKey({:s}) not supported' msg = msg.format(str(resource_key)) super().__init__(msg) class ConfigFieldNotFoundException(Exception): - def __init__(self, config_field_name): + def __init__(self, config_field_name) -> None: msg = 'ConfigField({:s}) not specified in resource' msg = msg.format(str(config_field_name)) super().__init__(msg) class ConfigFieldsNotSupportedException(Exception): - def __init__(self, config_fields): + def __init__(self, config_fields) -> None: msg = 'ConfigFields({:s}) not supported in resource' msg = msg.format(str(config_fields)) super().__init__(msg) diff --git a/src/device/service/drivers/__init__.py b/src/device/service/drivers/__init__.py index ba5298292fbccb04381050c82c388fa2d3ee39c7..ff0419a3e50d64141e6dd6b3d2cf5bccd4fbf6ab 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, + } + ])) diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/Acl.py b/src/device/service/drivers/gnmi_openconfig/handlers/Acl.py index 06061a0b82f3a9c2f0c123a5350d68b0fa663457..0e6f31ff73da12ee91ae06deeab54db5715f7602 100644 --- a/src/device/service/drivers/gnmi_openconfig/handlers/Acl.py +++ b/src/device/service/drivers/gnmi_openconfig/handlers/Acl.py @@ -30,7 +30,8 @@ _TFS_OC_RULE_TYPE = { _TFS_OC_FWD_ACTION = { 'ACLFORWARDINGACTION_DROP': 'DROP', 'ACLFORWARDINGACTION_ACCEPT': 'ACCEPT', - 'ACLFORWARDINGACTION_REJECT': 'REJECT', + #'ACLFORWARDINGACTION_REJECT': 'REJECT', # Correct according to OpenConfig. + 'ACLFORWARDINGACTION_REJECT': 'DROP', # - Arista EOS only supports ACCEPT/DROP } _OC_TFS_RULE_TYPE = {v: k for k, v in _TFS_OC_RULE_TYPE.items()} @@ -89,7 +90,7 @@ 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.get('match', dict()) 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') @@ -110,10 +111,9 @@ class AclHandler(_Handler): if src_port or dst_port: y_trans = y_e.create_path('transport') if src_port: - y_trans.create_path("config/source-port", int(src_port)) + y_trans.create_path('config/source-port', int(src_port)) if dst_port: - y_trans.create_path("config/destination-port", int(dst_port)) - y_ipv4.create_path('config/protocol', int(proto)) + y_trans.create_path('config/destination-port', int(dst_port)) y_act = y_e.create_path('actions') y_act.create_path('config/forwarding-action', act) @@ -183,14 +183,24 @@ class AclHandler(_Handler): act = ace.get('actions', {}).get('config', {}).get('forwarding-action', 'DROP') fwd_tfs = _OC_TFS_FWD_ACTION[act] ipv4_cfg = ace.get('ipv4', {}).get('config', {}) + transport_cfg = ace.get('transport', {}).get('config', {}) + + match_conditions = dict() + if 'source-address' in ipv4_cfg: + match_conditions['src_address'] = ipv4_cfg['source-address'] + if 'destination-address' in ipv4_cfg: + match_conditions['dst_address'] = ipv4_cfg['destination-address'] + if 'protocol' in ipv4_cfg: + match_conditions['protocol'] = ipv4_cfg['protocol'] + if 'source-port' in transport_cfg: + match_conditions['src_port'] = transport_cfg['source-port'] + if 'destination-port' in transport_cfg: + match_conditions['dst_port'] = transport_cfg['destination-port'] rule_set['entries'].append( { 'sequence_id': seq, - 'match': { - 'src_address': ipv4_cfg.get('source-address', ''), - 'dst_address': ipv4_cfg.get('destination-address', ''), - }, + 'match': match_conditions, 'action': {'forward_action': fwd_tfs}, } ) diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/InterfaceSwitchedVlan.py b/src/device/service/drivers/gnmi_openconfig/handlers/InterfaceSwitchedVlan.py new file mode 100644 index 0000000000000000000000000000000000000000..7a782b8816037ecaf25baa704bbed82fc6786b27 --- /dev/null +++ b/src/device/service/drivers/gnmi_openconfig/handlers/InterfaceSwitchedVlan.py @@ -0,0 +1,104 @@ +# 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, re +from typing import Any, Dict, List, Tuple +from ._Handler import _Handler +from .Tools import get_str +from .YangHandler import YangHandler + +LOGGER = logging.getLogger(__name__) + +RE_IF_SWITCHED_VLAN = re.compile(r'^/interface\[(?:name=)?([^\]]+)\]/ethernet/switched-vlan$') + +class InterfaceSwitchedVlanHandler(_Handler): + def get_resource_key(self) -> str: return '/interface/ethernet/switched-vlan' + def get_path(self) -> str: return '/openconfig-interfaces:interfaces/interface/ethernet/switched-vlan' + + def _get_interface_name(self, resource_key : str, resource_value : Dict) -> str: + if 'name' in resource_value: + return get_str(resource_value, 'name') + if 'interface' in resource_value: + return get_str(resource_value, 'interface') + match = RE_IF_SWITCHED_VLAN.match(resource_key) + if match is None: + MSG = 'Interface name not found in resource_key={:s} resource_value={:s}' + raise Exception(MSG.format(str(resource_key), str(resource_value))) + return match.groups()[0] + + def _normalize_config(self, resource_value : Dict) -> Dict[str, Any]: + config = resource_value.get('config') + if isinstance(config, dict): + return config + + interface_mode = resource_value.get('interface-mode', resource_value.get('interface_mode')) + if interface_mode is None: + raise Exception('interface-mode is required for switched-vlan config') + interface_mode = str(interface_mode).upper() + + config = {'interface-mode': interface_mode} + if interface_mode == 'ACCESS': + access_vlan = resource_value.get('access-vlan', resource_value.get('access_vlan')) + if access_vlan is None: + raise Exception('access-vlan is required for ACCESS mode') + config['access-vlan'] = int(access_vlan) + elif interface_mode == 'TRUNK': + native_vlan = resource_value.get('native-vlan', resource_value.get('native_vlan', 1)) + config['native-vlan'] = int(native_vlan) + trunk_vlans = resource_value.get('trunk-vlans', resource_value.get('trunk_vlans')) + if trunk_vlans is None: + trunk_vlan = resource_value.get('trunk-vlan', resource_value.get('trunk_vlan')) + trunk_vlans = [trunk_vlan] if trunk_vlan is not None else [] + if not isinstance(trunk_vlans, list): + trunk_vlans = [trunk_vlans] + config['trunk-vlans'] = [int(vlan) for vlan in trunk_vlans if vlan is not None] + else: + raise Exception('Unsupported interface-mode: {:s}'.format(str(interface_mode))) + + return config + + def compose( + self, resource_key : str, resource_value : Dict, yang_handler : YangHandler, delete : bool = False + ) -> Tuple[str, str]: + if_name = self._get_interface_name(resource_key, resource_value) + str_path = '/interfaces/interface[name={:s}]/ethernet/switched-vlan'.format(if_name) + if delete: + return str_path, json.dumps({}) + + config = self._normalize_config(resource_value) + str_data = json.dumps({'config': config}) + return str_path, str_data + + def parse( + self, json_data : Dict, yang_handler : YangHandler + ) -> List[Tuple[str, Dict[str, Any]]]: + json_data_valid = yang_handler.parse_to_dict( + '/openconfig-interfaces:interfaces', json_data, fmt='json', strict=False + ) + + entries = [] + for interface in json_data_valid.get('interfaces', {}).get('interface', []): + interface_name = interface['name'] + ethernet = interface.get('ethernet', {}) + switched_vlan = ethernet.get('switched-vlan') + if switched_vlan is None: + continue + entry_key = '/interface[{:s}]/ethernet/switched-vlan'.format(interface_name) + entry_value = {} + if 'config' in switched_vlan: + entry_value['config'] = switched_vlan['config'] + if 'state' in switched_vlan: + entry_value['state'] = switched_vlan['state'] + entries.append((entry_key, entry_value)) + return entries diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/Mpls.py b/src/device/service/drivers/gnmi_openconfig/handlers/Mpls.py new file mode 100644 index 0000000000000000000000000000000000000000..cadf35ce8ffff5281d0e5aaecebb8380eb000e40 --- /dev/null +++ b/src/device/service/drivers/gnmi_openconfig/handlers/Mpls.py @@ -0,0 +1,121 @@ +# 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, re +from typing import Any, Dict, List, Tuple +from ._Handler import _Handler +from .Tools import get_int, get_str +from .YangHandler import YangHandler + +LOGGER = logging.getLogger(__name__) + +RE_MPLS_INTERFACE = re.compile(r'^/mpls/interface\[([^\]]+)\]$') +DEFAULT_NETWORK_INSTANCE = 'default' + +class MplsHandler(_Handler): + def get_resource_key(self) -> str: return '/mpls' + def get_path(self) -> str: + return '/openconfig-network-instance:network-instances/network-instance/mpls' + + def compose( + self, resource_key : str, resource_value : Dict, yang_handler : YangHandler, delete : bool = False + ) -> Tuple[str, str]: + """ + Compose MPLS (global or per-interface) configuration. + - Global: set LDP router-id (lsr-id) and optional hello timers. + - Interface: set LDP interface-id and optional hello timers. + """ + ni_name = get_str(resource_value, 'network_instance', DEFAULT_NETWORK_INSTANCE) + ni_type = get_str(resource_value, 'network_instance_type') + if ni_type is None and ni_name == DEFAULT_NETWORK_INSTANCE: + ni_type = 'openconfig-network-instance-types:DEFAULT_INSTANCE' + + yang_nis : Any = yang_handler.get_data_path('/openconfig-network-instance:network-instances') + yang_ni : Any = yang_nis.create_path('network-instance[name="{:s}"]'.format(ni_name)) + yang_ni.create_path('config/name', ni_name) + if ni_type is not None: + yang_ni.create_path('config/type', ni_type) + + match_if = RE_MPLS_INTERFACE.match(resource_key) + if delete: + if match_if: + if_name = match_if.group(1) + str_path = ( + '/network-instances/network-instance[name={:s}]/mpls/signaling-protocols/ldp' + '/interface-attributes/interfaces/interface[interface-id={:s}]' + ).format(ni_name, if_name) + else: + str_path = '/network-instances/network-instance[name={:s}]/mpls'.format(ni_name) + return str_path, json.dumps({}) + + if match_if: + if_name = match_if.group(1) + hello_interval = get_int(resource_value, 'hello_interval') + hello_holdtime = get_int(resource_value, 'hello_holdtime') + + path_if_base = ( + 'mpls/signaling-protocols/ldp/interface-attributes/interfaces' + '/interface[interface-id="{:s}"]/config' + ).format(if_name) + yang_ni.create_path('{:s}/interface-id'.format(path_if_base), if_name) + if hello_interval is not None: + yang_ni.create_path('{:s}/hello-interval'.format(path_if_base), hello_interval) + if hello_holdtime is not None: + yang_ni.create_path('{:s}/hello-holdtime'.format(path_if_base), hello_holdtime) + + yang_if : Any = yang_ni.find_path( + 'mpls/signaling-protocols/ldp/interface-attributes/interfaces' + '/interface[interface-id="{:s}"]'.format(if_name) + ) + + str_path = ( + '/network-instances/network-instance[name={:s}]/mpls/signaling-protocols/ldp' + '/interface-attributes/interfaces/interface[interface-id={:s}]' + ).format(ni_name, if_name) + json_data = json.loads(yang_if.print_mem('json')) + json_data = json_data['openconfig-network-instance:interface'][0] + str_data = json.dumps(json_data) + return str_path, str_data + + # Global LDP configuration + ldp_cfg = resource_value.get('ldp', resource_value) + lsr_id = get_str(ldp_cfg, 'lsr_id') + hello_interval = get_int(ldp_cfg, 'hello_interval') + hello_holdtime = get_int(ldp_cfg, 'hello_holdtime') + + if lsr_id is not None: + yang_ni.create_path('mpls/signaling-protocols/ldp/global/config/lsr-id', lsr_id) + if hello_interval is not None: + yang_ni.create_path( + 'mpls/signaling-protocols/ldp/interface-attributes/config/hello-interval', hello_interval + ) + if hello_holdtime is not None: + yang_ni.create_path( + 'mpls/signaling-protocols/ldp/interface-attributes/config/hello-holdtime', hello_holdtime + ) + + yang_ldp : Any = yang_ni.find_path('mpls/signaling-protocols/ldp') + + str_path = '/network-instances/network-instance[name={:s}]/mpls/signaling-protocols/ldp'.format(ni_name) + json_data = json.loads(yang_ldp.print_mem('json')) + json_data = json_data['openconfig-network-instance:ldp'] + str_data = json.dumps(json_data) + return str_path, str_data + + def parse( + self, json_data : Dict, yang_handler : YangHandler + ) -> List[Tuple[str, Dict[str, Any]]]: + LOGGER.debug('[parse] json_data = %s', json.dumps(json_data)) + # Not required for current tests (L2VPN validation focuses on SetConfig). + return [] diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceConnectionPoint.py b/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceConnectionPoint.py new file mode 100644 index 0000000000000000000000000000000000000000..3ff259c5dd0b8e82d7aa0f112826a79c0312fe35 --- /dev/null +++ b/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceConnectionPoint.py @@ -0,0 +1,57 @@ +# 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 +from typing import Any, Dict, List, Tuple +from ._Handler import _Handler +from .Tools import get_str +from .YangHandler import YangHandler + +LOGGER = logging.getLogger(__name__) + +class NetworkInstanceConnectionPointHandler(_Handler): + def get_resource_key(self) -> str: return '/network_instance/connection_point' + def get_path(self) -> str: + return '/openconfig-network-instance:network-instances/network-instance/connection-points/connection-point' + + def compose( + self, resource_key : str, resource_value : Dict, yang_handler : YangHandler, delete : bool = False + ) -> Tuple[str, str]: + ni_name = get_str(resource_value, 'name') + cp_id = get_str(resource_value, 'connection_point_id') + + str_path = ( + '/network-instances/network-instance[name={:s}]/connection-points' + '/connection-point[connection-point-id={:s}]' + ).format(ni_name, cp_id) + if delete: + return str_path, json.dumps({}) + + yang_nis : Any = yang_handler.get_data_path('/openconfig-network-instance:network-instances') + path_cp_base = ( + 'network-instance[name="{:s}"]/connection-points' + '/connection-point[connection-point-id="{:s}"]' + ).format(ni_name, cp_id) + yang_nis.create_path('{:s}/config/connection-point-id'.format(path_cp_base), cp_id) + + yang_cp : Any = yang_nis.find_path(path_cp_base) + json_data = json.loads(yang_cp.print_mem('json')) + json_data = json_data['openconfig-network-instance:connection-point'][0] + return str_path, json.dumps(json_data) + + def parse( + self, json_data : Dict, yang_handler : YangHandler + ) -> List[Tuple[str, Dict[str, Any]]]: + LOGGER.debug('[parse] json_data = %s', json.dumps(json_data)) + return [] diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceEndpoint.py b/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceEndpoint.py new file mode 100644 index 0000000000000000000000000000000000000000..81ffe524e77843348c140c897a88d5fa0e96f39d --- /dev/null +++ b/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceEndpoint.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. + +import json, logging +from typing import Any, Dict, List, Tuple +from ._Handler import _Handler +from .Tools import get_int, get_str +from .YangHandler import YangHandler + +LOGGER = logging.getLogger(__name__) + +class NetworkInstanceEndpointHandler(_Handler): + def get_resource_key(self) -> str: return '/network_instance/connection_point/endpoint' + def get_path(self) -> str: + return '/openconfig-network-instance:network-instances/network-instance/connection-points/connection-point/endpoints/endpoint' + + def compose( + self, resource_key : str, resource_value : Dict, yang_handler : YangHandler, delete : bool = False + ) -> Tuple[str, str]: + ni_name = get_str(resource_value, 'name') + cp_id = get_str(resource_value, 'connection_point_id') + ep_id = get_str(resource_value, 'endpoint_id') + ep_type = get_str(resource_value, 'type') + precedence = get_int(resource_value, 'precedence') + + str_path = ( + '/network-instances/network-instance[name={:s}]/connection-points/connection-point' + '[connection-point-id={:s}]/endpoints/endpoint[endpoint-id={:s}]' + ).format(ni_name, cp_id, ep_id) + if delete: + return str_path, json.dumps({}) + + if ep_type is not None and ':' not in ep_type: + ep_type = 'openconfig-network-instance-types:{:s}'.format(ep_type) + + yang_nis : Any = yang_handler.get_data_path('/openconfig-network-instance:network-instances') + path_ep_base = ( + 'network-instance[name="{:s}"]/connection-points/connection-point[connection-point-id="{:s}"]' + '/endpoints/endpoint[endpoint-id="{:s}"]' + ).format(ni_name, cp_id, ep_id) + yang_nis.create_path('{:s}/config/endpoint-id'.format(path_ep_base), ep_id) + if ep_type is not None: + yang_nis.create_path('{:s}/config/type'.format(path_ep_base), ep_type) + if precedence is not None: + yang_nis.create_path('{:s}/config/precedence'.format(path_ep_base), precedence) + + if ep_type and ep_type.endswith('LOCAL'): + if_name = get_str(resource_value, 'interface') + sif_index = get_int(resource_value, 'subinterface', 0) + if if_name is not None: + yang_nis.create_path('{:s}/local/config/interface'.format(path_ep_base), if_name) + yang_nis.create_path('{:s}/local/config/subinterface'.format(path_ep_base), sif_index) + site_id = get_int(resource_value, 'site_id') + if site_id is not None: + yang_nis.create_path('{:s}/local/config/site-id'.format(path_ep_base), site_id) + elif ep_type and ep_type.endswith('REMOTE'): + remote_system = get_str(resource_value, 'remote_system') + vc_id = get_int(resource_value, 'virtual_circuit_id') + if remote_system is not None: + yang_nis.create_path('{:s}/remote/config/remote-system'.format(path_ep_base), remote_system) + if vc_id is not None: + yang_nis.create_path( + '{:s}/remote/config/virtual-circuit-identifier'.format(path_ep_base), vc_id + ) + site_id = get_int(resource_value, 'site_id') + if site_id is not None: + yang_nis.create_path('{:s}/remote/config/site-id'.format(path_ep_base), site_id) + + yang_ep : Any = yang_nis.find_path(path_ep_base) + json_data = json.loads(yang_ep.print_mem('json')) + json_data = json_data['openconfig-network-instance:endpoint'][0] + return str_path, json.dumps(json_data) + + def parse( + self, json_data : Dict, yang_handler : YangHandler + ) -> List[Tuple[str, Dict[str, Any]]]: + LOGGER.debug('[parse] json_data = %s', json.dumps(json_data)) + return [] diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceVlan.py b/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceVlan.py new file mode 100644 index 0000000000000000000000000000000000000000..a9e3fb0092ba26106873b5e3793ea28a311f795b --- /dev/null +++ b/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceVlan.py @@ -0,0 +1,66 @@ +# 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 +from typing import Any, Dict, List, Tuple, Union +from ._Handler import _Handler +from .Tools import get_int, get_str +from .YangHandler import YangHandler + +LOGGER = logging.getLogger(__name__) + +class NetworkInstanceVlanHandler(_Handler): + def get_resource_key(self) -> str: return '/network_instance/vlan' + def get_path(self) -> str: + return '/openconfig-network-instance:network-instances/network-instance/vlans/vlan' + + def compose( + self, resource_key : str, resource_value : Dict, yang_handler : YangHandler, delete : bool = False + ) -> Tuple[str, str]: + ni_name = get_str(resource_value, 'name', 'default') + vlan_id = get_int(resource_value, 'vlan_id') + vlan_name = get_str(resource_value, 'vlan_name') + str_path = '/network-instances/network-instance[name={:s}]/vlans/vlan[vlan-id={:d}]'.format( + ni_name, vlan_id + ) + if delete: + yang_nis : Any = yang_handler.get_data_path('/openconfig-network-instance:network-instances') + yang_vlan = yang_nis.find_path('network-instance[name="{:s}"]/vlans/vlan[vlan-id="{:d}"]'.format( + ni_name, vlan_id)) + if yang_vlan is not None: + yang_vlan.unlink() + yang_vlan.free() + return str_path, json.dumps({}) + + yang_nis : Any = yang_handler.get_data_path('/openconfig-network-instance:network-instances') + yang_ni : Any = yang_nis.create_path('network-instance[name="{:s}"]'.format(ni_name)) + yang_ni.create_path('config/name', ni_name) + if ni_name == 'default': + yang_ni.create_path('config/type', 'openconfig-network-instance-types:DEFAULT_INSTANCE') + + yang_vlans : Any = yang_ni.create_path('vlans') + yang_vlan : Any = yang_vlans.create_path('vlan[vlan-id="{:d}"]'.format(vlan_id)) + yang_vlan.create_path('config/vlan-id', vlan_id) + if vlan_name is not None: + yang_vlan.create_path('config/name', vlan_name) + + json_data = json.loads(yang_vlan.print_mem('json')) + json_data = json_data['openconfig-network-instance:vlan'][0] + return str_path, json.dumps(json_data) + + def parse( + self, json_data : Dict, yang_handler : YangHandler + ) -> List[Tuple[str, Dict[str, Any]]]: + LOGGER.debug('[parse] json_data = %s', json.dumps(json_data)) + return [] diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/YangHandler.py b/src/device/service/drivers/gnmi_openconfig/handlers/YangHandler.py index 5e1ea3b4389b69eccfc89256218b35bf1c02aeb8..684e09efb1ba67eabeed341a1d65c6aab1a3b2fd 100644 --- a/src/device/service/drivers/gnmi_openconfig/handlers/YangHandler.py +++ b/src/device/service/drivers/gnmi_openconfig/handlers/YangHandler.py @@ -42,6 +42,8 @@ YANG_MODULES = [ 'openconfig-types', 'openconfig-policy-types', 'openconfig-mpls-types', + 'openconfig-mpls', + 'openconfig-mpls-ldp', 'openconfig-network-instance-types', 'openconfig-network-instance', 'openconfig-acl', diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/__init__.py b/src/device/service/drivers/gnmi_openconfig/handlers/__init__.py index 3ce655353ecf78360931a008f7c69bb732749ea0..ab09a6c5446934d630735b82e80b2021b1328b4a 100644 --- a/src/device/service/drivers/gnmi_openconfig/handlers/__init__.py +++ b/src/device/service/drivers/gnmi_openconfig/handlers/__init__.py @@ -18,11 +18,16 @@ from device.service.driver_api._Driver import RESOURCE_ENDPOINTS, RESOURCE_INTER from ._Handler import _Handler from .Component import ComponentHandler from .Interface import InterfaceHandler +from .InterfaceSwitchedVlan import InterfaceSwitchedVlanHandler from .InterfaceCounter import InterfaceCounterHandler from .NetworkInstance import NetworkInstanceHandler from .NetworkInstanceInterface import NetworkInstanceInterfaceHandler from .NetworkInstanceProtocol import NetworkInstanceProtocolHandler from .NetworkInstanceStaticRoute import NetworkInstanceStaticRouteHandler +from .NetworkInstanceConnectionPoint import NetworkInstanceConnectionPointHandler +from .NetworkInstanceEndpoint import NetworkInstanceEndpointHandler +from .NetworkInstanceVlan import NetworkInstanceVlanHandler +from .Mpls import MplsHandler from .Acl import AclHandler from .Tools import get_schema from .YangHandler import YangHandler @@ -31,11 +36,16 @@ LOGGER = logging.getLogger(__name__) comph = ComponentHandler() ifaceh = InterfaceHandler() +ifsvh = InterfaceSwitchedVlanHandler() ifctrh = InterfaceCounterHandler() nih = NetworkInstanceHandler() niifh = NetworkInstanceInterfaceHandler() niph = NetworkInstanceProtocolHandler() nisrh = NetworkInstanceStaticRouteHandler() +nicph = NetworkInstanceConnectionPointHandler() +nieph = NetworkInstanceEndpointHandler() +nivlh = NetworkInstanceVlanHandler() +mplsh = MplsHandler() aclh = AclHandler() ALL_RESOURCE_KEYS = [ @@ -49,6 +59,11 @@ RESOURCE_KEY_MAPPER = { RESOURCE_ENDPOINTS : comph.get_resource_key(), RESOURCE_INTERFACES : ifaceh.get_resource_key(), RESOURCE_NETWORK_INSTANCES : nih.get_resource_key(), + '/interface' : ifaceh.get_resource_key(), + '/interface/ethernet/switched-vlan' : ifsvh.get_resource_key(), + '/mpls' : mplsh.get_resource_key(), + '/network_instance/vlan' : nivlh.get_resource_key(), + '/mpls/interface' : mplsh.get_resource_key(), RESOURCE_ACL : aclh.get_resource_key(), } @@ -56,29 +71,50 @@ PATH_MAPPER = { '/components' : comph.get_path(), '/components/component' : comph.get_path(), '/interfaces' : ifaceh.get_path(), + '/interfaces/interface/ethernet/switched-vlan' + : ifsvh.get_path(), '/network-instances' : nih.get_path(), + '/network-instances/network-instance/connection-points/connection-point' + : nicph.get_path(), + '/network-instances/network-instance/connection-points/connection-point/endpoints/endpoint' + : nieph.get_path(), + '/network-instances/network-instance/vlans/vlan' + : nivlh.get_path(), + '/mpls' : mplsh.get_path(), + '/network-instances/network-instance/mpls' + : mplsh.get_path(), '/acl' : aclh.get_path(), } RESOURCE_KEY_TO_HANDLER = { comph.get_resource_key() : comph, ifaceh.get_resource_key() : ifaceh, + ifsvh.get_resource_key() : ifsvh, ifctrh.get_resource_key() : ifctrh, nih.get_resource_key() : nih, niifh.get_resource_key() : niifh, niph.get_resource_key() : niph, nisrh.get_resource_key() : nisrh, + nicph.get_resource_key() : nicph, + nieph.get_resource_key() : nieph, + nivlh.get_resource_key() : nivlh, + mplsh.get_resource_key() : mplsh, aclh.get_resource_key() : aclh, } PATH_TO_HANDLER = { comph.get_path() : comph, ifaceh.get_path() : ifaceh, + ifsvh.get_path() : ifsvh, ifctrh.get_path() : ifctrh, nih.get_path() : nih, niifh.get_path() : niifh, niph.get_path() : niph, nisrh.get_path() : nisrh, + nicph.get_path() : nicph, + nieph.get_path() : nieph, + nivlh.get_path() : nivlh, + mplsh.get_path() : mplsh, aclh.get_path() : aclh, } diff --git a/src/device/service/drivers/ietf_l2vpn/TfsApiClient.py b/src/device/service/drivers/ietf_l2vpn/TfsApiClient.py index ac210671608f5f764e82c3a3288459f086d080ac..1b906b82000f5f8ab421e2bb34fa6686468a8f5d 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 de695685cbf9b85d3e3f020df3f83d5acd0f1fdf..c984c1adf2200b6150a5b59e416c85bf0ec7cdb3 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 08c9b78e06a6797bde1be175ba1dd9b2eeebc0a6..0388e91057ad7d65631f66d495112de03f02b72d 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/openroadm/OpenROADMDriver.py b/src/device/service/drivers/openroadm/OpenROADMDriver.py index f1a388b84b079d28fb03cd2fe0cccd940fecff3e..8468d472352b37629f499ef6e89549143d496a8b 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 df37414c15fa2be63ba74e6c6f9955749b15302a..be86498fed535a692530737f93a3444684930d16 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 45407d38d28892f9bbe049520cc3d615ec1bc965..33c755d7156f01373a4e84aa989da1d6c53c782f 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 6edaefc2fd9339dc368cefd2ac8a49334ba0c5c5..55d404f8dc3d55dc84468ad809e22a2853413672 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 32c03b026e98c75d529b747013219fc204eda285..ef51d3a05c585e1b5bfd03f402e5054370ed7c7a 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/service/drivers/optical_tfs/TfsApiClient.py b/src/device/service/drivers/optical_tfs/TfsApiClient.py index 79802fcf6d2708fe12fceccd68c0b1460c1e5ef8..59126c7b1734a3cc298c26cfdebc5aaa904e02b9 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/device/service/drivers/restconf_openconfig/RestConfOpenConfigDriver.py b/src/device/service/drivers/restconf_openconfig/RestConfOpenConfigDriver.py new file mode 100644 index 0000000000000000000000000000000000000000..b940f27baf16774f1648b60ce010b98d7d7eb8f2 --- /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/nbi/service/ietf_l2vpn/schemas/__init__.py b/src/device/service/drivers/restconf_openconfig/__init__.py similarity index 100% rename from src/nbi/service/ietf_l2vpn/schemas/__init__.py rename to src/device/service/drivers/restconf_openconfig/__init__.py 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 0000000000000000000000000000000000000000..9ef029c0969d4091c3a11248b45a785c4fb9f5c3 --- /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 and entry_match['protocol'] > 0: + ipv4_config['protocol'] = _TFS_2_OC_PROTOCOL[entry_match['protocol']] + 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 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 and entry_match['src_port'] > 0: + transport_config['source-port'] = entry_match['src_port'] + 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 + + 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 0000000000000000000000000000000000000000..f2c9fc6e380cf52fdc559caf9efa7d260ecfad83 --- /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/telemetry/backend/collectors/intcollector/__init__.py b/src/device/service/drivers/restconf_openconfig/handlers/__init__.py similarity index 100% rename from src/telemetry/backend/collectors/intcollector/__init__.py rename to src/device/service/drivers/restconf_openconfig/handlers/__init__.py diff --git a/src/device/service/drivers/ryu/RyuApiClient.py b/src/device/service/drivers/ryu/RyuApiClient.py index edbf14477a38e0f1421d471b16f8585bea0d275a..d7e4e067128bbfbc7a95af570b5566a5da274b19 100644 --- a/src/device/service/drivers/ryu/RyuApiClient.py +++ b/src/device/service/drivers/ryu/RyuApiClient.py @@ -143,19 +143,20 @@ class RyuApiClient: return result def add_flow_rule( - self, dpid : int, in_port : int, out_port : int, - eth_type : int, ip_src_addr : str, ip_dst_addr : str, + self, dpid : int, in_port : Optional[int], out_port : int, + eth_type : Optional[int], ip_src_addr : Optional[str], ip_dst_addr : Optional[str], priority : int = 65535, ) -> Union[bool, Exception]: + match = dict() + if in_port is not None: match['in_port' ] = in_port + if eth_type is not None: match['eth_type'] = eth_type + if ip_src_addr is not None: match['ipv4_src'] = ip_src_addr + if ip_dst_addr is not None: match['ipv4_dst'] = ip_dst_addr + flow_entry = { "dpid" : dpid, "priority": priority, - "match" : { - "in_port" : in_port, - "eth_type": eth_type, - "ipv4_src": ip_src_addr, - "ipv4_dst": ip_dst_addr, - }, + "match" : match, "instructions": [ { "type": "APPLY_ACTIONS", @@ -191,22 +192,20 @@ class RyuApiClient: def del_flow_rule( - self, dpid : int, in_port : int, out_port : int, - eth_type : int, ip_src_addr : str, ip_dst_addr : str, + self, dpid : int, in_port : Optional[int], out_port : int, + eth_type : Optional[int], ip_src_addr : Optional[str], ip_dst_addr : Optional[str], priority : int = 65535, ) -> Union[bool, Exception]: + match = dict(table_id=0, cookie=0, cookie_mask=0) + if in_port is not None: match['in_port' ] = in_port + if eth_type is not None: match['eth_type'] = eth_type + if ip_src_addr is not None: match['ipv4_src'] = ip_src_addr + if ip_dst_addr is not None: match['ipv4_dst'] = ip_dst_addr + flow_entry = { "dpid" : dpid, "priority": priority, - "match" : { - "in_port" : in_port, - "eth_type": eth_type, - "ipv4_src": ip_src_addr, - "ipv4_dst": ip_dst_addr, - "table_id" : 0, - "cookie" : 0, - "cookie_mask": 0, - }, + "match" : match, "instructions": [ { "type": "APPLY_ACTIONS", diff --git a/src/device/service/drivers/ryu/RyuDriver.py b/src/device/service/drivers/ryu/RyuDriver.py index 78716bf5654e2e6bce9bbb455e0aa94930b4b6b0..ca4f3f086db3c1a82ade9df6be1132c212bdb186 100644 --- a/src/device/service/drivers/ryu/RyuDriver.py +++ b/src/device/service/drivers/ryu/RyuDriver.py @@ -91,8 +91,8 @@ class RyuDriver(_Driver): dpid = int(resource_value_dict["dpid"], 16) in_port = int(resource_value_dict["in-port"].split("-")[1][3:]) out_port = int(resource_value_dict["out-port"].split("-")[1][3:]) - ip_src_addr = resource_value_dict.get("ip_address_source", "") - ip_dst_addr = resource_value_dict.get("ip_address_destination", "") + src_ip_addr = resource_value_dict.get("src-ip-addr", "") + dst_ip_addr = resource_value_dict.get("dst-ip-addr", "") if "h1-h3" in resource_key: priority = 1000 @@ -111,7 +111,7 @@ class RyuDriver(_Driver): continue results.append(self.rac.add_flow_rule( - dpid, in_port, out_port, 0x0800, ip_src_addr, ip_dst_addr, + dpid, in_port, out_port, 0x0800, src_ip_addr, dst_ip_addr, priority=priority )) except Exception as e: @@ -143,8 +143,8 @@ class RyuDriver(_Driver): dpid = int(resource_value_dict["dpid"], 16) in_port = int(resource_value_dict["in-port"].split("-")[1][3:]) out_port = int(resource_value_dict["out-port"].split("-")[1][3:]) - ip_src_addr = resource_value_dict.get("ip_address_source", "") - ip_dst_addr = resource_value_dict.get("ip_address_destination", "") + src_ip_addr = resource_value_dict.get("src-ip-addr", "") + dst_ip_addr = resource_value_dict.get("dst-ip-addr", "") if "h1-h3" in resource_key: priority = 1000 @@ -163,7 +163,7 @@ class RyuDriver(_Driver): continue results.append(self.rac.del_flow_rule( - dpid, in_port, out_port, 0x0800, ip_src_addr, ip_dst_addr, + dpid, in_port, out_port, 0x0800, src_ip_addr, dst_ip_addr, priority=priority )) except Exception as e: diff --git a/src/device/tests/dscm/Fixtures.py b/src/device/tests/dscm/Fixtures.py index 458d0d78629d8f6102feaab68a5c150dcfc4a3c1..ab9e67a90ebe8511ce12a058fe0e3c6aa03c4a1e 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/device/tests/gnmi_openconfig/Dockerfile.l2vpn b/src/device/tests/gnmi_openconfig/Dockerfile.l2vpn new file mode 100644 index 0000000000000000000000000000000000000000..2270ed3ed2d6210950ebfab5bc0a0e7a93643e5c --- /dev/null +++ b/src/device/tests/gnmi_openconfig/Dockerfile.l2vpn @@ -0,0 +1,85 @@ +# 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 reuse of device component Dockerfile steps to run L2VPN tests +FROM python:3.9-slim + +# Base deps + libyang build +RUN apt-get update -qq && apt-get install -y -qq wget g++ git build-essential cmake libpcre2-dev python3-dev python3-cffi && rm -rf /var/lib/apt/lists/* +RUN mkdir -p /var/libyang && git clone https://github.com/CESNET/libyang.git /var/libyang +WORKDIR /var/libyang +RUN git fetch && git checkout v2.1.148 && mkdir -p build +WORKDIR /var/libyang/build +RUN cmake -D CMAKE_BUILD_TYPE:String="Release" .. && make && make install && ldconfig + +ENV PYTHONUNBUFFERED=0 + +# Python toolchain +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' + +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 + +# Common files + proto +WORKDIR /var/teraflow/common +COPY src/common/. ./ +RUN rm -rf proto +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' {} \; + +# Device deps +WORKDIR /var/teraflow/device +COPY src/device/requirements.in requirements.in +RUN pip-compile --quiet --output-file=requirements.txt requirements.in +RUN python3 -m pip install -r requirements.txt + +# Source tree +WORKDIR /var/teraflow +COPY src/__init__.py ./__init__.py +COPY src/common/*.py ./common/ +COPY src/common/tests/. ./common/tests/ +COPY src/common/tools/. ./common/tools/ +COPY src/context/__init__.py context/__init__.py +COPY src/context/client/. context/client/ +COPY src/device/. device/ +COPY src/monitoring/__init__.py monitoring/__init__.py +COPY src/monitoring/client/. monitoring/client/ +COPY src/service/__init__.py service/__init__.py +COPY src/service/client/. service/client/ +COPY src/vnt_manager/__init__.py vnt_manager/__init__.py +COPY src/vnt_manager/client/. vnt_manager/client/ + +# OpenConfig models as in device Dockerfile +RUN mkdir -p /tmp/openconfig && git clone https://github.com/openconfig/public.git /tmp/openconfig +WORKDIR /tmp/openconfig +RUN git fetch && git checkout v4.4.0 +RUN rm -rf /var/teraflow/device/service/drivers/gnmi_openconfig/git +RUN mkdir -p /var/teraflow/device/service/drivers/gnmi_openconfig/git/openconfig/public +RUN mv /tmp/openconfig/release /var/teraflow/device/service/drivers/gnmi_openconfig/git/openconfig/public +RUN mv /tmp/openconfig/third_party /var/teraflow/device/service/drivers/gnmi_openconfig/git/openconfig/public +RUN rm -rf /tmp/openconfig +WORKDIR /var/teraflow + +ENV RUN_L2VPN_LAB=1 +ENV PYTHONPATH=/var/teraflow +CMD ["pytest", "--log-level=DEBUG", "--verbose", "device/tests/gnmi_openconfig/test_unitary_gnmi_oc_arista_l2vpn.py"] diff --git a/src/device/tests/gnmi_openconfig/test_unitary_gnmi_oc_arista_l2vpn.py b/src/device/tests/gnmi_openconfig/test_unitary_gnmi_oc_arista_l2vpn.py index f5bee3c12a03925fd838c3576eac39ac4144c1cf..24341f7a8b8c8b2302996534d4fe246236c8a0ad 100644 --- a/src/device/tests/gnmi_openconfig/test_unitary_gnmi_oc_arista_l2vpn.py +++ b/src/device/tests/gnmi_openconfig/test_unitary_gnmi_oc_arista_l2vpn.py @@ -12,565 +12,144 @@ # See the License for the specific language governing permissions and # limitations under the License. -import json, logging, os, pytest, time -from typing import Dict, Tuple -os.environ['DEVICE_EMULATED_ONLY'] = 'YES' +""" +Integration validation of GnmiOpenConfigDriver for L2VPN (VPLS) over MPLS/LDP +using the ContainerLab dataplane (dc1--r1--r2--dc2). +""" -# pylint: disable=wrong-import-position +import grpc, logging, os, pytest, time +from typing import Dict, List, Tuple from device.service.drivers.gnmi_openconfig.GnmiOpenConfigDriver import GnmiOpenConfigDriver -#from device.service.driver_api._Driver import ( -# RESOURCE_ENDPOINTS, RESOURCE_INTERFACES, RESOURCE_NETWORK_INSTANCES, RESOURCE_ROUTING_POLICIES, RESOURCE_SERVICES -#) - -logging.basicConfig(level=logging.DEBUG) -#logging.getLogger('ncclient.operations.rpc').setLevel(logging.INFO) -#logging.getLogger('ncclient.transport.parser').setLevel(logging.INFO) - -LOGGER = logging.getLogger(__name__) - - -##### DRIVERS FIXTURE ################################################################################################## - -DEVICES = { - 'SW1': {'address': '172.20.20.101', 'port': 6030, 'settings': { - 'username': 'admin', 'password': 'admin', - 'vendor': None, 'force_running': False, 'hostkey_verify': False, 'look_for_keys': False, 'allow_agent': False, - 'commit_per_rule': True, 'device_params': {'name': 'default'}, 'manager_params': {'timeout' : 120} - }}, - 'SW2': {'address': '10.1.1.87', 'port': 830, 'settings': { - 'username': 'ocnos', 'password': 'ocnos', - 'vendor': None, 'force_running': False, 'hostkey_verify': False, 'look_for_keys': False, 'allow_agent': False, - 'commit_per_rule': True, 'device_params': {'name': 'default'}, 'manager_params': {'timeout' : 120} - }}, -} - -@pytest.fixture(scope='session') -def drivers() -> Dict[str, OpenConfigDriver]: - _drivers : Dict[str, OpenConfigDriver] = dict() - for device_name, driver_params in DEVICES.items(): - driver = OpenConfigDriver(driver_params['address'], driver_params['port'], **(driver_params['settings'])) - driver.Connect() - _drivers[device_name] = driver - yield _drivers - time.sleep(1) - for _,driver in _drivers.items(): - driver.Disconnect() - - -def network_instance(ni_name, ni_type, ni_router_id=None, ni_route_distinguisher=None) -> Tuple[str, Dict]: - path = '/network_instance[{:s}]'.format(ni_name) - data = {'name': ni_name, 'type': ni_type} - if ni_router_id is not None: data['router_id'] = ni_router_id - if ni_route_distinguisher is not None: data['route_distinguisher'] = ni_route_distinguisher - return path, json.dumps(data) - -def network_instance_add_protocol_bgp(ni_name, ni_type, ni_router_id, ni_bgp_as, neighbors=[]) -> Tuple[str, Dict]: - path = '/network_instance[{:s}]/protocols[BGP]'.format(ni_name) - data = { - 'name': ni_name, 'type': ni_type, 'router_id': ni_router_id, 'identifier': 'BGP', - 'protocol_name': ni_bgp_as, 'as': ni_bgp_as - } - if len(neighbors) > 0: - data['neighbors'] = [ - {'ip_address': neighbor_ip_address, 'remote_as': neighbor_remote_as} - for neighbor_ip_address, neighbor_remote_as in neighbors - ] - return path, json.dumps(data) - -def network_instance_add_protocol_direct(ni_name, ni_type) -> Tuple[str, Dict]: - path = '/network_instance[{:s}]/protocols[DIRECTLY_CONNECTED]'.format(ni_name) - data = { - 'name': ni_name, 'type': ni_type, 'identifier': 'DIRECTLY_CONNECTED', - 'protocol_name': 'DIRECTLY_CONNECTED' - } - return path, json.dumps(data) - -def network_instance_add_protocol_static(ni_name, ni_type) -> Tuple[str, Dict]: - path = '/network_instance[{:s}]/protocols[STATIC]'.format(ni_name) - data = { - 'name': ni_name, 'type': ni_type, 'identifier': 'STATIC', - 'protocol_name': 'STATIC' - } - return path, json.dumps(data) - -#def network_instance_static_route(ni_name, prefix, next_hop, next_hop_index=0) -> Tuple[str, Dict]: -# path = '/network_instance[{:s}]/static_route[{:s}]'.format(ni_name, prefix) -# data = {'name': ni_name, 'prefix': prefix, 'next_hop': next_hop, 'next_hop_index': next_hop_index} -# return path, json.dumps(data) - -def network_instance_add_table_connection( - ni_name, src_protocol, dst_protocol, address_family, default_import_policy, bgp_as=None -) -> Tuple[str, Dict]: - path = '/network_instance[{:s}]/table_connections[{:s}][{:s}][{:s}]'.format( - ni_name, src_protocol, dst_protocol, address_family - ) - data = { - 'name': ni_name, 'src_protocol': src_protocol, 'dst_protocol': dst_protocol, - 'address_family': address_family, 'default_import_policy': default_import_policy, - } - if bgp_as is not None: data['as'] = bgp_as - return path, json.dumps(data) - -def interface( - name, index, description=None, if_type=None, vlan_id=None, mtu=None, ipv4_address_prefix=None, enabled=None -) -> Tuple[str, Dict]: - path = '/interface[{:s}]/subinterface[{:d}]'.format(name, index) - data = {'name': name, 'index': index} - if description is not None: data['description'] = description - if if_type is not None: data['type' ] = if_type - if vlan_id is not None: data['vlan_id' ] = vlan_id - if mtu is not None: data['mtu' ] = mtu - if enabled is not None: data['enabled' ] = enabled - if ipv4_address_prefix is not None: - ipv4_address, ipv4_prefix = ipv4_address_prefix - data['address_ip' ] = ipv4_address - data['address_prefix'] = ipv4_prefix - return path, json.dumps(data) - -def network_instance_interface(ni_name, ni_type, if_name, if_index) -> Tuple[str, Dict]: - path = '/network_instance[{:s}]/interface[{:s}.{:d}]'.format(ni_name, if_name, if_index) - data = {'name': ni_name, 'type': ni_type, 'id': if_name, 'interface': if_name, 'subinterface': if_index} - return path, json.dumps(data) - -def test_configure(drivers : Dict[str, OpenConfigDriver]): - #resources_to_get = [] - #resources_to_get = [RESOURCE_ENDPOINTS] - #resources_to_get = [RESOURCE_INTERFACES] - #resources_to_get = [RESOURCE_NETWORK_INSTANCES] - #resources_to_get = [RESOURCE_ROUTING_POLICIES] - #resources_to_get = [RESOURCE_SERVICES] - #LOGGER.info('resources_to_get = {:s}'.format(str(resources_to_get))) - #results_getconfig = driver.GetConfig(resources_to_get) - #LOGGER.info('results_getconfig = {:s}'.format(str(results_getconfig))) - - csgw1_resources_to_set = [ - network_instance('ecoc24', 'L3VRF', '192.168.150.1', '65001:1'), - network_instance_add_protocol_direct('ecoc24', 'L3VRF'), - network_instance_add_protocol_static('ecoc24', 'L3VRF'), - network_instance_add_protocol_bgp('ecoc24', 'L3VRF', '192.168.150.1', '65001', neighbors=[ - ('192.168.150.2', '65001') - ]), - network_instance_add_table_connection('ecoc24', 'DIRECTLY_CONNECTED', 'BGP', 'IPV4', 'ACCEPT_ROUTE', bgp_as='65001'), - network_instance_add_table_connection('ecoc24', 'STATIC', 'BGP', 'IPV4', 'ACCEPT_ROUTE', bgp_as='65001'), - - interface('ce1', 0, if_type='ethernetCsmacd', mtu=1500), - network_instance_interface('ecoc24', 'L3VRF', 'ce1', 0), - interface('ce1', 0, if_type='ethernetCsmacd', mtu=1500, ipv4_address_prefix=('192.168.10.1', 24), enabled=True), - - interface('xe5', 0, if_type='ethernetCsmacd', mtu=1500), - network_instance_interface('ecoc24', 'L3VRF', 'xe5', 0), - interface('xe5', 0, if_type='ethernetCsmacd', mtu=1500, ipv4_address_prefix=('192.168.150.1', 24), enabled=True), - ] - LOGGER.info('CSGW1 resources_to_set = {:s}'.format(str(csgw1_resources_to_set))) - results_setconfig = drivers['CSGW1'].SetConfig(csgw1_resources_to_set) - LOGGER.info('CSGW1 results_setconfig = {:s}'.format(str(results_setconfig))) - - csgw2_resources_to_set = [ - network_instance('ecoc24', 'L3VRF', '192.168.150.2', '65001:1'), - network_instance_add_protocol_direct('ecoc24', 'L3VRF'), - network_instance_add_protocol_static('ecoc24', 'L3VRF'), - network_instance_add_protocol_bgp('ecoc24', 'L3VRF', '192.168.150.2', '65001', neighbors=[ - ('192.168.150.1', '65001') - ]), - network_instance_add_table_connection('ecoc24', 'DIRECTLY_CONNECTED', 'BGP', 'IPV4', 'ACCEPT_ROUTE', bgp_as='65001'), - network_instance_add_table_connection('ecoc24', 'STATIC', 'BGP', 'IPV4', 'ACCEPT_ROUTE', bgp_as='65001'), - - interface('ce1', 0, if_type='ethernetCsmacd', mtu=1500), - network_instance_interface('ecoc24', 'L3VRF', 'ce1', 0), - interface('ce1', 0, if_type='ethernetCsmacd', mtu=1500, ipv4_address_prefix=('192.168.20.1', 24), enabled=True), - - interface('xe5', 0, if_type='ethernetCsmacd', mtu=1500), - network_instance_interface('ecoc24', 'L3VRF', 'xe5', 0), - interface('xe5', 0, if_type='ethernetCsmacd', mtu=1500, ipv4_address_prefix=('192.168.150.2', 24), enabled=True), - ] - LOGGER.info('CSGW2 resources_to_set = {:s}'.format(str(csgw2_resources_to_set))) - results_setconfig = drivers['CSGW2'].SetConfig(csgw2_resources_to_set) - LOGGER.info('CSGW2 results_setconfig = {:s}'.format(str(results_setconfig))) - - csgw1_resources_to_delete = [ - network_instance_interface('ecoc24', 'L3VRF', 'ce1', 0), - network_instance_interface('ecoc24', 'L3VRF', 'xe5', 0), - #interface('ce1', 0), - #interface('xe5', 0), - network_instance('ecoc24', 'L3VRF'), - ] - LOGGER.info('CSGW1 resources_to_delete = {:s}'.format(str(csgw1_resources_to_delete))) - results_deleteconfig = drivers['CSGW1'].DeleteConfig(csgw1_resources_to_delete) - LOGGER.info('CSGW1 results_deleteconfig = {:s}'.format(str(results_deleteconfig))) - - csgw2_resources_to_delete = [ - network_instance_interface('ecoc24', 'L3VRF', 'ce1', 0), - network_instance_interface('ecoc24', 'L3VRF', 'xe5', 0), - #interface('ce1', 0), - #interface('xe5', 0), - network_instance('ecoc24', 'L3VRF'), - ] - LOGGER.info('CSGW2 resources_to_delete = {:s}'.format(str(csgw2_resources_to_delete))) - results_deleteconfig = drivers['CSGW2'].DeleteConfig(csgw2_resources_to_delete) - LOGGER.info('CSGW2 results_deleteconfig = {:s}'.format(str(results_deleteconfig))) - - - - - - -# 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 logging, pytest, time -from typing import Dict, List -from device.service.driver_api._Driver import ( - RESOURCE_ENDPOINTS, RESOURCE_INTERFACES, RESOURCE_NETWORK_INSTANCES, - RESOURCE_ROUTING_POLICIES, RESOURCE_SERVICES -) -from device.service.drivers.gnmi_openconfig.GnmiOpenConfigDriver import GnmiOpenConfigDriver -from .storage.Storage import Storage -from .tools.manage_config import ( - check_config_endpoints, check_config_interfaces, check_config_network_instances, del_config, get_config, set_config -) -from .tools.check_updates import check_updates -from .tools.request_composers import ( - interface, network_instance, network_instance_interface, network_instance_static_route +from device.tests.gnmi_openconfig.tools.request_composers import ( + connection_point, connection_point_endpoint_local, connection_point_endpoint_remote, + interface, mpls_global, mpls_ldp_interface, network_instance, vlan, ) -logging.basicConfig(level=logging.DEBUG) +logging.basicConfig(level=logging.INFO) LOGGER = logging.getLogger(__name__) -LOGGER.setLevel(logging.DEBUG) - - -##### DRIVER FIXTURE ################################################################################################### -DRIVER_SETTING_ADDRESS = '172.20.20.101' -DRIVER_SETTING_PORT = 6030 -DRIVER_SETTING_USERNAME = 'admin' -DRIVER_SETTING_PASSWORD = 'admin' -DRIVER_SETTING_USE_TLS = False - -@pytest.fixture(scope='session') -def driver() -> GnmiOpenConfigDriver: - _driver = GnmiOpenConfigDriver( - DRIVER_SETTING_ADDRESS, DRIVER_SETTING_PORT, - username=DRIVER_SETTING_USERNAME, - password=DRIVER_SETTING_PASSWORD, - use_tls=DRIVER_SETTING_USE_TLS, - ) - _driver.Connect() - yield _driver - time.sleep(1) - _driver.Disconnect() - - -##### STORAGE FIXTURE ################################################################################################## - -@pytest.fixture(scope='session') -def storage() -> Dict: - yield Storage() +# Skip unless the lab is explicitly enabled +RUN_LAB = os.environ.get('RUN_L2VPN_LAB', '0') == '1' +pytestmark = pytest.mark.skipif(not RUN_LAB, reason='Requires running ContainerLab L2VPN dataplane') +GNMI_PORT = 6030 +USERNAME = 'admin' +PASSWORD = 'admin' -##### NETWORK INSTANCE DETAILS ######################################################################################### +SERVICE_NAME = 'tfs-l2vpn-vpls' +VC_ID = 100 +VLAN_ID = 100 -NETWORK_INSTANCES = [ +ROUTERS = [ { - 'name': 'test-l3-svc', - 'type': 'L3VRF', - 'interfaces': [ - {'name': 'Ethernet1', 'index': 0, 'ipv4_addr': '192.168.1.1', 'ipv4_prefix': 24, 'enabled': True}, - {'name': 'Ethernet10', 'index': 0, 'ipv4_addr': '192.168.10.1', 'ipv4_prefix': 24, 'enabled': True}, - ], - 'static_routes': [ - {'prefix': '172.0.0.0/24', 'next_hop': '172.16.0.2', 'metric': 1}, - {'prefix': '172.2.0.0/24', 'next_hop': '172.16.0.3', 'metric': 1}, - ] + 'name' : 'r1', + 'address' : '172.20.20.101', + 'ldp_router_id' : '172.20.20.101', + 'core_interface' : 'Ethernet2', + 'access_interface': 'Ethernet10', + 'peer' : '172.20.20.102', + }, + { + 'name' : 'r2', + 'address' : '172.20.20.102', + 'ldp_router_id' : '172.20.20.102', + 'core_interface' : 'Ethernet1', + 'access_interface': 'Ethernet10', + 'peer' : '172.20.20.101', }, - #{ - # 'name': 'test-l2-svc', - # 'type': 'L2VSI', - # 'interfaces': [ - # {'name': 'Ethernet2', 'index': 0, 'ipv4_addr': '192.168.1.1', 'ipv4_prefix': 24, 'enabled': True}, - # {'name': 'Ethernet4', 'index': 0, 'ipv4_addr': '192.168.10.1', 'ipv4_prefix': 24, 'enabled': True}, - # ], - # 'static_routes': [ - # {'prefix': '172.0.0.0/24', 'next_hop': '172.16.0.2', 'metric': 1}, - # {'prefix': '172.2.0.0/24', 'next_hop': '172.16.0.3', 'metric': 1}, - # ] - #} ] -##### TEST METHODS ##################################################################################################### - -def test_get_endpoints( - driver : GnmiOpenConfigDriver, # pylint: disable=redefined-outer-name - storage : Storage, # pylint: disable=redefined-outer-name -) -> None: - results_getconfig = get_config(driver, [RESOURCE_ENDPOINTS]) - storage.endpoints.populate(results_getconfig) - check_config_endpoints(driver, storage) - - -def test_get_interfaces( - driver : GnmiOpenConfigDriver, # pylint: disable=redefined-outer-name - storage : Storage, # pylint: disable=redefined-outer-name -) -> None: - results_getconfig = get_config(driver, [RESOURCE_INTERFACES]) - storage.interfaces.populate(results_getconfig) - check_config_interfaces(driver, storage) - - -def test_get_network_instances( - driver : GnmiOpenConfigDriver, # pylint: disable=redefined-outer-name - storage : Storage, # pylint: disable=redefined-outer-name -) -> None: - results_getconfig = get_config(driver, [RESOURCE_NETWORK_INSTANCES]) - storage.network_instances.populate(results_getconfig) - check_config_network_instances(driver, storage) - - -def test_set_network_instances( - driver : GnmiOpenConfigDriver, # pylint: disable=redefined-outer-name - storage : Storage, # pylint: disable=redefined-outer-name -) -> None: - check_config_interfaces(driver, storage) - check_config_network_instances(driver, storage) - - resources_to_set = list() - ni_names = list() - for ni in NETWORK_INSTANCES: - ni_name = ni['name'] - ni_type = ni['type'] - resources_to_set.append(network_instance(ni_name, ni_type)) - ni_names.append(ni_name) - storage.network_instances.network_instances.add(ni_name, {'type': ni_type}) - storage.network_instances.protocols.add(ni_name, 'DIRECTLY_CONNECTED') - storage.network_instances.tables.add(ni_name, 'DIRECTLY_CONNECTED', 'IPV4') - storage.network_instances.tables.add(ni_name, 'DIRECTLY_CONNECTED', 'IPV6') - - results_setconfig = set_config(driver, resources_to_set) - check_updates(results_setconfig, '/network_instance[{:s}]', ni_names) - - check_config_interfaces(driver, storage, max_retries=10, retry_delay=2.0) - check_config_network_instances(driver, storage, max_retries=10, retry_delay=2.0) - - -def test_add_interfaces_to_network_instance( - driver : GnmiOpenConfigDriver, # pylint: disable=redefined-outer-name - storage : Storage, # pylint: disable=redefined-outer-name -) -> None: - check_config_interfaces(driver, storage) - check_config_network_instances(driver, storage) - - resources_to_set = list() - ni_if_names = list() - for ni in NETWORK_INSTANCES: - ni_name = ni['name'] - for ni_if in ni.get('interfaces', list()): - if_name = ni_if['name' ] - subif_index = ni_if['index'] - resources_to_set.append(network_instance_interface(ni_name, if_name, subif_index)) - ni_if_names.append((ni_name, '{:s}.{:d}'.format(if_name, subif_index))) - storage.network_instances.interfaces.add(ni_name, if_name, subif_index) - - results_setconfig = set_config(driver, resources_to_set) - check_updates(results_setconfig, '/network_instance[{:s}]/interface[{:s}]', ni_if_names) - - check_config_interfaces(driver, storage, max_retries=10, retry_delay=2.0) - check_config_network_instances(driver, storage, max_retries=10, retry_delay=2.0) - - -def test_set_interfaces( - driver : GnmiOpenConfigDriver, # pylint: disable=redefined-outer-name - storage : Storage, # pylint: disable=redefined-outer-name -) -> None: - check_config_interfaces(driver, storage) - check_config_network_instances(driver, storage) - - resources_to_set = list() - if_names = list() - for ni in NETWORK_INSTANCES: - for ni_if in ni.get('interfaces', list()): - if_name = ni_if['name' ] - subif_index = ni_if['index' ] - ipv4_address = ni_if['ipv4_addr' ] - ipv4_prefix = ni_if['ipv4_prefix'] - enabled = ni_if['enabled' ] - resources_to_set.append(interface( - if_name, subif_index, ipv4_address, ipv4_prefix, enabled - )) - if_names.append(if_name) - storage.interfaces.ipv4_addresses.add(if_name, subif_index, ipv4_address, { - 'origin' : 'STATIC', 'prefix': ipv4_prefix - }) - default_vlan = storage.network_instances.vlans.get('default', 1) - default_vlan_members : List[str] = default_vlan.setdefault('members', list()) - if if_name in default_vlan_members: default_vlan_members.remove(if_name) - - results_setconfig = set_config(driver, resources_to_set) - check_updates(results_setconfig, '/interface[{:s}]', if_names) - - check_config_interfaces(driver, storage, max_retries=10, retry_delay=2.0) - check_config_network_instances(driver, storage, max_retries=10, retry_delay=2.0) - - -def test_set_network_instance_static_routes( - driver : GnmiOpenConfigDriver, # pylint: disable=redefined-outer-name - storage : Storage, # pylint: disable=redefined-outer-name -) -> None: - check_config_interfaces(driver, storage) - check_config_network_instances(driver, storage) - - resources_to_set = list() - ni_sr_prefixes = list() - for ni in NETWORK_INSTANCES: - ni_name = ni['name'] - for ni_sr in ni.get('static_routes', list()): - ni_sr_prefix = ni_sr['prefix' ] - ni_sr_next_hop = ni_sr['next_hop'] - ni_sr_metric = ni_sr['metric' ] - ni_sr_next_hop_index = 'AUTO_{:d}_{:s}'.format(ni_sr_metric, '-'.join(ni_sr_next_hop.split('.'))) - resources_to_set.append(network_instance_static_route( - ni_name, ni_sr_prefix, ni_sr_next_hop_index, ni_sr_next_hop, metric=ni_sr_metric - )) - ni_sr_prefixes.append((ni_name, ni_sr_prefix)) - storage.network_instances.protocols.add(ni_name, 'STATIC') - storage.network_instances.protocol_static.add(ni_name, 'STATIC', ni_sr_prefix, { - 'prefix': ni_sr_prefix, 'next_hops': { - ni_sr_next_hop_index: {'next_hop': ni_sr_next_hop, 'metric': ni_sr_metric} - } - }) - storage.network_instances.tables.add(ni_name, 'STATIC', 'IPV4') - storage.network_instances.tables.add(ni_name, 'STATIC', 'IPV6') - - results_setconfig = set_config(driver, resources_to_set) - check_updates(results_setconfig, '/network_instance[{:s}]/static_route[{:s}]', ni_sr_prefixes) - - check_config_interfaces(driver, storage, max_retries=10, retry_delay=2.0) - check_config_network_instances(driver, storage, max_retries=10, retry_delay=2.0) - - -def test_del_network_instance_static_routes( - driver : GnmiOpenConfigDriver, # pylint: disable=redefined-outer-name - storage : Storage, # pylint: disable=redefined-outer-name -) -> None: - check_config_interfaces(driver, storage) - check_config_network_instances(driver, storage) - - resources_to_delete = list() - ni_sr_prefixes = list() - for ni in NETWORK_INSTANCES: - ni_name = ni['name'] - for ni_sr in ni.get('static_routes', list()): - ni_sr_prefix = ni_sr['prefix' ] - ni_sr_next_hop = ni_sr['next_hop'] - ni_sr_metric = ni_sr['metric' ] - ni_sr_next_hop_index = 'AUTO_{:d}_{:s}'.format(ni_sr_metric, '-'.join(ni_sr_next_hop.split('.'))) - resources_to_delete.append(network_instance_static_route( - ni_name, ni_sr_prefix, ni_sr_next_hop_index, ni_sr_next_hop, metric=ni_sr_metric - )) - ni_sr_prefixes.append((ni_name, ni_sr_prefix)) - - storage.network_instances.protocols.remove(ni_name, 'STATIC') - storage.network_instances.protocol_static.remove(ni_name, 'STATIC', ni_sr_prefix) - storage.network_instances.tables.remove(ni_name, 'STATIC', 'IPV4') - storage.network_instances.tables.remove(ni_name, 'STATIC', 'IPV6') - - results_deleteconfig = del_config(driver, resources_to_delete) - check_updates(results_deleteconfig, '/network_instance[{:s}]/static_route[{:s}]', ni_sr_prefixes) - - check_config_interfaces(driver, storage, max_retries=10, retry_delay=2.0) - #check_config_network_instances(driver, storage, max_retries=10, retry_delay=2.0) - - -def test_del_interfaces( - driver : GnmiOpenConfigDriver, # pylint: disable=redefined-outer-name - storage : Storage, # pylint: disable=redefined-outer-name -) -> None: - check_config_interfaces(driver, storage) - #check_config_network_instances(driver, storage) - - resources_to_delete = list() - if_names = list() - for ni in NETWORK_INSTANCES: - for ni_if in ni.get('interfaces', list()): - if_name = ni_if['name' ] - subif_index = ni_if['index' ] - ipv4_address = ni_if['ipv4_addr' ] - ipv4_prefix = ni_if['ipv4_prefix'] - enabled = ni_if['enabled' ] - resources_to_delete.append(interface(if_name, subif_index, ipv4_address, ipv4_prefix, enabled)) - if_names.append(if_name) - storage.interfaces.ipv4_addresses.remove(if_name, subif_index, ipv4_address) - default_vlan = storage.network_instances.vlans.get('default', 1) - default_vlan_members : List[str] = default_vlan.setdefault('members', list()) - if if_name not in default_vlan_members: default_vlan_members.append(if_name) - - results_deleteconfig = del_config(driver, resources_to_delete) - check_updates(results_deleteconfig, '/interface[{:s}]', if_names) - - check_config_interfaces(driver, storage, max_retries=10, retry_delay=2.0) - #check_config_network_instances(driver, storage, max_retries=10, retry_delay=2.0) - - -def test_del_interfaces_from_network_instance( - driver : GnmiOpenConfigDriver, # pylint: disable=redefined-outer-name - storage : Storage, # pylint: disable=redefined-outer-name -) -> None: - check_config_interfaces(driver, storage) - #check_config_network_instances(driver, storage) - - resources_to_delete = list() - ni_if_names = list() - for ni in NETWORK_INSTANCES: - ni_name = ni['name'] - for ni_if in ni.get('interfaces', list()): - if_name = ni_if['name' ] - subif_index = ni_if['index'] - resources_to_delete.append(network_instance_interface(ni_name, if_name, subif_index)) - ni_if_names.append((ni_name, '{:s}.{:d}'.format(if_name, subif_index))) - storage.network_instances.interfaces.remove(ni_name, if_name, subif_index) - - results_deleteconfig = del_config(driver, resources_to_delete) - check_updates(results_deleteconfig, '/network_instance[{:s}]/interface[{:s}]', ni_if_names) - - check_config_interfaces(driver, storage, max_retries=10, retry_delay=2.0) - #check_config_network_instances(driver, storage, max_retries=10, retry_delay=2.0) +def _build_l2vpn_resources(router: Dict[str, str]) -> Tuple[List[Tuple[str, Dict]], List[Tuple[str, Dict]]]: + set_resources : List[Tuple[str, Dict]] = [ + network_instance(SERVICE_NAME, 'L2VSI'), + connection_point(SERVICE_NAME, 'access'), + connection_point_endpoint_local( + SERVICE_NAME, 'access', 'access-ep', router['access_interface'], subif=0, precedence=0 + ), + connection_point(SERVICE_NAME, 'core'), + connection_point_endpoint_remote( + SERVICE_NAME, 'core', 'core-ep', router['peer'], vc_id=VC_ID, precedence=100 + ), + ] + del_resources = list(reversed(set_resources)) + return set_resources, del_resources + +def _set_with_retry(driver: GnmiOpenConfigDriver, resources: List[Tuple[str, Dict]], attempts: int = 5, wait_s: int = 5): + """Retry SetConfig while the device reports it is not yet initialized.""" + last_exc = None + for i in range(attempts): + try: + return driver.SetConfig(resources) + except grpc.RpcError as exc: + last_exc = exc + if exc.code() == grpc.StatusCode.UNAVAILABLE and 'system not yet initialized' in exc.details(): + LOGGER.info('Device not ready (attempt %s/%s), waiting %ss', i + 1, attempts, wait_s) + time.sleep(wait_s) + continue + raise + if last_exc: + raise last_exc + return [] -def test_del_network_instances( - driver : GnmiOpenConfigDriver, # pylint: disable=redefined-outer-name - storage : Storage, # pylint: disable=redefined-outer-name -) -> None: - check_config_interfaces(driver, storage) - #check_config_network_instances(driver, storage) - resources_to_delete = list() - ni_names = list() - for ni in NETWORK_INSTANCES: - ni_name = ni['name'] - ni_type = ni['type'] - resources_to_delete.append(network_instance(ni_name, ni_type)) - ni_names.append(ni_name) - storage.network_instances.network_instances.remove(ni_name) - storage.network_instances.protocols.remove(ni_name, 'DIRECTLY_CONNECTED') - storage.network_instances.tables.remove(ni_name, 'DIRECTLY_CONNECTED', 'IPV4') - storage.network_instances.tables.remove(ni_name, 'DIRECTLY_CONNECTED', 'IPV6') +@pytest.fixture(scope='session') +def drivers() -> Dict[str, GnmiOpenConfigDriver]: + _drivers : Dict[str, GnmiOpenConfigDriver] = dict() + for router in ROUTERS: + driver = GnmiOpenConfigDriver( + router['address'], GNMI_PORT, username=USERNAME, password=PASSWORD, use_tls=False + ) + try: + driver.Connect() + except Exception as exc: # pylint: disable=broad-except + pytest.skip(f"Cannot connect to {router['name']} ({router['address']}): {exc}") + _drivers[router['name']] = driver + yield _drivers + time.sleep(1) + for _, driver in _drivers.items(): + driver.Disconnect() - results_deleteconfig = del_config(driver, resources_to_delete) - check_updates(results_deleteconfig, '/network_instance[{:s}]', ni_names) - check_config_interfaces(driver, storage, max_retries=10, retry_delay=2.0) - check_config_network_instances(driver, storage, max_retries=10, retry_delay=2.0) +def test_configure_mpls_ldp(drivers: Dict[str, GnmiOpenConfigDriver]) -> None: + """Enable LDP globally and on the r1<->r2 core links.""" + for router in ROUTERS: + driver = drivers[router['name']] + resources = [ + mpls_global(router['ldp_router_id'], hello_interval=5, hello_holdtime=15), + mpls_ldp_interface(router['core_interface'], hello_interval=5, hello_holdtime=15), + ] + LOGGER.info('Configuring MPLS/LDP on %s (%s)', router['name'], router['address']) + results = _set_with_retry(driver, resources) + LOGGER.info('MPLS/LDP result: %s', results) + assert all( + (result is True) or (isinstance(result, tuple) and len(result) > 1 and result[1] is True) + for result in results + ) + + +def test_configure_l2vpn_vpls(drivers: Dict[str, GnmiOpenConfigDriver]) -> None: + """Fallback validation: create a VLAN in default VRF and attach core/access interfaces.""" + for router in ROUTERS: + driver = drivers[router['name']] + vlan_res = vlan('default', VLAN_ID, vlan_name='tfs-vlan') + if_access = interface(router['access_interface'], VLAN_ID, enabled=True, vlan_id=VLAN_ID, + ipv4_address=None, ipv4_prefix=None) + if_core = interface(router['core_interface'], VLAN_ID, enabled=True, vlan_id=VLAN_ID, + ipv4_address=None, ipv4_prefix=None) + + LOGGER.info('Configuring VLAN %s on %s (%s)', VLAN_ID, router['name'], router['address']) + results_vlan = _set_with_retry(driver, [vlan_res, if_access, if_core]) + LOGGER.info('VLAN result: %s', results_vlan) + assert all( + (result is True) or (isinstance(result, tuple) and len(result) > 1 and result[1] is True) + for result in results_vlan + ) + + LOGGER.info('Tearing down VLAN %s on %s (%s)', VLAN_ID, router['name'], router['address']) + results_del = driver.DeleteConfig([if_core, if_access, vlan_res]) + assert all( + (result is True) or (isinstance(result, tuple) and len(result) > 1 and result[1] is True) + for result in results_del + ) diff --git a/src/device/tests/gnmi_openconfig/tools/request_composers.py b/src/device/tests/gnmi_openconfig/tools/request_composers.py index 0a8aefe24906011a8e329460c1c8d964a8097091..539f71ee63102f6090c48b674dcb9dd4204851ec 100644 --- a/src/device/tests/gnmi_openconfig/tools/request_composers.py +++ b/src/device/tests/gnmi_openconfig/tools/request_composers.py @@ -14,11 +14,20 @@ from typing import Dict, Tuple -def interface(if_name, sif_index, ipv4_address, ipv4_prefix, enabled) -> Tuple[str, Dict]: +def interface(if_name, sif_index, ipv4_address=None, ipv4_prefix=None, enabled=True, vlan_id=None) -> Tuple[str, Dict]: str_path = '/interface[{:s}]'.format(if_name) str_data = { - 'name': if_name, 'enabled': enabled, 'sub_if_index': sif_index, 'sub_if_enabled': enabled, - 'sub_if_ipv4_enabled': enabled, 'sub_if_ipv4_address': ipv4_address, 'sub_if_ipv4_prefix': ipv4_prefix + 'name': if_name, + 'enabled': enabled, + 'index': sif_index, + 'sub_if_index': sif_index, + 'sub_if_enabled': enabled, + 'sub_if_ipv4_enabled': enabled, + 'sub_if_ipv4_address': ipv4_address, + 'sub_if_ipv4_prefix': ipv4_prefix, + 'address_ip': ipv4_address, + 'address_prefix': ipv4_prefix, + 'vlan_id': vlan_id, } return str_path, str_data @@ -42,3 +51,70 @@ def network_instance_interface(ni_name, if_name, sif_index) -> Tuple[str, Dict]: 'name': ni_name, 'if_name': if_name, 'sif_index': sif_index } return str_path, str_data + +def mpls_global(ldp_router_id: str, hello_interval: int = None, hello_holdtime: int = None) -> Tuple[str, Dict]: + str_path = '/mpls' + str_data = { + 'ldp': { + 'lsr_id': ldp_router_id, + 'hello_interval': hello_interval, + 'hello_holdtime': hello_holdtime, + } + } + return str_path, str_data + +def mpls_ldp_interface(if_name: str, hello_interval: int = None, hello_holdtime: int = None) -> Tuple[str, Dict]: + str_path = '/mpls/interface[{:s}]'.format(if_name) + str_data = { + 'interface': if_name, + 'hello_interval': hello_interval, + 'hello_holdtime': hello_holdtime, + } + return str_path, str_data + +def connection_point(ni_name: str, cp_id: str) -> Tuple[str, Dict]: + str_path = '/network_instance[{:s}]/connection_point[{:s}]'.format(ni_name, cp_id) + str_data = {'name': ni_name, 'connection_point_id': cp_id} + return str_path, str_data + +def connection_point_endpoint_local( + ni_name: str, cp_id: str, ep_id: str, if_name: str, subif: int = 0, precedence: int = 0, site_id: int = None +) -> Tuple[str, Dict]: + str_path = '/network_instance[{:s}]/connection_point[{:s}]/endpoint[{:s}]'.format(ni_name, cp_id, ep_id) + str_data = { + 'name': ni_name, + 'connection_point_id': cp_id, + 'endpoint_id': ep_id, + 'type': 'LOCAL', + 'precedence': precedence, + 'interface': if_name, + 'subinterface': subif, + 'site_id': site_id, + } + return str_path, str_data + +def connection_point_endpoint_remote( + ni_name: str, cp_id: str, ep_id: str, remote_system: str, vc_id: int, + precedence: int = 0, site_id: int = None +) -> Tuple[str, Dict]: + str_path = '/network_instance[{:s}]/connection_point[{:s}]/endpoint[{:s}]'.format(ni_name, cp_id, ep_id) + str_data = { + 'name': ni_name, + 'connection_point_id': cp_id, + 'endpoint_id': ep_id, + 'type': 'REMOTE', + 'precedence': precedence, + 'remote_system': remote_system, + 'virtual_circuit_id': vc_id, + 'site_id': site_id, + } + return str_path, str_data + +def vlan(ni_name: str, vlan_id: int, vlan_name: str = None) -> Tuple[str, Dict]: + str_path = '/network_instance[{:s}]/vlan[{:d}]'.format(ni_name, vlan_id) + str_data = { + 'name': ni_name, + 'vlan_id': vlan_id, + 'vlan_name': vlan_name, + } + return str_path, str_data diff --git a/src/device/tests/restconf_openconfig/__init__.py b/src/device/tests/restconf_openconfig/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..3ccc21c7db78aac26daa1f8c5ff8e1ffd3f35460 --- /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 0000000000000000000000000000000000000000..edb3b917741b075d19325d1c88988b5be61f09e5 --- /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 0000000000000000000000000000000000000000..9a2b7c7c16807fb9957a6149afe57520bf19f478 --- /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 0000000000000000000000000000000000000000..79a87086ae381eabc52c27f5bfc7e18f0d6ad63d --- /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 0000000000000000000000000000000000000000..0d4aa6253a39cc7cd033f286ce2d763c16c40957 --- /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) diff --git a/src/kpi_manager/database/KpiModel.py b/src/kpi_manager/database/KpiModel.py index 169f9d2652cc6656128ca8d6ff671ca7abab6e46..62596d0c964487013d659e945deccc9c5390e9ae 100644 --- a/src/kpi_manager/database/KpiModel.py +++ b/src/kpi_manager/database/KpiModel.py @@ -18,7 +18,6 @@ from sqlalchemy import Column, Integer, String, Text from sqlalchemy.orm import registry from common.proto.kpi_manager_pb2 import KpiDescriptor -logging.basicConfig(level=logging.INFO) LOGGER = logging.getLogger(__name__) # Create a base class for declarative models diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py index da3eefe788f61f99e192c5820440928c93c38c79..86683898a5af81ebd605a749b35c3fb3d289280c 100644 --- a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py +++ b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py @@ -35,7 +35,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): self, request: KpiDescriptor, grpc_context: grpc.ServicerContext # type: ignore ) -> KpiId: # type: ignore response = KpiId() - LOGGER.info("Received gRPC message object: {:}".format(request)) + LOGGER.debug(f"SetKpiDescriptor - Received gRPC message object: {request}") kpi_to_insert = KpiModel.convert_KpiDescriptor_to_row(request) if self.kpi_db_obj.add_row_to_db(kpi_to_insert): response.kpi_id.uuid = request.kpi_id.kpi_id.uuid @@ -47,11 +47,11 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): self, request: KpiId, grpc_context: grpc.ServicerContext # type: ignore ) -> KpiDescriptor: # type: ignore response = KpiDescriptor() - LOGGER.info("Received gRPC message object: {:}".format(request)) + LOGGER.debug(f"GetKpiDescriptor - Received gRPC message object: {request}") kpi_id_to_search = request.kpi_id.uuid row = self.kpi_db_obj.search_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search) if row is None: - LOGGER.info('No matching row found kpi id: {:}'.format(kpi_id_to_search)) + LOGGER.error(f"No matching row found kpi id: {kpi_id_to_search}") raise NotFoundException('KpiDescriptor', kpi_id_to_search) response = KpiModel.convert_row_to_KpiDescriptor(row) return response @@ -60,7 +60,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): def DeleteKpiDescriptor( self, request: KpiId, grpc_context: grpc.ServicerContext # type: ignore ) -> Empty: # type: ignore - LOGGER.info("Received gRPC message object: {:}".format(request)) + LOGGER.debug(f"DeleteKpiDescriptor - Received gRPC message object: {request}") kpi_id_to_search = request.kpi_id.uuid self.kpi_db_obj.delete_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search) return Empty() @@ -69,7 +69,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): def SelectKpiDescriptor( self, filter: KpiDescriptorFilter, grpc_context: grpc.ServicerContext # type: ignore ) -> KpiDescriptorList: # type: ignore - LOGGER.info("Received gRPC message object: {:}".format(filter)) + LOGGER.debug(f"SelectKpiDescriptor - Received gRPC message object: {filter}") response = KpiDescriptorList() rows = self.kpi_db_obj.select_with_filter(KpiModel, filter) for row in rows: diff --git a/src/kpi_manager/service/__main__.py b/src/kpi_manager/service/__main__.py index 936a8fb3da1aaec16b37e98d71ac446a1d7ad117..0421fc6a1542264c520ad9861334bf7562130cf0 100644 --- a/src/kpi_manager/service/__main__.py +++ b/src/kpi_manager/service/__main__.py @@ -30,7 +30,7 @@ def main(): global LOGGER # pylint: disable=global-statement log_level = get_log_level() - logging.basicConfig(level=log_level) + logging.basicConfig(level=log_level, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s") LOGGER = logging.getLogger(__name__) signal.signal(signal.SIGINT, signal_handler) diff --git a/src/kpi_value_api/service/__main__.py b/src/kpi_value_api/service/__main__.py index 062856874bbe24a6407bd15fe3854b8780c25ad3..be6596e9835cf2b39638e38b6ee63ff07e8324d3 100644 --- a/src/kpi_value_api/service/__main__.py +++ b/src/kpi_value_api/service/__main__.py @@ -27,7 +27,7 @@ def main(): global LOGGER # pylint: disable=global-statement log_level = get_log_level() - logging.basicConfig(level=log_level) + logging.basicConfig(level=log_level, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s") LOGGER = logging.getLogger(__name__) signal.signal(signal.SIGINT, signal_handler) diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index fa4d482b583ed69e16563e6aa8944c837f0a0ba4..fe84fabaa15996833523a1301f78bc5506431db1 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -49,21 +49,21 @@ class KpiValueWriter(GenericGrpcService): consumer = self.kafka_consumer consumer.subscribe([KafkaTopic.VALUE.value]) - LOGGER.debug("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) + LOGGER.debug(f"Kafka Consumer start listening on topic: {KafkaTopic.VALUE.value}") while True: raw_kpi = consumer.poll(1.0) if raw_kpi is None: continue elif raw_kpi.error(): if raw_kpi.error().code() != KafkaError._PARTITION_EOF: - print("Consumer error: {}".format(raw_kpi.error())) + LOGGER.debug(f"Consumer error: {raw_kpi.error()}") continue try: kpi_value = json.loads(raw_kpi.value().decode('utf-8')) - LOGGER.info("Received KPI : {:}".format(kpi_value)) + LOGGER.debug(f"Received KPI: {kpi_value}") self.get_kpi_descriptor(kpi_value, kpi_manager_client, metric_writer) - except: - LOGGER.exception("Error detail: ") + except Exception as ex: + LOGGER.exception(f"Error detail: {ex}") continue def get_kpi_descriptor(self, kpi_value: str, kpi_manager_client, metric_writer): @@ -73,9 +73,9 @@ class KpiValueWriter(GenericGrpcService): kpi_descriptor_object = KpiDescriptor() kpi_descriptor_object = kpi_manager_client.GetKpiDescriptor(kpi_id) if kpi_descriptor_object.kpi_id.kpi_id.uuid == kpi_id.kpi_id.uuid: - LOGGER.info("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object)) + LOGGER.debug(f"Extracted KpiDescriptor: {kpi_descriptor_object}") metric_writer.create_and_expose_cooked_kpi(kpi_descriptor_object, kpi_value) else: - LOGGER.info("No KPI Descriptor found in Database for Kpi ID: {:}".format(kpi_id)) + LOGGER.warning(f"No KPI Descriptor found in Database for KPI ID: {kpi_id}") except: LOGGER.exception("Unable to get KpiDescriptor") diff --git a/src/kpi_value_writer/service/__main__.py b/src/kpi_value_writer/service/__main__.py index e90bdf9bd105a112b5d83ae6ce50a7c7588b27fb..ddda5173a0449a342a0d4246ce8ca0bd1f08b253 100644 --- a/src/kpi_value_writer/service/__main__.py +++ b/src/kpi_value_writer/service/__main__.py @@ -27,7 +27,7 @@ def main(): global LOGGER # pylint: disable=global-statement log_level = get_log_level() - logging.basicConfig(level=log_level) + logging.basicConfig(level=log_level, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s") LOGGER = logging.getLogger(__name__) signal.signal(signal.SIGINT, signal_handler) diff --git a/src/load_generator/requirements.in b/src/load_generator/requirements.in index a2ee41d8317c5146977ef173654b823f476d2237..aa83a97e393b2fb344655a742d98047a8b8fc69a 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 diff --git a/src/nbi/service/ietf_acl/Acl.py b/src/nbi/service/ietf_acl/Acl.py index c0635968bacfa7c6168f845ca9347aa1b63ee25e..d48b645de9fd68e136724697ea82a6fecf0b5346 100644 --- a/src/nbi/service/ietf_acl/Acl.py +++ b/src/nbi/service/ietf_acl/Acl.py @@ -13,6 +13,7 @@ # limitations under the License. import json, logging, re +from flask import jsonify from flask_restful import Resource from werkzeug.exceptions import NotFound from common.proto.context_pb2 import ConfigActionEnum, ConfigRule @@ -20,6 +21,7 @@ from common.tools.context_queries.Device import get_device from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from nbi.service._tools.Authentication import HTTP_AUTH +from nbi.service._tools.HttpStatusCodes import HTTP_NOCONTENT from .ietf_acl_parser import ietf_acl_from_config_rule_resource_value LOGGER = logging.getLogger(__name__) @@ -72,4 +74,7 @@ class Acl(Resource): del device.device_config.config_rules[:] device.device_config.config_rules.extend(delete_config_rules) device_client.ConfigureDevice(device) - return None + + response = jsonify({}) + response.status_code = HTTP_NOCONTENT + return response diff --git a/src/nbi/service/ietf_acl/Acls.py b/src/nbi/service/ietf_acl/Acls.py index e966f2c0c0fda057dfdf3c5d397c10b667f69d40..e9268226b8c7ca03a90864118462aaf0025112ca 100644 --- a/src/nbi/service/ietf_acl/Acls.py +++ b/src/nbi/service/ietf_acl/Acls.py @@ -23,6 +23,7 @@ from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from nbi.service._tools.Authentication import HTTP_AUTH +from nbi.service._tools.HttpStatusCodes import HTTP_CREATED from .ietf_acl_parser import AclDirectionEnum, config_rule_from_ietf_acl from .YangValidator import YangValidator @@ -129,4 +130,7 @@ class Acls(Resource): device_client = DeviceClient() device_client.ConfigureDevice(device) - return jsonify({}) + + response = jsonify({}) + response.status_code = HTTP_CREATED + return response diff --git a/src/nbi/service/ietf_acl/ietf_acl_parser.py b/src/nbi/service/ietf_acl/ietf_acl_parser.py index 65e9129a25d693327c29e503cdd832bac38b4561..66c041f200dd6582e6f879016ccc63fd573151b7 100644 --- a/src/nbi/service/ietf_acl/ietf_acl_parser.py +++ b/src/nbi/service/ietf_acl/ietf_acl_parser.py @@ -28,9 +28,12 @@ class AclDirectionEnum(Enum): class Ipv4(BaseModel): dscp: int = 0 - source_ipv4_network: str = Field(serialization_alias='source-ipv4-network', default='') - destination_ipv4_network: str = Field( - serialization_alias='destination-ipv4-network', default='' + protocol: int = 0 + source_ipv4_network: Optional[str] = Field( + serialization_alias='source-ipv4-network', default=None + ) + destination_ipv4_network: Optional[str] = Field( + serialization_alias='destination-ipv4-network', default=None ) @@ -45,9 +48,15 @@ class Tcp(BaseModel): destination_port: Optional[Port] = Field(serialization_alias='destination-port', default=None) +class Udp(BaseModel): + source_port: Optional[Port] = Field(serialization_alias='source-port', default=None) + destination_port: Optional[Port] = Field(serialization_alias='destination-port', default=None) + + class Matches(BaseModel): ipv4: Ipv4 = Ipv4() tcp: Optional[Tcp] = None + udp: Optional[Udp] = None class Action(BaseModel): @@ -118,7 +127,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 +138,8 @@ TFS_IETF_RULE_TYPE_MAPPING = { TFS_IETF_FORWARDING_ACTION_MAPPING = { 'ACLFORWARDINGACTION_ACCEPT': 'accept', - 'ACLFORWARDINGACTION_DROP': 'drop', + 'ACLFORWARDINGACTION_DROP' : 'drop', + 'ACLFORWARDINGACTION_REJECT': 'reject', } @@ -235,27 +246,42 @@ def config_rule_from_ietf_acl( def ietf_acl_from_config_rule_resource_value(config_rule_rv: Dict) -> Dict: - rule_set = config_rule_rv['rule_set'] + rule_set = config_rule_rv.get('rule_set', dict()) ace = [] - for acl_entry in rule_set['entries']: - match_ = acl_entry['match'] + for acl_entry in rule_set.get('entries', list()): + match_ = acl_entry.get('match', dict()) + protocol = match_.get('protocol', 0) ipv4 = Ipv4( - dscp=match_['dscp'], - source_ipv4_network=match_['src_address'], - destination_ipv4_network=match_['dst_address'], + dscp=match_.get('dscp', 0), + protocol=protocol, + source_ipv4_network=match_.get('src_address'), + destination_ipv4_network=match_.get('dst_address'), ) + + src_port = match_.get('src_port') + src_port = None if src_port is None else Port(port=src_port) + dst_port = match_.get('dst_port') + dst_port = None if dst_port is None else Port(port=dst_port) + tcp = None - if match_['tcp_flags']: + udp = None + if protocol == 6: tcp = Tcp( - flags=match_['tcp_flags'], - source_port=Port(port=match_['src_port']), - destination_port=Port(port=match_['dst_port']), + flags=match_.get('tcp_flags', 0), + source_port=src_port, + destination_port=dst_port, ) - matches = Matches(ipv4=ipv4, tcp=tcp) + elif protocol == 17: + udp = Udp( + source_port=src_port, + destination_port=dst_port, + ) + + matches = Matches(ipv4=ipv4, tcp=tcp, udp=udp) ace.append( Ace( - name=acl_entry['description'], + name=acl_entry.get('description', ''), matches=matches, actions=Action( forwarding=TFS_IETF_FORWARDING_ACTION_MAPPING[ diff --git a/src/nbi/service/ietf_l2vpn/Handlers.py b/src/nbi/service/ietf_l2vpn/Handlers.py new file mode 100644 index 0000000000000000000000000000000000000000..1b8fc2b93dfc7d724e26954ea18f9e263a85cf3a --- /dev/null +++ b/src/nbi/service/ietf_l2vpn/Handlers.py @@ -0,0 +1,327 @@ +# 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, Optional +from common.Constants import DEFAULT_CONTEXT_NAME +from common.proto.context_pb2 import Service, ServiceStatusEnum, ServiceTypeEnum +from common.tools.context_queries.Service import get_service_by_uuid +from common.tools.grpc.ConfigRules import update_config_rule_custom +from common.tools.grpc.Constraints import ( + update_constraint_custom_dict, update_constraint_endpoint_location, + update_constraint_endpoint_priority, update_constraint_sla_availability, + update_constraint_sla_capacity, update_constraint_sla_latency, +) +from common.tools.grpc.EndPointIds import update_endpoint_ids +from common.tools.grpc.Tools import grpc_message_to_json_string +from context.client.ContextClient import ContextClient +from service.client.ServiceClient import ServiceClient +from .Constants import ( + #DEFAULT_ADDRESS_FAMILIES, DEFAULT_BGP_AS, DEFAULT_BGP_ROUTE_TARGET, + BEARER_MAPPINGS, DEFAULT_MTU, +) + +LOGGER = logging.getLogger(__name__) + +def create_service( + service_uuid : str, + service_type : ServiceTypeEnum = ServiceTypeEnum.SERVICETYPE_L2NM, + context_uuid : Optional[str] = DEFAULT_CONTEXT_NAME, +) -> Optional[Exception]: + # pylint: disable=no-member + service_request = Service() + service_request.service_id.context_id.context_uuid.uuid = context_uuid + service_request.service_id.service_uuid.uuid = service_uuid + service_request.service_type = service_type + service_request.service_status.service_status = ServiceStatusEnum.SERVICESTATUS_PLANNED + + try: + service_client = ServiceClient() + service_client.CreateService(service_request) + return None + except Exception as e: # pylint: disable=broad-except + LOGGER.exception('Unhandled exception creating Service') + return e + +def process_vpn_service( + vpn_service : Dict, errors : List[Dict] +) -> None: + vpn_id = vpn_service['vpn-id'] + customer_name = vpn_service.get('customer-name') + if isinstance(customer_name, str) and customer_name.strip().lower() == 'osm': + service_type = ServiceTypeEnum.SERVICETYPE_L3NM + else: + service_type = ServiceTypeEnum.SERVICETYPE_L2NM + exc = create_service(vpn_id, service_type=service_type) + if exc is not None: errors.append({'error': str(exc)}) + + +def process_site_network_access( + site_id : str, network_access : Dict, errors : List[Dict] +) -> None: + try: + #device_uuid = None + #endpoint_uuid = None + #if 'device-reference' in network_access: + # device_uuid = network_access['device-reference'] + # endpoint_uuid = network_access['network-access-id'] + + bearer_reference = None + if 'bearer' in network_access: + network_access_bearer = network_access['bearer'] + if 'bearer-reference' in network_access_bearer: + bearer_reference = network_access_bearer['bearer-reference'] + + bearer_mapping = BEARER_MAPPINGS.get(bearer_reference) + if bearer_mapping is None: + if ':' in bearer_reference: + bearer_mapping = str(bearer_reference).split(':', maxsplit=1) + bearer_mapping.extend([None, None, None, None, None, None, None]) + bearer_mapping = tuple(bearer_mapping) + MSG = 'Bearer({:s}) not found; auto-generated mapping: {:s}' + LOGGER.warning(MSG.format(str(bearer_reference), str(bearer_mapping))) + else: + MSG = 'Bearer({:s}) not found; unable to auto-generated mapping' + raise Exception(MSG.format(str(bearer_reference))) + + ( + device_uuid, endpoint_uuid, router_id, route_dist, sub_if_index, + address_ip, address_prefix, remote_router, circuit_id + ) = bearer_mapping + + service_uuid = network_access['vpn-attachment']['vpn-id'] + + network_access_connection = network_access['connection'] + encapsulation_type = network_access_connection['encapsulation-type'] + encapsulation_type = encapsulation_type.replace('ietf-l2vpn-svc:', '') + if encapsulation_type != 'vlan': + encapsulation_type = network_access_connection['encapsulation-type'] + MSG = 'EncapsulationType({:s}) not supported' + raise NotImplementedError(MSG.format(str(encapsulation_type))) + + cvlan_tag_id = None + if 'tagged-interface' in network_access_connection: + nac_tagged_if = network_access_connection['tagged-interface'] + nac_tagged_if_type = nac_tagged_if.get('type', 'priority-tagged') + nac_tagged_if_type = nac_tagged_if_type.replace('ietf-l2vpn-svc:', '') + if nac_tagged_if_type == 'dot1q': + encapsulation_data = nac_tagged_if['dot1q-vlan-tagged'] + tag_type = encapsulation_data.get('tg-type', 'c-vlan') + tag_type = tag_type.replace('ietf-l2vpn-svc:', '') + if tag_type == 'c-vlan': + cvlan_tag_id = encapsulation_data['cvlan-id'] + else: + tag_type = encapsulation_data.get('tg-type', 'c-vlan') + MSG = 'TagType({:s}) not supported' + raise NotImplementedError(MSG.format(str(tag_type))) + else: + nac_tagged_if_type = nac_tagged_if.get('type', 'priority-tagged') + MSG = 'TaggedInterfaceType({:s}) not supported' + raise NotImplementedError(MSG.format(str(nac_tagged_if_type))) + + network_access_service = network_access.get('service', dict()) + + service_mtu = network_access_service.get('svc-mtu', DEFAULT_MTU) + + max_bandwidth_gbps = None + max_e2e_latency_ms = None + availability = None + + service_bandwidth_bps = 0 + service_input_bandwidth = network_access_service.get('svc-input-bandwidth') + if service_input_bandwidth is not None: + service_input_bandwidth = float(service_input_bandwidth) + service_bandwidth_bps = max(service_bandwidth_bps, service_input_bandwidth) + + service_output_bandwidth = network_access_service.get('svc-output-bandwidth') + if service_output_bandwidth is not None: + service_output_bandwidth = float(service_output_bandwidth) + if service_bandwidth_bps is None: + service_bandwidth_bps = service_output_bandwidth + else: + service_bandwidth_bps = max(service_bandwidth_bps, service_output_bandwidth) + + if service_bandwidth_bps > 1.e-12: + max_bandwidth_gbps = service_bandwidth_bps / 1.e9 + + qos_profile_classes = ( + network_access.get('service', dict()) + .get('qos', dict()) + .get('qos-profile', dict()) + .get('classes', dict()) + .get('class', list()) + ) + for qos_profile_class in qos_profile_classes: + if qos_profile_class['class-id'] != 'qos-realtime': + MSG = 'Site Network Access QoS Class Id: {:s}' + raise NotImplementedError(MSG.format(str(qos_profile_class['class-id']))) + + qos_profile_class_direction = qos_profile_class['direction'] + qos_profile_class_direction = qos_profile_class_direction.replace('ietf-l2vpn-svc:', '') + if qos_profile_class_direction != 'both': + MSG = 'Site Network Access QoS Class Direction: {:s}' + raise NotImplementedError(MSG.format(str(qos_profile_class['direction']))) + + max_e2e_latency_ms = float(qos_profile_class['latency']['latency-boundary']) + availability = float(qos_profile_class['bandwidth']['guaranteed-bw-percent']) + + network_access_diversity = network_access.get('access-diversity', {}) + diversity_constraints = network_access_diversity.get('constraints', {}).get('constraint', []) + raise_if_differs = True + diversity_constraints = { + constraint['constraint-type']:([ + target[0] + for target in constraint['target'].items() + if len(target[1]) == 1 + ][0], raise_if_differs) + for constraint in diversity_constraints + } + + network_access_availability = network_access.get('availability', {}) + access_priority : Optional[int] = network_access_availability.get('access-priority') + single_active : bool = len(network_access_availability.get('single-active', [])) > 0 + all_active : bool = len(network_access_availability.get('all-active', [])) > 0 + + context_client = ContextClient() + service = get_service_by_uuid( + context_client, service_uuid, context_uuid=DEFAULT_CONTEXT_NAME, rw_copy=True + ) + if service is None: + raise Exception('VPN({:s}) not found in database'.format(str(service_uuid))) + + endpoint_ids = service.service_endpoint_ids + config_rules = service.service_config.config_rules + constraints = service.service_constraints + + endpoint_id = update_endpoint_ids(endpoint_ids, device_uuid, endpoint_uuid) + + update_constraint_endpoint_location(constraints, endpoint_id, region=site_id) + if access_priority is not None: + update_constraint_endpoint_priority(constraints, endpoint_id, access_priority) + if max_bandwidth_gbps is not None: + update_constraint_sla_capacity(constraints, max_bandwidth_gbps) + if max_e2e_latency_ms is not None: + update_constraint_sla_latency(constraints, max_e2e_latency_ms) + if availability is not None: + update_constraint_sla_availability(constraints, 1, True, availability) + if len(diversity_constraints) > 0: + update_constraint_custom_dict(constraints, 'diversity', diversity_constraints) + if single_active or all_active: + # assume 1 disjoint path per endpoint/location included in service + location_endpoints = {} + for constraint in constraints: + if constraint.WhichOneof('constraint') != 'endpoint_location': continue + str_endpoint_id = grpc_message_to_json_string(constraint.endpoint_location.endpoint_id) + str_location_id = grpc_message_to_json_string(constraint.endpoint_location.location) + location_endpoints.setdefault(str_location_id, set()).add(str_endpoint_id) + num_endpoints_per_location = {len(endpoints) for endpoints in location_endpoints.values()} + num_disjoint_paths = max(num_endpoints_per_location) + update_constraint_sla_availability(constraints, num_disjoint_paths, all_active, 0.0) + + service_settings_key = '/settings' + field_updates = { + 'mtu' : (service_mtu, True), + #'address_families': (DEFAULT_ADDRESS_FAMILIES, True), + #'bgp_as' : (DEFAULT_BGP_AS, True), + #'bgp_route_target': (DEFAULT_BGP_ROUTE_TARGET, True), + } + if cvlan_tag_id is not None: field_updates['vlan_id' ] = (cvlan_tag_id, True) + update_config_rule_custom(config_rules, service_settings_key, field_updates) + + #ENDPOINT_SETTINGS_KEY = '/device[{:s}]/endpoint[{:s}]/vlan[{:d}]/settings' + #endpoint_settings_key = ENDPOINT_SETTINGS_KEY.format(device_uuid, endpoint_uuid, cvlan_tag_id) + ENDPOINT_SETTINGS_KEY = '/device[{:s}]/endpoint[{:s}]/settings' + endpoint_settings_key = ENDPOINT_SETTINGS_KEY.format(device_uuid, endpoint_uuid) + field_updates = {} + if router_id is not None: field_updates['router_id' ] = (router_id, True) + if route_dist is not None: field_updates['route_distinguisher'] = (route_dist, True) + if sub_if_index is not None: field_updates['sub_interface_index'] = (sub_if_index, True) + if cvlan_tag_id is not None: field_updates['vlan_id' ] = (cvlan_tag_id, True) + if address_ip is not None: field_updates['address_ip' ] = (address_ip, True) + if address_prefix is not None: field_updates['address_prefix' ] = (address_prefix, True) + if remote_router is not None: field_updates['remote_router' ] = (remote_router, True) + if circuit_id is not None: field_updates['circuit_id' ] = (circuit_id, True) + update_config_rule_custom(config_rules, endpoint_settings_key, field_updates) + + service_client = ServiceClient() + service_client.UpdateService(service) + except Exception as exc: + LOGGER.exception('Unhandled Exception') + errors.append({'error': str(exc)}) + + +def process_site(site : Dict, errors : List[Dict]) -> None: + site_id = site['site-id'] + + site_management_type = site['management']['type'] + site_management_type = site_management_type.replace('ietf-l2vpn-svc:', '') + if site_management_type != 'provider-managed': + MSG = 'Site Management Type: {:s}' + raise NotImplementedError(MSG.format(str(site['management']['type']))) + + network_accesses : List[Dict] = site['site-network-accesses']['site-network-access'] + for network_access in network_accesses: + process_site_network_access(site_id, network_access, errors) + +def update_vpn(site : Dict, errors : List[Dict]) -> None: + site_management_type = site['management']['type'] + site_management_type = site_management_type.replace('ietf-l2vpn-svc:', '') + if site_management_type != 'provider-managed': + MSG = 'Site Management Type: {:s}' + raise NotImplementedError(MSG.format(str(site['management']['type']))) + + network_accesses : List[Dict] = site['site-network-accesses']['site-network-access'] + for network_access in network_accesses: + update_site_network_access(network_access, errors) + +def update_site_network_access(network_access : Dict, errors : List[Dict]) -> None: + try: + site_network_access_type = network_access['site-network-access-type'] + site_network_access_type = site_network_access_type.replace('ietf-l2vpn-svc:', '') + if site_network_access_type != 'multipoint': + MSG = 'Site Network Access Type: {:s}' + msg = MSG.format(str(network_access['site-network-access-type'])) + raise NotImplementedError(msg) + + service_uuid = network_access['vpn-attachment']['vpn-id'] + + service_input_bandwidth = network_access['service']['svc-input-bandwidth'] + service_output_bandwidth = network_access['service']['svc-output-bandwidth'] + service_bandwidth_bps = max(service_input_bandwidth, service_output_bandwidth) + max_bandwidth_gbps = service_bandwidth_bps / 1.e9 + + max_e2e_latency_ms = None + availability = None + + context_client = ContextClient() + service = get_service_by_uuid( + context_client, service_uuid, context_uuid=DEFAULT_CONTEXT_NAME, rw_copy=True + ) + if service is None: + MSG = 'VPN({:s}) not found in database' + raise Exception(MSG.format(str(service_uuid))) + + constraints = service.service_constraints + if max_bandwidth_gbps is not None: + update_constraint_sla_capacity(constraints, max_bandwidth_gbps) + if max_e2e_latency_ms is not None: + update_constraint_sla_latency(constraints, max_e2e_latency_ms) + if availability is not None: + update_constraint_sla_availability(constraints, 1, True, availability) + + service_client = ServiceClient() + service_client.UpdateService(service) + except Exception as e: # pylint: disable=broad-except + LOGGER.exception('Unhandled exception updating Service') + errors.append({'error': str(e)}) diff --git a/src/nbi/service/ietf_l2vpn/L2VPN_Service.py b/src/nbi/service/ietf_l2vpn/L2VPN_Service.py index 1df6642ecfb1006d1c4491ab679c6d6f0428c44c..31354ae325d56a27e60c4209c850ea62509ad486 100644 --- a/src/nbi/service/ietf_l2vpn/L2VPN_Service.py +++ b/src/nbi/service/ietf_l2vpn/L2VPN_Service.py @@ -16,14 +16,18 @@ import logging from flask import request from flask.json import jsonify from flask_restful import Resource -from common.proto.context_pb2 import SliceStatusEnum -from common.tools.context_queries.Slice import get_slice_by_uuid +from common.proto.context_pb2 import ServiceStatusEnum, ServiceTypeEnum +from common.tools.context_queries.Service import get_service_by_uuid from context.client.ContextClient import ContextClient -from slice.client.SliceClient import SliceClient +from service.client.ServiceClient import ServiceClient +from typing import Dict, List +from werkzeug.exceptions import UnsupportedMediaType from nbi.service._tools.Authentication import HTTP_AUTH from nbi.service._tools.HttpStatusCodes import ( HTTP_GATEWAYTIMEOUT, HTTP_NOCONTENT, HTTP_OK, HTTP_SERVERERROR ) +from .Handlers import update_vpn +from .YangValidator import YangValidator LOGGER = logging.getLogger(__name__) @@ -36,17 +40,24 @@ class L2VPN_Service(Resource): try: context_client = ContextClient() - target = get_slice_by_uuid(context_client, vpn_id, rw_copy=True) + target = get_service_by_uuid(context_client, vpn_id, rw_copy=True) if target is None: raise Exception('VPN({:s}) not found in database'.format(str(vpn_id))) + + if target.service_type not in ( + ServiceTypeEnum.SERVICETYPE_L2NM, + ServiceTypeEnum.SERVICETYPE_L3NM, + ): + raise Exception('VPN({:s}) is not L2VPN'.format(str(vpn_id))) - if target.slice_id.slice_uuid.uuid != vpn_id: # pylint: disable=no-member - raise Exception('Slice retrieval failed. Wrong Slice Id was returned') + service_ids = {target.service_id.service_uuid.uuid, target.name} # pylint: disable=no-member + if vpn_id not in service_ids: + raise Exception('Service retrieval failed. Wrong Service Id was returned') - slice_ready_status = SliceStatusEnum.SLICESTATUS_ACTIVE - slice_status = target.slice_status.slice_status # pylint: disable=no-member - response = jsonify({}) - response.status_code = HTTP_OK if slice_status == slice_ready_status else HTTP_GATEWAYTIMEOUT + service_ready_status = ServiceStatusEnum.SERVICESTATUS_ACTIVE + service_status = target.service_status.service_status # pylint: disable=no-member + response = jsonify({'service-id': target.service_id.service_uuid.uuid}) + response.status_code = HTTP_OK if service_status == service_ready_status else HTTP_GATEWAYTIMEOUT except Exception as e: # pylint: disable=broad-except LOGGER.exception('Something went wrong Retrieving VPN({:s})'.format(str(vpn_id))) response = jsonify({'error': str(e)}) @@ -61,14 +72,20 @@ class L2VPN_Service(Resource): try: context_client = ContextClient() - target = get_slice_by_uuid(context_client, vpn_id) + target = get_service_by_uuid(context_client, vpn_id) if target is None: LOGGER.warning('VPN({:s}) not found in database. Nothing done.'.format(str(vpn_id))) + elif target.service_type not in ( + ServiceTypeEnum.SERVICETYPE_L2NM, + ServiceTypeEnum.SERVICETYPE_L3NM, + ): + raise Exception('VPN({:s}) is not L2VPN'.format(str(vpn_id))) else: - if target.slice_id.slice_uuid.uuid != vpn_id: # pylint: disable=no-member - raise Exception('Slice retrieval failed. Wrong Slice Id was returned') - slice_client = SliceClient() - slice_client.DeleteSlice(target.slice_id) + service_ids = {target.service_id.service_uuid.uuid, target.name} # pylint: disable=no-member + if vpn_id not in service_ids: + raise Exception('Service retrieval failed. Wrong Service Id was returned') + service_client = ServiceClient() + service_client.DeleteService(target.service_id) response = jsonify({}) response.status_code = HTTP_NOCONTENT except Exception as e: # pylint: disable=broad-except @@ -76,3 +93,42 @@ class L2VPN_Service(Resource): response = jsonify({'error': str(e)}) response.status_code = HTTP_SERVERERROR return response + + def put(self, vpn_id : str): + #TODO: check vpn_id with request service_id in body + if not request.is_json: raise UnsupportedMediaType('JSON payload is required') + request_data: Dict = request.json + LOGGER.debug('PUT Request: {:s}'.format(str(request_data))) + + errors = list() + + if 'ietf-l2vpn-svc:l2vpn-services' in request_data: + for l2vpn_svc in request_data['ietf-l2vpn-svc:l2vpn-services']['l2vpn-svc']: + l2vpn_svc.pop('service-id', None) + l2vpn_svc_request_data = {'ietf-l2vpn-svc:l2vpn-svc': l2vpn_svc} + errors.extend(self._update_l2vpn(l2vpn_svc_request_data)) + elif 'ietf-l2vpn-svc:l2vpn-svc' in request_data: + errors.extend(self._update_l2vpn(request_data)) + else: + errors.append('Unexpected request format: {:s}'.format(str(request_data))) + + if len(errors) > 0: + LOGGER.error('Errors: {:s}'.format(str(errors))) + else: + LOGGER.debug('Errors: {:s}'.format(str(errors))) + + response = jsonify(errors) + response.status_code = HTTP_NOCONTENT if len(errors) == 0 else HTTP_SERVERERROR + return response + + def _update_l2vpn(self, request_data: Dict) -> List[Dict]: + yang_validator = YangValidator('ietf-l2vpn-svc') + request_data = yang_validator.parse_to_dict(request_data) + yang_validator.destroy() + + errors = list() + + for site in request_data['l2vpn-svc']['sites']['site']: + update_vpn(site, errors) + + return errors diff --git a/src/nbi/service/ietf_l2vpn/L2VPN_Services.py b/src/nbi/service/ietf_l2vpn/L2VPN_Services.py index a760bfd3a5f324757b376196aa251a48529116a4..a43a78725aef1191f9b3a90a1b0e2b2bda2204bd 100644 --- a/src/nbi/service/ietf_l2vpn/L2VPN_Services.py +++ b/src/nbi/service/ietf_l2vpn/L2VPN_Services.py @@ -18,13 +18,10 @@ from flask import request from flask.json import jsonify from flask_restful import Resource from werkzeug.exceptions import UnsupportedMediaType -from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import SliceStatusEnum, Slice -from slice.client.SliceClient import SliceClient -from nbi.service._tools.HttpStatusCodes import HTTP_CREATED, HTTP_SERVERERROR -from nbi.service._tools.Validator import validate_message from nbi.service._tools.Authentication import HTTP_AUTH -from .schemas.vpn_service import SCHEMA_VPN_SERVICE +from nbi.service._tools.HttpStatusCodes import HTTP_CREATED, HTTP_SERVERERROR +from .Handlers import process_site, process_vpn_service +from .YangValidator import YangValidator LOGGER = logging.getLogger(__name__) @@ -38,24 +35,74 @@ class L2VPN_Services(Resource): if not request.is_json: raise UnsupportedMediaType('JSON payload is required') request_data : Dict = request.json LOGGER.debug('Request: {:s}'.format(str(request_data))) - validate_message(SCHEMA_VPN_SERVICE, request_data) - vpn_services : List[Dict] = request_data['ietf-l2vpn-svc:vpn-service'] - for vpn_service in vpn_services: - try: - # pylint: disable=no-member - slice_request = Slice() - slice_request.slice_id.context_id.context_uuid.uuid = DEFAULT_CONTEXT_NAME - slice_request.slice_id.slice_uuid.uuid = vpn_service['vpn-id'] - slice_request.slice_status.slice_status = SliceStatusEnum.SLICESTATUS_PLANNED - - slice_client = SliceClient() - slice_client.CreateSlice(slice_request) - - response = jsonify({}) - response.status_code = HTTP_CREATED - except Exception as e: # pylint: disable=broad-except - LOGGER.exception('Something went wrong Creating Service {:s}'.format(str(request))) - response = jsonify({'error': str(e)}) - response.status_code = HTTP_SERVERERROR + errors = list() + if 'ietf-l2vpn-svc:l2vpn-svc' in request_data: + # processing single (standard) request formatted as: + #{ + # "ietf-l2vpn-svc:l2vpn-svc": { + # "vpn-services": { + # "vpn-service": [ + errors.extend(self._process_l2vpn(request_data)) + elif 'ietf-l2vpn-svc:vpn-service' in request_data: + # processing OSM-style payload request formatted as: + #{ + # "ietf-l2vpn-svc:vpn-service": [ + vpn_services = request_data['ietf-l2vpn-svc:vpn-service'] + + # Add mandatory fields OSM RO driver skips + for vpn_service in vpn_services: + if 'ce-vlan-preservation' not in vpn_service: + vpn_service['ce-vlan-preservation'] = True + if 'ce-vlan-cos-preservation' not in vpn_service: + vpn_service['ce-vlan-cos-preservation'] = True + if 'frame-delivery' not in vpn_service: + vpn_service['frame-delivery'] = dict() + if 'multicast-gp-port-mapping' not in vpn_service['frame-delivery']: + vpn_service['frame-delivery']['multicast-gp-port-mapping'] = \ + 'ietf-l2vpn-svc:static-mapping' + + request_data = { + 'ietf-l2vpn-svc:l2vpn-svc': { + 'vpn-services': { + 'vpn-service': vpn_services + } + } + } + errors.extend(self._process_l2vpn(request_data)) + else: + errors.append('Unexpected request: {:s}'.format(str(request_data))) + + if len(errors) > 0: + LOGGER.error('Errors: {:s}'.format(str(errors))) + else: + LOGGER.debug('Errors: {:s}'.format(str(errors))) + + response = jsonify(errors) + response.status_code = HTTP_CREATED if len(errors) == 0 else HTTP_SERVERERROR return response + + def _process_l2vpn(self, request_data : Dict) -> List[Dict]: + yang_validator = YangValidator('ietf-l2vpn-svc') + request_data = yang_validator.parse_to_dict(request_data) + yang_validator.destroy() + + errors = list() + + vpn_services = ( + request_data.get('l2vpn-svc', dict()) + .get('vpn-services', dict()) + .get('vpn-service', list()) + ) + for vpn_service in vpn_services: + process_vpn_service(vpn_service, errors) + + sites = ( + request_data.get('l2vpn-svc', dict()) + .get('sites', dict()) + .get('site', list()) + ) + for site in sites: + process_site(site, errors) + + return errors diff --git a/src/nbi/service/ietf_l2vpn/L2VPN_SiteNetworkAccesses.py b/src/nbi/service/ietf_l2vpn/L2VPN_SiteNetworkAccesses.py index fed366d1bd5c38336ea28b01d5eec1cfa1dddcdc..e11beb62c9cd406bda957f3738b387ab5321b0b6 100644 --- a/src/nbi/service/ietf_l2vpn/L2VPN_SiteNetworkAccesses.py +++ b/src/nbi/service/ietf_l2vpn/L2VPN_SiteNetworkAccesses.py @@ -13,144 +13,199 @@ # limitations under the License. import logging -from typing import Dict, Optional +from typing import Dict, List from flask import request from flask.json import jsonify -from flask.wrappers import Response from flask_restful import Resource from werkzeug.exceptions import UnsupportedMediaType -from common.proto.context_pb2 import Slice -from common.tools.context_queries.Slice import get_slice_by_uuid -from common.tools.grpc.ConfigRules import update_config_rule_custom -from common.tools.grpc.Constraints import ( - update_constraint_custom_dict, update_constraint_endpoint_location, update_constraint_endpoint_priority, - update_constraint_sla_availability) -from common.tools.grpc.EndPointIds import update_endpoint_ids -from common.tools.grpc.Tools import grpc_message_to_json_string +from common.proto.context_pb2 import ServiceTypeEnum +from common.tools.context_queries.Service import get_services from context.client.ContextClient import ContextClient -from slice.client.SliceClient import SliceClient from nbi.service._tools.Authentication import HTTP_AUTH -from nbi.service._tools.HttpStatusCodes import HTTP_NOCONTENT, HTTP_SERVERERROR -from nbi.service._tools.Validator import validate_message -from .schemas.site_network_access import SCHEMA_SITE_NETWORK_ACCESS -from .Constants import BEARER_MAPPINGS, DEFAULT_ADDRESS_FAMILIES, DEFAULT_BGP_AS, DEFAULT_BGP_ROUTE_TARGET, DEFAULT_MTU +from nbi.service._tools.HttpStatusCodes import ( + HTTP_CREATED, HTTP_NOCONTENT, HTTP_SERVERERROR +) +from .Handlers import process_site_network_access +from .YangValidator import YangValidator LOGGER = logging.getLogger(__name__) -def process_site_network_access(context_client : ContextClient, site_id : str, site_network_access : Dict) -> Slice: - vpn_id = site_network_access['vpn-attachment']['vpn-id'] - encapsulation_type = site_network_access['connection']['encapsulation-type'] - cvlan_id = site_network_access['connection']['tagged-interface'][encapsulation_type]['cvlan-id'] - - bearer_reference = site_network_access['bearer']['bearer-reference'] - - access_priority : Optional[int] = site_network_access.get('availability', {}).get('access-priority') - single_active : bool = len(site_network_access.get('availability', {}).get('single-active', [])) > 0 - all_active : bool = len(site_network_access.get('availability', {}).get('all-active', [])) > 0 - - diversity_constraints = site_network_access.get('access-diversity', {}).get('constraints', {}).get('constraint', []) - raise_if_differs = True - diversity_constraints = { - constraint['constraint-type']:([ - target[0] - for target in constraint['target'].items() - if len(target[1]) == 1 - ][0], raise_if_differs) - for constraint in diversity_constraints - } - - mapping = BEARER_MAPPINGS.get(bearer_reference) - if mapping is None: - msg = 'Specified Bearer({:s}) is not configured.' - raise Exception(msg.format(str(bearer_reference))) - ( - device_uuid, endpoint_uuid, router_id, route_dist, sub_if_index, - address_ip, address_prefix, remote_router, circuit_id - ) = mapping - - target = get_slice_by_uuid(context_client, vpn_id, rw_copy=True) - if target is None: raise Exception('VPN({:s}) not found in database'.format(str(vpn_id))) - - endpoint_ids = target.slice_endpoint_ids # pylint: disable=no-member - config_rules = target.slice_config.config_rules # pylint: disable=no-member - constraints = target.slice_constraints # pylint: disable=no-member - - endpoint_id = update_endpoint_ids(endpoint_ids, device_uuid, endpoint_uuid) - - service_settings_key = '/settings' - update_config_rule_custom(config_rules, service_settings_key, { - 'mtu' : (DEFAULT_MTU, True), - 'address_families': (DEFAULT_ADDRESS_FAMILIES, True), - 'bgp_as' : (DEFAULT_BGP_AS, True), - 'bgp_route_target': (DEFAULT_BGP_ROUTE_TARGET, True), - }) - - endpoint_settings_key = '/device[{:s}]/endpoint[{:s}]/settings'.format(device_uuid, endpoint_uuid) - field_updates = {} - if router_id is not None: field_updates['router_id' ] = (router_id, True) - if route_dist is not None: field_updates['route_distinguisher'] = (route_dist, True) - if sub_if_index is not None: field_updates['sub_interface_index'] = (sub_if_index, True) - if cvlan_id is not None: field_updates['vlan_id' ] = (cvlan_id, True) - if address_ip is not None: field_updates['address_ip' ] = (address_ip, True) - if address_prefix is not None: field_updates['address_prefix' ] = (address_prefix, True) - if remote_router is not None: field_updates['remote_router' ] = (remote_router, True) - if circuit_id is not None: field_updates['circuit_id' ] = (circuit_id, True) - update_config_rule_custom(config_rules, endpoint_settings_key, field_updates) - - if len(diversity_constraints) > 0: - update_constraint_custom_dict(constraints, 'diversity', diversity_constraints) - - update_constraint_endpoint_location(constraints, endpoint_id, region=site_id) - if access_priority is not None: update_constraint_endpoint_priority(constraints, endpoint_id, access_priority) - if single_active or all_active: - # assume 1 disjoint path per endpoint/location included in service/slice - location_endpoints = {} - for constraint in constraints: - if constraint.WhichOneof('constraint') != 'endpoint_location': continue - str_endpoint_id = grpc_message_to_json_string(constraint.endpoint_location.endpoint_id) - str_location_id = grpc_message_to_json_string(constraint.endpoint_location.location) - location_endpoints.setdefault(str_location_id, set()).add(str_endpoint_id) - num_endpoints_per_location = {len(endpoints) for endpoints in location_endpoints.values()} - num_disjoint_paths = max(num_endpoints_per_location) - update_constraint_sla_availability(constraints, num_disjoint_paths, all_active, 0.0) - - return target - -def process_list_site_network_access( - context_client : ContextClient, slice_client : SliceClient, site_id : str, request_data : Dict - ) -> Response: - - LOGGER.debug('Request: {:s}'.format(str(request_data))) - validate_message(SCHEMA_SITE_NETWORK_ACCESS, request_data) - - errors = [] - for site_network_access in request_data['ietf-l2vpn-svc:site-network-access']: - sna_request = process_site_network_access(context_client, site_id, site_network_access) - LOGGER.debug('sna_request = {:s}'.format(grpc_message_to_json_string(sna_request))) - try: - slice_client.UpdateSlice(sna_request) - except Exception as e: # pylint: disable=broad-except - msg = 'Something went wrong Updating VPN {:s}' - LOGGER.exception(msg.format(grpc_message_to_json_string(sna_request))) - errors.append({'error': str(e)}) - - response = jsonify(errors) - response.status_code = HTTP_NOCONTENT if len(errors) == 0 else HTTP_SERVERERROR - return response - class L2VPN_SiteNetworkAccesses(Resource): @HTTP_AUTH.login_required def post(self, site_id : str): if not request.is_json: raise UnsupportedMediaType('JSON payload is required') + request_data : Dict = request.json LOGGER.debug('Site_Id: {:s}'.format(str(site_id))) - context_client = ContextClient() - slice_client = SliceClient() - return process_list_site_network_access(context_client, slice_client, site_id, request.json) + LOGGER.debug('Request: {:s}'.format(str(request_data))) + errors = self._process_site_network_accesses(site_id, request_data) + if len(errors) > 0: + LOGGER.error('Errors: {:s}'.format(str(errors))) + else: + LOGGER.debug('Errors: {:s}'.format(str(errors))) + response = jsonify(errors) + response.status_code = HTTP_CREATED if len(errors) == 0 else HTTP_SERVERERROR + return response @HTTP_AUTH.login_required def put(self, site_id : str): if not request.is_json: raise UnsupportedMediaType('JSON payload is required') + request_data : Dict = request.json LOGGER.debug('Site_Id: {:s}'.format(str(site_id))) - context_client = ContextClient() - slice_client = SliceClient() - return process_list_site_network_access(context_client, slice_client, site_id, request.json) + LOGGER.debug('Request: {:s}'.format(str(request_data))) + errors = self._process_site_network_accesses(site_id, request_data) + if len(errors) > 0: + LOGGER.error('Errors: {:s}'.format(str(errors))) + else: + LOGGER.debug('Errors: {:s}'.format(str(errors))) + response = jsonify(errors) + response.status_code = HTTP_NOCONTENT if len(errors) == 0 else HTTP_SERVERERROR + return response + + def _prepare_request_payload(self, site_id : str, request_data : Dict, errors : List[Dict]) -> Dict: + if 'ietf-l2vpn-svc:l2vpn-svc' in request_data: + # processing single (standard) request formatted as: + #{"ietf-l2vpn-svc:l2vpn-svc": { + # "sites": {"site": [ + # { + # "site-id": ..., + # "site-network-accesses": {"site-network-access": [ + # { + # "network-access-id": ..., + # ... + # } + # ]} + # } + # ]} + #}} + return request_data + + if 'ietf-l2vpn-svc:site-network-access' in request_data: + # processing OSM-style payload request formatted as: + #{ + # "ietf-l2vpn-svc:site-network-access": [ + site_network_accesses = request_data['ietf-l2vpn-svc:site-network-access'] + + location_refs = set() + location_refs.add('fake-location') + + device_refs = dict() + device_refs['fake-device'] = 'fake-location' + + # Add mandatory fields OSM RO driver skips and fix wrong ones + for site_network_access in site_network_accesses: + location = 'fake-location' + if 'location-reference' in site_network_access: + location = site_network_access['location-reference'] + site_network_access.pop('location-reference') + #else: + # site_network_access['location-reference'] = location + location_refs.add(location) + + if 'device-reference' in site_network_access: + device = site_network_access['device-reference'] + else: + device = 'fake-device' + site_network_access['device-reference'] = device + device_refs[device] = location + + if 'connection' in site_network_access: + connection = site_network_access['connection'] + if 'encapsulation-type' in connection: + if connection['encapsulation-type'] == 'dot1q-vlan-tagged': + connection['encapsulation-type'] = 'vlan' + else: + connection['encapsulation-type'] = 'ethernet' + if 'tagged-interface' in connection: + tagged_interface = connection['tagged-interface'] + if 'dot1q-vlan-tagged' in tagged_interface: + if 'type' not in tagged_interface: + tagged_interface['type'] = 'dot1q' + + if 'oam' not in connection: + connection['oam'] = dict() + if 'md-name' not in connection['oam']: + connection['oam']['md-name'] = 'fake-md-name' + if 'md-level' not in connection['oam']: + connection['oam']['md-level'] = 0 + + if 'service' not in site_network_access: + site_network_access['service'] = dict() + if 'svc-mtu' not in site_network_access['service']: + site_network_access['service']['svc-mtu'] = 1500 + + context_client = ContextClient() + vpn_services = list() + for service in get_services(context_client): + if service.service_type not in ( + ServiceTypeEnum.SERVICETYPE_L2NM, + ServiceTypeEnum.SERVICETYPE_L3NM, + ): + continue + + # De-duplicate services uuid/names in case service_uuid == service_name + vpn_ids = {service.service_id.service_uuid.uuid, service.name} + for vpn_id in vpn_ids: + vpn_services.append({ + 'vpn-id': vpn_id, + 'frame-delivery': { + 'multicast-gp-port-mapping': 'ietf-l2vpn-svc:static-mapping' + }, + 'ce-vlan-preservation': True, + 'ce-vlan-cos-preservation': True, + }) + + MSG = '[_prepare_request_payload] vpn_services={:s}' + LOGGER.debug(MSG.format(str(vpn_services))) + + request_data = {'ietf-l2vpn-svc:l2vpn-svc': { + 'vpn-services': { + 'vpn-service': vpn_services + }, + 'sites': {'site': [{ + 'site-id': site_id, + 'default-ce-vlan-id': 1, + 'management': {'type': 'provider-managed'}, + 'locations': {'location': [ + {'location-id': location_ref} + for location_ref in location_refs + ]}, + 'devices': {'device': [ + {'device-id': device_ref, 'location': location_ref} + for device_ref, location_ref in device_refs.items() + ]}, + 'site-network-accesses': { + 'site-network-access': site_network_accesses + } + }]} + }} + + MSG = '[_prepare_request_payload] request_data={:s}' + LOGGER.warning(MSG.format(str(request_data))) + return request_data + + errors.append('Unexpected request: {:s}'.format(str(request_data))) + return None + + def _process_site_network_accesses(self, site_id : str, request_data : Dict) -> List[Dict]: + errors = list() + request_data = self._prepare_request_payload(site_id, request_data, errors) + if len(errors) > 0: return errors + + yang_validator = YangValidator('ietf-l2vpn-svc') + request_data = yang_validator.parse_to_dict(request_data) + yang_validator.destroy() + + sites = ( + request_data.get('l2vpn-svc', dict()) + .get('sites', dict()) + .get('site', list()) + ) + for site in sites: + site_network_accesses = ( + site.get('site-network-accesses', dict()) + .get('site-network-access', list()) + ) + for site_network_access in site_network_accesses: + process_site_network_access(site_id, site_network_access, errors) + + return errors diff --git a/src/nbi/service/ietf_l2vpn/YangValidator.py b/src/nbi/service/ietf_l2vpn/YangValidator.py new file mode 100644 index 0000000000000000000000000000000000000000..82bd799a7e21936317b7beb7c7eb0b55fc2720b7 --- /dev/null +++ b/src/nbi/service/ietf_l2vpn/YangValidator.py @@ -0,0 +1,36 @@ +# 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 libyang, os +from typing import Dict, Optional + +YANG_DIR = os.path.join(os.path.dirname(__file__), 'yang') + +class YangValidator: + def __init__(self, module_name : str) -> None: + self._yang_context = libyang.Context(YANG_DIR) + self._yang_module = self._yang_context.load_module(module_name) + self._yang_module.feature_enable_all() + + def parse_to_dict(self, message : Dict) -> Dict: + dnode : Optional[libyang.DNode] = self._yang_module.parse_data_dict( + message, validate_present=True, validate=True, strict=True + ) + if dnode is None: raise Exception('Unable to parse Message({:s})'.format(str(message))) + message = dnode.print_dict() + dnode.free() + return message + + def destroy(self) -> None: + self._yang_context.destroy() diff --git a/src/nbi/service/ietf_l2vpn/__init__.py b/src/nbi/service/ietf_l2vpn/__init__.py index da76897786930d1bea45b8139fbc04fd9e3991d4..dfc52da8b5a022bb951a2dd389a0451b11b541b0 100644 --- a/src/nbi/service/ietf_l2vpn/__init__.py +++ b/src/nbi/service/ietf_l2vpn/__init__.py @@ -25,15 +25,15 @@ URL_PREFIX = '/restconf/data/ietf-l2vpn-svc:l2vpn-svc' def register_ietf_l2vpn(nbi_app : NbiApplication): nbi_app.add_rest_api_resource( L2VPN_Services, - URL_PREFIX + '/vpn-services' + URL_PREFIX + '/vpn-services', ) nbi_app.add_rest_api_resource( L2VPN_Service, URL_PREFIX + '/vpn-services/vpn-service=', - URL_PREFIX + '/vpn-services/vpn-service=/' + URL_PREFIX + '/vpn-services/vpn-service=/', ) nbi_app.add_rest_api_resource( L2VPN_SiteNetworkAccesses, URL_PREFIX + '/sites/site=/site-network-accesses', - URL_PREFIX + '/sites/site=/site-network-accesses/' + URL_PREFIX + '/sites/site=/site-network-accesses/', ) diff --git a/src/nbi/service/ietf_l2vpn/schemas/site_network_access.py b/src/nbi/service/ietf_l2vpn/schemas/site_network_access.py deleted file mode 100644 index c37c20dba162ea9ba3e0e163164de1ff2c770d73..0000000000000000000000000000000000000000 --- a/src/nbi/service/ietf_l2vpn/schemas/site_network_access.py +++ /dev/null @@ -1,80 +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. - -# Example request: -# request = {'ietf-l2vpn-svc:site-network-access': [{ -# 'network-access-id': '3fd942ee-2dc3-41d1-aeec-65aa85d117b2', -# 'vpn-attachment': {'vpn-id': '954b1b53-4a8c-406d-9eff-750ec2c9a258', -# 'site-role': 'any-to-any-role'}, -# 'connection': {'encapsulation-type': 'dot1q-vlan-tagged', 'tagged-interface': { -# 'dot1q-vlan-tagged': {'cvlan-id': 1234}}}, -# 'bearer': {'bearer-reference': '1a'} -# }]} - -from .Common import REGEX_UUID - -SCHEMA_SITE_NETWORK_ACCESS = { - '$schema': 'https://json-schema.org/draft/2020-12/schema', - 'type': 'object', - 'required': ['ietf-l2vpn-svc:site-network-access'], - 'properties': { - 'ietf-l2vpn-svc:site-network-access': { - 'type': 'array', - 'minItems': 1, - 'maxItems': 1, # by now we do not support multiple site-network-access in the same message - 'items': { - 'type': 'object', - 'required': ['network-access-id', 'vpn-attachment', 'connection', 'bearer'], - 'properties': { - 'network-access-id': {'type': 'string', 'pattern': REGEX_UUID}, - 'vpn-attachment': { - 'type': 'object', - 'required': ['vpn-id', 'site-role'], - 'properties': { - 'vpn-id': {'type': 'string', 'pattern': REGEX_UUID}, - 'site-role': {'type': 'string', 'minLength': 1}, - }, - }, - 'connection': { - 'type': 'object', - 'required': ['encapsulation-type', 'tagged-interface'], - 'properties': { - 'encapsulation-type': {'enum': ['dot1q-vlan-tagged']}, - 'tagged-interface': { - 'type': 'object', - 'required': ['dot1q-vlan-tagged'], - 'properties': { - 'dot1q-vlan-tagged': { - 'type': 'object', - 'required': ['cvlan-id'], - 'properties': { - 'cvlan-id': {'type': 'integer', 'minimum': 1, 'maximum': 4094}, - }, - }, - }, - }, - }, - }, - 'bearer': { - 'type': 'object', - 'required': ['bearer-reference'], - 'properties': { - 'bearer-reference': {'type': 'string', 'minLength': 1}, - }, - }, - }, - }, - }, - }, -} diff --git a/src/nbi/service/ietf_l2vpn/schemas/vpn_service.py b/src/nbi/service/ietf_l2vpn/schemas/vpn_service.py deleted file mode 100644 index 87321b88b4b7bf4f9d66c2032df88aa7bd879ad5..0000000000000000000000000000000000000000 --- a/src/nbi/service/ietf_l2vpn/schemas/vpn_service.py +++ /dev/null @@ -1,46 +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. - -# Example request: -# request = {'ietf-l2vpn-svc:vpn-service': [{ -# 'vpn-id': 'c6270231-f1de-4687-b2ed-7b58f9105775', -# 'vpn-svc-type': 'vpws', -# 'svc-topo': 'any-to-any', -# 'customer-name': 'osm' -# }]} - -from .Common import REGEX_UUID - -SCHEMA_VPN_SERVICE = { - '$schema': 'https://json-schema.org/draft/2020-12/schema', - 'type': 'object', - 'required': ['ietf-l2vpn-svc:vpn-service'], - 'properties': { - 'ietf-l2vpn-svc:vpn-service': { - 'type': 'array', - 'minItems': 1, - 'maxItems': 1, # by now we do not support multiple vpn-service in the same message - 'items': { - 'type': 'object', - 'required': ['vpn-id', 'vpn-svc-type', 'svc-topo', 'customer-name'], - 'properties': { - 'vpn-id': {'type': 'string', 'pattern': REGEX_UUID}, - 'vpn-svc-type': {'enum': ['vpws', 'vpls']}, - 'svc-topo': {'enum': ['any-to-any']}, - 'customer-name': {'const': 'osm'}, - }, - } - } - }, -} diff --git a/src/nbi/service/ietf_network/yang/ietf-inet-types@2013-07-15.yang b/src/nbi/service/ietf_l2vpn/yang/ietf-inet-types@2013-07-15.yang similarity index 100% rename from src/nbi/service/ietf_network/yang/ietf-inet-types@2013-07-15.yang rename to src/nbi/service/ietf_l2vpn/yang/ietf-inet-types@2013-07-15.yang diff --git a/src/nbi/service/ietf_l2vpn/yang/ietf-l2vpn-svc@2018-10-09.yang b/src/nbi/service/ietf_l2vpn/yang/ietf-l2vpn-svc@2018-10-09.yang new file mode 100644 index 0000000000000000000000000000000000000000..f2f5ddfb22e30e9232e914d071062f754bd7bc3f --- /dev/null +++ b/src/nbi/service/ietf_l2vpn/yang/ietf-l2vpn-svc@2018-10-09.yang @@ -0,0 +1,3318 @@ +module ietf-l2vpn-svc { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-l2vpn-svc"; + prefix l2vpn-svc; + + import ietf-inet-types { + prefix inet; + } + import ietf-yang-types { + prefix yang; + } + import ietf-netconf-acm { + prefix nacm; + } + + organization + "IETF L2SM Working Group."; + contact + "WG Web: + WG List: + Editor: Giuseppe Fioccola + "; + description + "This YANG module defines a generic service configuration model + for Layer 2 VPN services common across all vendor + implementations. + + 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 8466; + see the RFC itself for full legal notices."; + + revision 2018-10-09 { + description + "Initial revision."; + reference + "RFC 8466: A YANG Data Model for Layer 2 Virtual Private + Network (L2VPN) Service Delivery"; + } + + feature carrierscarrier { + description + "Enables the support of carriers' carriers (CsC)."; + } + + feature ethernet-oam { + description + "Enables the support of Ethernet Service OAM."; + } + + feature extranet-vpn { + description + "Enables the support of extranet VPNs."; + } + + feature l2cp-control { + description + "Enables the support of L2CP control."; + } + + feature input-bw { + description + "Enables the support of input bandwidth in a VPN."; + } + + feature output-bw { + description + "Enables the support of output bandwidth in a VPN."; + } + + feature uni-list { + description + "Enables the support of a list of UNIs in a VPN."; + } + + feature cloud-access { + description + "Allows the VPN to connect to a Cloud Service Provider (CSP) + or an ISP."; + } + + feature oam-3ah { + description + "Enables the support of OAM 802.3ah."; + } + + feature micro-bfd { + description + "Enables the support of micro-BFD."; + } + + feature bfd { + description + "Enables the support of BFD."; + } + + feature signaling-options { + description + "Enables the support of signaling options."; + } + + feature site-diversity { + description + "Enables the support of site diversity constraints in a VPN."; + } + + feature encryption { + description + "Enables the support of encryption."; + } + + feature always-on { + description + "Enables support for the 'always-on' access constraint."; + } + + feature requested-type { + description + "Enables support for the 'requested-type' access constraint."; + } + + feature bearer-reference { + description + "Enables support for the 'bearer-reference' access + constraint."; + } + + feature qos { + description + "Enables support for QoS."; + } + + feature qos-custom { + description + "Enables the support of a custom QoS profile."; + } + + feature lag-interface { + description + "Enables LAG interfaces."; + } + + feature vlan { + description + "Enables the support of VLANs."; + } + + feature dot1q { + description + "Enables the support of dot1Q."; + } + feature qinq { + description + "Enables the support of QinQ."; + } + + feature qinany { + description + "Enables the support of QinAny."; + } + + feature vxlan { + description + "Enables the support of VXLANs."; + } + + feature lan-tag { + description + "Enables LAN tag support in a VPN."; + } + + feature target-sites { + description + "Enables the support of the 'target-sites' + match-flow parameter."; + } + + feature bum { + description + "Enables BUM capabilities in a VPN."; + } + + feature mac-loop-prevention { + description + "Enables the MAC loop-prevention capability in a VPN."; + } + + feature lacp { + description + "Enables the Link Aggregation Control Protocol (LACP) + capability in a VPN."; + } + + feature mac-addr-limit { + description + "Enables the MAC address limit capability in a VPN."; + } + + feature acl { + description + "Enables the ACL capability in a VPN."; + } + + feature cfm { + description + "Enables the 802.1ag CFM capability in a VPN."; + } + + feature y-1731 { + description + "Enables the Y.1731 capability in a VPN."; + } + + typedef svc-id { + type string; + description + "Defines the type of service component identifier."; + } + + typedef ccm-priority-type { + type uint8 { + range "0..7"; + } + description + "A 3-bit priority value to be used in the VLAN tag, + if present in the transmitted frame."; + } + + typedef control-mode { + type enumeration { + enum peer { + description + "'peer' mode, i.e., participate in the protocol towards + the CE. Peering is common for LACP and the Ethernet + Local Management Interface (E-LMI) and, occasionally, + for LLDP. For VPLSs and VPWSs, the subscriber can also + request that the SP peer enable spanning tree."; + } + enum tunnel { + description + "'tunnel' mode, i.e., pass to the egress or destination + site. For EPLs, the expectation is that L2CP frames are + tunneled."; + } + enum discard { + description + "'discard' mode, i.e., discard the frame."; + } + } + description + "Defines the type of control mode on L2CP protocols."; + } + + typedef neg-mode { + type enumeration { + enum full-duplex { + description + "Defines full-duplex mode."; + } + enum auto-neg { + description + "Defines auto-negotiation mode."; + } + } + description + "Defines the type of negotiation mode."; + } + + identity site-network-access-type { + description + "Base identity for the site-network-access type."; + } + + identity point-to-point { + base site-network-access-type; + description + "Identity for a point-to-point connection."; + } + + identity multipoint { + base site-network-access-type; + description + "Identity for a multipoint connection, e.g., + an Ethernet broadcast segment."; + } + + identity tag-type { + description + "Base identity from which all tag types are derived."; + } + + identity c-vlan { + base tag-type; + description + "A CVLAN tag, normally using the 0x8100 Ethertype."; + } + + identity s-vlan { + base tag-type; + description + "An SVLAN tag."; + } + + identity c-s-vlan { + base tag-type; + description + "Using both a CVLAN tag and an SVLAN tag."; + } + + identity multicast-tree-type { + description + "Base identity for the multicast tree type."; + } + + identity ssm-tree-type { + base multicast-tree-type; + description + "Identity for the Source-Specific Multicast (SSM) tree type."; + reference "RFC 8299: YANG Data Model for L3VPN Service Delivery"; + } + + identity asm-tree-type { + base multicast-tree-type; + description + "Identity for the Any-Source Multicast (ASM) tree type."; + reference "RFC 8299: YANG Data Model for L3VPN Service Delivery"; + } + + identity bidir-tree-type { + base multicast-tree-type; + description + "Identity for the bidirectional tree type."; + reference "RFC 8299: YANG Data Model for L3VPN Service Delivery"; + } + + identity multicast-gp-address-mapping { + description + "Identity for mapping type."; + } + + identity static-mapping { + base multicast-gp-address-mapping; + description + "Identity for static mapping, i.e., attach the interface + to the multicast group as a static member."; + } + + identity dynamic-mapping { + base multicast-gp-address-mapping; + description + "Identity for dynamic mapping, i.e., an interface was added + to the multicast group as a result of snooping."; + } + + identity tf-type { + description + "Identity for the traffic type."; + } + + identity multicast-traffic { + base tf-type; + description + "Identity for multicast traffic."; + } + + identity broadcast-traffic { + base tf-type; + description + "Identity for broadcast traffic."; + } + + identity unknown-unicast-traffic { + base tf-type; + description + "Identity for unknown unicast traffic."; + } + + identity encapsulation-type { + description + "Identity for the encapsulation type."; + } + + identity ethernet { + base encapsulation-type; + description + "Identity for Ethernet type."; + } + + identity vlan { + base encapsulation-type; + description + "Identity for the VLAN type."; + } + + identity carrierscarrier-type { + description + "Identity of the CsC type."; + } + + identity ldp { + base carrierscarrier-type; + description + "Use LDP as the signaling protocol + between the PE and the CE."; + } + + identity bgp { + base carrierscarrier-type; + description + "Use BGP (as per RFC 8277) as the signaling protocol + between the PE and the CE. + In this case, BGP must also be configured as + the routing protocol."; + } + + identity eth-inf-type { + description + "Identity of the Ethernet interface type."; + } + + identity tagged { + base eth-inf-type; + description + "Identity of the tagged interface type."; + } + + identity untagged { + base eth-inf-type; + description + "Identity of the untagged interface type."; + } + + identity lag { + base eth-inf-type; + description + "Identity of the LAG interface type."; + } + + identity bw-type { + description + "Identity of the bandwidth type."; + } + + identity bw-per-cos { + base bw-type; + description + "Bandwidth is per CoS."; + } + + identity bw-per-port { + base bw-type; + description + "Bandwidth is per site network access."; + } + + identity bw-per-site { + base bw-type; + description + "Bandwidth is per site. It is applicable to + all the site network accesses within the site."; + } + + identity bw-per-svc { + base bw-type; + description + "Bandwidth is per VPN service."; + } + + identity site-vpn-flavor { + description + "Base identity for the site VPN service flavor."; + } + + identity site-vpn-flavor-single { + base site-vpn-flavor; + description + "Identity for the site VPN service flavor. + Used when the site belongs to only one VPN."; + } + + identity site-vpn-flavor-multi { + base site-vpn-flavor; + description + "Identity for the site VPN service flavor. + Used when a logical connection of a site + belongs to multiple VPNs."; + } + identity site-vpn-flavor-nni { + base site-vpn-flavor; + description + "Identity for the site VPN service flavor. + Used to describe an NNI option A connection."; + } + + identity service-type { + description + "Base identity of the service type."; + } + + identity vpws { + base service-type; + description + "Point-to-point Virtual Private Wire Service (VPWS) + service type."; + } + + identity pwe3 { + base service-type; + description + "Pseudowire Emulation Edge to Edge (PWE3) service type."; + } + + identity ldp-l2tp-vpls { + base service-type; + description + "LDP-based or L2TP-based multipoint Virtual Private LAN + Service (VPLS) service type. This VPLS uses LDP-signaled + Pseudowires or L2TP-signaled Pseudowires."; + } + + identity bgp-vpls { + base service-type; + description + "BGP-based multipoint VPLS service type. This VPLS uses a + BGP control plane as described in RFCs 4761 and 6624."; + } + + identity vpws-evpn { + base service-type; + description + "VPWS service type using Ethernet VPNs (EVPNs) + as specified in RFC 7432."; + } + + identity pbb-evpn { + base service-type; + description + "Provider Backbone Bridge (PBB) service type using + EVPNs as specified in RFC 7432."; + } + + identity bundling-type { + description + "The base identity for the bundling type. It supports + multiple CE-VLANs associated with an L2VPN service or + all CE-VLANs associated with an L2VPN service."; + } + + identity multi-svc-bundling { + base bundling-type; + description + "Identity for multi-service bundling, i.e., + multiple CE-VLAN IDs can be associated with an + L2VPN service at a site."; + } + + identity one2one-bundling { + base bundling-type; + description + "Identity for one-to-one service bundling, i.e., + each L2VPN can be associated with only one CE-VLAN ID + at a site."; + } + + identity all2one-bundling { + base bundling-type; + description + "Identity for all-to-one bundling, i.e., all CE-VLAN IDs + are mapped to one L2VPN service."; + } + + identity color-id { + description + "Base identity of the color ID."; + } + + identity color-id-cvlan { + base color-id; + description + "Identity of the color ID based on a CVLAN."; + } + + identity cos-id { + description + "Identity of the CoS ID."; + } + + identity cos-id-pcp { + base cos-id; + description + "Identity of the CoS ID based on the + Port Control Protocol (PCP)."; + } + + identity cos-id-dscp { + base cos-id; + description + "Identity of the CoS ID based on DSCP."; + } + + identity color-type { + description + "Identity of color types."; + } + + identity green { + base color-type; + description + "Identity of the 'green' color type."; + } + + identity yellow { + base color-type; + description + "Identity of the 'yellow' color type."; + } + + identity red { + base color-type; + description + "Identity of the 'red' color type."; + } + + identity policing { + description + "Identity of the type of policing applied."; + } + + identity one-rate-two-color { + base policing; + description + "Identity of one-rate, two-color (1R2C)."; + } + + identity two-rate-three-color { + base policing; + description + "Identity of two-rate, three-color (2R3C)."; + } + + identity bum-type { + description + "Identity of the BUM type."; + } + + identity broadcast { + base bum-type; + description + "Identity of broadcast."; + } + + identity unicast { + base bum-type; + description + "Identity of unicast."; + } + + identity multicast { + base bum-type; + description + "Identity of multicast."; + } + + identity loop-prevention-type { + description + "Identity of loop prevention."; + } + + identity shut { + base loop-prevention-type; + description + "Identity of shut protection."; + } + + identity trap { + base loop-prevention-type; + description + "Identity of trap protection."; + } + identity lacp-state { + description + "Identity of the LACP state."; + } + + identity lacp-on { + base lacp-state; + description + "Identity of LACP on."; + } + + identity lacp-off { + base lacp-state; + description + "Identity of LACP off."; + } + + identity lacp-mode { + description + "Identity of the LACP mode."; + } + + identity lacp-passive { + base lacp-mode; + description + "Identity of LACP passive."; + } + + identity lacp-active { + base lacp-mode; + description + "Identity of LACP active."; + } + + identity lacp-speed { + description + "Identity of the LACP speed."; + } + + identity lacp-fast { + base lacp-speed; + description + "Identity of LACP fast."; + } + + identity lacp-slow { + base lacp-speed; + description + "Identity of LACP slow."; + } + + identity bw-direction { + description + "Identity for the bandwidth direction."; + } + + identity input-bw { + base bw-direction; + description + "Identity for the input bandwidth."; + } + + identity output-bw { + base bw-direction; + description + "Identity for the output bandwidth."; + } + + identity management { + description + "Base identity for the site management scheme."; + } + + identity co-managed { + base management; + description + "Identity for a co-managed site."; + } + + identity customer-managed { + base management; + description + "Identity for a customer-managed site."; + } + + identity provider-managed { + base management; + description + "Identity for a provider-managed site."; + } + + identity address-family { + description + "Identity for an address family."; + } + + identity ipv4 { + base address-family; + description + "Identity for an IPv4 address family."; + } + + identity ipv6 { + base address-family; + description + "Identity for an IPv6 address family."; + } + + identity vpn-topology { + description + "Base identity for the VPN topology."; + } + + identity any-to-any { + base vpn-topology; + description + "Identity for the any-to-any VPN topology."; + } + + identity hub-spoke { + base vpn-topology; + description + "Identity for the Hub-and-Spoke VPN topology."; + } + + identity hub-spoke-disjoint { + base vpn-topology; + description + "Identity for the Hub-and-Spoke VPN topology, + where Hubs cannot communicate with each other."; + } + + identity site-role { + description + "Base identity for a site type."; + } + + identity any-to-any-role { + base site-role; + description + "Site in an any-to-any L2VPN."; + } + + identity spoke-role { + base site-role; + description + "Spoke site in a Hub-and-Spoke L2VPN."; + } + + identity hub-role { + base site-role; + description + "Hub site in a Hub-and-Spoke L2VPN."; + } + + identity pm-type { + description + "Performance-monitoring type."; + } + + identity loss { + base pm-type; + description + "Loss measurement."; + } + + identity delay { + base pm-type; + description + "Delay measurement."; + } + + identity fault-alarm-defect-type { + description + "Indicates the alarm-priority defect (i.e., the + lowest-priority defect that is allowed to + generate a fault alarm)."; + } + + identity remote-rdi { + base fault-alarm-defect-type; + description + "Indicates the aggregate health + of the Remote MEPs."; + } + + identity remote-mac-error { + base fault-alarm-defect-type; + description + "Indicates that one or more of the Remote MEPs are + reporting a failure in their Port Status TLVs or + Interface Status TLVs."; + } + + identity remote-invalid-ccm { + base fault-alarm-defect-type; + description + "Indicates that at least one of the Remote MEP + state machines is not receiving valid + Continuity Check Messages (CCMs) from its Remote MEP."; + } + + identity invalid-ccm { + base fault-alarm-defect-type; + description + "Indicates that one or more invalid CCMs have been + received and that a period of time 3.5 times the length + of those CCMs' transmission intervals has not yet expired."; + } + + identity cross-connect-ccm { + base fault-alarm-defect-type; + description + "Indicates that one or more cross-connect CCMs have been + received and that 3.5 times the period of at least one of + those CCMs' transmission intervals has not yet expired."; + } + + identity frame-delivery-mode { + description + "Delivery types."; + } + + identity discard { + base frame-delivery-mode; + description + "Service frames are discarded."; + } + + identity unconditional { + base frame-delivery-mode; + description + "Service frames are unconditionally delivered to the + destination site."; + } + + identity unknown-discard { + base frame-delivery-mode; + description + "Service frames are conditionally delivered to the + destination site. Packets with unknown destination addresses + will be discarded."; + } + + identity placement-diversity { + description + "Base identity for site placement constraints."; + } + + identity bearer-diverse { + base placement-diversity; + description + "Identity for bearer diversity. + The bearers should not use common elements."; + } + + identity pe-diverse { + base placement-diversity; + description + "Identity for PE diversity."; + } + + identity pop-diverse { + base placement-diversity; + description + "Identity for POP diversity."; + } + + identity linecard-diverse { + base placement-diversity; + description + "Identity for linecard diversity."; + } + + identity same-pe { + base placement-diversity; + description + "Identity for having sites connected on the same PE."; + } + + identity same-bearer { + base placement-diversity; + description + "Identity for having sites connected using the same bearer."; + } + + identity tagged-inf-type { + description + "Identity for the tagged interface type."; + } + + identity priority-tagged { + base tagged-inf-type; + description + "Identity for the priority-tagged interface."; + } + + identity qinq { + base tagged-inf-type; + description + "Identity for the QinQ tagged interface."; + } + + identity dot1q { + base tagged-inf-type; + description + "Identity for the dot1Q VLAN tagged interface."; + } + + identity qinany { + base tagged-inf-type; + description + "Identity for the QinAny tagged interface."; + } + + identity vxlan { + base tagged-inf-type; + description + "Identity for the VXLAN tagged interface."; + } + + identity provision-model { + description + "Base identity for the provision model."; + } + + identity single-side-provision { + description + "Identity for single-sided provisioning with discovery."; + } + + identity doubled-side-provision { + description + "Identity for double-sided provisioning."; + } + + identity mac-learning-mode { + description + "MAC learning mode."; + } + + identity data-plane { + base mac-learning-mode; + description + "User MAC addresses are learned through ARP broadcast."; + } + + identity control-plane { + base mac-learning-mode; + description + "User MAC addresses are advertised through EVPN-BGP."; + } + + identity vpn-policy-filter-type { + description + "Base identity for the filter type."; + } + + identity lan { + base vpn-policy-filter-type; + description + "Identity for a LAN tag filter type."; + } + + identity mac-action { + description + "Base identity for a MAC action."; + } + + identity drop { + base mac-action; + description + "Identity for dropping a packet."; + } + + identity flood { + base mac-action; + description + "Identity for packet flooding."; + } + + identity warning { + base mac-action; + description + "Identity for sending a warning log message."; + } + + identity qos-profile-direction { + description + "Base identity for the QoS-profile direction."; + } + + identity site-to-wan { + base qos-profile-direction; + description + "Identity for the site-to-WAN direction."; + } + + identity wan-to-site { + base qos-profile-direction; + description + "Identity for the WAN-to-site direction."; + } + + identity bidirectional { + base qos-profile-direction; + description + "Identity for both the WAN-to-site direction + and the site-to-WAN direction."; + } + + identity vxlan-peer-mode { + description + "Base identity for the VXLAN peer mode."; + } + + identity static-mode { + base vxlan-peer-mode; + description + "Identity for VXLAN access in the static mode."; + } + + identity bgp-mode { + base vxlan-peer-mode; + description + "Identity for VXLAN access by BGP EVPN learning."; + } + + identity customer-application { + description + "Base identity for a customer application."; + } + identity web { + base customer-application; + description + "Identity for a web application (e.g., HTTP, HTTPS)."; + } + + identity mail { + base customer-application; + description + "Identity for a mail application."; + } + + identity file-transfer { + base customer-application; + description + "Identity for a file-transfer application + (e.g., FTP, SFTP)."; + } + + identity database { + base customer-application; + description + "Identity for a database application."; + } + + identity social { + base customer-application; + description + "Identity for a social-network application."; + } + + identity games { + base customer-application; + description + "Identity for a gaming application."; + } + + identity p2p { + base customer-application; + description + "Identity for a peer-to-peer application."; + } + + identity network-management { + base customer-application; + description + "Identity for a management application + (e.g., Telnet, syslog, SNMP)."; + } + + identity voice { + base customer-application; + description + "Identity for a voice application."; + } + + identity video { + base customer-application; + description + "Identity for a videoconference application."; + } + + identity embb { + base customer-application; + description + "Identity for the enhanced Mobile Broadband (eMBB) + application. Note that the eMBB application + requires strict threshold values for a wide variety + of network performance parameters (e.g., data rate, + latency, loss rate, reliability)."; + } + + identity urllc { + base customer-application; + description + "Identity for the Ultra-Reliable and Low Latency + Communications (URLLC) application. Note that the + URLLC application requires strict threshold values for + a wide variety of network performance parameters + (e.g., latency, reliability)."; + } + + identity mmtc { + base customer-application; + description + "Identity for the massive Machine Type + Communications (mMTC) application. Note that the + mMTC application requires strict threshold values for + a wide variety of network performance parameters + (e.g., data rate, latency, loss rate, reliability)."; + } + + grouping site-acl { + container access-control-list { + if-feature "acl"; + list mac { + key "mac-address"; + leaf mac-address { + type yang:mac-address; + description + "MAC addresses."; + } + description + "List of MAC addresses."; + } + description + "Container for the ACL."; + } + description + "Grouping that defines the ACL."; + } + + grouping site-bum { + container broadcast-unknown-unicast-multicast { + if-feature "bum"; + leaf multicast-site-type { + type enumeration { + enum receiver-only { + description + "The site only has receivers."; + } + enum source-only { + description + "The site only has sources."; + } + enum source-receiver { + description + "The site has both sources and receivers."; + } + } + default "source-receiver"; + description + "Type of multicast site."; + } + list multicast-gp-address-mapping { + key "id"; + leaf id { + type uint16; + description + "Unique identifier for the mapping."; + } + leaf vlan-id { + type uint16 { + range "0..1024"; + } + mandatory true; + description + "The VLAN ID of the multicast group. + The range of the 12-bit VLAN ID is 0 to 1024."; + } + leaf mac-gp-address { + type yang:mac-address; + mandatory true; + description + "The MAC address of the multicast group."; + } + leaf port-lag-number { + type uint32; + description + "The ports/LAGs belonging to the multicast group."; + } + description + "List of port-to-group mappings."; + } + leaf bum-overall-rate { + type uint64; + units "bps"; + description + "Overall rate for BUM."; + } + list bum-rate-per-type { + key "type"; + leaf type { + type identityref { + base bum-type; + } + description + "BUM type."; + } + leaf rate { + type uint64; + units "bps"; + description + "Rate for BUM."; + } + description + "List of limit rates for the BUM type."; + } + description + "Container of BUM configurations."; + } + description + "Grouping for BUM."; + } + + grouping site-mac-loop-prevention { + container mac-loop-prevention { + if-feature "mac-loop-prevention"; + leaf protection-type { + type identityref { + base loop-prevention-type; + } + default "trap"; + description + "Protection type. By default, the protection + type is 'trap'."; + } + leaf frequency { + type uint32; + default "5"; + description + "The number of times to detect MAC duplication, where + a 'duplicate MAC address' situation has occurred and + the duplicate MAC address has been added to a list of + duplicate MAC addresses. By default, the number of + times is 5."; + } + leaf retry-timer { + type uint32; + units "seconds"; + description + "The retry timer. When the retry timer expires, + the duplicate MAC address will be flushed from + the MAC-VRF."; + } + description + "Container of MAC loop-prevention parameters."; + } + description + "Grouping for MAC loop prevention."; + } + + grouping site-service-qos-profile { + container qos { + if-feature "qos"; + container qos-classification-policy { + list rule { + key "id"; + ordered-by user; + leaf id { + type string; + description + "A description identifying the QoS classification + policy rule."; + } + choice match-type { + default "match-flow"; + case match-flow { + container match-flow { + leaf dscp { + type inet:dscp; + description + "DSCP value."; + } + leaf dot1q { + type uint16; + description + "802.1Q matching. It is a VLAN tag added into + a frame."; + } + leaf pcp { + type uint8 { + range "0..7"; + } + description + "PCP value."; + } + leaf src-mac { + type yang:mac-address; + description + "Source MAC."; + } + leaf dst-mac { + type yang:mac-address; + description + "Destination MAC."; + } + leaf color-type { + type identityref { + base color-type; + } + description + "Color types."; + } + leaf-list target-sites { + if-feature "target-sites"; + type svc-id; + description + "Identifies a site as a traffic destination."; + } + leaf any { + type empty; + description + "Allow all."; + } + leaf vpn-id { + type svc-id; + description + "Reference to the target VPN."; + } + description + "Describes flow-matching criteria."; + } + } + case match-application { + leaf match-application { + type identityref { + base customer-application; + } + description + "Defines the application to match."; + } + } + description + "Choice for classification."; + } + leaf target-class-id { + type string; + description + "Identification of the CoS. + This identifier is internal to the + administration."; + } + description + "List of marking rules."; + } + description + "Configuration of the traffic classification policy."; + } + container qos-profile { + choice qos-profile { + description + "Choice for the QoS profile. + Can be a standard profile or a customized profile."; + case standard { + description + "Standard QoS profile."; + leaf profile { + type leafref { + path "/l2vpn-svc/vpn-profiles/" + + "valid-provider-identifiers/" + + "qos-profile-identifier"; + } + description + "QoS profile to be used."; + } + } + case custom { + description + "Customized QoS profile."; + container classes { + if-feature "qos-custom"; + list class { + key "class-id"; + leaf class-id { + type string; + description + "Identification of the CoS. This identifier is + internal to the administration."; + } + leaf direction { + type identityref { + base qos-profile-direction; + } + default "bidirectional"; + description + "The direction in which the QoS profile is + applied. By default, the direction is + bidirectional."; + } + leaf policing { + type identityref { + base policing; + } + default "one-rate-two-color"; + description + "The policing type can be either one-rate, + two-color (1R2C) or two-rate, three-color + (2R3C). By default, the policing type is + 'one-rate-two-color'."; + } + leaf byte-offset { + type uint16; + description + "Number of bytes in the service frame header + that are excluded from the QoS calculation + (e.g., extra VLAN tags)."; + } + container frame-delay { + choice flavor { + case lowest { + leaf use-lowest-latency { + type empty; + description + "The traffic class should use the path + with the lowest delay."; + } + } + case boundary { + leaf delay-bound { + type uint16; + units "milliseconds"; + description + "The traffic class should use a path + with a defined maximum delay."; + } + } + description + "Delay constraint on the traffic class."; + } + description + "Delay constraint on the traffic class."; + } + container frame-jitter { + choice flavor { + case lowest { + leaf use-lowest-jitter { + type empty; + description + "The traffic class should use the path + with the lowest jitter."; + } + } + case boundary { + leaf delay-bound { + type uint32; + units "microseconds"; + description + "The traffic class should use a path + with a defined maximum jitter."; + } + } + description + "Jitter constraint on the traffic class."; + } + description + "Jitter constraint on the traffic class."; + } + container frame-loss { + leaf rate { + type decimal64 { + fraction-digits 2; + range "0..100"; + } + units "percent"; + description + "Frame loss rate constraint on the traffic + class."; + } + description + "Container for frame loss rate."; + } + container bandwidth { + leaf guaranteed-bw-percent { + type decimal64 { + fraction-digits 5; + range "0..100"; + } + units "percent"; + mandatory true; + description + "Used to define the guaranteed bandwidth + as a percentage of the available service + bandwidth."; + } + leaf end-to-end { + type empty; + description + "Used if the bandwidth reservation + must be done on the MPLS network too."; + } + description + "Bandwidth constraint on the traffic class."; + } + description + "List of CoS entries."; + } + description + "Container for list of CoS entries."; + } + } + } + description + "Qos profile configuration."; + } + description + "QoS configuration."; + } + description + "Grouping that defines QoS parameters for a site."; + } + + grouping site-service-mpls { + container carrierscarrier { + if-feature "carrierscarrier"; + leaf signaling-type { + type identityref { + base carrierscarrier-type; + } + default "bgp"; + description + "CsC. By default, the signaling type is 'bgp'."; + } + description + "Container for CsC."; + } + description + "Grouping for CsC."; + } + + container l2vpn-svc { + container vpn-profiles { + container valid-provider-identifiers { + leaf-list cloud-identifier { + if-feature "cloud-access"; + type string; + description + "Identification of the public cloud service or + Internet service. Local to each administration."; + } + leaf-list qos-profile-identifier { + type string; + description + "Identification of the QoS profile to be used. + Local to each administration."; + } + leaf-list bfd-profile-identifier { + type string; + description + "Identification of the SP BFD profile to be used. + Local to each administration."; + } + leaf-list remote-carrier-identifier { + type string; + description + "Identification of the remote carrier name to be used. + It can be an L2VPN partner, data-center SP, or + private CSP. Local to each administration."; + } + nacm:default-deny-write; + description + "Container for valid provider identifiers."; + } + description + "Container for VPN profiles."; + } + container vpn-services { + list vpn-service { + key "vpn-id"; + leaf vpn-id { + type svc-id; + description + "Defines a service identifier."; + } + leaf vpn-svc-type { + type identityref { + base service-type; + } + default "vpws"; + description + "Service type. By default, the service type is 'vpws'."; + } + leaf customer-name { + type string; + description + "Customer name."; + } + leaf svc-topo { + type identityref { + base vpn-topology; + } + default "any-to-any"; + description + "Defines the service topology, e.g., + 'any-to-any', 'hub-spoke'."; + } + container cloud-accesses { + if-feature "cloud-access"; + list cloud-access { + key "cloud-identifier"; + leaf cloud-identifier { + type leafref { + path "/l2vpn-svc/vpn-profiles/" + + "valid-provider-identifiers" + + "/cloud-identifier"; + } + description + "Identification of the cloud service. + Local to each administration."; + } + choice list-flavor { + case permit-any { + leaf permit-any { + type empty; + description + "Allow all sites."; + } + } + case deny-any-except { + leaf-list permit-site { + type leafref { + path "/l2vpn-svc/sites/site/site-id"; + } + description + "Site ID to be authorized."; + } + } + case permit-any-except { + leaf-list deny-site { + type leafref { + path "/l2vpn-svc/sites/site/site-id"; + } + description + "Site ID to be denied."; + } + } + description + "Choice for cloud access policy. + By default, all sites in the L2VPN + MUST be authorized to access the cloud."; + } + description + "Cloud access configuration."; + } + description + "Container for cloud access configurations."; + } + container frame-delivery { + if-feature "bum"; + container customer-tree-flavors { + leaf-list tree-flavor { + type identityref { + base multicast-tree-type; + } + description + "Type of tree to be used."; + } + description + "Types of trees used by the customer."; + } + container bum-deliveries { + list bum-delivery { + key "frame-type"; + leaf frame-type { + type identityref { + base tf-type; + } + description + "Type of frame delivery. It supports unicast + frame delivery, multicast frame delivery, + and broadcast frame delivery."; + } + leaf delivery-mode { + type identityref { + base frame-delivery-mode; + } + default "unconditional"; + description + "Defines the frame delivery mode + ('unconditional' (default), 'conditional', + or 'discard'). By default, service frames are + unconditionally delivered to the destination site."; + } + description + "List of frame delivery types and modes."; + } + description + "Defines the frame delivery types and modes."; + } + leaf multicast-gp-port-mapping { + type identityref { + base multicast-gp-address-mapping; + } + mandatory true; + description + "Describes the way in which each interface is + associated with the multicast group."; + } + description + "Multicast global parameters for the VPN service."; + } + container extranet-vpns { + if-feature "extranet-vpn"; + list extranet-vpn { + key "vpn-id"; + leaf vpn-id { + type svc-id; + description + "Identifies the target VPN that the local VPN wants to + access."; + } + leaf local-sites-role { + type identityref { + base site-role; + } + default "any-to-any-role"; + description + "Describes the role of the local sites in the target + VPN topology. In the any-to-any VPN service topology, + the local sites must have the same role, which will be + 'any-to-any-role'. In the Hub-and-Spoke VPN service + topology or the Hub-and-Spoke-Disjoint VPN service + topology, the local sites must have a Hub role or a + Spoke role."; + } + description + "List of extranet VPNs to which the local VPN + is attached."; + } + description + "Container for extranet VPN configurations."; + } + leaf ce-vlan-preservation { + type boolean; + mandatory true; + description + "Preserves the CE-VLAN ID from ingress to egress, i.e., + the CE-VLAN tag of the egress frame is identical to + that of the ingress frame that yielded this + egress service frame. If all-to-one bundling within + a site is enabled, then preservation applies to all + ingress service frames. If all-to-one bundling is + disabled, then preservation applies to tagged + ingress service frames having CE-VLAN IDs 1 through 4094."; + } + leaf ce-vlan-cos-preservation { + type boolean; + mandatory true; + description + "CE VLAN CoS preservation. The PCP bits in the CE-VLAN tag + of the egress frame are identical to those of the + ingress frame that yielded this egress service frame."; + } + leaf carrierscarrier { + if-feature "carrierscarrier"; + type boolean; + default "false"; + description + "The VPN is using CsC, and so MPLS is required."; + } + description + "List of VPN services."; + } + description + "Container for VPN services."; + } + container sites { + list site { + key "site-id"; + leaf site-id { + type string; + description + "Identifier of the site."; + } + leaf site-vpn-flavor { + type identityref { + base site-vpn-flavor; + } + default "site-vpn-flavor-single"; + description + "Defines the way that the VPN multiplexing is + done, e.g., whether the site belongs to + a single VPN site or a multi-VPN site. By + default, the site belongs to a single VPN."; + } + container devices { + when "derived-from-or-self(../management/type, " + + "'l2vpn-svc:provider-managed') or " + + "derived-from-or-self(../management/type, " + + "'l2vpn-svc:co-managed')" { + description + "Applicable only for a provider-managed or + co-managed device."; + } + list device { + key "device-id"; + leaf device-id { + type string; + description + "Identifier for the device."; + } + leaf location { + type leafref { + path "../../../locations/location/location-id"; + } + mandatory true; + description + "Location of the device."; + } + container management { + when "derived-from-or-self(../../../management/type, " + + "'l2vpn-svc:co-managed')" { + description + "Applicable only for a co-managed device."; + } + leaf transport { + type identityref { + base address-family; + } + description + "Transport protocol or address family + used for management."; + } + leaf address { + when '(../ transport)' { + description + "If the address family is specified, then the + address should also be specified. If the + transport is not specified, then the address + should not be specified."; + } + type inet:ip-address; + description + "Management address."; + } + description + "Management configuration. Applicable only for a + co-managed device."; + } + description + "List of devices requested by the customer."; + } + description + "Device configurations."; + } + container management { + leaf type { + type identityref { + base management; + } + mandatory true; + description + "Management type of the connection."; + } + description + "Management configuration."; + } + container locations { + list location { + key "location-id"; + leaf location-id { + type string; + description + "Location ID."; + } + leaf address { + type string; + description + "Address (number and street) of the site."; + } + leaf postal-code { + type string; + description + "Postal code of the site. The format of 'postal-code' + is similar to the 'PC' (postal code) label format + defined in RFC 4119."; + } + leaf state { + type string; + description + "State (region) of the site. This leaf can also be used + to describe a region of a country that does not have + states."; + } + leaf city { + type string; + description + "City of the site."; + } + leaf country-code { + type string; + description + "Country of the site. The format of 'country-code' is + similar to the 'country' label defined in RFC 4119."; + } + description + "List of locations."; + } + description + "Location of the site."; + } + container site-diversity { + if-feature "site-diversity"; + container groups { + list group { + key "group-id"; + leaf group-id { + type string; + description + "The group-id to which the site belongs."; + } + description + "List of group-ids."; + } + description + "Groups to which the site belongs. + All site network accesses will inherit those group + values."; + } + description + "The type of diversity constraint."; + } + container vpn-policies { + list vpn-policy { + key "vpn-policy-id"; + leaf vpn-policy-id { + type string; + description + "Unique identifier for the VPN policy."; + } + list entries { + key "id"; + leaf id { + type string; + description + "Unique identifier for the policy entry."; + } + container filters { + list filter { + key "type"; + ordered-by user; + leaf type { + type identityref { + base vpn-policy-filter-type; + } + description + "Type of VPN policy filter."; + } + leaf-list lan-tag { + when "derived-from-or-self(../type, " + + "'l2vpn-svc:lan')" { + description + "Only applies when the VPN policy filter is a + LAN tag filter."; + } + if-feature "lan-tag"; + type uint32; + description + "List of Ethernet LAN tags to be matched. An + Ethernet LAN tag identifies a particular + broadcast domain in a VPN."; + } + description + "List of filters used on the site. This list can + be augmented."; + } + description + "If a more granular VPN attachment is necessary, + filtering can be used. If used, it permits the + splitting of site LANs among multiple VPNs. The + site LAN can be split based on either the LAN tag or + the LAN prefix. If no filter is used, all the LANs + will be part of the same VPNs with the same role."; + } + list vpn { + key "vpn-id"; + leaf vpn-id { + type leafref { + path "/l2vpn-svc/vpn-services/vpn-service/vpn-id"; + } + description + "Reference to an L2VPN."; + } + leaf site-role { + type identityref { + base site-role; + } + default "any-to-any-role"; + description + "Role of the site in the L2VPN."; + } + description + "List of VPNs with which the LAN is associated."; + } + description + "List of entries for an export policy."; + } + description + "List of VPN policies."; + } + description + "VPN policy."; + } + container service { + uses site-service-qos-profile; + uses site-service-mpls; + description + "Service parameters on the attachment."; + } + uses site-bum; + uses site-mac-loop-prevention; + uses site-acl; + leaf actual-site-start { + type yang:date-and-time; + config false; + description + "This leaf is optional. It indicates the date and time + when the service at a particular site actually started."; + } + leaf actual-site-stop { + type yang:date-and-time; + config false; + description + "This leaf is optional. It indicates the date and time + when the service at a particular site actually stopped."; + } + leaf bundling-type { + type identityref { + base bundling-type; + } + default "one2one-bundling"; + description + "Bundling type. By default, each L2VPN + can be associated with only one + CE-VLAN, i.e., one-to-one bundling is used."; + } + leaf default-ce-vlan-id { + type uint32; + mandatory true; + description + "Default CE VLAN ID set at the site level."; + } + container site-network-accesses { + list site-network-access { + key "network-access-id"; + leaf network-access-id { + type string; + description + "Identifier of network access."; + } + leaf remote-carrier-name { + when "derived-from-or-self(../../../site-vpn-flavor," + + "'l2vpn-svc:site-vpn-flavor-nni')" { + description + "Relevant when the site's VPN flavor is + 'site-vpn-flavor-nni'."; + } + type leafref { + path "/l2vpn-svc/vpn-profiles/" + + "valid-provider-identifiers" + + "/remote-carrier-identifier"; + } + description + "Remote carrier name. The 'remote-carrier-name' + parameter must be configured only when + 'site-vpn-flavor' is set to 'site-vpn-flavor-nni'. + If it is not set, it indicates that the customer + does not know the remote carrier's name + beforehand."; + } + leaf type { + type identityref { + base site-network-access-type; + } + default "point-to-point"; + description + "Describes the type of connection, e.g., + point-to-point or multipoint."; + } + choice location-flavor { + case location { + when "derived-from-or-self(../../management/type, " + + "'l2vpn-svc:customer-managed')" { + description + "Applicable only for a customer-managed device."; + } + leaf location-reference { + type leafref { + path "../../../locations/location/location-id"; + } + description + "Location of the site-network-access."; + } + } + case device { + when "derived-from-or-self(../../management/type, " + + "'l2vpn-svc:provider-managed') or " + + "derived-from-or-self(../../management/type, " + + "'l2vpn-svc:co-managed')" { + description + "Applicable only for a provider-managed + or co-managed device."; + } + leaf device-reference { + type leafref { + path "../../../devices/device/device-id"; + } + description + "Identifier of the CE to use."; + } + } + mandatory true; + description + "Choice of how to describe the site's location."; + } + container access-diversity { + if-feature "site-diversity"; + container groups { + list group { + key "group-id"; + leaf group-id { + type string; + description + "Group-id to which the site belongs."; + } + description + "List of group-ids."; + } + description + "Groups to which the site or site-network-access + belongs."; + } + container constraints { + list constraint { + key "constraint-type"; + leaf constraint-type { + type identityref { + base placement-diversity; + } + description + "The type of diversity constraint."; + } + container target { + choice target-flavor { + default "id"; + case id { + list group { + key "group-id"; + leaf group-id { + type string; + description + "The constraint will apply against this + particular group-id."; + } + description + "List of groups."; + } + } + case all-accesses { + leaf all-other-accesses { + type empty; + description + "The constraint will apply against all other + site network accesses of this site."; + } + } + case all-groups { + leaf all-other-groups { + type empty; + description + "The constraint will apply against all other + groups the customer is managing."; + } + } + description + "Choice for the group definition."; + } + description + "The constraint will apply against + this list of groups."; + } + description + "List of constraints."; + } + description + "Constraints for placing this site network access."; + } + description + "Diversity parameters."; + } + container bearer { + container requested-type { + if-feature "requested-type"; + leaf type { + type string; + description + "Type of requested bearer: Ethernet, ATM, Frame + Relay, IP Layer 2 transport, Frame Relay Data + Link Connection Identifier (DLCI), SONET/SDH, + PPP."; + } + leaf strict { + type boolean; + default "false"; + description + "Defines whether the requested type is a preference + or a strict requirement."; + } + description + "Container for requested types."; + } + leaf always-on { + if-feature "always-on"; + type boolean; + default "true"; + description + "Request for an 'always-on' access type. + For example, this could mean no dial-in access + type."; + } + leaf bearer-reference { + if-feature "bearer-reference"; + type string; + description + "An internal reference for the SP."; + } + description + "Bearer-specific parameters. To be augmented."; + } + container connection { + leaf encapsulation-type { + type identityref { + base encapsulation-type; + } + default "ethernet"; + description + "Encapsulation type. By default, the + encapsulation type is set to 'ethernet'."; + } + leaf eth-inf-type { + type identityref { + base eth-inf-type; + } + default "untagged"; + description + "Ethernet interface type. By default, the + Ethernet interface type is set to 'untagged'."; + } + container tagged-interface { + leaf type { + type identityref { + base tagged-inf-type; + } + default "priority-tagged"; + description + "Tagged interface type. By default, + the type of the tagged interface is + 'priority-tagged'."; + } + container dot1q-vlan-tagged { + when "derived-from-or-self(../type, " + + "'l2vpn-svc:dot1q')" { + description + "Only applies when the type of the tagged + interface is 'dot1q'."; + } + if-feature "dot1q"; + leaf tg-type { + type identityref { + base tag-type; + } + default "c-vlan"; + description + "Tag type. By default, the tag type is + 'c-vlan'."; + } + leaf cvlan-id { + type uint16; + mandatory true; + description + "VLAN identifier."; + } + description + "Tagged interface."; + } + container priority-tagged { + when "derived-from-or-self(../type, " + + "'l2vpn-svc:priority-tagged')" { + description + "Only applies when the type of the tagged + interface is 'priority-tagged'."; + } + leaf tag-type { + type identityref { + base tag-type; + } + default "c-vlan"; + description + "Tag type. By default, the tag type is + 'c-vlan'."; + } + description + "Priority tagged."; + } + container qinq { + when "derived-from-or-self(../type, " + + "'l2vpn-svc:qinq')" { + description + "Only applies when the type of the tagged + interface is 'qinq'."; + } + if-feature "qinq"; + leaf tag-type { + type identityref { + base tag-type; + } + default "c-s-vlan"; + description + "Tag type. By default, the tag type is + 'c-s-vlan'."; + } + leaf svlan-id { + type uint16; + mandatory true; + description + "SVLAN identifier."; + } + leaf cvlan-id { + type uint16; + mandatory true; + description + "CVLAN identifier."; + } + description + "QinQ."; + } + container qinany { + when "derived-from-or-self(../type, " + + "'l2vpn-svc:qinany')" { + description + "Only applies when the type of the tagged + interface is 'qinany'."; + } + if-feature "qinany"; + leaf tag-type { + type identityref { + base tag-type; + } + default "s-vlan"; + description + "Tag type. By default, the tag type is + 's-vlan'."; + } + leaf svlan-id { + type uint16; + mandatory true; + description + "SVLAN ID."; + } + description + "Container for QinAny."; + } + container vxlan { + when "derived-from-or-self(../type, " + + "'l2vpn-svc:vxlan')" { + description + "Only applies when the type of the tagged + interface is 'vxlan'."; + } + if-feature "vxlan"; + leaf vni-id { + type uint32; + mandatory true; + description + "VXLAN Network Identifier (VNI)."; + } + leaf peer-mode { + type identityref { + base vxlan-peer-mode; + } + default "static-mode"; + description + "Specifies the VXLAN access mode. By default, + the peer mode is set to 'static-mode'."; + } + list peer-list { + key "peer-ip"; + leaf peer-ip { + type inet:ip-address; + description + "Peer IP."; + } + description + "List of peer IP addresses."; + } + description + "QinQ."; + } + description + "Container for tagged interfaces."; + } + container untagged-interface { + leaf speed { + type uint32; + units "mbps"; + default "10"; + description + "Port speed."; + } + leaf mode { + type neg-mode; + default "auto-neg"; + description + "Negotiation mode."; + } + leaf phy-mtu { + type uint32; + units "bytes"; + description + "PHY MTU."; + } + leaf lldp { + type boolean; + default "false"; + description + "LLDP. Indicates that LLDP is supported."; + } + container oam-802.3ah-link { + if-feature "oam-3ah"; + leaf enabled { + type boolean; + default "false"; + description + "Indicates whether or not to support + OAM 802.3ah links."; + } + description + "Container for OAM 802.3ah links."; + } + leaf uni-loop-prevention { + type boolean; + default "false"; + description + "If this leaf is set to 'true', then the port + automatically goes down when a physical + loopback is detected."; + } + description + "Container of untagged interface attribute + configurations."; + } + container lag-interfaces { + if-feature "lag-interface"; + list lag-interface { + key "index"; + leaf index { + type string; + description + "LAG interface index."; + } + container lacp { + if-feature "lacp"; + leaf enabled { + type boolean; + default "false"; + description + "LACP on/off. By default, LACP is disabled."; + } + leaf mode { + type neg-mode; + description + "LACP mode. LACP modes have active mode and + passive mode ('false'). 'Active mode' means + initiating the auto-speed negotiation and + trying to form an Ethernet channel with the + other end. 'Passive mode' means not initiating + the negotiation but responding to LACP packets + initiated by the other end (e.g., full duplex + or half duplex)."; + } + leaf speed { + type uint32; + units "mbps"; + default "10"; + description + "LACP speed. By default, the LACP speed is 10 + Mbps."; + } + leaf mini-link-num { + type uint32; + description + "Defines the minimum number of links that must + be active before the aggregating link is put + into service."; + } + leaf system-priority { + type uint16; + default "32768"; + description + "Indicates the LACP priority for the system. + The range is from 0 to 65535. + The default is 32768."; + } + container micro-bfd { + if-feature "micro-bfd"; + leaf enabled { + type enumeration { + enum on { + description + "Micro-bfd on."; + } + enum off { + description + "Micro-bfd off."; + } + } + default "off"; + description + "Micro-BFD on/off. By default, micro-BFD + is set to 'off'."; + } + leaf interval { + type uint32; + units "milliseconds"; + description + "BFD interval."; + } + leaf hold-timer { + type uint32; + units "milliseconds"; + description + "BFD hold timer."; + } + description + "Container of micro-BFD configurations."; + } + container bfd { + if-feature "bfd"; + leaf enabled { + type boolean; + default "false"; + description + "BFD activation. By default, BFD is not + activated."; + } + choice holdtime { + default "fixed"; + case profile { + leaf profile-name { + type leafref { + path "/l2vpn-svc/vpn-profiles/" + + "valid-provider-identifiers" + + "/bfd-profile-identifier"; + } + description + "SP well-known profile."; + } + description + "SP well-known profile."; + } + case fixed { + leaf fixed-value { + type uint32; + units "milliseconds"; + description + "Expected hold time expressed in + milliseconds."; + } + } + description + "Choice for the hold-time flavor."; + } + description + "Container for BFD."; + } + container member-links { + list member-link { + key "name"; + leaf name { + type string; + description + "Member link name."; + } + leaf speed { + type uint32; + units "mbps"; + default "10"; + description + "Port speed."; + } + leaf mode { + type neg-mode; + default "auto-neg"; + description + "Negotiation mode."; + } + leaf link-mtu { + type uint32; + units "bytes"; + description + "Link MTU size."; + } + container oam-802.3ah-link { + if-feature "oam-3ah"; + leaf enabled { + type boolean; + default "false"; + description + "Indicates whether OAM 802.3ah links are + supported."; + } + description + "Container for OAM 802.3ah links."; + } + description + "Member link."; + } + description + "Container of the member link list."; + } + leaf flow-control { + type boolean; + default "false"; + description + "Flow control. Indicates whether flow control + is supported."; + } + leaf lldp { + type boolean; + default "false"; + description + "LLDP. Indicates whether LLDP is supported."; + } + description + "LACP."; + } + description + "List of LAG interfaces."; + } + description + "Container of LAG interface attribute + configurations."; + } + list cvlan-id-to-svc-map { + key "svc-id"; + leaf svc-id { + type leafref { + path "/l2vpn-svc/vpn-services/vpn-service/vpn-id"; + } + description + "VPN service identifier."; + } + list cvlan-id { + key "vid"; + leaf vid { + type uint16; + description + "CVLAN ID."; + } + description + "List of CVLAN-ID-to-SVC-map configurations."; + } + description + "List of CVLAN-ID-to-L2VPN-service-map + configurations."; + } + container l2cp-control { + if-feature "l2cp-control"; + leaf stp-rstp-mstp { + type control-mode; + description + "STP / Rapid STP (RSTP) / Multiple STP (MSTP) + protocol type applicable to all sites."; + } + leaf pause { + type control-mode; + description + "Pause protocol type applicable to all sites."; + } + leaf lacp-lamp { + type control-mode; + description + "LACP / Link Aggregation Marker Protocol (LAMP)."; + } + leaf link-oam { + type control-mode; + description + "Link OAM."; + } + leaf esmc { + type control-mode; + description + "Ethernet Synchronization Messaging Channel + (ESMC)."; + } + leaf l2cp-802.1x { + type control-mode; + description + "IEEE 802.1x."; + } + leaf e-lmi { + type control-mode; + description + "E-LMI."; + } + leaf lldp { + type boolean; + description + "LLDP protocol type applicable to all sites."; + } + leaf ptp-peer-delay { + type control-mode; + description + "Precision Time Protocol (PTP) peer delay."; + } + leaf garp-mrp { + type control-mode; + description + "GARP/MRP."; + } + description + "Container of L2CP control configurations."; + } + container oam { + if-feature "ethernet-oam"; + leaf md-name { + type string; + mandatory true; + description + "Maintenance domain name."; + } + leaf md-level { + type uint16 { + range "0..255"; + } + mandatory true; + description + "Maintenance domain level. The level may be + restricted in certain protocols (e.g., + protocols in Layer 0 to Layer 7)."; + } + list cfm-8021-ag { + if-feature "cfm"; + key "maid"; + leaf maid { + type string; + mandatory true; + description + "Identifies a Maintenance Association (MA)."; + } + leaf mep-id { + type uint32; + description + "Local Maintenance Entity Group End Point (MEP) + ID. The non-existence of this leaf means + that no defects are to be reported."; + } + leaf mep-level { + type uint32; + description + "Defines the MEP level. The non-existence of this + leaf means that no defects are to be reported."; + } + leaf mep-up-down { + type enumeration { + enum up { + description + "MEP up."; + } + enum down { + description + "MEP down."; + } + } + default "up"; + description + "MEP up/down. By default, MEP up is used. + The non-existence of this leaf means that + no defects are to be reported."; + } + leaf remote-mep-id { + type uint32; + description + "Remote MEP ID. The non-existence of this leaf + means that no defects are to be reported."; + } + leaf cos-for-cfm-pdus { + type uint32; + description + "CoS for CFM PDUs. The non-existence of this leaf + means that no defects are to be reported."; + } + leaf ccm-interval { + type uint32; + units "milliseconds"; + default "10000"; + description + "CCM interval. By default, the CCM interval is + 10,000 milliseconds (10 seconds)."; + } + leaf ccm-holdtime { + type uint32; + units "milliseconds"; + default "35000"; + description + "CCM hold time. By default, the CCM hold time + is 3.5 times the CCM interval."; + } + leaf alarm-priority-defect { + type identityref { + base fault-alarm-defect-type; + } + default "remote-invalid-ccm"; + description + "The lowest-priority defect that is + allowed to generate a fault alarm. By default, + 'fault-alarm-defect-type' is set to + 'remote-invalid-ccm'. The non-existence of + this leaf means that no defects are + to be reported."; + } + leaf ccm-p-bits-pri { + type ccm-priority-type; + description + "The priority parameter for CCMs transmitted by + the MEP. The non-existence of this leaf means + that no defects are to be reported."; + } + description + "List of 802.1ag CFM attributes."; + } + list y-1731 { + if-feature "y-1731"; + key "maid"; + leaf maid { + type string; + mandatory true; + description + "Identifies an MA."; + } + leaf mep-id { + type uint32; + description + "Local MEP ID. The non-existence of this leaf + means that no measurements are to be reported."; + } + leaf type { + type identityref { + base pm-type; + } + default "delay"; + description + "Performance-monitoring types. By default, the + performance-monitoring type is set to 'delay'. + The non-existence of this leaf means that no + measurements are to be reported."; + } + leaf remote-mep-id { + type uint32; + description + "Remote MEP ID. The non-existence of this + leaf means that no measurements are to be + reported."; + } + leaf message-period { + type uint32; + units "milliseconds"; + default "10000"; + description + "Defines the interval between Y.1731 + performance-monitoring messages. The message + period is expressed in milliseconds."; + } + leaf measurement-interval { + type uint32; + units "seconds"; + description + "Specifies the measurement interval for + statistics. The measurement interval is + expressed in seconds."; + } + leaf cos { + type uint32; + description + "CoS. The non-existence of this leaf means that + no measurements are to be reported."; + } + leaf loss-measurement { + type boolean; + default "false"; + description + "Indicates whether or not to enable loss + measurement. By default, loss + measurement is not enabled."; + } + leaf synthetic-loss-measurement { + type boolean; + default "false"; + description + "Indicates whether or not to enable synthetic loss + measurement. By default, synthetic loss + measurement is not enabled."; + } + container delay-measurement { + leaf enable-dm { + type boolean; + default "false"; + description + "Indicates whether or not to enable delay + measurement. By default, delay measurement + is not enabled."; + } + leaf two-way { + type boolean; + default "false"; + description + "Indicates whether delay measurement is two-way + ('true') or one-way ('false'). By default, + one-way measurement is enabled."; + } + description + "Container for delay measurement."; + } + leaf frame-size { + type uint32; + units "bytes"; + description + "Frame size. The non-existence of this leaf + means that no measurements are to be reported."; + } + leaf session-type { + type enumeration { + enum proactive { + description + "Proactive mode."; + } + enum on-demand { + description + "On-demand mode."; + } + } + default "on-demand"; + description + "Session type. By default, the session type + is 'on-demand'. The non-existence of this + leaf means that no measurements are to be + reported."; + } + description + "List of configured Y-1731 instances."; + } + description + "Container for Ethernet Service OAM."; + } + description + "Container for connection requirements."; + } + container availability { + leaf access-priority { + type uint32; + default "100"; + description + "Access priority. The higher the access-priority + value, the higher the preference will be for the + access in question."; + } + choice redundancy-mode { + case single-active { + leaf single-active { + type empty; + description + "Single-active mode."; + } + description + "In single-active mode, only one node forwards + traffic to and from the Ethernet segment."; + } + case all-active { + leaf all-active { + type empty; + description + "All-active mode."; + } + description + "In all-active mode, all nodes can forward + traffic."; + } + description + "Redundancy mode choice."; + } + description + "Container of available optional configurations."; + } + container vpn-attachment { + choice attachment-flavor { + case vpn-id { + leaf vpn-id { + type leafref { + path "/l2vpn-svc/vpn-services/vpn-service/vpn-id"; + } + description + "Reference to an L2VPN. Referencing a vpn-id + provides an easy way to attach a particular + logical access to a VPN. In this case, + the vpn-id must be configured."; + } + leaf site-role { + type identityref { + base site-role; + } + default "any-to-any-role"; + description + "Role of the site in the L2VPN. When referencing + a vpn-id, the site-role setting must be added to + express the role of the site in the target VPN + service topology."; + } + } + case vpn-policy-id { + leaf vpn-policy-id { + type leafref { + path "../../../../vpn-policies/vpn-policy/" + + "vpn-policy-id"; + } + description + "Reference to a VPN policy."; + } + } + mandatory true; + description + "Choice for the VPN attachment flavor."; + } + description + "Defines the VPN attachment of a site."; + } + container service { + container svc-bandwidth { + if-feature "input-bw"; + list bandwidth { + key "direction type"; + leaf direction { + type identityref { + base bw-direction; + } + description + "Indicates the bandwidth direction. It can be + the bandwidth download direction from the SP to + the site or the bandwidth upload direction from + the site to the SP."; + } + leaf type { + type identityref { + base bw-type; + } + description + "Bandwidth type. By default, the bandwidth type + is set to 'bw-per-cos'."; + } + leaf cos-id { + when "derived-from-or-self(../type, " + + "'l2vpn-svc:bw-per-cos')" { + description + "Relevant when the bandwidth type is set to + 'bw-per-cos'."; + } + type uint8; + description + "Identifier of the CoS, indicated by DSCP or a + CE-VLAN CoS (802.1p) value in the service frame. + If the bandwidth type is set to 'bw-per-cos', + the CoS ID MUST also be specified."; + } + leaf vpn-id { + when "derived-from-or-self(../type, " + + "'l2vpn-svc:bw-per-svc')" { + description + "Relevant when the bandwidth type is + set as bandwidth per VPN service."; + } + type svc-id; + description + "Identifies the target VPN. If the bandwidth + type is set as bandwidth per VPN service, the + vpn-id MUST be specified."; + } + leaf cir { + type uint64; + units "bps"; + mandatory true; + description + "Committed Information Rate. The maximum number + of bits that a port can receive or send over + an interface in one second."; + } + leaf cbs { + type uint64; + units "bps"; + mandatory true; + description + "Committed Burst Size (CBS). Controls the bursty + nature of the traffic. Traffic that does not + use the configured Committed Information Rate + (CIR) accumulates credits until the credits + reach the configured CBS."; + } + leaf eir { + type uint64; + units "bps"; + description + "Excess Information Rate (EIR), i.e., excess frame + delivery allowed that is not subject to an SLA. + The traffic rate can be limited by the EIR."; + } + leaf ebs { + type uint64; + units "bps"; + description + "Excess Burst Size (EBS). The bandwidth available + for burst traffic from the EBS is subject to the + amount of bandwidth that is accumulated during + periods when traffic allocated by the EIR + policy is not used."; + } + leaf pir { + type uint64; + units "bps"; + description + "Peak Information Rate, i.e., maximum frame + delivery allowed. It is equal to or less + than the sum of the CIR and the EIR."; + } + leaf pbs { + type uint64; + units "bps"; + description + "Peak Burst Size. It is measured in bytes per + second."; + } + description + "List of bandwidth values (e.g., per CoS, + per vpn-id)."; + } + description + "From the customer site's perspective, the service + input/output bandwidth of the connection or + download/upload bandwidth from the SP/site + to the site/SP."; + } + leaf svc-mtu { + type uint16; + units "bytes"; + mandatory true; + description + "SVC MTU. It is also known as the maximum + transmission unit or maximum frame size. When + a frame is larger than the MTU, it is broken + down, or fragmented, into smaller pieces by + the network protocol to accommodate the MTU + of the network. If CsC is enabled, + the requested svc-mtu leaf will refer to the + MPLS MTU and not to the link MTU."; + } + uses site-service-qos-profile; + uses site-service-mpls; + description + "Container for services."; + } + uses site-bum; + uses site-mac-loop-prevention; + uses site-acl; + container mac-addr-limit { + if-feature "mac-addr-limit"; + leaf limit-number { + type uint16; + default "2"; + description + "Maximum number of MAC addresses learned from + the subscriber for a single service instance. + The default allowed maximum number of MAC + addresses is 2."; + } + leaf time-interval { + type uint32; + units "seconds"; + default "300"; + description + "The aging time of the MAC address. By default, + the aging time is set to 300 seconds."; + } + leaf action { + type identityref { + base mac-action; + } + default "warning"; + description + "Specifies the action taken when the upper limit is + exceeded: drop the packet, flood the packet, or + simply send a warning log message. By default, + the action is set to 'warning'."; + } + description + "Container of MAC address limit configurations."; + } + description + "List of site network accesses."; + } + description + "Container of port configurations."; + } + description + "List of sites."; + } + description + "Container of site configurations."; + } + description + "Container for L2VPN services."; + } +} \ No newline at end of file diff --git a/src/nbi/service/ietf_l2vpn/yang/ietf-netconf-acm@2018-02-14.yang b/src/nbi/service/ietf_l2vpn/yang/ietf-netconf-acm@2018-02-14.yang new file mode 100644 index 0000000000000000000000000000000000000000..dc0deb8ffd29791ad80b9e3ad8244502126f2d44 --- /dev/null +++ b/src/nbi/service/ietf_l2vpn/yang/ietf-netconf-acm@2018-02-14.yang @@ -0,0 +1,468 @@ +module ietf-netconf-acm { + + namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-acm"; + + prefix nacm; + + import ietf-yang-types { + prefix yang; + } + + organization + "IETF NETCONF (Network Configuration) Working Group"; + + contact + "WG Web: + WG List: + + Author: Andy Bierman + + + Author: Martin Bjorklund + "; + + description + "Network Configuration Access Control Model. + + Copyright (c) 2012 - 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 8341; see + the RFC itself for full legal notices."; + + revision "2018-02-14" { + description + "Added support for YANG 1.1 actions and notifications tied to + data nodes. Clarified how NACM extensions can be used by + other data models."; + reference + "RFC 8341: Network Configuration Access Control Model"; + } + + revision "2012-02-22" { + description + "Initial version."; + reference + "RFC 6536: Network Configuration Protocol (NETCONF) + Access Control Model"; + } + + /* + * Extension statements + */ + + extension default-deny-write { + description + "Used to indicate that the data model node + represents a sensitive security system parameter. + + If present, the NETCONF server will only allow the designated + 'recovery session' to have write access to the node. An + explicit access control rule is required for all other users. + + If the NACM module is used, then it must be enabled (i.e., + /nacm/enable-nacm object equals 'true'), or this extension + is ignored. + + The 'default-deny-write' extension MAY appear within a data + definition statement. It is ignored otherwise."; + } + + extension default-deny-all { + description + "Used to indicate that the data model node + controls a very sensitive security system parameter. + + If present, the NETCONF server will only allow the designated + 'recovery session' to have read, write, or execute access to + the node. An explicit access control rule is required for all + other users. + + If the NACM module is used, then it must be enabled (i.e., + /nacm/enable-nacm object equals 'true'), or this extension + is ignored. + + The 'default-deny-all' extension MAY appear within a data + definition statement, 'rpc' statement, or 'notification' + statement. It is ignored otherwise."; + } + + /* + * Derived types + */ + + typedef user-name-type { + type string { + length "1..max"; + } + description + "General-purpose username string."; + } + + typedef matchall-string-type { + type string { + pattern '\*'; + } + description + "The string containing a single asterisk '*' is used + to conceptually represent all possible values + for the particular leaf using this data type."; + } + + typedef access-operations-type { + type bits { + bit create { + description + "Any protocol operation that creates a + new data node."; + position 0; + } + bit read { + description + "Any protocol operation or notification that + returns the value of a data node."; + position 1; + } + bit update { + description + "Any protocol operation that alters an existing + data node."; + position 2; + } + bit delete { + description + "Any protocol operation that removes a data node."; + position 3; + } + bit exec { + description + "Execution access to the specified protocol operation."; + position 4; + } + } + description + "Access operation."; + } + + typedef group-name-type { + type string { + length "1..max"; + pattern '[^\*].*'; + } + description + "Name of administrative group to which + users can be assigned."; + } + + typedef action-type { + type enumeration { + enum permit { + description + "Requested action is permitted."; + } + enum deny { + description + "Requested action is denied."; + } + } + description + "Action taken by the server when a particular + rule matches."; + } + + typedef node-instance-identifier { + type yang:xpath1.0; + description + "Path expression used to represent a special + data node, action, or notification instance-identifier + string. + + A node-instance-identifier value is an + unrestricted YANG instance-identifier expression. + All the same rules as an instance-identifier apply, + except that predicates for keys are optional. If a key + predicate is missing, then the node-instance-identifier + represents all possible server instances for that key. + + This XML Path Language (XPath) expression is evaluated in the + following context: + + o The set of namespace declarations are those in scope on + the leaf element where this type is used. + + o The set of variable bindings contains one variable, + 'USER', which contains the name of the user of the + current session. + + o The function library is the core function library, but + note that due to the syntax restrictions of an + instance-identifier, no functions are allowed. + + o The context node is the root node in the data tree. + + The accessible tree includes actions and notifications tied + to data nodes."; + } + + /* + * Data definition statements + */ + + container nacm { + nacm:default-deny-all; + + description + "Parameters for NETCONF access control model."; + + leaf enable-nacm { + type boolean; + default "true"; + description + "Enables or disables all NETCONF access control + enforcement. If 'true', then enforcement + is enabled. If 'false', then enforcement + is disabled."; + } + + leaf read-default { + type action-type; + default "permit"; + description + "Controls whether read access is granted if + no appropriate rule is found for a + particular read request."; + } + + leaf write-default { + type action-type; + default "deny"; + description + "Controls whether create, update, or delete access + is granted if no appropriate rule is found for a + particular write request."; + } + + leaf exec-default { + type action-type; + default "permit"; + description + "Controls whether exec access is granted if no appropriate + rule is found for a particular protocol operation request."; + } + + leaf enable-external-groups { + type boolean; + default "true"; + description + "Controls whether the server uses the groups reported by the + NETCONF transport layer when it assigns the user to a set of + NACM groups. If this leaf has the value 'false', any group + names reported by the transport layer are ignored by the + server."; + } + + leaf denied-operations { + type yang:zero-based-counter32; + config false; + mandatory true; + description + "Number of times since the server last restarted that a + protocol operation request was denied."; + } + + leaf denied-data-writes { + type yang:zero-based-counter32; + config false; + mandatory true; + description + "Number of times since the server last restarted that a + protocol operation request to alter + a configuration datastore was denied."; + } + + leaf denied-notifications { + type yang:zero-based-counter32; + config false; + mandatory true; + description + "Number of times since the server last restarted that + a notification was dropped for a subscription because + access to the event type was denied."; + } + + container groups { + description + "NETCONF access control groups."; + + list group { + key name; + + description + "One NACM group entry. This list will only contain + configured entries, not any entries learned from + any transport protocols."; + + leaf name { + type group-name-type; + description + "Group name associated with this entry."; + } + + leaf-list user-name { + type user-name-type; + description + "Each entry identifies the username of + a member of the group associated with + this entry."; + } + } + } + + list rule-list { + key name; + ordered-by user; + description + "An ordered collection of access control rules."; + + leaf name { + type string { + length "1..max"; + } + description + "Arbitrary name assigned to the rule-list."; + } + leaf-list group { + type union { + type matchall-string-type; + type group-name-type; + } + description + "List of administrative groups that will be + assigned the associated access rights + defined by the 'rule' list. + + The string '*' indicates that all groups apply to the + entry."; + } + + list rule { + key name; + ordered-by user; + description + "One access control rule. + + Rules are processed in user-defined order until a match is + found. A rule matches if 'module-name', 'rule-type', and + 'access-operations' match the request. If a rule + matches, the 'action' leaf determines whether or not + access is granted."; + + leaf name { + type string { + length "1..max"; + } + description + "Arbitrary name assigned to the rule."; + } + + leaf module-name { + type union { + type matchall-string-type; + type string; + } + default "*"; + description + "Name of the module associated with this rule. + + This leaf matches if it has the value '*' or if the + object being accessed is defined in the module with the + specified module name."; + } + choice rule-type { + description + "This choice matches if all leafs present in the rule + match the request. If no leafs are present, the + choice matches all requests."; + case protocol-operation { + leaf rpc-name { + type union { + type matchall-string-type; + type string; + } + description + "This leaf matches if it has the value '*' or if + its value equals the requested protocol operation + name."; + } + } + case notification { + leaf notification-name { + type union { + type matchall-string-type; + type string; + } + description + "This leaf matches if it has the value '*' or if its + value equals the requested notification name."; + } + } + case data-node { + leaf path { + type node-instance-identifier; + mandatory true; + description + "Data node instance-identifier associated with the + data node, action, or notification controlled by + this rule. + + Configuration data or state data + instance-identifiers start with a top-level + data node. A complete instance-identifier is + required for this type of path value. + + The special value '/' refers to all possible + datastore contents."; + } + } + } + + leaf access-operations { + type union { + type matchall-string-type; + type access-operations-type; + } + default "*"; + description + "Access operations associated with this rule. + + This leaf matches if it has the value '*' or if the + bit corresponding to the requested operation is set."; + } + + leaf action { + type action-type; + mandatory true; + description + "The access control action associated with the + rule. If a rule has been determined to match a + particular request, then this object is used + to determine whether to permit or deny the + request."; + } + + leaf comment { + type string; + description + "A textual description of the access rule."; + } + } + } + } +} diff --git a/src/nbi/service/ietf_network/yang/ietf-yang-types@2013-07-15.yang b/src/nbi/service/ietf_l2vpn/yang/ietf-yang-types@2013-07-15.yang similarity index 100% rename from src/nbi/service/ietf_network/yang/ietf-yang-types@2013-07-15.yang rename to src/nbi/service/ietf_l2vpn/yang/ietf-yang-types@2013-07-15.yang diff --git a/src/nbi/service/ietf_l2vpn/yang/ietf_l2vpn_tree.txt b/src/nbi/service/ietf_l2vpn/yang/ietf_l2vpn_tree.txt new file mode 100644 index 0000000000000000000000000000000000000000..393ed7a36a943638c6bc66127a3a5b4f21fe271e --- /dev/null +++ b/src/nbi/service/ietf_l2vpn/yang/ietf_l2vpn_tree.txt @@ -0,0 +1,383 @@ +module: ietf-l2vpn-svc + +--rw l2vpn-svc + +--rw vpn-profiles + | +--rw valid-provider-identifiers + | +--rw cloud-identifier* string {cloud-access}? + | +--rw qos-profile-identifier* string + | +--rw bfd-profile-identifier* string + | +--rw remote-carrier-identifier* string + +--rw vpn-services + | +--rw vpn-service* [vpn-id] + | +--rw vpn-id svc-id + | +--rw vpn-svc-type? identityref + | +--rw customer-name? string + | +--rw svc-topo? identityref + | +--rw cloud-accesses {cloud-access}? + | | +--rw cloud-access* [cloud-identifier] + | | +--rw cloud-identifier -> /l2vpn-svc/vpn-profiles/valid-provider-identifiers/cloud-identifier + | | +--rw (list-flavor)? + | | +--:(permit-any) + | | | +--rw permit-any? empty + | | +--:(deny-any-except) + | | | +--rw permit-site* -> /l2vpn-svc/sites/site/site-id + | | +--:(permit-any-except) + | | +--rw deny-site* -> /l2vpn-svc/sites/site/site-id + | +--rw frame-delivery {bum}? + | | +--rw customer-tree-flavors + | | | +--rw tree-flavor* identityref + | | +--rw bum-deliveries + | | | +--rw bum-delivery* [frame-type] + | | | +--rw frame-type identityref + | | | +--rw delivery-mode? identityref + | | +--rw multicast-gp-port-mapping identityref + | +--rw extranet-vpns {extranet-vpn}? + | | +--rw extranet-vpn* [vpn-id] + | | +--rw vpn-id svc-id + | | +--rw local-sites-role? identityref + | +--rw ce-vlan-preservation boolean + | +--rw ce-vlan-cos-preservation boolean + | +--rw carrierscarrier? boolean {carrierscarrier}? + +--rw sites + +--rw site* [site-id] + +--rw site-id string + +--rw site-vpn-flavor? identityref + +--rw devices + | +--rw device* [device-id] + | +--rw device-id string + | +--rw location -> ../../../locations/location/location-id + | +--rw management + | +--rw transport? identityref + | +--rw address? inet:ip-address + +--rw management + | +--rw type identityref + +--rw locations + | +--rw location* [location-id] + | +--rw location-id string + | +--rw address? string + | +--rw postal-code? string + | +--rw state? string + | +--rw city? string + | +--rw country-code? string + +--rw site-diversity {site-diversity}? + | +--rw groups + | +--rw group* [group-id] + | +--rw group-id string + +--rw vpn-policies + | +--rw vpn-policy* [vpn-policy-id] + | +--rw vpn-policy-id string + | +--rw entries* [id] + | +--rw id string + | +--rw filters + | | +--rw filter* [type] + | | +--rw type identityref + | | +--rw lan-tag* uint32 {lan-tag}? + | +--rw vpn* [vpn-id] + | +--rw vpn-id -> /l2vpn-svc/vpn-services/vpn-service/vpn-id + | +--rw site-role? identityref + +--rw service + | +--rw qos {qos}? + | | +--rw qos-classification-policy + | | | +--rw rule* [id] + | | | +--rw id string + | | | +--rw (match-type)? + | | | | +--:(match-flow) + | | | | | +--rw match-flow + | | | | | +--rw dscp? inet:dscp + | | | | | +--rw dot1q? uint16 + | | | | | +--rw pcp? uint8 + | | | | | +--rw src-mac? yang:mac-address + | | | | | +--rw dst-mac? yang:mac-address + | | | | | +--rw color-type? identityref + | | | | | +--rw target-sites* svc-id {target-sites}? + | | | | | +--rw any? empty + | | | | | +--rw vpn-id? svc-id + | | | | +--:(match-application) + | | | | +--rw match-application? identityref + | | | +--rw target-class-id? string + | | +--rw qos-profile + | | +--rw (qos-profile)? + | | +--:(standard) + | | | +--rw profile? -> /l2vpn-svc/vpn-profiles/valid-provider-identifiers/qos-profile-identifier + | | +--:(custom) + | | +--rw classes {qos-custom}? + | | +--rw class* [class-id] + | | +--rw class-id string + | | +--rw direction? identityref + | | +--rw policing? identityref + | | +--rw byte-offset? uint16 + | | +--rw frame-delay + | | | +--rw (flavor)? + | | | +--:(lowest) + | | | | +--rw use-lowest-latency? empty + | | | +--:(boundary) + | | | +--rw delay-bound? uint16 + | | +--rw frame-jitter + | | | +--rw (flavor)? + | | | +--:(lowest) + | | | | +--rw use-lowest-jitter? empty + | | | +--:(boundary) + | | | +--rw delay-bound? uint32 + | | +--rw frame-loss + | | | +--rw rate? decimal64 + | | +--rw bandwidth + | | +--rw guaranteed-bw-percent decimal64 + | | +--rw end-to-end? empty + | +--rw carrierscarrier {carrierscarrier}? + | +--rw signaling-type? identityref + +--rw broadcast-unknown-unicast-multicast {bum}? + | +--rw multicast-site-type? enumeration + | +--rw multicast-gp-address-mapping* [id] + | | +--rw id uint16 + | | +--rw vlan-id uint16 + | | +--rw mac-gp-address yang:mac-address + | | +--rw port-lag-number? uint32 + | +--rw bum-overall-rate? uint64 + | +--rw bum-rate-per-type* [type] + | +--rw type identityref + | +--rw rate? uint64 + +--rw mac-loop-prevention {mac-loop-prevention}? + | +--rw protection-type? identityref + | +--rw frequency? uint32 + | +--rw retry-timer? uint32 + +--rw access-control-list {acl}? + | +--rw mac* [mac-address] + | +--rw mac-address yang:mac-address + +--ro actual-site-start? yang:date-and-time + +--ro actual-site-stop? yang:date-and-time + +--rw bundling-type? identityref + +--rw default-ce-vlan-id uint32 + +--rw site-network-accesses + +--rw site-network-access* [network-access-id] + +--rw network-access-id string + +--rw remote-carrier-name? -> /l2vpn-svc/vpn-profiles/valid-provider-identifiers/remote-carrier-identifier + +--rw type? identityref + +--rw (location-flavor) + | +--:(location) + | | +--rw location-reference? -> ../../../locations/location/location-id + | +--:(device) + | +--rw device-reference? -> ../../../devices/device/device-id + +--rw access-diversity {site-diversity}? + | +--rw groups + | | +--rw group* [group-id] + | | +--rw group-id string + | +--rw constraints + | +--rw constraint* [constraint-type] + | +--rw constraint-type identityref + | +--rw target + | +--rw (target-flavor)? + | +--:(id) + | | +--rw group* [group-id] + | | +--rw group-id string + | +--:(all-accesses) + | | +--rw all-other-accesses? empty + | +--:(all-groups) + | +--rw all-other-groups? empty + +--rw bearer + | +--rw requested-type {requested-type}? + | | +--rw type? string + | | +--rw strict? boolean + | +--rw always-on? boolean {always-on}? + | +--rw bearer-reference? string {bearer-reference}? + +--rw connection + | +--rw encapsulation-type? identityref + | +--rw eth-inf-type? identityref + | +--rw tagged-interface + | | +--rw type? identityref + | | +--rw dot1q-vlan-tagged {dot1q}? + | | | +--rw tg-type? identityref + | | | +--rw cvlan-id uint16 + | | +--rw priority-tagged + | | | +--rw tag-type? identityref + | | +--rw qinq {qinq}? + | | | +--rw tag-type? identityref + | | | +--rw svlan-id uint16 + | | | +--rw cvlan-id uint16 + | | +--rw qinany {qinany}? + | | | +--rw tag-type? identityref + | | | +--rw svlan-id uint16 + | | +--rw vxlan {vxlan}? + | | +--rw vni-id uint32 + | | +--rw peer-mode? identityref + | | +--rw peer-list* [peer-ip] + | | +--rw peer-ip inet:ip-address + | +--rw untagged-interface + | | +--rw speed? uint32 + | | +--rw mode? neg-mode + | | +--rw phy-mtu? uint32 + | | +--rw lldp? boolean + | | +--rw oam-802.3ah-link {oam-3ah}? + | | | +--rw enabled? boolean + | | +--rw uni-loop-prevention? boolean + | +--rw lag-interfaces {lag-interface}? + | | +--rw lag-interface* [index] + | | +--rw index string + | | +--rw lacp {lacp}? + | | +--rw enabled? boolean + | | +--rw mode? neg-mode + | | +--rw speed? uint32 + | | +--rw mini-link-num? uint32 + | | +--rw system-priority? uint16 + | | +--rw micro-bfd {micro-bfd}? + | | | +--rw enabled? enumeration + | | | +--rw interval? uint32 + | | | +--rw hold-timer? uint32 + | | +--rw bfd {bfd}? + | | | +--rw enabled? boolean + | | | +--rw (holdtime)? + | | | +--:(profile) + | | | | +--rw profile-name? -> /l2vpn-svc/vpn-profiles/valid-provider-identifiers/bfd-profile-identifier + | | | +--:(fixed) + | | | +--rw fixed-value? uint32 + | | +--rw member-links + | | | +--rw member-link* [name] + | | | +--rw name string + | | | +--rw speed? uint32 + | | | +--rw mode? neg-mode + | | | +--rw link-mtu? uint32 + | | | +--rw oam-802.3ah-link {oam-3ah}? + | | | +--rw enabled? boolean + | | +--rw flow-control? boolean + | | +--rw lldp? boolean + | +--rw cvlan-id-to-svc-map* [svc-id] + | | +--rw svc-id -> /l2vpn-svc/vpn-services/vpn-service/vpn-id + | | +--rw cvlan-id* [vid] + | | +--rw vid uint16 + | +--rw l2cp-control {l2cp-control}? + | | +--rw stp-rstp-mstp? control-mode + | | +--rw pause? control-mode + | | +--rw lacp-lamp? control-mode + | | +--rw link-oam? control-mode + | | +--rw esmc? control-mode + | | +--rw l2cp-802.1x? control-mode + | | +--rw e-lmi? control-mode + | | +--rw lldp? boolean + | | +--rw ptp-peer-delay? control-mode + | | +--rw garp-mrp? control-mode + | +--rw oam {ethernet-oam}? + | +--rw md-name string + | +--rw md-level uint16 + | +--rw cfm-8021-ag* [maid] {cfm}? + | | +--rw maid string + | | +--rw mep-id? uint32 + | | +--rw mep-level? uint32 + | | +--rw mep-up-down? enumeration + | | +--rw remote-mep-id? uint32 + | | +--rw cos-for-cfm-pdus? uint32 + | | +--rw ccm-interval? uint32 + | | +--rw ccm-holdtime? uint32 + | | +--rw alarm-priority-defect? identityref + | | +--rw ccm-p-bits-pri? ccm-priority-type + | +--rw y-1731* [maid] {y-1731}? + | +--rw maid string + | +--rw mep-id? uint32 + | +--rw type? identityref + | +--rw remote-mep-id? uint32 + | +--rw message-period? uint32 + | +--rw measurement-interval? uint32 + | +--rw cos? uint32 + | +--rw loss-measurement? boolean + | +--rw synthetic-loss-measurement? boolean + | +--rw delay-measurement + | | +--rw enable-dm? boolean + | | +--rw two-way? boolean + | +--rw frame-size? uint32 + | +--rw session-type? enumeration + +--rw availability + | +--rw access-priority? uint32 + | +--rw (redundancy-mode)? + | +--:(single-active) + | | +--rw single-active? empty + | +--:(all-active) + | +--rw all-active? empty + +--rw vpn-attachment + | +--rw (attachment-flavor) + | +--:(vpn-id) + | | +--rw vpn-id? -> /l2vpn-svc/vpn-services/vpn-service/vpn-id + | | +--rw site-role? identityref + | +--:(vpn-policy-id) + | +--rw vpn-policy-id? -> ../../../../vpn-policies/vpn-policy/vpn-policy-id + +--rw service + | +--rw svc-bandwidth {input-bw}? + | | +--rw bandwidth* [direction type] + | | +--rw direction identityref + | | +--rw type identityref + | | +--rw cos-id? uint8 + | | +--rw vpn-id? svc-id + | | +--rw cir uint64 + | | +--rw cbs uint64 + | | +--rw eir? uint64 + | | +--rw ebs? uint64 + | | +--rw pir? uint64 + | | +--rw pbs? uint64 + | +--rw svc-mtu uint16 + | +--rw qos {qos}? + | | +--rw qos-classification-policy + | | | +--rw rule* [id] + | | | +--rw id string + | | | +--rw (match-type)? + | | | | +--:(match-flow) + | | | | | +--rw match-flow + | | | | | +--rw dscp? inet:dscp + | | | | | +--rw dot1q? uint16 + | | | | | +--rw pcp? uint8 + | | | | | +--rw src-mac? yang:mac-address + | | | | | +--rw dst-mac? yang:mac-address + | | | | | +--rw color-type? identityref + | | | | | +--rw target-sites* svc-id {target-sites}? + | | | | | +--rw any? empty + | | | | | +--rw vpn-id? svc-id + | | | | +--:(match-application) + | | | | +--rw match-application? identityref + | | | +--rw target-class-id? string + | | +--rw qos-profile + | | +--rw (qos-profile)? + | | +--:(standard) + | | | +--rw profile? -> /l2vpn-svc/vpn-profiles/valid-provider-identifiers/qos-profile-identifier + | | +--:(custom) + | | +--rw classes {qos-custom}? + | | +--rw class* [class-id] + | | +--rw class-id string + | | +--rw direction? identityref + | | +--rw policing? identityref + | | +--rw byte-offset? uint16 + | | +--rw frame-delay + | | | +--rw (flavor)? + | | | +--:(lowest) + | | | | +--rw use-lowest-latency? empty + | | | +--:(boundary) + | | | +--rw delay-bound? uint16 + | | +--rw frame-jitter + | | | +--rw (flavor)? + | | | +--:(lowest) + | | | | +--rw use-lowest-jitter? empty + | | | +--:(boundary) + | | | +--rw delay-bound? uint32 + | | +--rw frame-loss + | | | +--rw rate? decimal64 + | | +--rw bandwidth + | | +--rw guaranteed-bw-percent decimal64 + | | +--rw end-to-end? empty + | +--rw carrierscarrier {carrierscarrier}? + | +--rw signaling-type? identityref + +--rw broadcast-unknown-unicast-multicast {bum}? + | +--rw multicast-site-type? enumeration + | +--rw multicast-gp-address-mapping* [id] + | | +--rw id uint16 + | | +--rw vlan-id uint16 + | | +--rw mac-gp-address yang:mac-address + | | +--rw port-lag-number? uint32 + | +--rw bum-overall-rate? uint64 + | +--rw bum-rate-per-type* [type] + | +--rw type identityref + | +--rw rate? uint64 + +--rw mac-loop-prevention {mac-loop-prevention}? + | +--rw protection-type? identityref + | +--rw frequency? uint32 + | +--rw retry-timer? uint32 + +--rw access-control-list {acl}? + | +--rw mac* [mac-address] + | +--rw mac-address yang:mac-address + +--rw mac-addr-limit {mac-addr-limit}? + +--rw limit-number? uint16 + +--rw time-interval? uint32 + +--rw action? identityref diff --git a/src/nbi/service/ietf_l3vpn/L3VPN_Service.py b/src/nbi/service/ietf_l3vpn/L3VPN_Service.py index 610fba692ac5aefc6b96fc6737eae3c8c63973c4..659d8c7f59a7eb865058d5d99c184ddd375f344e 100644 --- a/src/nbi/service/ietf_l3vpn/L3VPN_Service.py +++ b/src/nbi/service/ietf_l3vpn/L3VPN_Service.py @@ -16,7 +16,7 @@ import logging from flask import request from flask.json import jsonify from flask_restful import Resource -from common.proto.context_pb2 import ServiceStatusEnum +from common.proto.context_pb2 import ServiceStatusEnum, ServiceTypeEnum from common.tools.context_queries.Service import get_service_by_uuid from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient @@ -24,7 +24,7 @@ from typing import Dict, List from werkzeug.exceptions import UnsupportedMediaType from nbi.service._tools.Authentication import HTTP_AUTH from nbi.service._tools.HttpStatusCodes import ( - HTTP_GATEWAYTIMEOUT, HTTP_NOCONTENT, HTTP_OK, HTTP_SERVERERROR, HTTP_CREATED + HTTP_GATEWAYTIMEOUT, HTTP_NOCONTENT, HTTP_OK, HTTP_SERVERERROR ) from .Handlers import update_vpn from .YangValidator import YangValidator @@ -32,7 +32,7 @@ from .YangValidator import YangValidator LOGGER = logging.getLogger(__name__) class L3VPN_Service(Resource): - # @HTTP_AUTH.login_required + @HTTP_AUTH.login_required def get(self, vpn_id : str): LOGGER.debug('VPN_Id: {:s}'.format(str(vpn_id))) LOGGER.debug('Request: {:s}'.format(str(request))) @@ -43,6 +43,9 @@ class L3VPN_Service(Resource): target = get_service_by_uuid(context_client, vpn_id, rw_copy=True) if target is None: raise Exception('VPN({:s}) not found in database'.format(str(vpn_id))) + + if target.service_type != ServiceTypeEnum.SERVICETYPE_L3NM: + raise Exception('VPN({:s}) is not L3VPN'.format(str(vpn_id))) service_ids = {target.service_id.service_uuid.uuid, target.name} # pylint: disable=no-member if vpn_id not in service_ids: @@ -58,7 +61,7 @@ class L3VPN_Service(Resource): response.status_code = HTTP_SERVERERROR return response - # @HTTP_AUTH.login_required + @HTTP_AUTH.login_required def delete(self, vpn_id : str): LOGGER.debug('VPN_Id: {:s}'.format(str(vpn_id))) LOGGER.debug('Request: {:s}'.format(str(request))) @@ -69,6 +72,8 @@ class L3VPN_Service(Resource): target = get_service_by_uuid(context_client, vpn_id) if target is None: LOGGER.warning('VPN({:s}) not found in database. Nothing done.'.format(str(vpn_id))) + elif target.service_type != ServiceTypeEnum.SERVICETYPE_L3NM: + raise Exception('VPN({:s}) is not L3VPN'.format(str(vpn_id))) else: service_ids = {target.service_id.service_uuid.uuid, target.name} # pylint: disable=no-member if vpn_id not in service_ids: @@ -102,7 +107,7 @@ class L3VPN_Service(Resource): errors.append('Unexpected request format: {:s}'.format(str(request_data))) response = jsonify(errors) - response.status_code = HTTP_CREATED if len(errors) == 0 else HTTP_SERVERERROR + response.status_code = HTTP_NOCONTENT if len(errors) == 0 else HTTP_SERVERERROR return response def _update_l3vpn(self, request_data: Dict) -> List[Dict]: diff --git a/src/nbi/service/ietf_l3vpn/L3VPN_Services.py b/src/nbi/service/ietf_l3vpn/L3VPN_Services.py index 2396ae738febc635523a29726f5219fb91d6cadf..3b3426f20b37146bdbc734beefb6b7fb2f41ef7e 100644 --- a/src/nbi/service/ietf_l3vpn/L3VPN_Services.py +++ b/src/nbi/service/ietf_l3vpn/L3VPN_Services.py @@ -26,11 +26,11 @@ from .YangValidator import YangValidator LOGGER = logging.getLogger(__name__) class L3VPN_Services(Resource): - # @HTTP_AUTH.login_required + @HTTP_AUTH.login_required def get(self): return {} - # @HTTP_AUTH.login_required + @HTTP_AUTH.login_required def post(self): if not request.is_json: raise UnsupportedMediaType('JSON payload is required') request_data : Dict = request.json @@ -58,7 +58,7 @@ class L3VPN_Services(Resource): # "vpn-service": [ errors.extend(self._process_l3vpn(request_data)) else: - errors.append('unexpected request: {:s}'.format(str(request_data))) + errors.append('Unexpected request: {:s}'.format(str(request_data))) response = jsonify(errors) response.status_code = HTTP_CREATED if len(errors) == 0 else HTTP_SERVERERROR diff --git a/src/nbi/service/ietf_network/yang/iana-routing-types@2017-12-04.yang b/src/nbi/service/ietf_network/yang/iana-routing-types@2017-12-04.yang deleted file mode 100644 index 250cba4b695e269116e181b46226bae7dab7604d..0000000000000000000000000000000000000000 --- a/src/nbi/service/ietf_network/yang/iana-routing-types@2017-12-04.yang +++ /dev/null @@ -1,473 +0,0 @@ - module iana-routing-types { - namespace "urn:ietf:params:xml:ns:yang:iana-routing-types"; - prefix iana-rt-types; - - organization - "IANA"; - contact - "Internet Assigned Numbers Authority - - Postal: ICANN - 12025 Waterfront Drive, Suite 300 - Los Angeles, CA 90094-2536 - United States of America - Tel: +1 310 301 5800 - "; - - description - "This module contains a collection of YANG data types - considered defined by IANA and used for routing - protocols. - - Copyright (c) 2017 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 8294; see - the RFC itself for full legal notices."; - - revision 2017-12-04 { - description "Initial revision."; - reference - "RFC 8294: Common YANG Data Types for the Routing Area. - Section 4."; - } - - /*** Collection of IANA types related to routing ***/ - /*** IANA Address Family enumeration ***/ - - typedef address-family { - type enumeration { - enum ipv4 { - value 1; - description - "IPv4 Address Family."; - } - - enum ipv6 { - value 2; - description - "IPv6 Address Family."; - } - - enum nsap { - value 3; - description - "OSI Network Service Access Point (NSAP) Address Family."; - } - - enum hdlc { - value 4; - description - "High-Level Data Link Control (HDLC) Address Family."; - } - - enum bbn1822 { - value 5; - description - "Bolt, Beranek, and Newman Report 1822 (BBN 1822) - Address Family."; - } - - enum ieee802 { - value 6; - description - "IEEE 802 Committee Address Family - (aka Media Access Control (MAC) address)."; - } - - enum e163 { - value 7; - description - "ITU-T E.163 Address Family."; - } - - enum e164 { - value 8; - description - "ITU-T E.164 (Switched Multimegabit Data Service (SMDS), - Frame Relay, ATM) Address Family."; - } - - enum f69 { - value 9; - description - "ITU-T F.69 (Telex) Address Family."; - } - - enum x121 { - value 10; - description - "ITU-T X.121 (X.25, Frame Relay) Address Family."; - } - - enum ipx { - value 11; - description - "Novell Internetwork Packet Exchange (IPX) - Address Family."; - } - - enum appletalk { - value 12; - description - "Apple AppleTalk Address Family."; - } - - enum decnet-iv { - value 13; - description - "Digital Equipment DECnet Phase IV Address Family."; - } - - enum vines { - value 14; - description - "Banyan Vines Address Family."; - } - - enum e164-nsap { - value 15; - description - "ITU-T E.164 with NSAP sub-address Address Family."; - } - - enum dns { - value 16; - description - "Domain Name System (DNS) Address Family."; - } - - enum distinguished-name { - value 17; - description - "Distinguished Name Address Family."; - } - - enum as-num { - value 18; - description - "Autonomous System (AS) Number Address Family."; - } - - enum xtp-v4 { - value 19; - description - "Xpress Transport Protocol (XTP) over IPv4 - Address Family."; - } - - enum xtp-v6 { - value 20; - description - "XTP over IPv6 Address Family."; - } - - enum xtp-native { - value 21; - description - "XTP native mode Address Family."; - } - - enum fc-port { - value 22; - description - "Fibre Channel (FC) World-Wide Port Name Address Family."; - } - - enum fc-node { - value 23; - description - "FC World-Wide Node Name Address Family."; - } - - enum gwid { - value 24; - description - "ATM Gateway Identifier (GWID) Number Address Family."; - } - - enum l2vpn { - value 25; - description - "Layer 2 VPN (L2VPN) Address Family."; - } - - enum mpls-tp-section-eid { - value 26; - description - "MPLS Transport Profile (MPLS-TP) Section Endpoint - Identifier Address Family."; - } - - enum mpls-tp-lsp-eid { - value 27; - description - "MPLS-TP Label Switched Path (LSP) Endpoint Identifier - Address Family."; - } - - enum mpls-tp-pwe-eid { - value 28; - description - "MPLS-TP Pseudowire Endpoint Identifier Address Family."; - } - - enum mt-v4 { - value 29; - description - "Multi-Topology IPv4 Address Family."; - } - - enum mt-v6 { - value 30; - description - "Multi-Topology IPv6 Address Family."; - } - - enum eigrp-common-sf { - value 16384; - description - "Enhanced Interior Gateway Routing Protocol (EIGRP) - Common Service Family Address Family."; - } - - enum eigrp-v4-sf { - value 16385; - description - "EIGRP IPv4 Service Family Address Family."; - } - - enum eigrp-v6-sf { - value 16386; - description - "EIGRP IPv6 Service Family Address Family."; - } - - enum lcaf { - value 16387; - description - "Locator/ID Separation Protocol (LISP) - Canonical Address Format (LCAF) Address Family."; - } - - enum bgp-ls { - value 16388; - description - "Border Gateway Protocol - Link State (BGP-LS) - Address Family."; - } - - enum mac-48 { - value 16389; - description - "IEEE 48-bit MAC Address Family."; - } - - enum mac-64 { - value 16390; - description - "IEEE 64-bit MAC Address Family."; - } - - enum trill-oui { - value 16391; - description - "Transparent Interconnection of Lots of Links (TRILL) - IEEE Organizationally Unique Identifier (OUI) - Address Family."; - } - - enum trill-mac-24 { - value 16392; - description - "TRILL final 3 octets of 48-bit MAC Address Family."; - } - - enum trill-mac-40 { - value 16393; - description - "TRILL final 5 octets of 64-bit MAC Address Family."; - } - - enum ipv6-64 { - value 16394; - description - "First 8 octets (64 bits) of IPv6 address - Address Family."; - } - - enum trill-rbridge-port-id { - value 16395; - description - "TRILL Routing Bridge (RBridge) Port ID Address Family."; - } - - enum trill-nickname { - value 16396; - description - "TRILL Nickname Address Family."; - } - } - - description - "Enumeration containing all the IANA-defined - Address Families."; - - } - - /*** Subsequent Address Family Identifiers (SAFIs) ***/ - /*** for multiprotocol BGP enumeration ***/ - - typedef bgp-safi { - type enumeration { - enum unicast-safi { - value 1; - description - "Unicast SAFI."; - } - - enum multicast-safi { - value 2; - description - "Multicast SAFI."; - } - - enum labeled-unicast-safi { - value 4; - description - "Labeled Unicast SAFI."; - } - - enum multicast-vpn-safi { - value 5; - description - "Multicast VPN SAFI."; - } - - enum pseudowire-safi { - value 6; - description - "Multi-segment Pseudowire VPN SAFI."; - } - - enum tunnel-encap-safi { - value 7; - description - "Tunnel Encap SAFI."; - } - - enum mcast-vpls-safi { - value 8; - description - "Multicast Virtual Private LAN Service (VPLS) SAFI."; - } - - enum tunnel-safi { - value 64; - description - "Tunnel SAFI."; - } - - enum vpls-safi { - value 65; - description - "VPLS SAFI."; - } - - enum mdt-safi { - value 66; - description - "Multicast Distribution Tree (MDT) SAFI."; - } - - enum v4-over-v6-safi { - value 67; - description - "IPv4 over IPv6 SAFI."; - } - - enum v6-over-v4-safi { - value 68; - description - "IPv6 over IPv4 SAFI."; - } - - enum l1-vpn-auto-discovery-safi { - value 69; - description - "Layer 1 VPN Auto-Discovery SAFI."; - } - - enum evpn-safi { - value 70; - description - "Ethernet VPN (EVPN) SAFI."; - } - - enum bgp-ls-safi { - value 71; - description - "BGP-LS SAFI."; - } - - enum bgp-ls-vpn-safi { - value 72; - description - "BGP-LS VPN SAFI."; - } - - enum sr-te-safi { - value 73; - description - "Segment Routing - Traffic Engineering (SR-TE) SAFI."; - } - - enum labeled-vpn-safi { - value 128; - description - "MPLS Labeled VPN SAFI."; - } - - enum multicast-mpls-vpn-safi { - value 129; - description - "Multicast for BGP/MPLS IP VPN SAFI."; - } - - enum route-target-safi { - value 132; - description - "Route Target SAFI."; - } - - enum ipv4-flow-spec-safi { - value 133; - description - "IPv4 Flow Specification SAFI."; - } - - enum vpnv4-flow-spec-safi { - value 134; - description - "IPv4 VPN Flow Specification SAFI."; - } - - enum vpn-auto-discovery-safi { - value 140; - description - "VPN Auto-Discovery SAFI."; - } - } - description - "Enumeration for BGP SAFI."; - reference - "RFC 4760: Multiprotocol Extensions for BGP-4."; - } - } diff --git a/src/nbi/service/ietf_network/yang/iana-routing-types@2025-02-18.yang b/src/nbi/service/ietf_network/yang/iana-routing-types@2025-02-18.yang new file mode 100644 index 0000000000000000000000000000000000000000..b7a9e21b3dfb8d442b04a0110e212804bd7c46ef --- /dev/null +++ b/src/nbi/service/ietf_network/yang/iana-routing-types@2025-02-18.yang @@ -0,0 +1,648 @@ +module iana-routing-types { + namespace "urn:ietf:params:xml:ns:yang:iana-routing-types"; + prefix iana-rt-types; + + organization + "IANA"; + contact + "Internet Assigned Numbers Authority + + Postal: ICANN + 12025 Waterfront Drive, Suite 300 + Los Angeles, CA 90094-2536 + United States of America + Tel: +1 310 301 5800 + "; + + description + "This module contains a collection of YANG data types + considered defined by IANA and used for routing + protocols. + + Copyright (c) 2017 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 8294; see + the RFC itself for full legal notices."; + + revision 2025-02-18 { + description "Modified SAFI value 73."; + } + + revision 2022-08-19 { + description "Added SAFI value 85."; + } + + revision 2022-04-13 { + description "Added SAFI values 83 and 84."; + } + + revision 2022-02-11 { + description "Added SAFI value 80."; + } + + revision 2021-10-19 { + description "Added Address Family Number value 16399."; + } + + revision 2021-09-08 { + description "Added SAFI value 79."; + } + + revision 2021-05-26 { + description "Added ‘OBSOLETE’ to description field for SAFI value 7."; + } + + revision 2021-05-18 { + description "Added Address Family Number value 31, + SAFI value 9."; + } + + revision 2021-03-23 { + description "Added SAFI value 78."; + } + + revision 2020-12-31 { + description "Non-backwards-compatible change of SAFI names + (SAFI values 133, 134)."; + reference + "RFC 8955: Dissemination of Flow Specification Rules."; + } + + revision 2020-11-19 { + description "Added SAFI value 77."; + } + + revision 2020-07-02 { + description "Added SAFI value 76."; + } + + revision 2020-05-12 { + description "Added Address Family Number value 16398, + SAFI value 75."; + } + + revision 2019-11-04 { + description "Added Address Family Number value 16397."; + } + + revision 2018-10-29 { + description "Added SAFI value 74."; + } + + revision 2017-12-04 { + description "Initial revision."; + reference + "RFC 8294: Common YANG Data Types for the Routing Area. + Section 4."; + } + + + + + /*** Collection of IANA types related to routing ***/ + /*** IANA Address Family enumeration ***/ + + typedef address-family { + type enumeration { + enum ipv4 { + value 1; + description + "IPv4 Address Family."; + } + + enum ipv6 { + value 2; + description + "IPv6 Address Family."; + } + + enum nsap { + value 3; + description + "OSI Network Service Access Point (NSAP) Address Family."; + } + + enum hdlc { + value 4; + description + "High-Level Data Link Control (HDLC) Address Family."; + } + + enum bbn1822 { + value 5; + description + "Bolt, Beranek, and Newman Report 1822 (BBN 1822) + Address Family."; + } + + enum ieee802 { + value 6; + description + "IEEE 802 Committee Address Family + (aka Media Access Control (MAC) address)."; + } + + enum e163 { + value 7; + description + "ITU-T E.163 Address Family."; + } + enum e164 { + value 8; + description + "ITU-T E.164 (Switched Multimegabit Data Service (SMDS), + Frame Relay, ATM) Address Family."; + } + + enum f69 { + value 9; + description + "ITU-T F.69 (Telex) Address Family."; + } + + enum x121 { + value 10; + description + "ITU-T X.121 (X.25, Frame Relay) Address Family."; + } + + enum ipx { + value 11; + description + "Novell Internetwork Packet Exchange (IPX) + Address Family."; + } + + enum appletalk { + value 12; + description + "Apple AppleTalk Address Family."; + } + + enum decnet-iv { + value 13; + description + "Digital Equipment DECnet Phase IV Address Family."; + } + + enum vines { + value 14; + description + "Banyan Vines Address Family."; + } + + + + + + enum e164-nsap { + value 15; + description + "ITU-T E.164 with NSAP sub-address Address Family."; + } + + enum dns { + value 16; + description + "Domain Name System (DNS) Address Family."; + } + + enum distinguished-name { + value 17; + description + "Distinguished Name Address Family."; + } + + enum as-num { + value 18; + description + "Autonomous System (AS) Number Address Family."; + } + + enum xtp-v4 { + value 19; + description + "Xpress Transport Protocol (XTP) over IPv4 + Address Family."; + } + + enum xtp-v6 { + value 20; + description + "XTP over IPv6 Address Family."; + } + + enum xtp-native { + value 21; + description + "XTP native mode Address Family."; + } + + enum fc-port { + value 22; + description + "Fibre Channel (FC) World-Wide Port Name Address Family."; + } + enum fc-node { + value 23; + description + "FC World-Wide Node Name Address Family."; + } + + enum gwid { + value 24; + description + "ATM Gateway Identifier (GWID) Number Address Family."; + } + + enum l2vpn { + value 25; + description + "Layer 2 VPN (L2VPN) Address Family."; + } + + enum mpls-tp-section-eid { + value 26; + description + "MPLS Transport Profile (MPLS-TP) Section Endpoint + Identifier Address Family."; + } + + enum mpls-tp-lsp-eid { + value 27; + description + "MPLS-TP Label Switched Path (LSP) Endpoint Identifier + Address Family."; + } + + enum mpls-tp-pwe-eid { + value 28; + description + "MPLS-TP Pseudowire Endpoint Identifier Address Family."; + } + + enum mt-v4 { + value 29; + description + "Multi-Topology IPv4 Address Family."; + } + + + + + + enum mt-v6 { + value 30; + description + "Multi-Topology IPv6 Address Family."; + } + + enum bgp-sfc { + value 31; + description + "BGP SFC Address Family."; + reference + "RFC 9015: BGP Control Plane for the Network Service Header in Service Function Chaining."; + } + + enum eigrp-common-sf { + value 16384; + description + "Enhanced Interior Gateway Routing Protocol (EIGRP) + Common Service Family Address Family."; + } + + enum eigrp-v4-sf { + value 16385; + description + "EIGRP IPv4 Service Family Address Family."; + } + + enum eigrp-v6-sf { + value 16386; + description + "EIGRP IPv6 Service Family Address Family."; + } + + enum lcaf { + value 16387; + description + "Locator/ID Separation Protocol (LISP) + Canonical Address Format (LCAF) Address Family."; + } + + enum bgp-ls { + value 16388; + description + "Border Gateway Protocol - Link State (BGP-LS) + Address Family."; + } + + enum mac-48 { + value 16389; + description + "IEEE 48-bit MAC Address Family."; + } + + + + + enum mac-64 { + value 16390; + description + "IEEE 64-bit MAC Address Family."; + } + + enum trill-oui { + value 16391; + description + "Transparent Interconnection of Lots of Links (TRILL) + IEEE Organizationally Unique Identifier (OUI) + Address Family."; + } + + enum trill-mac-24 { + value 16392; + description + "TRILL final 3 octets of 48-bit MAC Address Family."; + } + + enum trill-mac-40 { + value 16393; + description + "TRILL final 5 octets of 64-bit MAC Address Family."; + } + + enum ipv6-64 { + value 16394; + description + "First 8 octets (64 bits) of IPv6 address + Address Family."; + } + + enum trill-rbridge-port-id { + value 16395; + description + "TRILL Routing Bridge (RBridge) Port ID Address Family."; + } + + enum trill-nickname { + value 16396; + description + "TRILL Nickname Address Family."; + } + + enum universally-unique-identifier { + value 16397; + description + "Universally Unique Identifier (UUID)."; + } + + enum routing-policy { + value 16398; + description + "Routing Policy Address Family."; + } + + enum mpls-namespaces { + value 16399; + description + "MPLS Namespaces Address Family."; + } + + } + + + + description + "Enumeration containing all the IANA-defined + Address Families."; + + } + + /*** Subsequent Address Family Identifiers (SAFIs) ***/ + /*** for multiprotocol BGP enumeration ***/ + + typedef bgp-safi { + type enumeration { + enum unicast-safi { + value 1; + description + "Unicast SAFI."; + } + + enum multicast-safi { + value 2; + description + "Multicast SAFI."; + } + + enum labeled-unicast-safi { + value 4; + description + "Labeled Unicast SAFI."; + } + + enum multicast-vpn-safi { + value 5; + description + "Multicast VPN SAFI."; + } + + enum pseudowire-safi { + value 6; + description + "Multi-segment Pseudowire VPN SAFI."; + } + + enum tunnel-encap-safi { + value 7; + description + "Tunnel Encap SAFI (OBSOLETE)."; + } + + + enum mcast-vpls-safi { + value 8; + description + "Multicast Virtual Private LAN Service (VPLS) SAFI."; + } + + enum bgp-sfc-safi { + value 9; + description + "BGP SFC SAFI."; + reference + "RFC 9015: BGP Control Plane for the Network Service Header in Service Function Chaining."; + } + + enum tunnel-safi { + value 64; + description + "Tunnel SAFI."; + } + + enum vpls-safi { + value 65; + description + "VPLS SAFI."; + } + + enum mdt-safi { + value 66; + description + "Multicast Distribution Tree (MDT) SAFI."; + } + + enum v4-over-v6-safi { + value 67; + description + "IPv4 over IPv6 SAFI."; + } + + enum v6-over-v4-safi { + value 68; + description + "IPv6 over IPv4 SAFI."; + } + + enum l1-vpn-auto-discovery-safi { + value 69; + description + "Layer 1 VPN Auto-Discovery SAFI."; + } + + enum evpn-safi { + value 70; + description + "Ethernet VPN (EVPN) SAFI."; + } + + enum bgp-ls-safi { + value 71; + description + "BGP-LS SAFI."; + } + + enum bgp-ls-vpn-safi { + value 72; + description + "BGP-LS VPN SAFI."; + } + + enum sr-policy-safi { + value 73; + description + "SR Policy SAFI."; + } + + enum sd-wan-capabilities-safi { + value 74; + description + "SD-WAN Capabilities SAFI."; + } + + enum routing-policy-safi { + value 75; + description + "Routing Policy SAFI."; + } + + enum classful-transport-safi { + value 76; + description + "Classful-Transport SAFI."; + } + + enum tunneled-traffic-flowspec-safi { + value 77; + description + "Tunneled Traffic Flowspec SAFI."; + } + + enum mcast-tree-safi { + value 78; + description + "MCAST-TREE SAFI."; + } + + enum bgp-dps-safi { + value 79; + description + "BGP-DPS (Dynamic Path Selection) SAFI."; + } + + enum bgp-ls-spf-safi { + value 80; + description + "BGP-LS-SPF SAFI."; + } + + enum bgp-car-safi { + value 83; + description + "BGP CAR SAFI."; + } + + enum bgp-vpn-car-safi { + value 84; + description + "BGP VPN CAR SAFI."; + } + + enum bgp-mup-safi { + value 85; + description + "BGP-MUP SAFI."; + } + + enum labeled-vpn-safi { + value 128; + description + "MPLS Labeled VPN SAFI."; + } + + enum multicast-mpls-vpn-safi { + value 129; + description + "Multicast for BGP/MPLS IP VPN SAFI."; + } + + enum route-target-safi { + value 132; + description + "Route Target SAFI."; + } + + enum flow-spec-safi { + value 133; + description + "Dissemination of Flow Specification rules SAFI."; + } + + enum l3vpn-flow-spec-safi { + value 134; + description + "L3VPN Dissemination of Flow Specification rules SAFI."; + } + + enum vpn-auto-discovery-safi { + value 140; + description + "VPN Auto-Discovery SAFI."; + } + } + description + "Enumeration for BGP SAFI."; + reference + "RFC 4760: Multiprotocol Extensions for BGP-4."; + } +} diff --git a/src/nbi/service/ietf_network/yang/ietf-eth-tran-service@2023-10-23.yang b/src/nbi/service/ietf_network/yang/ietf-eth-tran-service@2023-10-23.yang deleted file mode 100644 index 222066adf0e1ece5f964fbabb170edf92d57b21e..0000000000000000000000000000000000000000 --- a/src/nbi/service/ietf_network/yang/ietf-eth-tran-service@2023-10-23.yang +++ /dev/null @@ -1,1004 +0,0 @@ - module ietf-eth-tran-service { - yang-version 1.1; - namespace "urn:ietf:params:xml:ns:yang:ietf-eth-tran-service"; - - prefix "ethtsvc"; - import ietf-yang-types { - prefix "yang"; - reference "RFC 6991 - Common YANG Data Types"; - } - - import ietf-network { - prefix "nw"; - reference "RFC8345 - A YANG Data Model for Network Topologies"; - } - - import ietf-network-topology { - prefix "nt"; - reference "RFC8345 - A YANG Data Model for Network Topologies"; - } - - import ietf-te-types { - prefix "te-types"; - reference "RFC 8776 - Traffic Engineering Common YANG Types"; - } - - import ietf-eth-tran-types { - prefix "etht-types"; - reference "RFC XXXX - A YANG Data Model for Transport - Network Client Signals"; - } - - import ietf-routing-types { - prefix "rt-types"; - reference "RFC 8294 - Common YANG Data Types for the - Routing Area"; - - } - - import ietf-te { - prefix "te"; - reference "RFC YYYY - A YANG Data Model for Traffic - Engineering Tunnels and Interfaces"; - } - - organization - "Internet Engineering Task Force (IETF) CCAMP WG"; - contact - " - WG List: - - ID-draft editor: - Haomian Zheng (zhenghaomian@huawei.com); - Italo Busi (italo.busi@huawei.com); - Aihua Guo (aihuaguo.ietf@gmail.com); - Anton Snitser (antons@sedonasys.com);0 - Francesco Lazzeri (francesco.lazzeri@ericsson.com); - Yunbin Xu (xuyunbin@caict.ac.cn); - Yang Zhao (zhaoyangyjy@chinamobile.com); - Xufeng Liu (xufeng.liu.ietf@gmail.com); - Giuseppe Fioccola (giuseppe.fioccola@huawei.com); - Chaode Yu (yuchaode@huawei.com) - "; - - description - "This module defines a YANG data model for describing - the Ethernet services. The model fully conforms to the - Network Management Datastore Architecture (NMDA). - - Copyright (c) 2021 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 XXXX; see - the RFC itself for full legal notices."; - - revision 2023-10-23 { - description - "version -04 as an WG document"; - reference - "draft-ietf-ccamp-client-signal-yang"; - } - - /* - * Groupings - */ - - grouping vlan-classification { - description - "A grouping which represents classification - on an 802.1Q VLAN tag."; - - leaf tag-type { - type etht-types:eth-tag-classify; - description - "The tag type used for VLAN classification."; - } - choice individual-bundling-vlan { - description - "VLAN based classification can be individual - or bundling."; - - case individual-vlan { - leaf vlan-value { - type etht-types:vlanid; - description - "VLAN ID value."; - } - } - - case vlan-bundling { - leaf vlan-range { - type etht-types:vid-range-type; - description - "List of VLAN ID values."; - } - } - } - } - - grouping vlan-write { - description - "A grouping which represents push/pop operations - of an 802.1Q VLAN tag."; - - leaf tag-type { - type etht-types:eth-tag-type; - description - "The VLAN tag type to push/swap."; - } - leaf vlan-value { - type etht-types:vlanid; - description - "The VLAN ID value to push/swap."; - } - /* - * To be added: this attribute is used when: - * a) the ETH service has only one CoS (as in current version) - * b) as a default when a mapping between a given CoS value - * and the PCP value is not defined (in future versions) - */ - leaf default-pcp { - type uint8 { - range "0..7"; - } - description - "The default Priority Code Point (PCP) value to push/swap"; - } - } - - grouping vlan-operations { - description - "A grouping which represents VLAN operations."; - - leaf pop-tags { - type uint8 { - range "1..2"; - } - description - "The number of VLAN tags to pop (or swap if used in - conjunction with push-tags)"; - } - container push-tags { - description - "The VLAN tags to push (or swap if used in - conjunction with pop-tags)"; - - container outer-tag { - presence - "Indicates existence of the outermost VLAN tag to - push/swap"; - - description - "The outermost VLAN tag to push/swap."; - - uses vlan-write; - } - container second-tag { - must - '../outer-tag/tag-type = "etht-types:s-vlan-tag-type" and ' + - 'tag-type = "etht-types:c-vlan-tag-type"' - { - - error-message - " - When pushing/swapping two tags, the outermost tag must - be specified and of S-VLAN type and the second - outermost tag must be of C-VLAN tag type. - "; - description - " - For IEEE 802.1Q interoperability, when pushing/swapping - two tags, it is required that the outermost tag exists - and is an S-VLAN, and the second outermost tag is a - C-VLAN. - "; - } - - presence - "Indicates existence of a second outermost VLAN tag to - push/swap"; - - description - "The second outermost VLAN tag to push/swap."; - uses vlan-write; - } - } - } - - grouping named-or-value-bandwidth-profile { - description - "A grouping to configure a bandwdith profile either by - referencing a named bandwidth profile or by - configuring the values of the bandwidth profile attributes."; - choice style { - description - "Whether the bandwidth profile is named or defined by value"; - - case named { - description - "Named bandwidth profile."; - leaf bandwidth-profile-name { - type leafref { - path "/ethtsvc:etht-svc/ethtsvc:globals/" - + "ethtsvc:named-bandwidth-profiles/" - + "ethtsvc:bandwidth-profile-name"; - } - description - "Name of the bandwidth profile."; - } - } - case value { - description - "Bandwidth profile configured by value."; - uses etht-types:etht-bandwidth-profiles; - } - } - } - - grouping bandwidth-profiles { - description - "A grouping which represent bandwidth profile configuration."; - - choice direction { - description - "Whether the bandwidth profiles are symmetrical or - asymmetrical"; - case symmetrical { - description - "The same bandwidth profile is used to describe both - the ingress and the egress bandwidth profile."; - container ingress-egress-bandwidth-profile { - description - "The bandwdith profile used in both directions."; - uses named-or-value-bandwidth-profile; - } - } - case asymmetrical { - description - "Ingress and egress bandwidth profiles can be specified."; - container ingress-bandwidth-profile { - description - "The bandwdith profile used in the ingress direction."; - uses named-or-value-bandwidth-profile; - } - container egress-bandwidth-profile { - description - "The bandwdith profile used in the egress direction."; - uses named-or-value-bandwidth-profile; - } - } - } - } - - grouping etht-svc-access-parameters { - description - "ETH services access parameters"; - - leaf access-node-id { - type te-types:te-node-id; - description - "The identifier of the access node in - the ETH TE topology."; - } - - leaf access-node-uri { - type nw:node-id; - description - "The identifier of the access node in the network."; - } - - leaf access-ltp-id { - type te-types:te-tp-id; - description - "The TE link termination point identifier, used - together with access-node-id to identify the - access LTP."; - } - - leaf access-ltp-uri { - type nt:tp-id; - description - "The link termination point identifier in network topology, - used together with access-node-uri to identify the - access LTP."; - } - - leaf access-role { - type identityref { - base etht-types:access-role; - } - description - "Indicate the role of access, e.g., working or protection. "; - } - - container pm-config { - uses pm-config-grouping; - description - "This grouping is used to set the threshold value for - performance monitoring. "; - } - - container state { - config false; - description - "The state is used to monitor the status of service. "; - leaf operational-state { - type identityref { - base te-types:tunnel-state-type; - } - description - "Indicating the operational state of client signal. "; - } - leaf provisioning-state { - type identityref { - base te-types:lsp-state-type; - } - description - "Indicating the provisional state of client signal, - especially when there is a change, i.e., revise, create. "; - } - } - - leaf performance { - type identityref { - base etht-types:performance; - } - config false; - description - "Performance Monitoring for the service. "; - } - - } - - grouping etht-svc-tunnel-parameters { - description - "ETH services tunnel parameters."; - choice technology { - description - "Service multiplexing is optional and flexible."; - - case native-ethernet { - /* - placeholder to support proprietary multiplexing - (for further discussion) - */ - list eth-tunnels { - key name; - description - "ETH Tunnel list in native Ethernet scenario."; - uses tunnels-grouping; - } - } - - case frame-base { - list otn-tunnels { - key name; - description - "OTN Tunnel list in Frame-based scenario."; - uses tunnels-grouping; - } - } - - case mpls-tp { - container pw { - description - "Pseudowire information for Ethernet over MPLS-TP."; - uses pw-segment-grouping; - } - } - } - - /* - * Open issue: can we constraints it to be used only with mp services? - */ - leaf src-split-horizon-group { - type string; - description - "Identify a split horizon group at the Tunnel source TTP"; - } - leaf dst-split-horizon-group { - type string; - description - "Identify a split horizon group at the Tunnel destination TTP"; - } - } - - grouping etht-svc-pm-threshold-config { - description - "Configuraiton parameters for Ethernet service PM thresholds."; - - leaf sending-rate-high { - type uint64; - description - "High threshold of packet sending rate in kbps."; - } - leaf sending-rate-low { - type uint64; - description - "Low threshold of packet sending rate in kbps."; - } - leaf receiving-rate-high { - type uint64; - description - "High threshold of packet receiving rate in kbps."; - } - leaf receiving-rate-low { - type uint64; - description - "Low threshold of packet receiving rate in kbps."; - } - } - - grouping etht-svc-pm-stats { - description - "Ethernet service PM statistics."; - - leaf sending-rate-too-high { - type uint32; - description - "Counter that indicates the number of times the - sending rate is above the high threshold"; - } - leaf sending-rate-too-low { - type uint32; - description - "Counter that indicates the number of times the - sending rate is below the low threshold"; - } - leaf receiving-rate-too-high { - type uint32; - description - "Counter that indicates the number of times the - receiving rate is above the high threshold"; - } - leaf receiving-rate-too-low { - type uint32; - description - "Counter that indicates the number of times the - receiving rate is below the low threshold"; - } - } - - grouping etht-svc-instance-config { - description - "Configuraiton parameters for Ethernet services."; - - leaf etht-svc-name { - type string; - description - "Name of the ETH service."; - } - - leaf etht-svc-title { - type string; - description - "The Identifier of the ETH service."; - } - - leaf user-label { - type string; - description - "Alias of the ETH service."; - } - - leaf etht-svc-descr { - type string; - description - "Description of the ETH service."; - } - - leaf etht-svc-customer { - type string; - description - "Customer of the ETH service."; - } - - leaf etht-svc-type { - type etht-types:service-type; - description - "Type of ETH service (p2p, mp2mp or rmp)."; - /* Add default as p2p */ - } - - leaf etht-svc-lifecycle { - type etht-types:lifecycle-status; - description - "Lifecycle state of ETH service."; - /* Add default as installed */ - } - uses te-types:te-topology-identifier; - - uses resilience-grouping; - list etht-svc-end-points { - key etht-svc-end-point-name; - description - "The logical end point for the ETH service. "; - uses etht-svc-end-point-grouping; - } - - container alarm-shreshold { - description "threshold configuration for the E2E client signal"; - uses alarm-shreshold-grouping; - } - - container underlay { - description - "The unterlay tunnel information that carrying the - ETH service. "; - uses etht-svc-tunnel-parameters; - } - - leaf admin-status { - type identityref { - base te-types:tunnel-admin-state-type; - } - default te-types:tunnel-admin-state-up; - description "ETH service administrative state."; - } - } - - grouping etht-svc-instance-state { - description - "State parameters for Ethernet services."; - - leaf operational-state { - type identityref { - base te-types:tunnel-state-type; - } - default te-types:tunnel-state-up; - description "ETH service operational state."; - } - leaf provisioning-state { - type identityref { - base te-types:lsp-state-type; - } - description "ETH service provisioning state."; - } - leaf creation-time { - type yang:date-and-time; - description - "Time of ETH service creation."; - } - leaf last-updated-time { - type yang:date-and-time; - description - "Time of ETH service last update."; - } - - leaf created-by { - type string; - description - "The client signal is created by whom, - can be a system or staff ID."; - } - leaf last-updated-by { - type string; - description - "The client signal is last updated by whom, - can be a system or staff ID."; - } - leaf owned-by { - type string; - description - "The client signal is last updated by whom, - can be a system ID."; - } - container pm-state { - description - "PM data of E2E Ethernet service"; - uses pm-state-grouping; - } - container error-info { - description "error messages of configuration"; - uses error-info-grouping; - } - } - - grouping pm-state-grouping { - leaf latency { - description - "latency value of the E2E Ethernet service"; - type uint32; - units microsecond; - } - } - - grouping error-info-grouping { - leaf error-code { - description "error code"; - type uint16; - } - - leaf error-description { - description "detail message of error"; - type string; - } - - leaf error-timestamp { - description "the date and time error is happened"; - type yang:date-and-time; - } - } - - grouping alarm-shreshold-grouping { - leaf latency-threshold { - description "a threshold for the E2E client signal service's - latency. Once the latency value exceed this threshold, an alarm - should be triggered."; - type uint32; - units microsecond; - } - } - - /* - * Data nodes - */ - - container etht-svc { - description - "ETH services."; - - container globals { - description - "Globals Ethernet configuration data container"; - list named-bandwidth-profiles { - key bandwidth-profile-name; - description - "List of named bandwidth profiles used by - Ethernet services."; - - leaf bandwidth-profile-name { - type string; - description - "Name of the bandwidth profile."; - } - uses etht-types:etht-bandwidth-profiles; - } - } - list etht-svc-instances { - key etht-svc-name; - description - "The list of p2p ETH service instances"; - - uses etht-svc-instance-config; - - container state { - config false; - description - "Ethernet Service states."; - - uses etht-svc-instance-state; - } - } - } - - grouping resilience-grouping { - description - "Grouping for resilience configuration. "; - container resilience { - description - "To configure the data plane protection parameters, - currently a placeholder only, future candidate attributes - include, Revert, WTR, Hold-off Timer, ..."; - uses te:protection-restoration-properties; - } - } - - grouping etht-svc-end-point-grouping { - description - "Grouping for the end point configuration."; - leaf etht-svc-end-point-name { - type string; - description - "The name of the logical end point of ETH service. "; - } - - leaf etht-svc-end-point-id { - type string; - description - "The identifier of the logical end point of ETH service."; - } - - leaf etht-svc-end-point-descr { - type string; - description - "The description of the logical end point of ETH service. "; - } - - leaf topology-role { - type identityref { - base etht-types:topology-role; - } - description - "Indicating the underlay topology role, - e.g., hub,spoke, any-to-any "; - } - - container resilience { - description - "Placeholder for resilience configuration, for future study. "; - } - - list etht-svc-access-points { - key access-point-id; - min-elements "1"; - /* - Open Issue: - Is it possible to limit the max-elements only for p2p services? - max-elements "2"; - */ - description - "List of the ETH trasport services access point instances."; - - leaf access-point-id { - type string; - description - "ID of the service access point instance"; - } - uses etht-svc-access-parameters; - } - - leaf service-classification-type { - type identityref { - base etht-types:service-classification-type; - } - description - "Service classification type."; - } - - choice service-classification { - description - "Access classification can be port-based or - VLAN based."; - case port-classification { - /* no additional information */ - } - - case vlan-classification { - container outer-tag { - presence "The outermost VLAN tag exists"; - description - "Classifies traffic using the outermost VLAN tag."; - - uses vlan-classification; - } - container second-tag { - must - '../outer-tag/tag-type = "etht-types:classify-s-vlan" and ' + - 'tag-type = "etht-types:classify-c-vlan"' - { - error-message - " - When matching two tags, the outermost tag must be - specified and of S-VLAN type and the second - outermost tag must be of C-VLAN tag type. - "; - description - " - For IEEE 802.1Q interoperability, when matching two - tags, it is required that the outermost tag exists - and is an S-VLAN, and the second outermost tag is a - C-VLAN. - "; - } - presence "The second outermost VLAN tag exists"; - - description - "Classifies traffic using the second outermost VLAN tag."; - - uses vlan-classification; - } - } - } - - /* - * Open issue: can we constraints it to be used only with mp services? - */ - leaf split-horizon-group { - type string; - description "Identify a split horizon group"; - } - uses bandwidth-profiles; - - container vlan-operations { - description - "Configuration of VLAN operations."; - choice direction { - description - "Whether the VLAN operations are symmetrical or - asymmetrical"; - case symmetrical { - container symmetrical-operation { - uses vlan-operations; - description - "Symmetrical operations. - Expressed in the ingress direction, but - the reverse operation is applied to egress traffic"; - } - } - case asymmetrical { - container asymmetrical-operation { - description "Asymmetrical operations"; - container ingress { - uses vlan-operations; - description "Ingress operations"; - } - container egress { - uses vlan-operations; - description "Egress operations"; - } - } - } - } - } - } - - grouping pm-config-grouping { - description - "Grouping used for Performance Monitoring Configuration. "; - leaf pm-enable { - type boolean; - description - "Whether to enable the performance monitoring."; - } - - leaf sending-rate-high { - type uint64; - description - "The upperbound of sending rate."; - } - - leaf sending-rate-low { - type uint64; - description - "The lowerbound of sending rate."; - } - - leaf receiving-rate-high { - type uint64; - description - "The upperbound of receiving rate."; - } - - leaf receiving-rate-low { - type uint64; - description - "The lowerbound of receiving rate."; - } - } - - grouping pw-segment-grouping { - description - "Grouping used for PW configuration. "; - leaf pw-id { - type string; - description - "The Identifier information of pseudowire. "; - } - - leaf pw-name { - type string; - description - "The name information of pseudowire."; - } - - leaf transmit-label { - type rt-types:mpls-label; - description - "Transmit label information in PW. "; - } - - leaf receive-label { - type rt-types:mpls-label; - description - "Receive label information in PW. "; - } - leaf encapsulation-type { - type identityref { - base etht-types:encapsulation-type; - } - description - "The encapsulation type, raw or tag. "; - } - - leaf oper-status { - type identityref { - base te-types:tunnel-state-type; - } - config false; - description - "The operational state of the PW segment. "; - } - - container ingress-bandwidth-profile { - description - "Bandwidth Profile for ingress. "; - uses pw-segment-named-or-value-bandwidth-profile; - } - - list pw-paths { - key path-id; - description - "A list of pw paths. "; - - leaf path-id { - type uint8; - description - "The identifier of pw paths. "; - - } - - list tp-tunnels { - key name; - description - "Names of TP Tunnel underlay"; - leaf name { - type string; - description - "Names of TP Tunnel underlay"; - } - } - } - - } - grouping pw-segment-named-or-value-bandwidth-profile { - description - "A grouping to configure a bandwdith profile either by - referencing a named bandwidth profile or by - configuring the values of the bandwidth profile attributes."; - choice style { - description - "Whether the bandwidth profile is named or defined by value"; - case named { - description - "Named bandwidth profile."; - leaf bandwidth-profile-name { - type leafref { - path "/ethtsvc:etht-svc/ethtsvc:globals/" - + "ethtsvc:named-bandwidth-profiles/" - + "ethtsvc:bandwidth-profile-name"; - } - description - "Name of the bandwidth profile."; - } - } - case value { - description - "Bandwidth profile configured by value."; - uses etht-types:pw-segement-bandwidth-profile-grouping; - } - } - } - - grouping tunnels-grouping { - description - "A group of tunnels. "; - leaf name { - type leafref { - path "/te:te/te:tunnels/te:tunnel/te:name"; - require-instance false; - } - description "Dependency tunnel name"; - } - leaf encoding { - type identityref { - base te-types:lsp-encoding-types; - } - description "LSP encoding type"; - reference "RFC3945"; - } - leaf switching-type { - type identityref { - base te-types:switching-capabilities; - } - description "LSP switching type"; - reference "RFC3945"; - } - } - } diff --git a/src/nbi/service/ietf_network/yang/ietf-eth-tran-service@2024-01-11.yang b/src/nbi/service/ietf_network/yang/ietf-eth-tran-service@2024-01-11.yang new file mode 100644 index 0000000000000000000000000000000000000000..d1207fd7ce805f86b9df479ac356c316a82c1055 --- /dev/null +++ b/src/nbi/service/ietf_network/yang/ietf-eth-tran-service@2024-01-11.yang @@ -0,0 +1,987 @@ +module ietf-eth-tran-service { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-eth-tran-service"; + prefix etht-svc; + + import ietf-yang-types { + prefix yang; + reference + "RFC 6991: Common YANG Data Types"; + } + + import ietf-routing-types { + prefix rt-types; + reference + "RFC 8294: Common YANG Data Types for the Routing Area"; + } + + import ietf-te-types { + prefix te-types; + reference "RFCYYYY: Traffic Engineering Common YANG Types"; + } + // RFC Editor: replace YYYY with the actual RFC number assigned + // to the RFC once draft-ietf-teas-rfc8776-update + // becomes an RFC, update date information and remove this note. + + import ietf-network { + prefix nw; + reference + "RFC8345: A YANG Data Model for Network Topologies"; + } + + import ietf-network-topology { + prefix "nt"; + reference + "RFC8345: A YANG Data Model for Network Topologies"; + } + + import ietf-te { + prefix "te"; + reference + "RFCKKKK: A YANG Data Model for Traffic Engineering Tunnels + and Interfaces"; + } + // RFC Editor: replace KKKK with the actual RFC number assigned + // to the RFC once draft-ietf-teas-yang-te + // becomes an RFC, update date information and remove this note. + + import ietf-eth-tran-types { + prefix etht-types; + reference + "RFCXXXX: A YANG Data Model for Transport Network Client + Signals"; + } + // RFC Editor: replace XXXX with the actual RFC number assigned + // to the RFC once this draft + // becomes an RFC, update date information and remove this note. + + organization + "Internet Engineering Task Force (IETF) CCAMP WG"; + contact + "WG Web: + WG List: + + Editor: Haomian Zheng + + + Editor: Aihua Guo + + + Editor: Italo Busi + + + Editor: Anton Snitser + + + Editor: Chaode Yu + "; + + description + "This module defines a YANG data model for describing + Ethernet transport network client services. + + The model fully conforms to the Network Management + Datastore Architecture (NMDA). + + Copyright (c) 2024 IETF Trust and the persons + identified as authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC XXXX; see + the RFC itself for full legal notices."; + + revision 2024-01-11 { + description + "Initial Version"; + reference + "RFC XXXX: A YANG Data Model for Transport Network Client + Signals"; + } + // RFC Editor: replace XXXX with the actual RFC number assigned + // to the RFC once this draft + // becomes an RFC, update date information and remove this note. + + /* + * Groupings + */ + + grouping vlan-classification { + description + "A grouping which represents classification + on an 802.1Q VLAN tag."; + + leaf tag-type { + type etht-types:eth-tag-classify; + description + "The tag type used for VLAN classification."; + } + choice individual-bundling-vlan { + description + "VLAN based classification can be individual + or bundling."; + + case individual-vlan { + leaf vlan-value { + type etht-types:vlanid; + description + "VLAN ID value."; + } + } + case vlan-bundling { + leaf vlan-range { + type etht-types:vid-range-type; + description + "List of VLAN ID values."; + } + } + } + } + + grouping vlan-write { + description + "A grouping which represents push/pop operations + of an 802.1Q VLAN tag."; + + leaf tag-type { + type etht-types:eth-tag-type; + description + "The VLAN tag type to push/swap."; + } + leaf vlan-value { + type etht-types:vlanid; + description + "The VLAN ID value to push/swap."; + } +/* + * To be added: this attribute is used when: + * a) the ETH service has only one CoS (as in current version) + * b) as a default when a mapping between a given CoS value + * and the PCP value is not defined (in future versions) + */ + leaf default-pcp { + type uint8 { + range "0..7"; + } + description + "The default Priority Code Point (PCP) value to push/swap"; + } + } + + grouping vlan-operations { + description + "A grouping which represents VLAN operations."; + + leaf pop-tags { + type uint8 { + range "1..2"; + } + description + "The number of VLAN tags to pop (or swap if used in + conjunction with push-tags)"; + } + container push-tags { + description + "The VLAN tags to push (or swap if used in + conjunction with pop-tags)"; + container outer-tag { + presence + "Indicates existence of the outermost VLAN tag to + push/swap"; + description + "The outermost VLAN tag to push/swap."; + uses vlan-write; + } + container second-tag { + must + '../outer-tag/tag-type = "etht-types:s-vlan-tag-type" and ' + + 'tag-type = "etht-types:c-vlan-tag-type"' + { + error-message + " + When pushing/swapping two tags, the outermost tag must + be specified and of S-VLAN type and the second + outermost tag must be of C-VLAN tag type. + "; + description + " + For IEEE 802.1Q interoperability, when pushing/swapping + two tags, it is required that the outermost tag exists + and is an S-VLAN, and the second outermost tag is a + C-VLAN. + "; + } + presence + "Indicates existence of a second outermost VLAN tag to + push/swap"; + description + "The second outermost VLAN tag to push/swap."; + uses vlan-write; + } + } + } + + grouping named-or-value-bandwidth-profile { + description + "A grouping to configure a bandwdith profile either by + referencing a named bandwidth profile or by + configuring the values of the bandwidth profile attributes."; + choice style { + description + "Whether the bandwidth profile is named or defined by value"; + case named { + description + "Named bandwidth profile."; + leaf bandwidth-profile-name { + type leafref { + path "/etht-svc:etht-svc/etht-svc:globals/" + + "etht-svc:named-bandwidth-profiles/" + + "etht-svc:bandwidth-profile-name"; + } + description + "Name of the bandwidth profile."; + } + } + case value { + description + "Bandwidth profile configured by value."; + uses etht-types:etht-bandwidth-profiles; + } + } + } + + grouping bandwidth-profiles { + description + "A grouping which represent bandwidth profile configuration."; + + choice direction { + description + "Whether the bandwidth profiles are symmetrical or + asymmetrical"; + case symmetrical { + description + "The same bandwidth profile is used to describe both + the ingress and the egress bandwidth profile."; + container ingress-egress-bandwidth-profile { + description + "The bandwdith profile used in both directions."; + uses named-or-value-bandwidth-profile; + } + } + case asymmetrical { + description + "Ingress and egress bandwidth profiles can be specified."; + container ingress-bandwidth-profile { + description + "The bandwdith profile used in the ingress direction."; + uses named-or-value-bandwidth-profile; + } + container egress-bandwidth-profile { + description + "The bandwdith profile used in the egress direction."; + uses named-or-value-bandwidth-profile; + } + } + } + } + + grouping etht-svc-access-parameters { + description + "ETH services access parameters"; + + leaf access-node-id { + type te-types:te-node-id; + description + "The identifier of the access node in + the ETH TE topology."; + } + leaf access-node-uri { + type nw:node-id; + description + "The identifier of the access node in the network."; + } + leaf access-ltp-id { + type te-types:te-tp-id; + description + "The TE link termination point identifier, used + together with access-node-id to identify the + access LTP."; + } + leaf access-ltp-uri { + type nt:tp-id; + description + "The link termination point identifier in network topology, + used together with access-node-uri to identify the + access LTP."; + } + leaf access-role { + type identityref { + base etht-types:access-role; + } + description + "Indicate the role of access, e.g., working or protection. "; + } + container pm-config { + uses pm-config-grouping; + description + "This grouping is used to set the threshold value for + performance monitoring. "; + } + container state { + config false; + description + "The state is used to monitor the status of service. "; + leaf operational-state { + type identityref { + base te-types:tunnel-state-type; + } + description + "Indicating the operational state of client signal. "; + } + leaf provisioning-state { + type identityref { + base te-types:lsp-state-type; + } + description + "Indicating the provisional state of client signal, + especially when there is a change, i.e., revise, create. "; + } + } + leaf performance { + type identityref { + base etht-types:performance; + } + config false; + description + "Performance Monitoring for the service. "; + } + } + + grouping etht-svc-tunnel-parameters { + description + "ETH services tunnel parameters."; + + choice technology { + description + "Service multiplexing is optional and flexible."; + case native-ethernet { + /* + placeholder to support proprietary multiplexing + (for further discussion) + */ + list eth-tunnels { + key name; + description + "ETH Tunnel list in native Ethernet scenario."; + uses tunnels-grouping; + } + } + case frame-base { + list otn-tunnels { + key name; + description + "OTN Tunnel list in Frame-based scenario."; + uses tunnels-grouping; + } + } + case mpls-tp { + container pw { + description + "Pseudowire information for Ethernet over MPLS-TP."; + uses pw-segment-grouping; + } + } + } + /* + * Open issue: + * can we constraints it to be used only with mp services? + */ + leaf src-split-horizon-group { + type string; + description + "Identify a split horizon group at the source Tunnel + Termination Point (TTP)."; + } + leaf dst-split-horizon-group { + type string; + description + "Identify a split horizon group at the destination Tunnel + Termination Point (TTP)."; + } + } + + grouping etht-svc-pm-threshold-config { + description + "Configuraiton parameters for Ethernet service PM thresholds."; + + leaf sending-rate-high { + type uint64; + description + "High threshold of packet sending rate in kbps."; + } + leaf sending-rate-low { + type uint64; + description + "Low threshold of packet sending rate in kbps."; + } + leaf receiving-rate-high { + type uint64; + description + "High threshold of packet receiving rate in kbps."; + } + leaf receiving-rate-low { + type uint64; + description + "Low threshold of packet receiving rate in kbps."; + } + } + + grouping etht-svc-pm-stats { + description + "Ethernet service PM statistics."; + + leaf sending-rate-too-high { + type uint32; + description + "Counter that indicates the number of times the + sending rate is above the high threshold"; + } + leaf sending-rate-too-low { + type uint32; + description + "Counter that indicates the number of times the + sending rate is below the low threshold"; + } + leaf receiving-rate-too-high { + type uint32; + description + "Counter that indicates the number of times the + receiving rate is above the high threshold"; + } + leaf receiving-rate-too-low { + type uint32; + description + "Counter that indicates the number of times the + receiving rate is below the low threshold"; + } + } + + grouping etht-svc-instance-config { + description + "Configuraiton parameters for Ethernet services."; + + leaf etht-svc-name { + type string; + description + "Name of the ETH service."; + } + leaf etht-svc-title { + type string; + description + "The Identifier of the ETH service."; + } + leaf user-label { + type string; + description + "Alias of the ETH service."; + } + leaf etht-svc-descr { + type string; + description + "Description of the ETH service."; + } + leaf etht-svc-customer { + type string; + description + "Customer of the ETH service."; + } + leaf etht-svc-type { + type etht-types:service-type; + description + "Type of ETH service (p2p, mp2mp or rmp)."; + /* Add default as p2p */ + } + leaf etht-svc-lifecycle { + type etht-types:lifecycle-status; + description + "Lifecycle state of ETH service."; + /* Add default as installed */ + } + uses te-types:te-topology-identifier; + uses resilience-grouping; + list etht-svc-end-points { + key etht-svc-end-point-name; + description + "The logical end point for the ETH service. "; + uses etht-svc-end-point-grouping; + } + container alarm-threshold { + description + "threshold configuration for the E2E client signal"; + uses alarm-threshold-grouping; + } + container underlay { + description + "The unterlay tunnel information that carrying the + ETH service. "; + uses etht-svc-tunnel-parameters; + } + leaf admin-status { + type identityref { + base te-types:tunnel-admin-state-type; + } + default te-types:tunnel-admin-state-up; + description "ETH service administrative state."; + } + } + + grouping etht-svc-instance-state { + description + "State parameters for Ethernet services."; + + leaf operational-state { + type identityref { + base te-types:tunnel-state-type; + } + default te-types:tunnel-state-up; + description + "ETH service operational state."; + } + leaf provisioning-state { + type identityref { + base te-types:lsp-state-type; + } + description + "ETH service provisioning state."; + } + leaf creation-time { + type yang:date-and-time; + description + "Time of ETH service creation."; + } + leaf last-updated-time { + type yang:date-and-time; + description + "Time of ETH service last update."; + } + leaf created-by { + type string; + description + "The client signal is created by whom, + can be a system or staff ID."; + } + leaf last-updated-by { + type string; + description + "The client signal is last updated by whom, + can be a system or staff ID."; + } + leaf owned-by { + type string; + description + "The client signal is last updated by whom, + can be a system ID."; + } + container pm-state { + description + "PM data of E2E Ethernet service"; + uses pm-state-grouping; + } + container error-info { + description "error messages of configuration"; + uses error-info-grouping; + } + } + + grouping pm-state-grouping { + description + "Performance Monitoring (PM) state attributes"; + leaf latency { + type uint32; + units microsecond; + description + "latency value of the E2E Ethernet service"; + } + } + + grouping error-info-grouping { + description + "Error information parameters"; + + leaf error-code { + type uint16; + description "error code"; + } + leaf error-description { + type string; + description "detail message of error"; + } + leaf error-timestamp { + type yang:date-and-time; + description "the date and time error is happened"; + } + } + + grouping alarm-threshold-grouping { + description + "Alarm threshold parameters."; + leaf latency-threshold { + type uint32; + units microsecond; + description + "a threshold for the E2E client signal service's + latency. Once the latency value exceed this threshold, + an alarm should be triggered."; + } + } + + grouping resilience-grouping { + description + "Grouping for resilience configuration. "; + container resilience { + description + "To configure the data plane protection parameters, + currently a placeholder only, future candidate attributes + include, Revert, WTR, Hold-off Timer, ..."; + uses te:protection-restoration-properties; + } + } + + grouping etht-svc-end-point-grouping { + description + "Grouping for the end point configuration."; + + leaf etht-svc-end-point-name { + type string; + description + "The name of the logical end point of ETH service. "; + } + leaf etht-svc-end-point-id { + type string; + description + "The identifier of the logical end point of ETH service."; + } + leaf etht-svc-end-point-descr { + type string; + description + "The description of the logical end point of ETH service. "; + } + leaf topology-role { + type identityref { + base etht-types:topology-role; + } + description + "Indicating the underlay topology role, + e.g., hub,spoke, any-to-any "; + } + container resilience { + description + "Placeholder for resilience configuration, for future + study."; + } + list etht-svc-access-points { + key access-point-id; + min-elements "1"; + /* + Open Issue: + Is it possible to limit the max-elements only for p2p + services? + max-elements "2"; + */ + description + "List of the ETH trasport services access point instances."; + leaf access-point-id { + type string; + description + "ID of the service access point instance"; + } + uses etht-svc-access-parameters; + } + leaf service-classification-type { + type identityref { + base etht-types:service-classification-type; + } + description + "Service classification type."; + } + choice service-classification { + description + "Access classification can be port-based or + VLAN based."; + case port-classification { + /* no additional information */ + } + case vlan-classification { + container outer-tag { + presence "The outermost VLAN tag exists"; + description + "Classifies traffic using the outermost VLAN tag."; + uses vlan-classification; + } + container second-tag { + must + '../outer-tag/tag-type = "etht-types:classify-s-vlan"' + + ' and tag-type = "etht-types:classify-c-vlan"' + { + error-message + " + When matching two tags, the outermost tag must be + specified and of S-VLAN type and the second + outermost tag must be of C-VLAN tag type. + "; + description + " + For IEEE 802.1Q interoperability, when matching two + tags, it is required that the outermost tag exists + and is an S-VLAN, and the second outermost tag is a + C-VLAN. + "; + } + presence "The second outermost VLAN tag exists"; + description + "Classifies traffic using the second outermost VLAN + tag."; + uses vlan-classification; + } + } + } + /* + * Open issue: + * can we constraints it to be used only with mp services? + */ + leaf split-horizon-group { + type string; + description "Identify a split horizon group"; + } + uses bandwidth-profiles; + container vlan-operations { + description + "Configuration of VLAN operations."; + choice direction { + description + "Whether the VLAN operations are symmetrical or + asymmetrical"; + case symmetrical { + container symmetrical-operation { + uses vlan-operations; + description + "Symmetrical operations. + Expressed in the ingress direction, but + the reverse operation is applied to egress traffic"; + } + } + case asymmetrical { + container asymmetrical-operation { + description "Asymmetrical operations"; + container ingress { + uses vlan-operations; + description "Ingress operations"; + } + container egress { + uses vlan-operations; + description "Egress operations"; + } + } + } + } + } + } + + grouping pm-config-grouping { + description + "Grouping used for Performance Monitoring Configuration. "; + + leaf pm-enable { + type boolean; + description + "Whether to enable the performance monitoring."; + } + leaf sending-rate-high { + type uint64; + description + "The upperbound of sending rate."; + } + leaf sending-rate-low { + type uint64; + description + "The lowerbound of sending rate."; + } + leaf receiving-rate-high { + type uint64; + description + "The upperbound of receiving rate."; + } + leaf receiving-rate-low { + type uint64; + description + "The lowerbound of receiving rate."; + } + } + + grouping pw-segment-grouping { + description + "Grouping used for PW configuration. "; + + leaf pw-id { + type string; + description + "The Identifier information of pseudowire. "; + } + leaf pw-name { + type string; + description + "The name information of pseudowire."; + } + leaf transmit-label { + type rt-types:mpls-label; + description + "Transmit label information in PW. "; + } + leaf receive-label { + type rt-types:mpls-label; + description + "Receive label information in PW. "; + } + leaf encapsulation-type { + type identityref { + base etht-types:encapsulation-type; + } + description + "The encapsulation type, raw or tag. "; + } + leaf oper-status { + type identityref { + base te-types:tunnel-state-type; + } + config false; + description + "The operational state of the PW segment. "; + } + container ingress-bandwidth-profile { + description + "Bandwidth Profile for ingress. "; + uses pw-segment-named-or-value-bandwidth-profile; + } + list pw-paths { + key path-id; + description + "A list of pw paths. "; + leaf path-id { + type uint8; + description + "The identifier of pw paths. "; + } + list tp-tunnels { + key name; + description + "Names of TP Tunnel underlay"; + leaf name { + type string; + description + "Names of TP Tunnel underlay"; + } + } + } + } + + grouping pw-segment-named-or-value-bandwidth-profile { + description + "A grouping to configure a bandwdith profile either by + referencing a named bandwidth profile or by + configuring the values of the bandwidth profile attributes."; + + choice style { + description + "Whether the bandwidth profile is named or defined by value"; + case named { + description + "Named bandwidth profile."; + leaf bandwidth-profile-name { + type leafref { + path "/etht-svc:etht-svc/etht-svc:globals/" + + "etht-svc:named-bandwidth-profiles/" + + "etht-svc:bandwidth-profile-name"; + } + description + "Name of the bandwidth profile."; + } + } + case value { + description + "Bandwidth profile configured by value."; + uses etht-types:pw-segement-bandwidth-profile-grouping; + } + } + } + + grouping tunnels-grouping { + description + "A group of tunnels. "; + leaf name { + type leafref { + path "/te:te/te:tunnels/te:tunnel/te:name"; + require-instance false; + } + description "Dependency tunnel name"; + } + leaf encoding { + type identityref { + base te-types:lsp-encoding-types; + } + description "LSP encoding type"; + reference "RFC3945"; + } + leaf switching-type { + type identityref { + base te-types:switching-capabilities; + } + description "LSP switching type"; + reference "RFC3945"; + } + } + + /* + * Data nodes + */ + + container etht-svc { + description + "ETH services."; + + container globals { + description + "Globals Ethernet configuration data container"; + list named-bandwidth-profiles { + key bandwidth-profile-name; + description + "List of named bandwidth profiles used by + Ethernet services."; + + leaf bandwidth-profile-name { + type string; + description + "Name of the bandwidth profile."; + } + uses etht-types:etht-bandwidth-profiles; + } + } + list etht-svc-instances { + key etht-svc-name; + description + "The list of p2p ETH service instances"; + + uses etht-svc-instance-config; + container state { + config false; + description + "Ethernet Service states."; + uses etht-svc-instance-state; + } + } + } +} diff --git a/src/nbi/service/ietf_network/yang/ietf-eth-tran-types@2023-10-23.yang b/src/nbi/service/ietf_network/yang/ietf-eth-tran-types@2023-10-23.yang deleted file mode 100644 index f46908b34f3cc30a0b19359c032a7cd8856b1b08..0000000000000000000000000000000000000000 --- a/src/nbi/service/ietf_network/yang/ietf-eth-tran-types@2023-10-23.yang +++ /dev/null @@ -1,457 +0,0 @@ - module ietf-eth-tran-types { - yang-version 1.1; - namespace "urn:ietf:params:xml:ns:yang:ietf-eth-tran-types"; - - prefix "etht-types"; - - organization - "Internet Engineering Task Force (IETF) CCAMP WG"; - contact - " - WG List: - - ID-draft editor: - Haomian Zheng (zhenghaomian@huawei.com); - Italo Busi (italo.busi@huawei.com); - Aihua Guo (aihuaguo.ietf@gmail.com); - Anton Snitser (antons@sedonasys.com); - Francesco Lazzeri (francesco.lazzeri@ericsson.com); - Yunbin Xu (xuyunbin@caict.ac.cn); - Yang Zhao (zhaoyangyjy@chinamobile.com); - Xufeng Liu (xufeng.liu.ietf@gmail.com); - Giuseppe Fioccola (giuseppe.fioccola@huawei.com); - Chaode Yu (yuchaode@huawei.com) - "; - - description - "This module defines the ETH types. - The model fully conforms to the Network Management - Datastore Architecture (NMDA). - - Copyright (c) 2019 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 XXXX; see - the RFC itself for full legal notices."; - - revision 2023-10-23 { - description - "version -05 as a WG draft"; - reference - "draft-ietf-ccamp-client-signal-yang"; - } - - /* - * Identities - */ - - identity eth-vlan-tag-type { - description - "ETH VLAN tag type."; - } - - identity c-vlan-tag-type { - base eth-vlan-tag-type; - description - "802.1Q Customer VLAN"; - } - - identity s-vlan-tag-type { - base eth-vlan-tag-type; - description - "802.1Q Service VLAN (QinQ)"; - } - - identity service-classification-type { - description - "Service classification."; - } - - identity port-classification { - base service-classification-type; - description - "Port classification."; - } - identity vlan-classification { - base service-classification-type; - description - "VLAN classification."; - } - - identity eth-vlan-tag-classify { - description - "VLAN tag classification."; - } - - identity classify-c-vlan { - base eth-vlan-tag-classify; - description - "Classify 802.1Q Customer VLAN tag. - Only C-tag type is accepted"; - } - - identity classify-s-vlan { - base eth-vlan-tag-classify; - description - "Classify 802.1Q Service VLAN (QinQ) tag. - Only S-tag type is accepted"; - } - - identity classify-s-or-c-vlan { - base eth-vlan-tag-classify; - description - "Classify S-VLAN or C-VLAN tag-classify. - Either tag is accepted"; - } - - identity bandwidth-profile-type-ir { - description - "Bandwidth Profile Types"; - } - - identity mef-10-bwp { - base bandwidth-profile-type-ir; - description - "MEF 10 Bandwidth Profile"; - } - - identity rfc-2697-bwp { - base bandwidth-profile-type-ir; - description - "RFC 2697 Bandwidth Profile"; - } - identity rfc-2698-bwp { - base bandwidth-profile-type-ir; - description - "RFC 2698 Bandwidth Profile"; - } - - identity rfc-4115-bwp { - base bandwidth-profile-type-ir; - description - "RFC 4115 Bandwidth Profile"; - } - - identity service-type-ir { - description - "Type of Ethernet service."; - } - - identity p2p-svc { - base service-type-ir; - description - "Ethernet point-to-point service (EPL, EVPL)."; - } - - identity rmp-svc { - base service-type-ir; - description - "Ethernet rooted-multitpoint service (E-TREE, EP-TREE)."; - } - - identity mp2mp-svc { - base service-type-ir; - description - "Ethernet multipoint-to-multitpoint service (E-LAN, EP-LAN)."; - } - - identity lifecycle-status-ir { - description - "Lifecycle Status."; - } - - identity installed { - base lifecycle-status-ir; - description - "Installed."; - } - - identity planned { - base lifecycle-status-ir; - description - "Planned."; - } - - identity pending-removal { - base lifecycle-status-ir; - description - "Pending Removal."; - } - - /* - * Type Definitions - */ - - typedef eth-tag-type { - type identityref { - base eth-vlan-tag-type; - } - description - "Identifies a specific ETH VLAN tag type."; - } - - typedef eth-tag-classify { - type identityref { - base eth-vlan-tag-classify; - } - description - "Identifies a specific VLAN tag classification."; - } - - typedef vlanid { - type uint16 { - range "1..4094"; - } - description - "The 12-bit VLAN-ID used in the VLAN Tag header."; - } - - typedef vid-range-type { - type string { - pattern "([1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?" + - "(,[1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?)*)"; - } - description - "A list of VLAN Ids, or non overlapping VLAN ranges, in - ascending order, between 1 and 4094. - This type is used to match an ordered list of VLAN Ids, or - contiguous ranges of VLAN Ids. Valid VLAN Ids must be in the - range 1 to 4094, and included in the list in non overlapping - ascending order. - - For example: 1,10-100,50,500-1000"; - } - - typedef bandwidth-profile-type { - type identityref { - base bandwidth-profile-type-ir; - } - description - "Identifies a specific Bandwidth Profile type."; - } - - typedef service-type { - type identityref { - base service-type-ir; - } - description - "Identifies the type of Ethernet service."; - } - - typedef lifecycle-status { - type identityref { - base lifecycle-status-ir; - } - description - "Identifies the lLifecycle Status ."; - } - - /* - * Grouping Definitions - */ - - grouping etht-bandwidth-profiles { - description - "Bandwidth profile configuration paramters."; - - leaf bandwidth-profile-type { - type etht-types:bandwidth-profile-type; - description - "The type of bandwidth profile."; - } - leaf CIR { - type uint64; - description - "Committed Information Rate in Kbps"; - } - leaf CBS { - type uint64; - description - "Committed Burst Size in in KBytes"; - } - leaf EIR { - type uint64; - /* Need to indicate that EIR is not supported by RFC 2697 - - must - '../bw-profile-type = "mef-10-bwp" or ' + - '../bw-profile-type = "rfc-2698-bwp" or ' + - '../bw-profile-type = "rfc-4115-bwp"' - - must - '../bw-profile-type != "rfc-2697-bwp"' - */ - description - "Excess Information Rate in Kbps - In case of RFC 2698, PIR = CIR + EIR"; - } - leaf EBS { - type uint64; - description - "Excess Burst Size in KBytes. - In case of RFC 2698, PBS = CBS + EBS"; - } - leaf color-aware { - type boolean; - description - "Indicates weather the color-mode is - color-aware or color-blind."; - } - leaf coupling-flag { - type boolean; - /* Need to indicate that Coupling Flag is defined only for MEF 10 - - must - '../bw-profile-type = "mef-10-bwp"' - */ - description - "Coupling Flag."; - } - } - - identity topology-role { - description - "The role of underlay topology: e.g., hub, spoke, - any-to-any."; - } - - identity resilience { - description - "Placeholder for resilience information in data plane, - for future study. "; - } - - identity access-role { - description - "Indicating whether the access is a working or protection access."; - } - - identity root-primary { - base access-role; - description - "Designates the primary root UNI of an E-Tree service, and may also - designates the UNI access role of E-LINE and E-LAN service."; - } - - identity root-backup { - base access-role; - description - "Designates the backup root UNI of an E-Tree service."; - } - - identity leaf-access { - base access-role; - description - "Designates the leaf UNI of an E-Tree service."; - } - - identity leaf-edge { - base access-role; - description ""; - } - - identity performance { - description - "Placeholder for performance information, for future study."; - } - - identity encapsulation-type { - description - "Indicating how the service is encapsulated (to PW), e.g, raw or tag. "; - } - grouping pw-segement-bandwidth-profile-grouping { - description - "bandwidth profile grouping for PW segment. "; - leaf bandwidth-profile-type { - type etht-types:bandwidth-profile-type; - description - "The type of bandwidth profile."; - } - leaf CIR { - type uint64; - description - "Committed Information Rate in Kbps"; - } - leaf CBS { - type uint64; - description - "Committed Burst Size in in KBytes"; - } - leaf EIR { - type uint64; - /* Need to indicate that EIR is not supported by RFC 2697 - - must - '../bw-profile-type = "mef-10-bwp" or ' + - '../bw-profile-type = "rfc-2698-bwp" or ' + - '../bw-profile-type = "rfc-4115-bwp"' - - must - '../bw-profile-type != "rfc-2697-bwp"' - */ - description - "Excess Information Rate in Kbps - In case of RFC 2698, PIR = CIR + EIR"; - } - leaf EBS { - type uint64; - description - "Excess Burst Size in KBytes. - In case of RFC 2698, PBS = CBS + EBS"; - } - } - grouping eth-bandwidth { - description - "Available bandwith for ethernet."; - leaf eth-bandwidth { - type uint64{ - range "0..10000000000"; - } - units "Kbps"; - description - "Available bandwith value expressed in kilobits per second"; - } - } - - grouping eth-label-restriction { - description - "Label Restriction for ethernet."; - leaf tag-type { - type etht-types:eth-tag-type; - description "VLAN tag type."; - } - leaf priority { - type uint8; - description "priority."; - } - } - grouping eth-label { - description - "Label for ethernet."; - leaf vlanid { - type etht-types:vlanid; - description - "VLAN tag id."; - } - } - - grouping eth-label-step { - description "Label step for Ethernet VLAN"; - leaf eth-step { - type uint16 { - range "1..4095"; - } - default 1; - description - "Label step which represent possible increments for - an Ethernet VLAN tag."; - reference - "IEEE 802.1ad: Provider Bridges."; - } - } - } diff --git a/src/nbi/service/ietf_network/yang/ietf-eth-tran-types@2024-01-11.yang b/src/nbi/service/ietf_network/yang/ietf-eth-tran-types@2024-01-11.yang new file mode 100644 index 0000000000000000000000000000000000000000..78c849d7b8249a1fe5e14dd24e8f133d81462aa0 --- /dev/null +++ b/src/nbi/service/ietf_network/yang/ietf-eth-tran-types@2024-01-11.yang @@ -0,0 +1,470 @@ +module ietf-eth-tran-types { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-eth-tran-types"; + prefix etht-types; + + organization + "Internet Engineering Task Force (IETF) CCAMP WG"; + contact + "WG Web: + WG List: + + Editor: Haomian Zheng + + + Editor: Aihua Guo + + + Editor: Italo Busi + + + Editor: Anton Snitser + + + Editor: Chaode Yu + "; + + description + "This module defines a collection of common YANG identity, data + type and grouping definitions for describing Ethernet transport + network clients. + + Copyright (c) 2024 IETF Trust and the persons + identified as authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC XXXX; see + the RFC itself for full legal notices."; + + revision 2024-01-11 { + description + "Initial Version"; + reference + "RFC XXXX: A YANG Data Model for Transport Network Client + Signals"; + } + // RFC Editor: replace XXXX with the actual RFC number assigned + // to the RFC once this draft + // becomes an RFC, update date information and remove this note. + + /* + * Identities + */ + + identity eth-vlan-tag-type { + description + "ETH VLAN tag type."; + } + + identity c-vlan-tag-type { + base eth-vlan-tag-type; + description + "802.1Q Customer VLAN"; + } + + identity s-vlan-tag-type { + base eth-vlan-tag-type; + description + "802.1Q Service VLAN (QinQ)"; + } + + identity service-classification-type { + description + "Service classification."; + } + + identity port-classification { + base service-classification-type; + description + "Port classification."; + } + + identity vlan-classification { + base service-classification-type; + description + "VLAN classification."; + } + + identity eth-vlan-tag-classify { + description + "VLAN tag classification."; + } + + identity classify-c-vlan { + base eth-vlan-tag-classify; + description + "Classify 802.1Q Customer VLAN tag. + Only C-tag type is accepted"; + } + + identity classify-s-vlan { + base eth-vlan-tag-classify; + description + "Classify 802.1Q Service VLAN (QinQ) tag. + Only S-tag type is accepted"; + } + + identity classify-s-or-c-vlan { + base eth-vlan-tag-classify; + description + "Classify S-VLAN or C-VLAN tag-classify. + Either tag is accepted"; + } + + identity bandwidth-profile-type { + description + "Bandwidth Profile Types"; + } + + identity mef-10-bwp { + base bandwidth-profile-type; + description + "MEF 10 Bandwidth Profile"; + } + + identity rfc-2697-bwp { + base bandwidth-profile-type; + description + "RFC 2697 Bandwidth Profile"; + } + + identity rfc-2698-bwp { + base bandwidth-profile-type; + description + "RFC 2698 Bandwidth Profile"; + } + + identity rfc-4115-bwp { + base bandwidth-profile-type; + description + "RFC 4115 Bandwidth Profile"; + } + + identity service-type { + description + "Type of Ethernet service."; + } + + identity p2p-svc { + base service-type; + description + "Ethernet point-to-point service (EPL, EVPL)."; + } + + identity rmp-svc { + base service-type; + description + "Ethernet rooted-multitpoint service (E-TREE, EP-TREE)."; + } + + identity mp2mp-svc { + base service-type; + description + "Ethernet multipoint-to-multitpoint service + (E-LAN, EP-LAN)."; + } + + identity lifecycle-status { + description + "Lifecycle Status."; + } + + identity installed { + base lifecycle-status; + description + "Installed."; + } + + identity planned { + base lifecycle-status; + description + "Planned."; + } + + identity pending-removal { + base lifecycle-status; + description + "Pending Removal."; + } + + identity topology-role { + description + "The role of underlay topology: e.g., hub, spoke, + any-to-any."; + } + + identity resilience { + description + "Placeholder for resilience information in data plane, + for future study. "; + } + + identity access-role { + description + "Indicating whether the access is a working or protection + access."; + } + + identity root-primary { + base access-role; + description + "Designates the primary root UNI of an E-Tree service, and + may also designates the UNI access role of E-LINE and E-LAN + service."; + } + + identity root-backup { + base access-role; + description + "Designates the backup root UNI of an E-Tree service."; + } + + identity leaf-access { + base access-role; + description + "Designates the leaf UNI of an E-Tree service."; + } + + identity performance { + description + "Placeholder for performance information, for future study."; + } + + identity encapsulation-type { + description + "Indicating how the service is encapsulated (to PW), e.g, raw or + tag. "; + } + + /* + * Data Types + */ + + typedef eth-tag-type { + type identityref { + base eth-vlan-tag-type; + } + description + "Identifies a specific ETH VLAN tag type."; + } + + typedef eth-tag-classify { + type identityref { + base eth-vlan-tag-classify; + } + description + "Identifies a specific VLAN tag classification."; + } + + typedef vlanid { + type uint16 { + range "1..4094"; + } + description + "The 12-bit VLAN-ID used in the VLAN Tag header."; + } + + typedef vid-range-type { + type string { + pattern "([1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?" + + "(,[1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?)*)"; + } + description + "A list of VLAN Ids, or non overlapping VLAN ranges, in + ascending order, between 1 and 4094. + This type is used to match an ordered list of VLAN Ids, or + contiguous ranges of VLAN Ids. Valid VLAN Ids must be in the + range 1 to 4094, and included in the list in non overlapping + ascending order. + + For example: 1,10-100,50,500-1000"; + } + + typedef bandwidth-profile-type { + type identityref { + base bandwidth-profile-type; + } + description + "Identifies a specific Bandwidth Profile type."; + } + + typedef service-type { + type identityref { + base service-type; + } + description + "Identifies the type of Ethernet service."; + } + + typedef lifecycle-status { + type identityref { + base lifecycle-status; + } + description + "Identifies the lLifecycle Status ."; + } + + /* + * Groupings + */ + + grouping etht-bandwidth-profiles { + description + "Bandwidth profile configuration paramters."; + + leaf bandwidth-profile-type { + type etht-types:bandwidth-profile-type; + description + "The type of bandwidth profile."; + } + leaf CIR { + type uint64; + description + "Committed Information Rate in Kbps"; + } + leaf CBS { + type uint64; + description + "Committed Burst Size in in KBytes"; + } + leaf EIR { + type uint64; + /* Need to indicate that EIR is not supported by RFC 2697 + + must + '../bw-profile-type = "mef-10-bwp" or ' + + '../bw-profile-type = "rfc-2698-bwp" or ' + + '../bw-profile-type = "rfc-4115-bwp"' + + must + '../bw-profile-type != "rfc-2697-bwp"' + */ + description + "Excess Information Rate in Kbps + In case of RFC 2698, PIR = CIR + EIR"; + } + leaf EBS { + type uint64; + description + "Excess Burst Size in KBytes. + In case of RFC 2698, PBS = CBS + EBS"; + } + leaf color-aware { + type boolean; + description + "Indicates weather the color-mode is + color-aware or color-blind."; + } + leaf coupling-flag { + type boolean; + /* Need to indicate that Coupling Flag is defined only for + MEF 10 + + must + '../bw-profile-type = "mef-10-bwp"' + */ + description + "Coupling Flag."; + } + } + + grouping pw-segement-bandwidth-profile-grouping { + description + "bandwidth profile grouping for PW segment."; + + leaf bandwidth-profile-type { + type etht-types:bandwidth-profile-type; + description + "The type of bandwidth profile."; + } + leaf CIR { + type uint64; + description + "Committed Information Rate in Kbps"; + } + leaf CBS { + type uint64; + description + "Committed Burst Size in in KBytes"; + } + leaf EIR { + type uint64; + /* Need to indicate that EIR is not supported by RFC 2697 + + must + '../bw-profile-type = "mef-10-bwp" or ' + + '../bw-profile-type = "rfc-2698-bwp" or ' + + '../bw-profile-type = "rfc-4115-bwp"' + + must + '../bw-profile-type != "rfc-2697-bwp"' + */ + description + "Excess Information Rate in Kbps + In case of RFC 2698, PIR = CIR + EIR"; + } + leaf EBS { + type uint64; + description + "Excess Burst Size in KBytes. + In case of RFC 2698, PBS = CBS + EBS"; + } + } + + grouping eth-bandwidth { + description + "Available bandwith for ethernet."; + leaf eth-bandwidth { + type uint64{ + range "0..10000000000"; + } + units "Kbps"; + description + "Available bandwith value expressed in kilobits per second"; + } + } + + grouping eth-label-restriction { + description + "Label Restriction for ethernet."; + leaf tag-type { + type etht-types:eth-tag-type; + description "VLAN tag type."; + } + leaf priority { + type uint8; + description "priority."; + } + } + + grouping eth-label { + description + "Label for ethernet."; + leaf vlanid { + type etht-types:vlanid; + description + "VLAN tag id."; + } + } + + grouping eth-label-step { + description "Label step for Ethernet VLAN"; + leaf eth-step { + type uint16 { + range "1..4095"; + } + default 1; + description + "Label step which represent possible increments for + an Ethernet VLAN tag."; + reference + "IEEE 802.1ad: Provider Bridges."; + } + } +} diff --git a/src/nbi/service/ietf_network/yang/ietf-inet-types@2025-06-23.yang b/src/nbi/service/ietf_network/yang/ietf-inet-types@2025-06-23.yang new file mode 100644 index 0000000000000000000000000000000000000000..b28621b9f4d85dec73f2723520a6fe0f8c758a6d --- /dev/null +++ b/src/nbi/service/ietf_network/yang/ietf-inet-types@2025-06-23.yang @@ -0,0 +1,669 @@ +module ietf-inet-types { + + namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types"; + prefix "inet"; + + organization + "IETF Network Modeling (NETMOD) Working Group"; + + contact + "WG Web: + WG List: + + Editor: Juergen Schoenwaelder + "; + + description + "This module contains a collection of generally useful derived + YANG data types for Internet addresses and related things. + + The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL + NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', + 'MAY', and 'OPTIONAL' in this document are to be interpreted as + described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, + they appear in all capitals, as shown here. + + Copyright (c) 2025 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC XXXX; + see the RFC itself for full legal notices."; + + revision 2025-06-23 { + description + "This revision adds the following new data types: + - inet:ip-address-and-prefix + - inet:ipv4-address-and-prefix + - inet:ipv6-address-and-prefix + - inet:protocol-number + - inet:upper-layer-protocol-number + - inet:host-name + - inet:email-address + - inet:ip-address-link-local + - inet:ipv4-address-link-local + - inet:ipv6-address-link-local + The inet:host union was changed to use inet:host-name instead + of inet:domain-name. Several pattern statements have been + improved."; + reference + "RFC XXXX: Common YANG Data Types"; + } + + revision 2013-07-15 { + description + "This revision adds the following new data types: + - inet:ip-address-no-zone + - inet:ipv4-address-no-zone + - inet:ipv6-address-no-zone"; + reference + "RFC 6991: Common YANG Data Types"; + } + + revision 2010-09-24 { + description + "Initial revision."; + reference + "RFC 6021: Common YANG Data Types"; + } + + /*** collection of types related to protocol fields ***/ + + typedef ip-version { + type enumeration { + enum unknown { + value "0"; + description + "An unknown or unspecified version of the Internet + protocol."; + } + enum ipv4 { + value "1"; + description + "The IPv4 protocol as defined in RFC 791."; + } + enum ipv6 { + value "2"; + description + "The IPv6 protocol as defined in RFC 8200."; + } + } + description + "This value represents the version of the IP protocol. + + In the value set and its semantics, this type is equivalent + to the InetVersion textual convention of the SMIv2."; + reference + "RFC 791: Internet Protocol + RFC 8200: Internet Protocol, Version 6 (IPv6) Specification + RFC 4001: Textual Conventions for Internet Network Addresses"; + } + + typedef dscp { + type uint8 { + range "0..63"; + } + description + "The dscp type represents a Differentiated Services Code Point + that may be used for marking packets in a traffic stream. + + In the value set and its semantics, this type is equivalent + to the Dscp textual convention of the SMIv2."; + reference + "RFC 3289: Management Information Base for the Differentiated + Services Architecture + RFC 2474: Definition of the Differentiated Services Field + (DS Field) in the IPv4 and IPv6 Headers + RFC 2780: IANA Allocation Guidelines For Values In + the Internet Protocol and Related Headers"; + } + + typedef ipv6-flow-label { + type uint32 { + range "0..1048575"; + } + description + "The ipv6-flow-label type represents the flow identifier or + Flow Label in an IPv6 packet header that may be used to + discriminate traffic flows. + + In the value set and its semantics, this type is equivalent + to the IPv6FlowLabel textual convention of the SMIv2."; + reference + "RFC 3595: Textual Conventions for IPv6 Flow Label + RFC 8200: Internet Protocol, Version 6 (IPv6) Specification"; + } + + typedef port-number { + type uint16 { + range "0..65535"; + } + description + "The port-number type represents a 16-bit port number of an + Internet transport-layer protocol such as UDP, TCP, DCCP, or + SCTP. + + Port numbers are assigned by IANA. The current list of + all assignments is available from . + + Note that the port number value zero is reserved by IANA. In + situations where the value zero does not make sense, it can + be excluded by subtyping the port-number type. + + In the value set and its semantics, this type is equivalent + to the InetPortNumber textual convention of the SMIv2."; + reference + "RFC 768: User Datagram Protocol + RFC 9293: Transmission Control Protocol (TCP) + RFC 9260: Stream Control Transmission Protocol + RFC 4340: Datagram Congestion Control Protocol (DCCP) + RFC 4001: Textual Conventions for Internet Network Addresses"; + } + + typedef protocol-number { + type uint8; + description + "The protocol-number type represents an 8-bit Internet + protocol number, carried in the 'protocol' field of the + IPv4 header or in the 'next header' field of the IPv6 + header. + + Protocol numbers are assigned by IANA. The current list of + all assignments is available from ."; + reference + "RFC 791: Internet Protocol + RFC 8200: Internet Protocol, Version 6 (IPv6) Specification"; + } + + typedef upper-layer-protocol-number { + type protocol-number; + description + "The upper-layer-protocol-number represents the upper-layer + protocol number carried in an IP packet. For IPv6 packets + with extension headers, this is the protocol number carried + in the last 'next header' field of the chain of IPv6 extension + headers."; + reference + "RFC 791: Internet Protocol + RFC 8200: Internet Protocol, Version 6 (IPv6) Specification"; + } + + /*** collection of types related to autonomous systems ***/ + + typedef as-number { + type uint32; + description + "The as-number type represents autonomous system numbers + which identify an Autonomous System (AS). An AS is a set + of routers under a single technical administration, using + an interior gateway protocol and common metrics to route + packets within the AS, and using an exterior gateway + protocol to route packets to other ASes. IANA maintains + the AS number space and has delegated large parts to the + regional registries. + + Autonomous system numbers were originally limited to 16 + bits. BGP extensions have enlarged the autonomous system + number space to 32 bits. This type therefore uses an uint32 + base type without a range restriction in order to support + a larger autonomous system number space. + + In the value set and its semantics, this type is equivalent + to the InetAutonomousSystemNumber textual convention of + the SMIv2."; + reference + "RFC 1930: Guidelines for creation, selection, and registration + of an Autonomous System (AS) + RFC 4271: A Border Gateway Protocol 4 (BGP-4) + RFC 4001: Textual Conventions for Internet Network Addresses + RFC 6793: BGP Support for Four-Octet Autonomous System (AS) + Number Space"; + } + + /*** collection of types related to IP addresses and hostnames ***/ + + typedef ip-address { + type union { + type ipv4-address; + type ipv6-address; + } + description + "The ip-address type represents an IP address and is IP + version neutral. The format of the textual representation + implies the IP version. This type supports scoped addresses + by allowing zone identifiers in the address format."; + reference + "RFC 4007: IPv6 Scoped Address Architecture"; + } + + typedef ipv4-address { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' + + '(%.+)?'; + } + description + "The ipv4-address type represents an IPv4 address in + dotted-quad notation. The IPv4 address may include a zone + index, separated by a % sign. If a system uses zone names + that are not represented in UTF-8, then an implementation + needs to use some mechanism to transform the local name + into UTF-8. The definition of such a mechanism is outside + the scope of this document. + + The zone index is used to disambiguate identical address + values. For link-local addresses, the zone index will + typically be the interface index number or the name of an + interface. If the zone index is not present, the default + zone of the device will be used. + + The canonical format for the zone index is the numerical + format"; + } + + typedef ipv6-address { + type string { + pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}' + + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|' + + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}' + + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))' + + '(%[A-Za-z0-9][A-Za-z0-9\-\._~/]*)?'; + pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|' + + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)' + + '(%.+)?'; + } + description + "The ipv6-address type represents an IPv6 address in full, + mixed, shortened, and shortened-mixed notation. The IPv6 + address may include a zone index, separated by a % sign. + If a system uses zone names that are not represented in + UTF-8, then an implementation needs to use some mechanism + to transform the local name into UTF-8. The definition of + such a mechanism is outside the scope of this document. + + The zone index is used to disambiguate identical address + values. For link-local addresses, the zone index will + typically be the interface index number or the name of an + interface. If the zone index is not present, the default + zone of the device will be used. + + The canonical format of IPv6 addresses uses the textual + representation defined in Section 4 of RFC 5952. The + canonical format for the zone index is the numerical + format as described in Section 11.2 of RFC 4007."; + reference + "RFC 4291: IP Version 6 Addressing Architecture + RFC 4007: IPv6 Scoped Address Architecture + RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + typedef ip-address-no-zone { + type union { + type ipv4-address-no-zone; + type ipv6-address-no-zone; + } + description + "The ip-address-no-zone type represents an IP address and is + IP version neutral. The format of the textual representation + implies the IP version. This type does not support scoped + addresses since it does not allow zone identifiers in the + address format."; + reference + "RFC 4007: IPv6 Scoped Address Architecture"; + } + + typedef ipv4-address-no-zone { + type ipv4-address { + pattern '[0-9\.]*'; + } + description + "An IPv4 address without a zone index. This type, derived + from the type ipv4-address, may be used in situations where + the zone is known from the context and no zone index is + needed."; + } + + typedef ipv6-address-no-zone { + type ipv6-address { + pattern '[0-9a-fA-F:\.]*'; + } + description + "An IPv6 address without a zone index. This type, derived + from the type ipv6-address, may be used in situations where + the zone is known from the context and no zone index is + needed."; + reference + "RFC 4291: IP Version 6 Addressing Architecture + RFC 4007: IPv6 Scoped Address Architecture + RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + typedef ip-address-link-local { + type union { + type ipv4-address-link-local; + type ipv6-address-link-local; + } + description + "The ip-address-link-local type represents a link-local IP + address and is IP version neutral. The format of the textual + representation implies the IP version."; + } + + typedef ipv4-address-link-local { + type ipv4-address { + pattern '169\.254\..*'; + } + description + "A link-local IPv4 address in the prefix 169.254.0.0/16 as + defined in section 2.1. of RFC 3927."; + reference + "RFC 3927: Dynamic Configuration of IPv4 Link-Local Addresses"; + } + + typedef ipv6-address-link-local { + type ipv6-address { + pattern '[fF][eE]80:.*'; + } + description + "A link-local IPv6 address in the prefix fe80::/10 as defined + in section 2.5.6. of RFC 4291."; + reference + "RFC 4291: IP Version 6 Addressing Architecture"; + } + + typedef ip-prefix { + type union { + type ipv4-prefix; + type ipv6-prefix; + } + description + "The ip-prefix type represents an IP prefix and is IP + version neutral. The format of the textual representations + implies the IP version."; + } + + typedef ipv4-prefix { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' + + '/(([0-9])|([1-2][0-9])|(3[0-2]))'; + } + description + "The ipv4-prefix type represents an IPv4 prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 32. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0. + + The canonical format of an IPv4 prefix has all bits of + the IPv4 address set to zero that are not part of the + IPv4 prefix. + + The definition of ipv4-prefix does not require that bits, + which are not part of the prefix, are set to zero. However, + implementations have to return values in canonical format, + which requires non-prefix bits to be set to zero. This means + that 192.0.2.1/24 must be accepted as a valid value but it + will be converted into the canonical format 192.0.2.0/24."; + } + + typedef ipv6-prefix { + type string { + pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}' + + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|' + + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}' + + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))' + + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'; + pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|' + + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)' + + '(/.+)'; + } + description + "The ipv6-prefix type represents an IPv6 prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 128. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0. + + The canonical format of an IPv6 prefix has all bits of + the IPv6 address set to zero that are not part of the + IPv6 prefix. Furthermore, the IPv6 address is represented + as defined in Section 4 of RFC 5952. + + The definition of ipv6-prefix does not require that bits, + which are not part of the prefix, are set to zero. However, + implementations have to return values in canonical format, + which requires non-prefix bits to be set to zero. This means + that 2001:db8::1/64 must be accepted as a valid value but it + will be converted into the canonical format 2001:db8::/64."; + reference + "RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + typedef ip-address-and-prefix { + type union { + type ipv4-address-and-prefix; + type ipv6-address-and-prefix; + } + description + "The ip-address-and-prefix type represents an IP address and + prefix and is IP version neutral. The format of the textual + representations implies the IP version."; + } + + typedef ipv4-address-and-prefix { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' + + '/(([0-9])|([1-2][0-9])|(3[0-2]))'; + } + description + "The ipv4-address-and-prefix type represents an IPv4 + address and an associated IPv4 prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 32. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0."; + } + + typedef ipv6-address-and-prefix { + type string { + pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}' + + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|' + + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}' + + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))' + + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'; + pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|' + + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)' + + '(/.+)'; + } + description + "The ipv6-address-and-prefix type represents an IPv6 + address and an associated IPv6 prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 128. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0. + + The canonical format requires that the IPv6 address is + represented as defined in Section 4 of RFC 5952."; + reference + "RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + /*** collection of domain name and URI types ***/ + + typedef domain-name { + type string { + 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]\.?)' + + '|\.'; + } + description + "The domain-name type represents a DNS domain name. The + name SHOULD be fully qualified whenever possible. This + type does not support wildcards (see RFC 4592) or + classless in-addr.arpa delegations (see RFC 2317). + + 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. Note that Internet host names have a + stricter syntax (described in RFC 952) than the DNS + recommendations in RFCs 1034 and 1123. Schema nodes + representing host names should use the host-name type + instead of the domain-type. + + The encoding of DNS names in the DNS protocol is limited + to 255 characters. Since the encoding consists of labels + prefixed by a length bytes and there is a trailing NULL + byte, only 253 characters can appear in the textual dotted + notation. + + The description clause of schema nodes using the domain-name + type MUST describe when and how these names are resolved to + IP addresses. Note that the resolution of a domain-name value + may require to query multiple DNS records (e.g., A for IPv4 + and AAAA for IPv6). The order of the resolution process and + which DNS record takes precedence can either be defined + explicitly or may depend on the configuration of the + resolver. + + Domain-name values use the US-ASCII encoding. Their canonical + format uses lowercase US-ASCII characters. Internationalized + domain names MUST be A-labels as per RFC 5890."; + reference + "RFC 952: DoD Internet Host Table Specification + RFC 1034: Domain Names - Concepts and Facilities + RFC 1123: Requirements for Internet Hosts -- Application + and Support + RFC 2317: Classless IN-ADDR.ARPA delegation + RFC 2782: A DNS RR for specifying the location of services + (DNS SRV) + RFC 4592: The Role of Wildcards in the Domain Name System + RFC 5890: Internationalized Domain Names in Applications + (IDNA): Definitions and Document Framework + RFC 9499: DNS Terminology"; + } + + typedef host-name { + type domain-name { + length "2..max"; + pattern '[a-zA-Z0-9\-\.]+'; + } + description + "The host-name type represents (fully qualified) host names. + Host names must be at least two characters long (see RFC 952) + and they are restricted to labels consisting of letters, digits + and hyphens separated by dots (see RFC1123 and RFC 952)."; + reference + "RFC 952: DoD Internet Host Table Specification + RFC 1123: Requirements for Internet Hosts -- Application + and Support"; + } + + typedef host { + type union { + type ip-address; + type host-name; + } + description + "The host type represents either an IP address or a (fully + qualified) host name."; + } + + typedef uri { + type string { + pattern '[a-z][a-z0-9+.-]*:.*'; + } + description + "The uri type represents a Uniform Resource Identifier + (URI) as defined by the rule 'URI' in RFC 3986. + + Objects using the uri type MUST be in US-ASCII encoding, + and MUST be normalized as described by RFC 3986 Sections + 6.2.1, 6.2.2.1, and 6.2.2.2. Characters that can be + represented without using percent-encoding are represented + as characters (without percent-encoding), and all + case-insensitive characters are set to lowercase except + for hexadecimal digits within a percent-encoded triplet, + which are normalized to uppercase as described in + Section 6.2.2.1 of RFC 3986. + + The purpose of this normalization is to help provide + unique URIs. Note that this normalization is not + sufficient to provide uniqueness. Two URIs that are + textually distinct after this normalization may still be + equivalent. + + Objects using the uri type may restrict the schemes that + they permit. For example, 'data:' and 'urn:' schemes + might not be appropriate. + + A zero-length URI is not a valid URI. This can be used to + express 'URI absent' where required. + + In the value set and its semantics, this type is equivalent + to the Uri SMIv2 textual convention defined in RFC 5017."; + reference + "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax + RFC 3305: Report from the Joint W3C/IETF URI Planning Interest + Group: Uniform Resource Identifiers (URIs), URLs, + and Uniform Resource Names (URNs): Clarifications + and Recommendations + RFC 5017: MIB Textual Conventions for Uniform Resource + Identifiers (URIs)"; + } + + typedef email-address { + type string { + pattern '.+@.+'; + } + description + "The email-address type represents an internationalized + email address. + + The email address format is defined by the addr-spec + ABNF rule in RFC 5322 section 3.4.1. This format has + been extended by RFC 6532 to support internationalized + email addresses. Implementations MUST support the + internationalization extensions of RFC 6532. Support + of the obsolete obs-local-part, obs-domain, and + obs-qtext parts of RFC 5322 is not required. + + The domain part may use both A-labels and U-labels + (see RFC 5890). The canonical format of the domain part + uses lowercase characters and U-labels (RFC 5890) where + applicable."; + reference + "RFC 5322: Internet Message Format + RFC 5890: Internationalized Domain Names in Applications + (IDNA): Definitions and Document Framework + RFC 6531: SMTP Extension for Internationalized Email"; + } + +} \ No newline at end of file diff --git a/src/nbi/service/ietf_network/yang/ietf-layer1-types@2022-10-14.yang b/src/nbi/service/ietf_network/yang/ietf-layer1-types@2022-10-14.yang deleted file mode 100644 index 188336931c36000b287bad5258550e7d3fa7016b..0000000000000000000000000000000000000000 --- a/src/nbi/service/ietf_network/yang/ietf-layer1-types@2022-10-14.yang +++ /dev/null @@ -1,1414 +0,0 @@ - module ietf-layer1-types { - yang-version 1.1; - namespace "urn:ietf:params:xml:ns:yang:ietf-layer1-types"; - prefix "l1-types"; - - import ietf-routing-types { - prefix rt-types; - reference - "RFC 8294: Common YANG Data Types for the Routing Area"; - } - - organization - "IETF CCAMP Working Group"; - contact - "WG Web: - WG List: - - Editor: Haomian Zheng - - - Editor: Italo Busi - "; - - description - "This module defines Layer 1 types. The model fully conforms - to the Network Management Datastore Architecture (NMDA). - - Copyright (c) 2022 IETF Trust and the persons - identified as authors of the code. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, is permitted pursuant to, and subject - to the license terms contained in, the Revised BSD License - set forth in Section 4.c of the IETF Trust's Legal Provisions - Relating to IETF Documents - (https://trustee.ietf.org/license-info). - - This version of this YANG module is part of RFC XXXX; see - the RFC itself for full legal notices. - - The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL - NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', - 'MAY', and 'OPTIONAL' in this document are to be interpreted as - described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, - - - - - they appear in all capitals, as shown here."; - - revision "2022-10-14" { - description - "Initial Version"; - reference - "RFC XXXX: A YANG Data Model for Layer 1 Types"; - // RFC Editor: replace XXXX with actual RFC number, update date - // information and remove this note - } - - /* - * Identities - */ - - identity tributary-slot-granularity { - description - "Tributary Slot Granularity (TSG)"; - reference - "ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity tsg-1.25G { - base tributary-slot-granularity; - description - "1.25G tributary slot granularity"; - } - - identity tsg-2.5G { - base tributary-slot-granularity; - description - "2.5G tributary slot granularity"; - } - - identity tsg-5G { - base tributary-slot-granularity; - description - "5G tributary slot granularity"; - } - - identity odu-type { - description - "Base identity from which specific Optical Data Unit (ODU) - type is derived."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - - - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ODU0 { - base odu-type; - description - "ODU0 type (1.24Gb/s)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ODU1 { - base odu-type; - description - "ODU1 type (2.49Gb/s)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ODU2 { - base odu-type; - description - "ODU2 type (10.03Gb/s)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ODU2e { - base odu-type; - description - "ODU2e type (10.39Gb/s)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - - - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ODU3 { - base odu-type; - description - "ODU3 type (40.31Gb/s)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ODU4 { - base odu-type; - description - "ODU4 type (104.79Gb/s)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ODUflex { - base odu-type; - description - "ODUflex type (flexible bit rate, not resizable). - - It could be used for any type of ODUflex, including - ODUflex(CBR), ODUflex(GFP), ODUflex(GFP,n,k), ODUflex(IMP,s), - ODUflex(IMP) and ODUflex(FlexE-aware)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ODUflex-resizable { - base odu-type; - description - "ODUflex protocol (flexible bit rate, resizable). - - - - - It could be used only for ODUflex(GFP,n,k)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity protocol { - description - "Base identity from which specific protocol is derived."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity Ethernet { - base protocol; - description - "Ethernet protocol."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity Fibre-Channel { - base protocol; - description - "Fibre-Channel (FC) protocol."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity SDH { - base protocol; - description - "SDH protocol."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity SONET { - base protocol; - description - "SONET protocol."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - - - - identity client-signal { - description - "Base identity from which specific Constant Bit Rate (CBR) - client signal is derived"; - } - - identity coding-func { - description - "Base identity from which specific coding function - is derived."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity ETH-1Gb { - base client-signal; - description - "Client signal type of 1GbE"; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ETH-10Gb-LAN { - base client-signal; - description - "Client signal type of ETH-10Gb-LAN (10.3 Gb/s)"; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - IEEE 802.3-2018, Clause 49: IEEE Standard for Ethernet"; - } - - identity ETH-10Gb-WAN { - base client-signal; - description - "Client signal type of ETH-10Gb-WAN (9.95 Gb/s)"; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - - - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - IEEE 802.3-2018, Clause 50: IEEE Standard for Ethernet"; - } - - identity ETH-40Gb { - base client-signal; - description - "Client signal type of 40GbE"; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ETH-100Gb { - base client-signal; - description - "Client signal type of 100GbE"; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity STM-1 { - base client-signal; - base coding-func; - description - "Client signal type of STM-1; - STM-1 G.707 (N=1) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity STM-4 { - base client-signal; - - - - - base coding-func; - description - "Client signal type of STM-4; - STM-4 G.707 (N=4) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity STM-16 { - base client-signal; - base coding-func; - description - "Client signal type of STM-16; - STM-16 G.707 (N=16) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity STM-64 { - base client-signal; - base coding-func; - description - "Client signal type of STM-64; - STM-64 G.707 (N=64) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity STM-256 { - base client-signal; - - - - - base coding-func; - description - "Client signal type of STM-256; - STM-256 G.707 (N=256) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity OC-3 { - base client-signal; - base coding-func; - description - "Client signal type of OC3; - OC-3 GR-253-CORE (N=3) coding function."; - reference - "ANSI T1.105-1995: Synchronous Optical Network (SONET) - Basic Description including Multiplex Structure, Rates, - and Formats - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity OC-12 { - base client-signal; - base coding-func; - description - "Client signal type of OC12; - OC-12 GR-253-CORE (N=12) coding function."; - reference - "ANSI T1.105-1995: Synchronous Optical Network (SONET) - Basic Description including Multiplex Structure, Rates, - and Formats - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity OC-48 { - base client-signal; - base coding-func; - description - "Client signal type of OC48; - OC-48 GR-253-CORE (N=48) coding function."; - - - - - reference - "ANSI T1.105-1995: Synchronous Optical Network (SONET) - Basic Description including Multiplex Structure, Rates, - and Formats - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity OC-192 { - base client-signal; - base coding-func; - description - "Client signal type of OC192; - OC-192 GR-253-CORE (N=192) coding function."; - reference - "ANSI T1.105-1995: Synchronous Optical Network (SONET) - Basic Description including Multiplex Structure, Rates, - and Formats - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity OC-768 { - base client-signal; - base coding-func; - description - "Client signal type of OC768; - OC-768 GR-253-CORE (N=768) coding function."; - reference - "ANSI T1.105-1995: Synchronous Optical Network (SONET) - Basic Description including Multiplex Structure, Rates, - and Formats - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity FC-100 { - base client-signal; - base coding-func; - description - "Client signal type of Fibre Channel FC-100; - FC-100 FC-FS-2 (1.0625 Gb/s) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - - - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity FC-200 { - base client-signal; - base coding-func; - description - "Client signal type of Fibre Channel FC-200; - FC-200 FC-FS-2 (2.125 Gb/s) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity FC-400 { - base client-signal; - base coding-func; - description - "Client signal type of Fibre Channel FC-400; - FC-400 FC-FS-2 (4.250 Gb/s) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity FC-800 { - base client-signal; - base coding-func; - description - "Client signal type of Fibre Channel FC-800; - FC-800 FC-FS-2 (8.500 Gb/s) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - - - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity FC-1200 { - base client-signal; - base coding-func; - description - "Client signal type of Fibre Channel FC-1200; - FC-1200 FC-10GFC (10.51875 Gb/s) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity FC-1600 { - base client-signal; - base coding-func; - description - "Client signal type of Fibre Channel FC-1600; - FC-1600 FC-FS-3 (14.025 Gb/s) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity FC-3200 { - base client-signal; - base coding-func; - description - "Client signal type of Fibre Channel FC-3200; - FC-3200 FC-FS-4 (28.05 Gb/s) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - - - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity FICON-4G { - base client-signal; - description - "Client signal type of Fibre Connection 4G"; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity FICON-8G { - base client-signal; - description - "Client signal type of Fibre Connection 8G"; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ETH-1000X { - base coding-func; - description - "1000BASE-X PCS clause 36 coding function."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity ETH-10GW { - base coding-func; - description - "10GBASE-W (WAN PHY) PCS clause 49 and WIS clause 50 - coding function."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity ETH-10GR { - base coding-func; - description - "10GBASE-R (LAN PHY) PCS clause 49 coding function."; - - - - - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity ETH-40GR { - base coding-func; - description - "40GBASE-R PCS clause 82 coding function."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity ETH-100GR { - base coding-func; - description - "100GBASE-R PCS clause 82 coding function."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity optical-interface-func { - description - "Base identity from which optical-interface-function - is derived."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity SX-PMD-1000 { - base optical-interface-func; - description - "SX-PMD-clause-38 Optical Interface function for - 1000BASE-X PCS-36"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity LX-PMD-1000 { - base optical-interface-func; - description - "LX-PMD-clause-38 Optical Interface function for - 1000BASE-X PCS-36"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity LX10-PMD-1000 { - base optical-interface-func; - - - - - description - "LX10-PMD-clause-59 Optical Interface function for - 1000BASE-X PCS-36"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity BX10-PMD-1000 { - base optical-interface-func; - description - "BX10-PMD-clause-59 Optical Interface function for - 1000BASE-X PCS-36"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity LW-PMD-10G { - base optical-interface-func; - description - "LW-PMD-clause-52 Optical Interface function for - 10GBASE-W PCS-49-WIS-50"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity EW-PMD-10G { - base optical-interface-func; - description - "EW-PMD-clause-52 Optical Interface function for - 10GBASE-W PCS-49-WIS-50"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity LR-PMD-10G { - base optical-interface-func; - description - "LR-PMD-clause-52 Optical Interface function for - 10GBASE-R PCS-49"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity ER-PMD-10G { - base optical-interface-func; - description - "ER-PMD-clause-52 Optical Interface function for - 10GBASE-R PCS-49"; - - - - - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity LR4-PMD-40G { - base optical-interface-func; - description - "LR4-PMD-clause-87 Optical Interface function for - 40GBASE-R PCS-82"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity ER4-PMD-40G { - base optical-interface-func; - description - "ER4-PMD-clause-87 Optical Interface function for - 40GBASE-R PCS-82"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity FR-PMD-40G { - base optical-interface-func; - description - "FR-PMD-clause-89 Optical Interface function for - 40GBASE-R PCS-82"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity LR4-PMD-100G { - base optical-interface-func; - description - "LR4-PMD-clause-88 Optical Interface function for - 100GBASE-R PCS-82"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity ER4-PMD-100G { - base optical-interface-func; - description - "ER4-PMD-clause-88 Optical Interface function for - 100GBASE-R PCS-82"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - - - - /* - * Typedefs - */ - - typedef otn-tpn { - type uint16 { - range "1..4095"; - } - description - "Tributary Port Number (TPN) for OTN. "; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks."; - } - - typedef otn-ts { - type uint16 { - range "1..4095"; - } - description - "Tributary Slot (TS) for OTN."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks."; - } - - typedef otn-label-range-type { - type enumeration { - enum trib-slot { - description - "Defines a range of OTN tributary slots (TS)."; - } - enum trib-port { - description - "Defines a range of OTN tributary ports (TPN)."; - } - } - description - "Defines the type of OTN label range: TS or TPN. "; - } - - typedef gfp-k { - type enumeration { - enum 2 { - description - "The ODU2.ts rate (1,249,177.230 kbit/s) is used - to compute the rate of an ODUflex(GFP,n,2). "; - } - - - - - enum 3 { - description - "The ODU3.ts rate (1,254,470.354 kbit/s) is used - to compute the rate of an ODUflex(GFP,n,3). "; - } - enum 4 { - description - "The ODU4.ts rate (1,301,467.133 kbit/s) is used - to compute the rate of an ODUflex(GFP,n,4). "; - } - } - description - "The ODUk.ts used to compute the rate of an ODUflex(GFP,n,k)"; - reference - "ITU-T G.709 v6.0 (06/2020), Table 7-8 and L.7: Interfaces for - the Optical Transport Network (OTN)"; - } - - typedef flexe-client-rate { - type union { - type uint16; - type enumeration { - enum "10G" { - description - "Represents a 10G FlexE Client signal (s=2)"; - } - enum "40G" { - description - "Represents a 40G FlexE Client signal (s=8)"; - } - } - } - description - "The FlexE Client signal rate (s x 5,156,250.000 kbit/s) - used to compute the rate of an ODUflex(IMP, s). - Valid values for s are s=2 (10G), s=4 (40G) and - s=5 x n (n x 25G). - In the first two cases an enumeration value - (either 10G or 40G) is used, while in the latter case - the value of n is used"; - reference - "ITU-T G.709 v6.0 (06/2020), Table 7-2: Interfaces for the - Optical Transport Network (OTN)"; - } - - typedef odtu-flex-type { - type enumeration { - enum "2" { - - - - - description - "The ODTU2.ts ODTU type."; - } - enum "3" { - description - "The ODTU3.ts ODTU type."; - } - enum "4" { - description - "The ODTU4.ts ODTU type."; - } - enum "Cn" { - description - "The ODTUCn.ts ODTU type."; - } - } - description - "The type of Optical Data Tributary Unit (ODTU), - whose nominal bitrate is used to compute the number of - Tributary Slots (TS) required by an ODUflex LSP, according to - the (19-1a) and (20-1a) formulas defined in G.709."; - reference - "ITU-T G.709 v6.0 (06/2020), Table 7-7, clause 19.6 and - clause 20.5: Interfaces for the Optical Transport - Network (OTN)"; - } - - typedef bandwidth-scientific-notation { - type string { - pattern - '0(\.0?)?([eE](\+)?0?)?|' - + '[1-9](\.[0-9]{0,6})?[eE](\+)?(9[0-6]|[1-8][0-9]|0?[0-9])?'; - } - units "bps"; - description - "Bandwidth values, expressed using the scientific notation - in bits per second. - - The encoding format is the external decimal-significant - character sequences specified in IEEE 754 and ISO/IEC C99 - for 32-bit decimal floating-point numbers: - (-1)**(S) * 10**(Exponent) * (Significant), - where Significant uses 7 digits. - - An implementation for this representation MAY use decimal32 - or binary32. The range of the Exponent is from -95 to +96 - for decimal32, and from -38 to +38 for binary32. - As a bandwidth value, the format is restricted to be - - - - - normalized, non-negative, and non-fraction: - n.dddddde{+}dd, N.DDDDDDE{+}DD, 0e0 or 0E0, - where 'd' and 'D' are decimal digits; 'n' and 'N' are - non-zero decimal digits; 'e' and 'E' indicate a power of ten. - Some examples are 0e0, 1e10, and 9.953e9."; - reference - "IEEE Std 754-2008: IEEE Standard for Floating-Point - Arithmetic. - ISO/IEC C99: Information technology - Programming - Languages - C."; - } - - /* - * Groupings - */ - - grouping otn-link-bandwidth { - description - "Bandwidth attributes for OTN links"; - container otn { - description - "Bandwidth attributes for OTN links"; - list odulist { - key "odu-type"; - description - "OTN bandwidth definition"; - leaf odu-type { - type identityref { - base odu-type; - } - description "ODU type"; - } - leaf number { - type uint16; - description "Number of ODUs"; - } - leaf ts-number { - when 'derived-from-or-self(../odu-type,"ODUflex") or - derived-from-or-self(../odu-type, - "ODUflex-resizable")' { - description - "Applicable when odu-type is ODUflex or - ODUflex-resizable"; - } - type uint16 { - range "1..4095"; - } - description - - - - - "The number of Tributary Slots (TS) that - could be used by all the ODUflex LSPs."; - } - } - } - } - - grouping otn-path-bandwidth { - description - "Bandwidth attributes for OTN paths."; - container otn { - description - "Bandwidth attributes for OTN paths."; - leaf odu-type { - type identityref { - base odu-type; - } - description "ODU type"; - } - choice oduflex-type { - when 'derived-from-or-self(./odu-type,"ODUflex") or - derived-from-or-self(./odu-type, - "ODUflex-resizable")' { - description - "Applicable when odu-type is ODUflex or - ODUflex-resizable"; - } - description - "Types of ODUflex used to compute the ODUflex - nominal bit rate."; - reference - "ITU-T G.709 v6.0 (06/2020), Table 7-2: Interfaces for the - Optical Transport Network (OTN)"; - case generic { - leaf nominal-bit-rate { - type union { - type l1-types:bandwidth-scientific-notation; - type rt-types:bandwidth-ieee-float32; - } - mandatory true; - description - "Nominal ODUflex bit rate."; - } - } - case cbr { - leaf client-type { - type identityref { - base client-signal; - - - - - } - mandatory true; - description - "The type of Constant Bit Rate (CBR) client signal - of an ODUflex(CBR)."; - } - } - case gfp-n-k { - leaf gfp-n { - type uint8 { - range "1..80"; - } - mandatory true; - description - "The value of n for an ODUflex(GFP,n,k)."; - reference - "ITU-T G.709 v6.0 (06/2020), Tables 7-8 and L.7: - Interfaces for the Optical Transport Network (OTN)"; - } - leaf gfp-k { - type gfp-k; - description - "The value of k for an ODUflex(GFP,n,k). - - If omitted, it is calculated from the value of gfp-n - as described in Table 7-8 of G.709"; - reference - "ITU-T G.709 v6.0 (06/2020), Tables 7-8 and L.7: - Interfaces for the Optical Transport Network (OTN)"; - } - } - case flexe-client { - leaf flexe-client { - type flexe-client-rate; - mandatory true; - description - "The rate of the FlexE-client for an ODUflex(IMP,s)."; - } - } - case flexe-aware { - leaf flexe-aware-n { - type uint16; - mandatory true; - description - "The rate of FlexE-aware client signal - for ODUflex(FlexE-aware)"; - } - } - - - - - case packet { - leaf opuflex-payload-rate { - type union { - type l1-types:bandwidth-scientific-notation; - type rt-types:bandwidth-ieee-float32; - } - mandatory true; - description - "Either the GFP-F encapsulated packet client nominal - bit rate for an ODUflex(GFP) or the 64b/66b encoded - packet client nominal bit rate for an ODUflex(IMP)."; - } - } - } - } - } - - grouping otn-max-path-bandwidth { - description - "Maximum bandwidth attributes for OTN paths."; - container otn { - description - "Maximum bandwidth attributes for OTN paths."; - leaf odu-type { - type identityref { - base odu-type; - } - description "ODU type"; - } - leaf max-ts-number { - when 'derived-from-or-self(../odu-type,"ODUflex") or - derived-from-or-self(../odu-type, - "ODUflex-resizable")' { - description - "Applicable when odu-type is ODUflex or - ODUflex-resizable"; - } - type uint16 { - range "1..4095"; - } - description - "The maximum number of Tributary Slots (TS) that could be - used by an ODUflex LSP."; - } - } - } - - grouping otn-label-range-info { - - - - - description - "Label range information for OTN. - - This grouping SHOULD be used together with the - otn-label-start-end and otn-label-step groupings to provide - OTN technology-specific label information to the models which - use the label-restriction-info grouping defined in the module - ietf-te-types."; - container otn-label-range { - description - "Label range information for OTN."; - leaf range-type { - type otn-label-range-type; - description "The type of range (e.g., TPN or TS) - to which the label range applies"; - } - leaf tsg { - type identityref { - base tributary-slot-granularity; - } - description - "Tributary slot granularity (TSG) to which the label range - applies. - - This leaf MUST be present when the range-type is TS. - - This leaf MAY be omitted when mapping an ODUk over an OTUk - Link. In this case the range-type is tpn, with only one - entry (ODUk), and the tpn range has only one value (1)."; - reference - "ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - leaf-list odu-type-list { - type identityref { - base odu-type; - } - description - "List of ODU types to which the label range applies. - - An Empty odu-type-list means that the label range - applies to all the supported ODU types."; - } - leaf priority { - type uint8 { - range 0..7; - } - description - - - - - "Priority in Interface Switching Capability - Descriptor (ISCD)."; - reference - "RFC4203: OSPF Extensions in Support of Generalized - Multi-Protocol Label Switching (GMPLS)"; - } - } - } - - grouping otn-label-start-end { - description - "The OTN label-start or label-end used to specify an OTN label - range. - - This grouping is dependent on the range-type defined in the - otn-label-range-info grouping. - - This grouping SHOULD be used together with the - otn-label-range-info and otn-label-step groupings to provide - OTN technology-specific label information to the models which - use the label-restriction-info grouping defined in the module - ietf-te-types."; - container otn { - description - "Label start or label end for OTN."; - choice range-type { - description - "OTN label range type, either TPN range or TS range"; - case trib-port { - leaf tpn { - when "../../../../otn-label-range/range-type = - 'trib-port'" { - description - "Valid only when range-type represented by - trib-port"; - } - type otn-tpn; - description - "Tributary Port Number (TPN)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of - Evolving G.709 Optical Transport Networks."; - } - } - case trib-slot { - leaf ts { - when "../../../../otn-label-range/range-type = - 'trib-slot'" { - - - - - description - "Valid only when range-type represented by - trib-slot"; - } - type otn-ts; - description - "Tributary Slot (TS) number."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of - Evolving G.709 Optical Transport Networks"; - } - } - } - } - } - - grouping otn-label-hop { - description "OTN Label"; - reference - "RFC7139, section 6: GMPLS Signaling Extensions for Control of - Evolving G.709 Optical Transport Networks"; - container otn { - description - "Label hop for OTN."; - leaf tpn { - type otn-tpn; - description - "Tributary Port Number (TPN)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of - Evolving G.709 Optical Transport Networks."; - } - leaf tsg { - type identityref { - base tributary-slot-granularity; - } - description "Tributary Slot Granularity (TSG)."; - reference - "ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - leaf ts-list { - type string { - pattern "([1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?" - + "(,[1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?)*)"; - } - description - "A list of available Tributary Slots (TS) ranging - - - - - between 1 and 4095. If multiple values or - ranges are given, they all MUST be disjoint - and MUST be in ascending order. - For example 1-20,25,50-1000."; - reference - "RFC 7139: GMPLS Signaling Extensions for Control - of Evolving G.709 Optical Transport Networks"; - } - } - } - - grouping otn-label-step { - description - "Label step for OTN. - - This grouping is dependent on the range-type defined in the - otn-label-range-info grouping. - - This grouping SHOULD be used together with the - otn-label-range-info and otn-label-start-end groupings to - provide OTN technology-specific label information to the - models which use the label-restriction-info grouping defined - in the module ietf-te-types."; - container otn { - description - "Label step for OTN"; - choice range-type { - description - "OTN label range type, either TPN range or TS range"; - case trib-port { - leaf tpn { - when "../../../otn-label-range/range-type = - 'trib-port'" { - description - "Valid only when range-type represented by - trib-port"; - } - type otn-tpn; - description - "Label step which represents possible increments for - Tributary Port Number (TPN)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of - Evolving G.709 Optical Transport Networks."; - } - } - case trib-slot { - leaf ts { - - - - - when "../../../otn-label-range/range-type = - 'trib-slot'" { - description - "Valid only when range-type represented by - trib-slot"; - } - type otn-ts; - description - "Label step which represents possible increments for - Tributary Slot (TS) number."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of - Evolving G.709 Optical Transport Networks."; - } - } - } - } - } - } diff --git a/src/nbi/service/ietf_network/yang/ietf-layer1-types@2024-02-22.yang b/src/nbi/service/ietf_network/yang/ietf-layer1-types@2024-02-22.yang new file mode 100644 index 0000000000000000000000000000000000000000..5269ea60af8090263341c1e408ca767b5c32701b --- /dev/null +++ b/src/nbi/service/ietf_network/yang/ietf-layer1-types@2024-02-22.yang @@ -0,0 +1,1361 @@ +module ietf-layer1-types { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-layer1-types"; + prefix "l1-types"; + + import ietf-routing-types { + prefix rt-types; + reference + "RFC 8294: Common YANG Data Types for the Routing Area"; + } + + organization + "IETF CCAMP Working Group"; + contact + "WG Web: + WG List: + + Editor: Haomian Zheng + + + Editor: Italo Busi + "; + + description + "This module defines Layer 1 YANG types. The model fully conforms + to the Network Management Datastore Architecture (NMDA). + + Copyright (c) 2024 IETF Trust and the persons + identified as authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC XXXX; see + the RFC itself for full legal notices. + + The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL + NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', + 'MAY', and 'OPTIONAL' in this document are to be interpreted as + described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, + they appear in all capitals, as shown here."; + + revision "2024-02-22" { + description + "Initial Version"; + reference + "RFC XXXX: A YANG Data Model for Layer 1 Types"; + // RFC Editor: replace RFC XXXX with actual RFC number, + // update date information and remove this note. + } + + /* + * Identities + */ + + identity tributary-slot-granularity { + description + "Tributary Slot Granularity (TSG)."; + reference + "ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity tsg-1.25G { + base tributary-slot-granularity; + description + "1.25G tributary slot granularity."; + } + + identity tsg-2.5G { + base tributary-slot-granularity; + description + "2.5G tributary slot granularity."; + } + + identity tsg-5G { + base tributary-slot-granularity; + description + "5G tributary slot granularity."; + } + + identity odu-type { + description + "Base identity from which specific Optical Data Unit (ODU) + type is derived."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ODU0 { + base odu-type; + description + "ODU0 type (1.24Gb/s)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ODU1 { + base odu-type; + description + "ODU1 type (2.49Gb/s)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ODU2 { + base odu-type; + description + "ODU2 type (10.03Gb/s)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ODU2e { + base odu-type; + description + "ODU2e type (10.39Gb/s)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ODU3 { + base odu-type; + description + "ODU3 type (40.31Gb/s)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ODU4 { + base odu-type; + description + "ODU4 type (104.79Gb/s)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ODUflex { + base odu-type; + description + "ODUflex type (flexible bit rate, not resizable). + + It could be used for any type of ODUflex, including + ODUflex(CBR), ODUflex(GFP), ODUflex(GFP,n,k), ODUflex(IMP,s), + ODUflex(IMP) and ODUflex(FlexE-aware)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + identity ODUflex-resizable { + base odu-type; + description + "ODUflex protocol (flexible bit rate, resizable). + + It could be used only for ODUflex(GFP,n,k)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity protocol { + description + "Base identity from which specific protocol is derived."; + reference + "MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity Ethernet { + base protocol; + description + "Ethernet protocol."; + reference + "MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity Fibre-Channel { + base protocol; + description + "Fibre-Channel (FC) protocol."; + reference + "MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity SDH { + base protocol; + description + "SDH protocol."; + reference + "MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity SONET { + base protocol; + description + "SONET protocol."; + reference + "MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity client-signal { + description + "Base identity from which specific Constant Bit Rate (CBR) + client signal is derived"; + } + + identity coding-func { + description + "Base identity from which specific coding function + is derived."; + reference + "MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity ETH-1Gb { + base client-signal; + description + "Client signal type of 1GbE."; + reference + "IEEE 802.3-2018, Clause 36: IEEE Standard for Ethernet + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ETH-10Gb-LAN { + base client-signal; + description + "Client signal type of ETH-10Gb-LAN (10.3 Gb/s)."; + reference + "IEEE 802.3-2018, Clause 49: IEEE Standard for Ethernet + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ETH-10Gb-WAN { + base client-signal; + description + "Client signal type of ETH-10Gb-WAN (9.95 Gb/s)."; + reference + "IEEE 802.3-2018, Clause 50: IEEE Standard for Ethernet + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ETH-40Gb { + base client-signal; + description + "Client signal type of 40GbE."; + reference + "IEEE 802.3-2018, Clause 82: IEEE Standard for Ethernet + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ETH-100Gb { + base client-signal; + description + "Client signal type of 100GbE."; + reference + "IEEE 802.3-2018, Clause 82: IEEE Standard for Ethernet + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity STM-1 { + base client-signal; + base coding-func; + description + "Client signal type of STM-1; + STM-1 G.707 (N=1) coding function."; + reference + "ITU-T G.707 v7.0 (01/2007): Network node interface for the + synchronous digital hierarchy (SDH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity STM-4 { + base client-signal; + base coding-func; + description + "Client signal type of STM-4; + STM-4 G.707 (N=4) coding function."; + reference + "ITU-T G.707 v7.0 (01/2007): Network node interface for the + synchronous digital hierarchy (SDH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity STM-16 { + base client-signal; + base coding-func; + description + "Client signal type of STM-16; + STM-16 G.707 (N=16) coding function."; + reference + "ITU-T G.707 v7.0 (01/2007): Network node interface for the + synchronous digital hierarchy (SDH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity STM-64 { + base client-signal; + base coding-func; + description + "Client signal type of STM-64; + STM-64 G.707 (N=64) coding function."; + reference + "ITU-T G.707 v7.0 (01/2007): Network node interface for the + synchronous digital hierarchy (SDH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity STM-256 { + base client-signal; + base coding-func; + description + "Client signal type of STM-256; + STM-256 G.707 (N=256) coding function."; + reference + "ITU-T G.707 v7.0 (01/2007): Network node interface for the + synchronous digital hierarchy (SDH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity OC-3 { + base client-signal; + base coding-func; + description + "Client signal type of OC3; + OC-3 GR-253-CORE (N=3) coding function."; + reference + "ANSI T1.105-2001: Synchronous Optical Network (SONET) + Basic Description including Multiplex Structure, Rates, + and Formats + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity OC-12 { + base client-signal; + base coding-func; + description + "Client signal type of OC12; + OC-12 GR-253-CORE (N=12) coding function."; + reference + "ANSI T1.105-2001: Synchronous Optical Network (SONET) + Basic Description including Multiplex Structure, Rates, + and Formats + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity OC-48 { + base client-signal; + base coding-func; + description + "Client signal type of OC48; + OC-48 GR-253-CORE (N=48) coding function."; + reference + "ANSI T1.105-2001: Synchronous Optical Network (SONET) + Basic Description including Multiplex Structure, Rates, + and Formats + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity OC-192 { + base client-signal; + base coding-func; + description + "Client signal type of OC192; + OC-192 GR-253-CORE (N=192) coding function."; + reference + "ANSI T1.105-2001: Synchronous Optical Network (SONET) + Basic Description including Multiplex Structure, Rates, + and Formats + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity OC-768 { + base client-signal; + base coding-func; + description + "Client signal type of OC768; + OC-768 GR-253-CORE (N=768) coding function."; + reference + "ANSI T1.105-2001: Synchronous Optical Network (SONET) + Basic Description including Multiplex Structure, Rates, + and Formats + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity FC-100 { + base client-signal; + base coding-func; + description + "Client signal type of Fibre Channel FC-100; + FC-100 FC-FS-2 (1.0625 Gb/s) coding function."; + reference + "ANSI INCITS 230-1994 R1999): Information Technology - + Fibre Channel - Physical and Signaling Interface (FC-PH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity FC-200 { + base client-signal; + base coding-func; + description + "Client signal type of Fibre Channel FC-200; + FC-200 FC-FS-2 (2.125 Gb/s) coding function."; + reference + "ANSI INCITS 230-1994 R1999): Information Technology - + Fibre Channel - Physical and Signaling Interface (FC-PH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity FC-400 { + base client-signal; + base coding-func; + description + "Client signal type of Fibre Channel FC-400; + FC-400 FC-FS-2 (4.250 Gb/s) coding function."; + reference + "ANSI INCITS 230-1994 R1999): Information Technology - + Fibre Channel - Physical and Signaling Interface (FC-PH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity FC-800 { + base client-signal; + base coding-func; + description + "Client signal type of Fibre Channel FC-800; + FC-800 FC-FS-2 (8.500 Gb/s) coding function."; + reference + "ANSI INCITS 230-1994 R1999): Information Technology - + Fibre Channel - Physical and Signaling Interface (FC-PH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity FC-1200 { + base client-signal; + base coding-func; + description + "Client signal type of Fibre Channel FC-1200; + FC-1200 FC-10GFC (10.51875 Gb/s) coding function."; + reference + "ANSI INCITS 230-1994 R1999): Information Technology - + Fibre Channel - Physical and Signaling Interface (FC-PH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity FC-1600 { + base client-signal; + base coding-func; + description + "Client signal type of Fibre Channel FC-1600; + FC-1600 FC-FS-3 (14.025 Gb/s) coding function."; + reference + "ANSI INCITS 230-1994 R1999): Information Technology - + Fibre Channel - Physical and Signaling Interface (FC-PH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity FC-3200 { + base client-signal; + base coding-func; + description + "Client signal type of Fibre Channel FC-3200; + FC-3200 FC-FS-4 (28.05 Gb/s) coding function."; + reference + "ANSI INCITS 230-1994 R1999): Information Technology - + Fibre Channel - Physical and Signaling Interface (FC-PH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity ETH-1000X { + base coding-func; + description + "1000BASE-X PCS clause 36 coding function."; + reference + "IEEE 802.3-2018, Clause 36: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity ETH-10GW { + base coding-func; + description + "IEEE 802.3-2018, Clause 50: IEEE Standard for Ethernet + + 10GBASE-W (WAN PHY) PCS clause 49 and WIS clause 50 + coding function."; + reference + "MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity ETH-10GR { + base coding-func; + description + "10GBASE-R (LAN PHY) PCS clause 49 coding function."; + reference + "IEEE 802.3-2018, Clause 49: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity ETH-40GR { + base coding-func; + description + "40GBASE-R PCS clause 82 coding function."; + reference + "IEEE 802.3-2018, Clause 82: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity ETH-100GR { + base coding-func; + description + "100GBASE-R PCS clause 82 coding function."; + reference + "IEEE 802.3-2018, Clause 82: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity optical-interface-func { + description + "Base identity from which optical-interface-function + is derived."; + reference + "MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity SX-PMD-1000 { + base optical-interface-func; + description + "SX-PMD-clause-38 Optical Interface function for + 1000BASE-X PCS-36."; + reference + "IEEE 802.3-2018, Clause 38: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity LX-PMD-1000 { + base optical-interface-func; + description + "LX-PMD-clause-38 Optical Interface function for + 1000BASE-X PCS-36."; + reference + "IEEE 802.3-2018, Clause 38: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity LX10-PMD-1000 { + base optical-interface-func; + description + "LX10-PMD-clause-59 Optical Interface function for + 1000BASE-X PCS-36."; + reference + "IEEE 802.3-2018, Clause 59: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity BX10-PMD-1000 { + base optical-interface-func; + description + "BX10-PMD-clause-59 Optical Interface function for + 1000BASE-X PCS-36."; + reference + "IEEE 802.3-2018, Clause 59: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity LW-PMD-10G { + base optical-interface-func; + description + "LW-PMD-clause-52 Optical Interface function for + 10GBASE-W PCS-49-WIS-50."; + reference + "IEEE 802.3-2018, Clause 52: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity EW-PMD-10G { + base optical-interface-func; + description + "EW-PMD-clause-52 Optical Interface function for + 10GBASE-W PCS-49-WIS-50."; + reference + "IEEE 802.3-2018, Clause 52: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity LR-PMD-10G { + base optical-interface-func; + description + "LR-PMD-clause-52 Optical Interface function for + 10GBASE-R PCS-49."; + reference + "IEEE 802.3-2018, Clause 52: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity ER-PMD-10G { + base optical-interface-func; + description + "ER-PMD-clause-52 Optical Interface function for + 10GBASE-R PCS-49."; + reference + "IEEE 802.3-2018, Clause 52: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity LR4-PMD-40G { + base optical-interface-func; + description + "LR4-PMD-clause-87 Optical Interface function for + 40GBASE-R PCS-82."; + reference + "IEEE 802.3-2018, Clause 87: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity ER4-PMD-40G { + base optical-interface-func; + description + "ER4-PMD-clause-87 Optical Interface function for + 40GBASE-R PCS-82."; + reference + "IEEE 802.3-2018, Clause 87: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity FR-PMD-40G { + base optical-interface-func; + description + "FR-PMD-clause-89 Optical Interface function for + 40GBASE-R PCS-82."; + reference + "IEEE 802.3-2018, Clause 89: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity LR4-PMD-100G { + base optical-interface-func; + description + "LR4-PMD-clause-88 Optical Interface function for + 100GBASE-R PCS-82."; + reference + "IEEE 802.3-2018, Clause 88: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + identity ER4-PMD-100G { + base optical-interface-func; + description + "ER4-PMD-clause-88 Optical Interface function for + 100GBASE-R PCS-82."; + reference + "IEEE 802.3-2018, Clause 88: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + /* + * Typedefs + */ + + typedef otn-tpn { + type uint16 { + range "1..4095"; + } + description + "Tributary Port Number (TPN) for OTN."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks."; + } + + typedef otn-ts { + type uint16 { + range "1..4095"; + } + description + "Tributary Slot (TS) for OTN."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks."; + } + + typedef otn-label-range-type { + type enumeration { + enum trib-slot { + description + "Defines a range of OTN tributary slots (TS)."; + } + enum trib-port { + description + "Defines a range of OTN tributary ports (TPN)."; + } + } + description + "Defines the type of OTN label range: TS or TPN."; + } + + typedef gfp-k { + type enumeration { + enum 2 { + description + "The ODU2.ts rate (1,249,177.230 kbit/s) is used + to compute the rate of an ODUflex(GFP,n,2)."; + } + enum 3 { + description + "The ODU3.ts rate (1,254,470.354 kbit/s) is used + to compute the rate of an ODUflex(GFP,n,3)."; + } + enum 4 { + description + "The ODU4.ts rate (1,301,467.133 kbit/s) is used + to compute the rate of an ODUflex(GFP,n,4)."; + } + } + description + "The ODUk.ts used to compute the rate of an ODUflex(GFP,n,k)."; + reference + "ITU-T G.709 v6.0 (06/2020), Table 7-8 and L.7: Interfaces for + the Optical Transport Network (OTN)"; + } + + typedef flexe-client-rate { + type union { + type uint16; + type enumeration { + enum "10G" { + description + "Represents a 10G FlexE Client signal (s=2)."; + } + enum "40G" { + description + "Represents a 40G FlexE Client signal (s=8)."; + } + } + } + description + "The FlexE Client signal rate (s x 5,156,250.000 kbit/s) + used to compute the rate of an ODUflex(IMP, s). + + Valid values for s are s=2 (10G), s=4 (40G) and + s=5 x n (n x 25G). + + In the first two cases an enumeration value + (either 10G or 40G) is used, while in the latter case + the value of n is used."; + reference + "ITU-T G.709 v6.0 (06/2020), Table 7-2: Interfaces for the + Optical Transport Network (OTN)"; + } + + typedef odtu-flex-type { + type enumeration { + enum "2" { + description + "The ODTU2.ts ODTU type."; + } + enum "3" { + description + "The ODTU3.ts ODTU type."; + } + enum "4" { + description + "The ODTU4.ts ODTU type."; + } + enum "Cn" { + description + "The ODTUCn.ts ODTU type."; + } + } + description + "The type of Optical Data Tributary Unit (ODTU), + whose nominal bitrate is used to compute the number of + Tributary Slots (TS) required by an ODUflex LSP, according to + the (19-1a) and (20-1a) formulas defined in G.709."; + reference + "ITU-T G.709 v6.0 (06/2020), Table 7-7, clause 19.6 and + clause 20.5: Interfaces for the Optical Transport + Network (OTN)"; + } + + typedef bandwidth-scientific-notation { + type string { + pattern + '0(\.0?)?([eE](\+)?0?)?|' + + '[1-9](\.[0-9]{0,6})?[eE](\+)?(9[0-6]|[1-8][0-9]|0?[0-9])?'; + } + units "bps"; + description + "Bandwidth values, expressed using the scientific notation + in bits per second. + + The encoding format is the external decimal-significant + character sequences specified in IEEE 754 and ISO/IEC 9899:1999 + for 32-bit decimal floating-point numbers: + (-1)**(S) * 10**(Exponent) * (Significant), + where Significant uses 7 digits. + + An implementation for this representation MAY use decimal32 + or binary32. The range of the Exponent is from -95 to +96 + for decimal32, and from -38 to +38 for binary32. + As a bandwidth value, the format is restricted to be + normalized, non-negative, and non-fraction: + n.dddddde{+}dd, N.DDDDDDE{+}DD, 0e0 or 0E0, + where 'd' and 'D' are decimal digits; 'n' and 'N' are + non-zero decimal digits; 'e' and 'E' indicate a power of ten. + Some examples are 0e0, 1e10, and 9.953e9."; + reference + "IEEE Std 754-2001: IEEE Standard for Floating-Point + Arithmetic + + ISO/IEC 9899:1999: Information technology - Programming + Languages - C"; + } + + /* + * Groupings + */ + + grouping otn-link-bandwidth { + description + "Bandwidth attributes for OTN links."; + container otn-bandwidth { + description + "Bandwidth attributes for OTN links."; + list odulist { + key "odu-type"; + description + "OTN bandwidth definition"; + leaf odu-type { + type identityref { + base odu-type; + } + description "ODU type"; + } + leaf number { + type uint16; + description "Number of ODUs."; + } + leaf ts-number { + when 'derived-from-or-self(../odu-type,"ODUflex") or + derived-from-or-self(../odu-type, + "ODUflex-resizable")' { + description + "Applicable when odu-type is ODUflex or + ODUflex-resizable."; + } + type uint16 { + range "1..4095"; + } + description + "The number of Tributary Slots (TS) that + could be used by all the ODUflex LSPs."; + } + } + } + } + + grouping otn-path-bandwidth { + description + "Bandwidth attributes for OTN paths."; + container otn-bandwidth { + description + "Bandwidth attributes for OTN paths."; + leaf odu-type { + type identityref { + base odu-type; + } + description "ODU type"; + } + choice oduflex-type { + when 'derived-from-or-self(./odu-type,"ODUflex") or + derived-from-or-self(./odu-type, + "ODUflex-resizable")' { + description + "Applicable when odu-type is ODUflex or + ODUflex-resizable."; + } + description + "Types of ODUflex used to compute the ODUflex + nominal bit rate."; + reference + "ITU-T G.709 v6.0 (06/2020), Table 7-2: Interfaces for the + Optical Transport Network (OTN)"; + case generic { + leaf nominal-bit-rate { + type union { + type l1-types:bandwidth-scientific-notation; + type rt-types:bandwidth-ieee-float32; + } + mandatory true; + description + "Nominal ODUflex bit rate."; + } + } + case cbr { + leaf client-type { + type identityref { + base client-signal; + } + mandatory true; + description + "The type of Constant Bit Rate (CBR) client signal + of an ODUflex(CBR)."; + } + } + case gfp-n-k { + leaf gfp-n { + type uint8 { + range "1..80"; + } + mandatory true; + description + "The value of n for an ODUflex(GFP,n,k)."; + reference + "ITU-T G.709 v6.0 (06/2020), Tables 7-8 and L.7: + Interfaces for the Optical Transport Network (OTN)"; + } + leaf gfp-k { + type gfp-k; + description + "The value of k for an ODUflex(GFP,n,k). + + If omitted, it is calculated from the value of gfp-n + as described in Table 7-8 of G.709."; + reference + "ITU-T G.709 v6.0 (06/2020), Tables 7-8 and L.7: + Interfaces for the Optical Transport Network (OTN)"; + } + } + case flexe-client { + leaf flexe-client { + type flexe-client-rate; + mandatory true; + description + "The rate of the FlexE-client for an ODUflex(IMP,s)."; + } + } + case flexe-aware { + leaf flexe-aware-n { + type uint16; + mandatory true; + description + "The rate of FlexE-aware client signal + for ODUflex(FlexE-aware)"; + } + } + case packet { + leaf opuflex-payload-rate { + type union { + type l1-types:bandwidth-scientific-notation; + type rt-types:bandwidth-ieee-float32; + } + mandatory true; + description + "Either the GFP-F encapsulated packet client nominal + bit rate for an ODUflex(GFP) or the 64b/66b encoded + packet client nominal bit rate for an ODUflex(IMP)."; + } + } + } + } + } + + grouping otn-max-path-bandwidth { + description + "Maximum bandwidth attributes for OTN paths."; + container otn-bandwidth { + description + "Maximum bandwidth attributes for OTN paths."; + leaf odu-type { + type identityref { + base odu-type; + } + description "ODU type."; + } + leaf max-ts-number { + when 'derived-from-or-self(../odu-type,"ODUflex") or + derived-from-or-self(../odu-type, + "ODUflex-resizable")' { + description + "Applicable when odu-type is ODUflex or + ODUflex-resizable."; + } + type uint16 { + range "1..4095"; + } + description + "The maximum number of Tributary Slots (TS) that could be + used by an ODUflex LSP."; + } + } + } + + grouping otn-label-range-info { + description + "Label range information for OTN. + + This grouping SHOULD be used together with the + otn-label-start-end and otn-label-step groupings to provide + OTN technology-specific label information to the models which + use the label-restriction-info grouping defined in the module + ietf-te-types."; + container otn-label-range { + description + "Label range information for OTN."; + leaf range-type { + type otn-label-range-type; + description "The type of range (e.g., TPN or TS) + to which the label range applies"; + } + leaf tsg { + type identityref { + base tributary-slot-granularity; + } + description + "Tributary slot granularity (TSG) to which the label range + applies. + + This leaf MUST be present when the range-type is TS. + + This leaf MAY be omitted when mapping an ODUk over an OTUk + Link. In this case the range-type is tpn, with only one + entry (ODUk), and the tpn range has only one value (1)."; + reference + "ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + leaf-list odu-type-list { + type identityref { + base odu-type; + } + description + "List of ODU types to which the label range applies. + + An Empty odu-type-list means that the label range + applies to all the supported ODU types."; + } + leaf priority { + type uint8 { + range 0..7; + } + description + "Priority in Interface Switching Capability + Descriptor (ISCD)."; + reference + "RFC4203: OSPF Extensions in Support of Generalized + Multi-Protocol Label Switching (GMPLS)"; + } + } + } + + grouping otn-label-start-end { + description + "The OTN label-start or label-end used to specify an OTN label + range. + + This grouping is dependent on the range-type defined in the + otn-label-range-info grouping. + + This grouping SHOULD be used together with the + otn-label-range-info and otn-label-step groupings to provide + OTN technology-specific label information to the models which + use the label-restriction-info grouping defined in the module + ietf-te-types."; + container otn-label { + description + "Label start or label end for OTN. + + It is either a TPN or a TS depending on the OTN label range + type specified in the 'range-type' leaf defined in the + otn-label-range-info grouping."; + leaf tpn { + when "../../../../otn-label-range/range-type = + 'trib-port'" { + description + "Valid only when range-type represented by + trib-port."; + } + type otn-tpn; + description + "Tributary Port Number (TPN)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of + Evolving G.709 Optical Transport Networks"; + } + leaf ts { + when "../../../../otn-label-range/range-type = + 'trib-slot'" { + description + "Valid only when range-type represented by + trib-slot."; + } + type otn-ts; + description + "Tributary Slot (TS) number."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of + Evolving G.709 Optical Transport Networks"; + } + } + } + + grouping otn-label-hop { + description "OTN Label"; + reference + "RFC7139, section 6: GMPLS Signaling Extensions for Control of + Evolving G.709 Optical Transport Networks"; + container otn-label { + description + "Label hop for OTN."; + leaf tpn { + type otn-tpn; + description + "Tributary Port Number (TPN)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of + Evolving G.709 Optical Transport Networks"; + } + leaf tsg { + type identityref { + base tributary-slot-granularity; + } + description "Tributary Slot Granularity (TSG)."; + reference + "ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + leaf ts-list { + type string { + pattern "([1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?" + + "(,[1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?)*)"; + } + description + "A list of available Tributary Slots (TS) ranging + between 1 and 4095. If multiple values or + ranges are given, they all MUST be disjoint + and MUST be in ascending order. + For example 1-20,25,50-1000."; + reference + "RFC 7139: GMPLS Signaling Extensions for Control + of Evolving G.709 Optical Transport Networks"; + } + } + } + + grouping otn-label-step { + description + "Label step for OTN. + + This grouping is dependent on the range-type defined in the + otn-label-range-info grouping. + + This grouping SHOULD be used together with the + otn-label-range-info and otn-label-start-end groupings to + provide OTN technology-specific label information to the + models which use the label-restriction-info grouping defined + in the module ietf-te-types."; + container otn-label-step { + description + "Label step for OTN. + + It is either a TPN or a TS depending on the OTN label range + type specified in the 'range-type' leaf defined in the + otn-label-range-info grouping."; + leaf tpn { + when "../../../otn-label-range/range-type = + 'trib-port'" { + description + "Valid only when range-type represented by + trib-port."; + } + type otn-tpn; + description + "Label step which represents possible increments for + Tributary Port Number (TPN)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of + Evolving G.709 Optical Transport Networks"; + } + leaf ts { + when "../../../otn-label-range/range-type = + 'trib-slot'" { + description + "Valid only when range-type represented by + trib-slot"; + } + type otn-ts; + description + "Label step which represents possible increments for + Tributary Slot (TS) number."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of + Evolving G.709 Optical Transport Networks"; + } + } + } +} diff --git a/src/nbi/service/ietf_network/yang/ietf-otn-topology@2023-07-06.yang b/src/nbi/service/ietf_network/yang/ietf-otn-topology@2023-07-06.yang deleted file mode 100644 index 587612e8e7acb1f2eedb329b2f13a1a0626f3181..0000000000000000000000000000000000000000 --- a/src/nbi/service/ietf_network/yang/ietf-otn-topology@2023-07-06.yang +++ /dev/null @@ -1,2405 +0,0 @@ - module ietf-otn-topology { - yang-version 1.1; - namespace "urn:ietf:params:xml:ns:yang:ietf-otn-topology"; - prefix "otnt"; - - import ietf-network { - prefix "nw"; - reference "RFC 8345: A YANG Data Model for Network Topologies"; - } - - import ietf-network-topology { - prefix "nt"; - reference "RFC 8345: A YANG Data Model for Network Topologies"; - } - - import ietf-te-topology { - prefix "tet"; - reference - "RFC 8795: YANG Data Model for Traffic Engineering - (TE) Topologies"; - } - - import ietf-layer1-types { - prefix "l1-types"; - reference - "I-D.ietf-ccamp-layer1-types: A YANG Data Model - for Layer 1 Types"; - } - - organization - "IETF CCAMP Working Group"; - contact - "WG Web: - WG List: - - Editor: Haomian Zheng - - - Editor: Italo Busi - - - Editor: Xufeng Liu - - - Editor: Sergio Belotti - - - - - - Editor: Oscar Gonzalez de Dios - "; - - description - "This module defines a protocol independent Layer 1/ODU topology - data model. The model fully conforms - to the Network Management Datastore Architecture (NMDA). - - Copyright (c) 2023 IETF Trust and the persons identified - as authors of the code. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, is permitted pursuant to, and subject - to the license terms contained in, the Revised BSD License - set forth in Section 4.c of the IETF Trust's Legal Provisions - Relating to IETF Documents - (https://trustee.ietf.org/license-info). - - This version of this YANG module is part of RFC XXXX; see - the RFC itself for full legal notices. - - The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL - NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', - 'MAY', and 'OPTIONAL' in this document are to be interpreted as - described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, - they appear in all capitals, as shown here."; - - revision 2023-07-06 { - description - "Initial Revision"; - reference - "RFC XXXX: A YANG Data Model for Optical Transport Network - Topology"; - // RFC Ed.: replace XXXX with actual RFC number, update date - // information and remove this note - } - - /* - * Groupings - */ - - grouping label-range-info { - description - "OTN technology-specific label range related information with - a presence container indicating that the label range is an - OTN technology-specific label range. - - This grouping SHOULD be used together with the - - - - - otn-label-start-end and otn-label-step groupings to provide - OTN technology-specific label information to the models which - use the label-restriction-info grouping defined in the module - ietf-te-types."; - uses l1-types:otn-label-range-info { - refine otn-label-range { - presence - "Indicates the label range is an OTN label range. - - This container MUST NOT be present if there are other - presence containers or attributes indicating another type - of label range."; - } - } - } - - /* - * Data nodes - */ - - augment "/nw:networks/nw:network/nw:network-types/" - + "tet:te-topology" { - container otn-topology { - presence "indicates a topology type of Optical Transport - Network (OTN)-electrical layer."; - description "OTN topology type"; - } - description "augment network types to include OTN newtork"; - } - - augment "/nw:networks/nw:network/nw:node/tet:te" - + "/tet:te-node-attributes" { - when "../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description "Augment only for OTN network."; - } - description "Augment TE node attributes."; - container otn-node { - presence "The TE node is an OTN node."; - description - "Introduce new TE node type for OTN node."; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:te-link-attributes" { - when "../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - - - - - description "Augment only for OTN network."; - } - description "Augment link configuration"; - - container otn-link { - description - "Attributes of the OTN Link."; - leaf odtu-flex-type { - type l1-types:odtu-flex-type; - description - "The type of Optical Data Tributary Unit (ODTU) - whose nominal bitrate is used to compute the number of - Tributary Slots (TS) required by the ODUflex LSPs set up - on this OTN Link."; - } - leaf tsg { - type identityref { - base l1-types:tributary-slot-granularity; - } - description "Tributary slot granularity."; - reference - "ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - leaf distance { - type uint32; - description "distance in the unit of kilometers"; - } - } - container client-svc { - presence - "When present, indicates that the Link supports Costant - Bit Rate (CBR) client signals."; - description - "Attributes of the Link supporting CBR client signals."; - leaf-list supported-client-signal { - type identityref { - base l1-types:client-signal; - } - min-elements 1; - description - "List of client signal types supported by the Link."; - } - } - } - - augment "/nw:networks/nw:network/nw:node/nt:termination-point/" - + "tet:te" { - - - - - when "../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description "Augment only for OTN network"; - } - description "OTN TP attributes config in ODU topology."; - - container otn-ltp { - description - "Attributes of the OTN Link Termination Point (LTP)."; - leaf odtu-flex-type { - type l1-types:odtu-flex-type; - description - "The type of Optical Data Tributary Unit (ODTU) - whose nominal bitrate is used to compute the number of - Tributary Slots (TS) required by the ODUflex LSPs set up - on this OTN Link Termination Point (LTP)."; - } - } - container client-svc { - presence - "When present, indicates that the Link Termination Point - (LTP) supports Costant Bit Rate (CBR) client signals."; - description - "OTN LTP Service attributes."; - leaf-list supported-client-signal { - type identityref { - base l1-types:client-signal; - } - description - "List of client signal types supported by the LTP."; - } - } - } - - /* - * Augment TE bandwidth - */ - - augment "/nw:networks/nw:network/nw:node/nt:termination-point/" - + "tet:te/" - + "tet:interface-switching-capability/tet:max-lsp-bandwidth/" - + "tet:te-bandwidth/tet:technology" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - - - - - description - "Augment maximum LSP TE bandwidth for the link termination - point (LTP)."; - case otn { - uses l1-types:otn-max-path-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link Termination - Point (LTP) is used to compute the number of Tributary - Slots (TS) required by the ODUflex LSPs set up on this - OTN LTP."; - } - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:path-constraints/tet:te-bandwidth/tet:technology" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE bandwidth path constraints of the TE node - connectivity matrices."; - case otn { - uses l1-types:otn-link-bandwidth { - augment otn { - description - "Augment OTN link bandwidth information."; - leaf odtu-flex-type { - type l1-types:odtu-flex-type; - description - "The type of Optical Data Tributary Unit (ODTU) - whose nominal bitrate is used to compute the number of - Tributary Slots (TS) required by the ODUflex LSPs - set up along the underlay paths of these OTN - connectivity matrices."; - } - } - } - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - - - - - + "tet:path-constraints/tet:te-bandwidth/tet:technology" { - when "../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE bandwidth path constraints of the - connectivity matrix entry."; - case otn { - uses l1-types:otn-link-bandwidth { - augment otn { - description - "Augment OTN link bandwidth information."; - leaf odtu-flex-type { - type l1-types:odtu-flex-type; - description - "The type of Optical Data Tributary Unit (ODTU) - whose nominal bitrate is used to compute the number of - Tributary Slots (TS) required by the ODUflex LSPs - set up along the underlay path of this OTN - connectivity matrix entry."; - } - } - } - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:path-constraints/tet:te-bandwidth/tet:technology" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE bandwidth path constraints of the TE node - connectivity matrices information source."; - case otn { - uses l1-types:otn-link-bandwidth { - augment otn { - description - "Augment OTN link bandwidth information."; - leaf odtu-flex-type { - type l1-types:odtu-flex-type; - - - - - description - "The type of Optical Data Tributary Unit (ODTU) - whose nominal bitrate is used to compute the number of - Tributary Slots (TS) required by the ODUflex LSPs - set up along the underlay paths of these OTN - connectivity matrices."; - } - } - } - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:path-constraints/tet:te-bandwidth/tet:technology" { - when "../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE bandwidth path constraints of the - connectivity matrix entry information source"; - case otn { - uses l1-types:otn-link-bandwidth { - augment otn { - description - "Augment OTN link bandwidth information."; - leaf odtu-flex-type { - type l1-types:odtu-flex-type; - description - "The type of Optical Data Tributary Unit (ODTU) - whose nominal bitrate is used to compute the number of - Tributary Slots (TS) required by the ODUflex LSPs - set up along the underlay path of this OTN - connectivity matrix entry."; - } - } - } - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:client-layer-adaptation/tet:switching-capability/" - + "tet:te-bandwidth/tet:technology" { - - - - - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment client TE bandwidth of the tunnel termination point - (TTP)"; - case otn { - uses l1-types:otn-link-bandwidth { - augment otn { - description - "Augment OTN link bandwidth information."; - leaf odtu-flex-type { - type l1-types:odtu-flex-type; - description - "The type of Optical Data Tributary Unit (ODTU) - whose nominal bitrate is used to compute the number of - Tributary Slots (TS) required by the ODUflex LSPs - terminated on this OTN Tunnel Termination Point - (TTP)."; - } - } - } - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/tet:path-constraints/" - + "tet:te-bandwidth/tet:technology" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE bandwidth path constraints for the TTP - Local Link Connectivities."; - case otn { - uses l1-types:otn-link-bandwidth { - augment otn { - description - "Augment OTN link bandwidth information."; - leaf odtu-flex-type { - type l1-types:odtu-flex-type; - - - - - description - "The type of Optical Data Tributary Unit (ODTU) - whose nominal bitrate is used to compute the number of - Tributary Slots (TS) required by the ODUflex LSPs - set up along the underlay paths of these OTN Local - Link Connectivities."; - } - } - } - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:local-link-connectivity/tet:path-constraints/" - + "tet:te-bandwidth/tet:technology" { - when "../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE bandwidth path constraints for the TTP - Local Link Connectivity entry."; - case otn { - uses l1-types:otn-link-bandwidth { - augment otn { - description - "Augment OTN link bandwidth information."; - leaf odtu-flex-type { - type l1-types:odtu-flex-type; - description - "The type of Optical Data Tributary Unit (ODTU) - whose nominal bitrate is used to compute the number of - Tributary Slots (TS) required by the ODUflex LSPs - set up along the underlay path of this OTN Local - Link Connectivyt entry."; - } - } - } - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:te-link-attributes/" - + "tet:interface-switching-capability/tet:max-lsp-bandwidth/" - - - - - + "tet:te-bandwidth/tet:technology" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment maximum LSP TE bandwidth for the TE link."; - case otn { - uses l1-types:otn-max-path-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on this OTN Link."; - } - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:te-link-attributes/" - + "tet:max-link-bandwidth/" - + "tet:te-bandwidth" { - when "../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment maximum TE bandwidth for the TE link"; - uses l1-types:otn-link-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on this OTN Link."; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:te-link-attributes/" - + "tet:max-resv-link-bandwidth/" - + "tet:te-bandwidth" { - when "../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - - - - - } - description - "Augment maximum reservable TE bandwidth for the TE link"; - uses l1-types:otn-link-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on this OTN Link."; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:te-link-attributes/" - + "tet:unreserved-bandwidth/" - + "tet:te-bandwidth" { - when "../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment unreserved TE bandwidth for the TE Link"; - uses l1-types:otn-link-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on this OTN Link."; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:information-source-entry/" - + "tet:interface-switching-capability/" - + "tet:max-lsp-bandwidth/" - + "tet:te-bandwidth/tet:technology" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment maximum LSP TE bandwidth for the TE link - information source"; - case otn { - uses l1-types:otn-max-path-bandwidth { - description - - - - - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on this OTN Link."; - } - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:information-source-entry/" - + "tet:max-link-bandwidth/" - + "tet:te-bandwidth" { - when "../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment maximum TE bandwidth for the TE link - information source"; - uses l1-types:otn-link-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on this OTN Link."; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:information-source-entry/" - + "tet:max-resv-link-bandwidth/" - + "tet:te-bandwidth" { - when "../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment maximum reservable TE bandwidth for the TE link - information-source"; - uses l1-types:otn-link-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on this OTN Link."; - } - } - - - - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:information-source-entry/" - + "tet:unreserved-bandwidth/" - + "tet:te-bandwidth" { - when "../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment unreserved TE bandwidth of the TE link - information source"; - uses l1-types:otn-link-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on this OTN Link."; - } - } - - augment "/nw:networks/tet:te/tet:templates/" - + "tet:link-template/tet:te-link-attributes/" - + "tet:interface-switching-capability/" - + "tet:max-lsp-bandwidth/" - + "tet:te-bandwidth/tet:technology" { - description - "Augment maximum LSP TE bandwidth of the TE link - template"; - case otn { - uses l1-types:otn-max-path-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on the OTN Link that uses this - Link Template."; - } - } - } - - augment "/nw:networks/tet:te/tet:templates/" - + "tet:link-template/tet:te-link-attributes/" - + "tet:max-link-bandwidth/" - + "tet:te-bandwidth" { - description - "Augment maximum TE bandwidth the TE link template"; - uses l1-types:otn-link-bandwidth { - description - - - - - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on the OTN Link that uses this - Link Template."; - } - } - - augment "/nw:networks/tet:te/tet:templates/" - + "tet:link-template/tet:te-link-attributes/" - + "tet:max-resv-link-bandwidth/" - + "tet:te-bandwidth" { - description - "Augment maximum reservable TE bandwidth for the TE link - template."; - uses l1-types:otn-link-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on the OTN Link that uses this - Link Template."; - } - } - - augment "/nw:networks/tet:te/tet:templates/" - + "tet:link-template/tet:te-link-attributes/" - + "tet:unreserved-bandwidth/" - + "tet:te-bandwidth" { - description - "Augment unreserved TE bandwidth the TE link template"; - uses l1-types:otn-link-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on the OTN Link that uses this - Link Template."; - } - } - - /* - * Augment TE label range information - */ - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:label-restrictions/tet:label-restriction" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - - - - - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range information for the TE node - connectivity matrices."; - uses label-range-info; - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/tet:from/" - + "tet:label-restrictions/tet:label-restriction" { - when "../../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range information for the source LTP - of the connectivity matrix entry."; - uses label-range-info; - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/tet:to/" - + "tet:label-restrictions/tet:label-restriction" { - when "../../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range information for the destination LTP - of the connectivity matrix entry."; - uses label-range-info; - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/" - + "tet:connectivity-matrices/tet:label-restrictions/" - + "tet:label-restriction" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - - - - - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range information for the TE node - connectivity matrices information source."; - uses label-range-info; - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:from/tet:label-restrictions/tet:label-restriction" { - when "../../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range information for the source LTP - of the connectivity matrix entry information source."; - uses label-range-info; - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:to/tet:label-restrictions/tet:label-restriction" { - when "../../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range information for the destination LTP - of the connectivity matrix entry information source."; - uses label-range-info; - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:label-restrictions/tet:label-restriction" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - - - - - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range information for the TTP - Local Link Connectivities."; - uses label-range-info; - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:local-link-connectivity/" - + "tet:label-restrictions/tet:label-restriction" { - when "../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range information for the TTP - Local Link Connectivity entry."; - uses label-range-info; - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:te-link-attributes/" - + "tet:label-restrictions/tet:label-restriction" { - when "../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range information for the TE link."; - uses label-range-info; - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:information-source-entry/" - + "tet:label-restrictions/tet:label-restriction" { - when "../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - - - - - } - description - "Augment TE label range information for the TE link - information source."; - uses label-range-info; - } - - augment "/nw:networks/tet:te/tet:templates/" - + "tet:link-template/tet:te-link-attributes/" - + "tet:label-restrictions/tet:label-restriction" { - description - "Augment TE label range information for the TE link template."; - uses label-range-info; - } - - /* - * Augment TE label - */ - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-start/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range start for the TE node - connectivity matrices"; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:label-restrictions/" - + "tet:label-restriction/tet:label-end/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - - - - - } - description - "Augment TE label range end for the TE node - connectivity matrices"; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:label-restrictions/" - + "tet:label-restriction/tet:label-step/" - + "tet:technology" { - when "../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range step for the TE node - connectivity matrices"; - case otn { - uses l1-types:otn-label-step; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:underlay/tet:primary-path/tet:path-element/" - + "tet:type/tet:label/tet:label-hop/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay primary path of the - TE node connectivity matrices"; - case otn { - uses l1-types:otn-label-hop; - } - } - - - - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:underlay/tet:backup-path/tet:path-element/" - + "tet:type/tet:label/tet:label-hop/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay backup path of the - TE node connectivity matrices"; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:optimizations/tet:algorithm/tet:metric/" - + "tet:optimization-metric/" - + "tet:explicit-route-exclude-objects/" - + "tet:route-object-exclude-object/" - + "tet:type/tet:label/tet:label-hop/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects excluded - by the path computation of the TE node connectivity - matrices"; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:optimizations/tet:algorithm/tet:metric/" - + "tet:optimization-metric/" - - - - - + "tet:explicit-route-include-objects/" - + "tet:route-object-include-object/" - + "tet:type/tet:label/tet:label-hop/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects included - by the path computation of the TE node connectivity - matrices"; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:path-properties/tet:path-route-objects/" - + "tet:path-route-object/tet:type/tet:label/tet:label-hop/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the computed path route objects - of the TE node connectivity matrices"; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/tet:from/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-start/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - - - - - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range start for the source LTP - of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/tet:from/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-end/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range end for the source LTP - of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/tet:from/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-step/" - + "tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - - - - - "Augment TE label range step for the source LTP - of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-step; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/tet:to/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-start/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range start for the destination LTP - of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/tet:to/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-end/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range end for the destination LTP - of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - - - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/tet:to/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-step/" - + "tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range step for the destination LTP - of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-step; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:underlay/tet:primary-path/tet:path-element/" - + "tet:type/tet:label/tet:label-hop/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay primary path - of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:underlay/tet:backup-path/tet:path-element/" - + "tet:type/tet:label/tet:label-hop/" - + "tet:te-label/tet:technology" { - - - - - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay backup path - of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/tet:optimizations/" - + "tet:algorithm/tet:metric/tet:optimization-metric/" - + "tet:explicit-route-exclude-objects/" - + "tet:route-object-exclude-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects excluded - by the path computation of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/tet:optimizations/" - + "tet:algorithm/tet:metric/tet:optimization-metric/" - + "tet:explicit-route-include-objects/" - + "tet:route-object-include-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - - - - - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects included - by the path computation of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:path-properties/tet:path-route-objects/" - + "tet:path-route-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the computed path route objects - of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/" - + "tet:connectivity-matrices/tet:label-restrictions/" - + "tet:label-restriction/" - + "tet:label-start/tet:te-label/tet:technology" { - when "../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range start for the TE node connectivity - matrices information source."; - case otn { - - - - - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/" - + "tet:connectivity-matrices/tet:label-restrictions/" - + "tet:label-restriction/" - + "tet:label-end/tet:te-label/tet:technology" { - when "../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range end for the TE node connectivity - matrices information source."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/" - + "tet:connectivity-matrices/tet:label-restrictions/" - + "tet:label-restriction/" - + "tet:label-step/tet:technology" { - when "../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range step for the TE node connectivity - matrices information source."; - case otn { - uses l1-types:otn-label-step; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - - - - - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay primary path - of the TE node connectivity matrices of the information - source entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay backup path - of the TE node connectivity matrices of the information - source entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:optimizations/tet:algorithm/tet:metric/" - + "tet:optimization-metric/" - + "tet:explicit-route-exclude-objects/" - + "tet:route-object-exclude-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - - - - - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects excluded - by the path computation of the TE node connectivity matrices - information source."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:optimizations/tet:algorithm/tet:metric/" - + "tet:optimization-metric/" - + "tet:explicit-route-include-objects/" - + "tet:route-object-include-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects included - by the path computation of the TE node connectivity matrices - information source."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:path-properties/tet:path-route-objects/" - + "tet:path-route-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the computed path route objects - - - - - of the TE node connectivity matrices information source."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:from/tet:label-restrictions/" - + "tet:label-restriction/" - + "tet:label-start/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range start for the source LTP - of the connectivity matrix entry information source."; - case otn { - uses l1-types:otn-label-start-end; - } - } - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:from/tet:label-restrictions/" - + "tet:label-restriction/" - + "tet:label-end/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range end for the source LTP - of the connectivity matrix entry information source."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - - - - - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:from/tet:label-restrictions/" - + "tet:label-restriction/" - + "tet:label-step/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range step for the source LTP - of the connectivity matrix entry information source."; - case otn { - uses l1-types:otn-label-step; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:to/tet:label-restrictions/tet:label-restriction/" - + "tet:label-start/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range start for the destination LTP - of the connectivity matrix entry information source."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:to/tet:label-restrictions/tet:label-restriction/" - + "tet:label-end/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - - - - - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range end for the destination LTP - of the connectivity matrix entry information source."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:to/tet:label-restrictions/tet:label-restriction/" - + "tet:label-step/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range step for the destination LTP - of the connectivity matrix entry information source."; - case otn { - uses l1-types:otn-label-step; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay primary path - of the connectivity matrix entry information source."; - case otn { - - - - - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay backup path - of the connectivity matrix entry information source."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:optimizations/tet:algorithm/tet:metric/" - + "tet:optimization-metric/" - + "tet:explicit-route-exclude-objects/" - + "tet:route-object-exclude-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects excluded - by the path computation of the connectivity matrix entry - information source."; - case otn { - uses l1-types:otn-label-hop; - } - } - - - - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:optimizations/tet:algorithm/tet:metric/" - + "tet:optimization-metric/" - + "tet:explicit-route-include-objects/" - + "tet:route-object-include-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects included - by the path computation of the connectivity matrix entry - information source."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:path-properties/tet:path-route-objects/" - + "tet:path-route-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the computed path route objects - of the connectivity matrix entry information source."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - - - - - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-start/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range start for the TTP - Local Link Connectivities."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-end/" - + "tet:te-label/tet:technology"{ - when "../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range end for the TTP - Local Link Connectivities."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-step/" - + "tet:technology"{ - when "../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - - - - - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range step for the TTP - Local Link Connectivities."; - case otn { - uses l1-types:otn-label-step; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay primary path - of the TTP Local Link Connectivities."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay backup path - of the TTP Local Link Connectivities."; - case otn { - - - - - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:optimizations/tet:algorithm/tet:metric/" - + "tet:optimization-metric/" - + "tet:explicit-route-exclude-objects/" - + "tet:route-object-exclude-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects excluded - by the path computation of the TTP Local Link - Connectivities."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:optimizations/tet:algorithm/tet:metric/" - + "tet:optimization-metric/" - + "tet:explicit-route-include-objects/" - + "tet:route-object-include-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects included - by the path computation of the TTP Local Link - Connectivities."; - case otn { - - - - - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:path-properties/tet:path-route-objects/" - + "tet:path-route-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the computed path route objects - of the TTP Local Link Connectivities."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:local-link-connectivity/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-start/tet:te-label/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range start for the TTP - Local Link Connectivity entry."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - - - - - + "tet:local-link-connectivities/" - + "tet:local-link-connectivity/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-end/tet:te-label/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range end for the TTP - Local Link Connectivity entry."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:local-link-connectivity/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-step/tet:technology" { - when "../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range step for the TTP - Local Link Connectivity entry."; - case otn { - uses l1-types:otn-label-step; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:local-link-connectivity/" - + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - - - - - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay primary path - of the TTP Local Link Connectivity entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:local-link-connectivity/" - + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay backup path - of the TTP Local Link Connectivity entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:local-link-connectivity/" - + "tet:optimizations/tet:algorithm/tet:metric/" - + "tet:optimization-metric/" - + "tet:explicit-route-exclude-objects/" - + "tet:route-object-exclude-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - - - - - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects excluded - by the path computation of the TTP Local Link - Connectivity entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:local-link-connectivity/" - + "tet:optimizations/tet:algorithm/tet:metric/" - + "tet:optimization-metric/" - + "tet:explicit-route-include-objects/" - + "tet:route-object-include-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects included - by the path computation of the TTP Local Link - Connectivity entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:local-link-connectivity/" - + "tet:path-properties/tet:path-route-objects/" - + "tet:path-route-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - - - - - OTN topology type."; - } - description - "Augment TE label hop for the computed path route objects - of the TTP Local Link Connectivity entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:te-link-attributes/" - + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay primary path - of the TE link."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:te-link-attributes/" - + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay backup path - of the TE link."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - - - - - + "tet:te-link-attributes/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-start/tet:te-label/tet:technology" { - when "../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range start for the TE link."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:te-link-attributes/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-end/tet:te-label/tet:technology" { - when "../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range end for the TE link."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:te-link-attributes/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-step/tet:technology" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range step for the TE link."; - case otn { - uses l1-types:otn-label-step; - } - - - - - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:information-source-entry/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-start/tet:te-label/tet:technology" { - when "../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range start for the TE link - information source."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:information-source-entry/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-end/tet:te-label/tet:technology" { - when "../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range end for the TE link - information source."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:information-source-entry/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-step/tet:technology" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - - - - - description - "Augment TE label range step for the TE link - information source."; - case otn { - uses l1-types:otn-label-step; - } - } - - augment "/nw:networks/tet:te/tet:templates/" - + "tet:link-template/tet:te-link-attributes/" - + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - description - "Augment TE label hop for the underlay primary path - of the TE link template."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/tet:te/tet:templates/" - + "tet:link-template/tet:te-link-attributes/" - + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - description - "Augment TE label hop for the underlay backup path - of the TE link template."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/tet:te/tet:templates/" - + "tet:link-template/tet:te-link-attributes/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-start/tet:te-label/tet:technology" { - description - "Augment TE label range start for the TE link template."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/tet:te/tet:templates/" - + "tet:link-template/tet:te-link-attributes/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-end/tet:te-label/tet:technology" { - description - - - - - "Augment TE label range end for the TE link template."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/tet:te/tet:templates/" - + "tet:link-template/tet:te-link-attributes/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-step/tet:technology" { - description - "Augment TE label range step for the TE link template."; - case otn { - uses l1-types:otn-label-step; - } - } - } diff --git a/src/nbi/service/ietf_network/yang/ietf-otn-topology@2024-06-21.yang b/src/nbi/service/ietf_network/yang/ietf-otn-topology@2024-06-21.yang new file mode 100644 index 0000000000000000000000000000000000000000..90677e79e75909189cac3b7979c8716037f9d284 --- /dev/null +++ b/src/nbi/service/ietf_network/yang/ietf-otn-topology@2024-06-21.yang @@ -0,0 +1,2230 @@ +module ietf-otn-topology { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-otn-topology"; + prefix "otnt"; + + import ietf-network { + prefix "nw"; + reference + "RFC 8345: A YANG Data Model for Network Topologies"; + } + + import ietf-network-topology { + prefix "nt"; + reference + "RFC 8345: A YANG Data Model for Network Topologies"; + } + + import ietf-te-topology { + prefix "tet"; + reference + "RFC 8795: YANG Data Model for Traffic Engineering + (TE) Topologies"; + } + + import ietf-layer1-types { + prefix "l1-types"; + reference + "RFC YYYY: A YANG Data Model for Layer 1 Types"; + } + // RFC Editor: replace YYYY with actual RFC number assigned to + // [I-D.ietf-ccamp-layer1-types] and remove this note + + organization + "IETF CCAMP Working Group"; + contact + "WG Web: + WG List: + + Editor: Haomian Zheng + + + Editor: Italo Busi + + + Editor: Xufeng Liu + + + Editor: Sergio Belotti + + + Editor: Oscar Gonzalez de Dios + "; + + description + "This module defines a protocol independent Layer 1/ODU topology + data model. The model fully conforms + to the Network Management Datastore Architecture (NMDA). + + Copyright (c) 2024 IETF Trust and the persons identified + as authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC XXXX; see + the RFC itself for full legal notices. + + The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL + NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', + 'MAY', and 'OPTIONAL' in this document are to be interpreted as + described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, + they appear in all capitals, as shown here."; + + revision 2024-06-21 { + description + "Initial Revision"; + reference + "RFC XXXX: A YANG Data Model for Optical Transport Network + Topology"; + } + // RFC Editor: replace XXXX with actual RFC number, update date + // information and remove this note + + /* + * Groupings + */ + + grouping label-range-info { + description + "OTN technology-specific label range related information with + a presence container indicating that the label range is an + OTN technology-specific label range. + + This grouping SHOULD be used together with the + otn-label-start-end and otn-label-step groupings to provide + OTN technology-specific label information to the models which + use the label-restriction-info grouping defined in the module + ietf-te-types."; + uses l1-types:otn-label-range-info { + refine otn-label-range { + presence + "Indicates the label range is an OTN label range. + + This container MUST NOT be present if there are other + presence containers or attributes indicating another type + of label range."; + } + } + } + + /* + * Data nodes + */ + + augment "/nw:networks/nw:network/nw:network-types/" + + "tet:te-topology" { + container otn-topology { + presence "indicates a topology type of Optical Transport + Network (OTN)-electrical layer."; + description "OTN topology type"; + } + description "augment network types to include OTN."; + } + + augment "/nw:networks/nw:network/nw:node/tet:te" + + "/tet:te-node-attributes" { + when "../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description "Augment only for OTN."; + } + description "Augment TE node attributes."; + container otn-node { + presence "The TE node is an OTN node."; + description + "Introduce new TE node type for OTN node."; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes" { + when "../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description "Augment only for OTN."; + } + description "Augment link configuration"; + + container otn-link { + description + "Attributes of the OTN Link."; + leaf odtu-flex-type { + type l1-types:odtu-flex-type; + description + "The type of Optical Data Tributary Unit (ODTU) + whose nominal bitrate is used to compute the number of + Tributary Slots (TS) required by the ODUflex LSPs set up + on this OTN Link."; + } + leaf tsg { + type identityref { + base l1-types:tributary-slot-granularity; + } + description "Tributary slot granularity."; + reference + "ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + leaf distance { + type uint32; + description "distance in the unit of kilometers"; + } + } + container client-svc { + presence + "When present, indicates that the Link supports Constant + Bit Rate (CBR) client signals."; + description + "Attributes of the Link supporting CBR client signals."; + leaf-list supported-client-signal { + type identityref { + base l1-types:client-signal; + } + min-elements 1; + description + "List of client signal types supported by the Link."; + } + } + } + + augment "/nw:networks/nw:network/nw:node/nt:termination-point/" + + "tet:te" { + when "../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description "Augment only for OTN."; + } + description + "Augment link termination point (LTP) configuration."; + + container otn-link-tp { + description + "Attributes of the OTN Link Termination Point (LTP)."; + leaf odtu-flex-type { + type l1-types:odtu-flex-type; + description + "The type of Optical Data Tributary Unit (ODTU) + whose nominal bitrate is used to compute the number of + Tributary Slots (TS) required by the ODUflex LSPs set up + on this OTN Link Termination Point (LTP)."; + } + } + container client-svc { + presence + "When present, indicates that the Link Termination Point + (LTP) supports Constant Bit Rate (CBR) client signals."; + description + "OTN LTP Service attributes."; + leaf-list supported-client-signal { + type identityref { + base l1-types:client-signal; + } + description + "List of client signal types supported by the LTP."; + } + } + } + + /* + * Augment TE bandwidth + */ + + augment "/nw:networks/nw:network/nw:node/nt:termination-point/" + + "tet:te/" + + "tet:interface-switching-capability/tet:max-lsp-bandwidth/" + + "tet:te-bandwidth/tet:technology" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment maximum LSP TE bandwidth for the link termination + point (LTP)."; + case otn { + uses l1-types:otn-max-path-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link Termination + Point (LTP) is used to compute the number of Tributary + Slots (TS) required by the ODUflex LSPs set up on this + OTN LTP."; + } + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:path-constraints/tet:te-bandwidth/tet:technology" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE bandwidth path constraints of the TE node + connectivity matrices."; + case otn { + uses l1-types:otn-link-bandwidth { + augment otn-bandwidth { + description + "Augment OTN link bandwidth information."; + leaf odtu-flex-type { + type l1-types:odtu-flex-type; + description + "The type of Optical Data Tributary Unit (ODTU) + whose nominal bitrate is used to compute the number of + Tributary Slots (TS) required by the ODUflex LSPs + set up along the underlay paths of these OTN + connectivity matrices."; + } + } + } + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:path-constraints/tet:te-bandwidth/tet:technology" { + when "../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE bandwidth path constraints of the + connectivity matrix entry."; + case otn { + uses l1-types:otn-link-bandwidth { + augment otn-bandwidth { + description + "Augment OTN link bandwidth information."; + leaf odtu-flex-type { + type l1-types:odtu-flex-type; + description + "The type of Optical Data Tributary Unit (ODTU) + whose nominal bitrate is used to compute the number of + Tributary Slots (TS) required by the ODUflex LSPs + set up along the underlay path of this OTN + connectivity matrix entry."; + } + } + } + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:path-constraints/tet:te-bandwidth/tet:technology" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE bandwidth path constraints of the TE node + connectivity matrices information source."; + case otn { + uses l1-types:otn-link-bandwidth { + augment otn-bandwidth { + description + "Augment OTN link bandwidth information."; + leaf odtu-flex-type { + type l1-types:odtu-flex-type; + description + "The type of Optical Data Tributary Unit (ODTU) + whose nominal bitrate is used to compute the number of + Tributary Slots (TS) required by the ODUflex LSPs + set up along the underlay paths of these OTN + connectivity matrices."; + } + } + } + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:path-constraints/tet:te-bandwidth/tet:technology" { + when "../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE bandwidth path constraints of the + connectivity matrix entry information source"; + case otn { + uses l1-types:otn-link-bandwidth { + augment otn-bandwidth { + description + "Augment OTN link bandwidth information."; + leaf odtu-flex-type { + type l1-types:odtu-flex-type; + description + "The type of Optical Data Tributary Unit (ODTU) + whose nominal bitrate is used to compute the number of + Tributary Slots (TS) required by the ODUflex LSPs + set up along the underlay path of this OTN + connectivity matrix entry."; + } + } + } + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:client-layer-adaptation/tet:switching-capability/" + + "tet:te-bandwidth/tet:technology" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment client TE bandwidth of the tunnel termination point + (TTP)"; + case otn { + uses l1-types:otn-link-bandwidth { + augment otn-bandwidth { + description + "Augment OTN link bandwidth information."; + leaf odtu-flex-type { + type l1-types:odtu-flex-type; + description + "The type of Optical Data Tributary Unit (ODTU) + whose nominal bitrate is used to compute the number of + Tributary Slots (TS) required by the ODUflex LSPs + terminated on this OTN Tunnel Termination Point + (TTP)."; + } + } + } + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/tet:path-constraints/" + + "tet:te-bandwidth/tet:technology" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE bandwidth path constraints for the TTP + Local Link Connectivities."; + case otn { + uses l1-types:otn-link-bandwidth { + augment otn-bandwidth { + description + "Augment OTN link bandwidth information."; + leaf odtu-flex-type { + type l1-types:odtu-flex-type; + description + "The type of Optical Data Tributary Unit (ODTU) + whose nominal bitrate is used to compute the number of + Tributary Slots (TS) required by the ODUflex LSPs + set up along the underlay paths of these OTN Local + Link Connectivities."; + } + } + } + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:local-link-connectivity/tet:path-constraints/" + + "tet:te-bandwidth/tet:technology" { + when "../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE bandwidth path constraints for the TTP + Local Link Connectivity entry."; + case otn { + uses l1-types:otn-link-bandwidth { + augment otn-bandwidth { + description + "Augment OTN link bandwidth information."; + leaf odtu-flex-type { + type l1-types:odtu-flex-type; + description + "The type of Optical Data Tributary Unit (ODTU) + whose nominal bitrate is used to compute the number of + Tributary Slots (TS) required by the ODUflex LSPs + set up along the underlay path of this OTN Local + Link Connectivity entry."; + } + } + } + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes/" + + "tet:interface-switching-capability/tet:max-lsp-bandwidth/" + + "tet:te-bandwidth/tet:technology" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment maximum LSP TE bandwidth for the TE link."; + case otn { + uses l1-types:otn-max-path-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on this OTN Link."; + } + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes/" + + "tet:max-link-bandwidth/" + + "tet:te-bandwidth" { + when "../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment maximum TE bandwidth for the TE link"; + uses l1-types:otn-link-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on this OTN Link."; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes/" + + "tet:max-resv-link-bandwidth/" + + "tet:te-bandwidth" { + when "../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment maximum reservable TE bandwidth for the TE link"; + uses l1-types:otn-link-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on this OTN Link."; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes/" + + "tet:unreserved-bandwidth/" + + "tet:te-bandwidth" { + when "../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment unreserved TE bandwidth for the TE Link"; + uses l1-types:otn-link-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on this OTN Link."; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:information-source-entry/" + + "tet:interface-switching-capability/" + + "tet:max-lsp-bandwidth/" + + "tet:te-bandwidth/tet:technology" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment maximum LSP TE bandwidth for the TE link + information source"; + case otn { + uses l1-types:otn-max-path-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on this OTN Link."; + } + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:information-source-entry/" + + "tet:max-link-bandwidth/" + + "tet:te-bandwidth" { + when "../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment maximum TE bandwidth for the TE link + information source"; + uses l1-types:otn-link-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on this OTN Link."; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:information-source-entry/" + + "tet:max-resv-link-bandwidth/" + + "tet:te-bandwidth" { + when "../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment maximum reservable TE bandwidth for the TE link + information-source"; + uses l1-types:otn-link-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on this OTN Link."; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:information-source-entry/" + + "tet:unreserved-bandwidth/" + + "tet:te-bandwidth" { + when "../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment unreserved TE bandwidth of the TE link + information source"; + uses l1-types:otn-link-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on this OTN Link."; + } + } + + augment "/nw:networks/tet:te/tet:templates/" + + "tet:link-template/tet:te-link-attributes/" + + "tet:interface-switching-capability/" + + "tet:max-lsp-bandwidth/" + + "tet:te-bandwidth/tet:technology" { + description + "Augment maximum LSP TE bandwidth of the TE link + template"; + case otn { + uses l1-types:otn-max-path-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on the OTN Link that uses this + Link Template."; + } + } + } + + augment "/nw:networks/tet:te/tet:templates/" + + "tet:link-template/tet:te-link-attributes/" + + "tet:max-link-bandwidth/" + + "tet:te-bandwidth" { + description + "Augment maximum TE bandwidth the TE link template"; + uses l1-types:otn-link-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on the OTN Link that uses this + Link Template."; + } + } + + augment "/nw:networks/tet:te/tet:templates/" + + "tet:link-template/tet:te-link-attributes/" + + "tet:max-resv-link-bandwidth/" + + "tet:te-bandwidth" { + description + "Augment maximum reservable TE bandwidth for the TE link + template."; + uses l1-types:otn-link-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on the OTN Link that uses this + Link Template."; + } + } + + augment "/nw:networks/tet:te/tet:templates/" + + "tet:link-template/tet:te-link-attributes/" + + "tet:unreserved-bandwidth/" + + "tet:te-bandwidth" { + description + "Augment unreserved TE bandwidth the TE link template"; + uses l1-types:otn-link-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on the OTN Link that uses this + Link Template."; + } + } + + /* + * Augment TE label range information + */ + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:label-restrictions/tet:label-restriction" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range information for the TE node + connectivity matrices."; + uses label-range-info; + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/tet:from/" + + "tet:label-restrictions/tet:label-restriction" { + when "../../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range information for the source LTP + of the connectivity matrix entry."; + uses label-range-info; + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/tet:to/" + + "tet:label-restrictions/tet:label-restriction" { + when "../../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range information for the destination LTP + of the connectivity matrix entry."; + uses label-range-info; + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/" + + "tet:connectivity-matrices/tet:label-restrictions/" + + "tet:label-restriction" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range information for the TE node + connectivity matrices information source."; + uses label-range-info; + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:from/tet:label-restrictions/tet:label-restriction" { + when "../../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range information for the source LTP + of the connectivity matrix entry information source."; + uses label-range-info; + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:to/tet:label-restrictions/tet:label-restriction" { + when "../../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range information for the destination LTP + of the connectivity matrix entry information source."; + uses label-range-info; + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:label-restrictions/tet:label-restriction" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range information for the TTP + Local Link Connectivities."; + uses label-range-info; + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:local-link-connectivity/" + + "tet:label-restrictions/tet:label-restriction" { + when "../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range information for the TTP + Local Link Connectivity entry."; + uses label-range-info; + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes/" + + "tet:label-restrictions/tet:label-restriction" { + when "../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range information for the TE link."; + uses label-range-info; + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:information-source-entry/" + + "tet:label-restrictions/tet:label-restriction" { + when "../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range information for the TE link + information source."; + uses label-range-info; + } + + augment "/nw:networks/tet:te/tet:templates/" + + "tet:link-template/tet:te-link-attributes/" + + "tet:label-restrictions/tet:label-restriction" { + description + "Augment TE label range information for the TE link template."; + uses label-range-info; + } + + /* + * Augment TE label + */ + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-start/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range start for the TE node + connectivity matrices"; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:label-restrictions/" + + "tet:label-restriction/tet:label-end/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range end for the TE node + connectivity matrices"; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:label-restrictions/" + + "tet:label-restriction/tet:label-step/" + + "tet:technology" { + when "../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range step for the TE node + connectivity matrices"; + case otn { + uses l1-types:otn-label-step; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:underlay/tet:primary-path/tet:path-element/" + + "tet:type/tet:label/tet:label-hop/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay primary path of the + TE node connectivity matrices"; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:underlay/tet:backup-path/tet:path-element/" + + "tet:type/tet:label/tet:label-hop/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay backup path of the + TE node connectivity matrices"; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:optimizations/tet:algorithm/tet:metric/" + + "tet:optimization-metric/" + + "tet:explicit-route-exclude-objects/" + + "tet:route-object-exclude-object/" + + "tet:type/tet:label/tet:label-hop/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects excluded + by the path computation of the TE node connectivity + matrices"; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:optimizations/tet:algorithm/tet:metric/" + + "tet:optimization-metric/" + + "tet:explicit-route-include-objects/" + + "tet:route-object-include-object/" + + "tet:type/tet:label/tet:label-hop/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects included + by the path computation of the TE node connectivity + matrices"; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:path-properties/tet:path-route-objects/" + + "tet:path-route-object/tet:type/tet:label/tet:label-hop/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the computed path route objects + of the TE node connectivity matrices"; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/tet:from/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-start/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range start for the source LTP + of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/tet:from/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-end/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range end for the source LTP + of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/tet:from/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-step/" + + "tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range step for the source LTP + of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-step; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/tet:to/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-start/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range start for the destination LTP + of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/tet:to/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-end/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range end for the destination LTP + of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/tet:to/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-step/" + + "tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range step for the destination LTP + of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-step; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:underlay/tet:primary-path/tet:path-element/" + + "tet:type/tet:label/tet:label-hop/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay primary path + of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:underlay/tet:backup-path/tet:path-element/" + + "tet:type/tet:label/tet:label-hop/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay backup path + of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/tet:optimizations/" + + "tet:algorithm/tet:metric/tet:optimization-metric/" + + "tet:explicit-route-exclude-objects/" + + "tet:route-object-exclude-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects excluded + by the path computation of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/tet:optimizations/" + + "tet:algorithm/tet:metric/tet:optimization-metric/" + + "tet:explicit-route-include-objects/" + + "tet:route-object-include-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects included + by the path computation of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:path-properties/tet:path-route-objects/" + + "tet:path-route-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the computed path route objects + of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/" + + "tet:connectivity-matrices/tet:label-restrictions/" + + "tet:label-restriction/" + + "tet:label-start/tet:te-label/tet:technology" { + when "../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range start for the TE node connectivity + matrices information source."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/" + + "tet:connectivity-matrices/tet:label-restrictions/" + + "tet:label-restriction/" + + "tet:label-end/tet:te-label/tet:technology" { + when "../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range end for the TE node connectivity + matrices information source."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/" + + "tet:connectivity-matrices/tet:label-restrictions/" + + "tet:label-restriction/" + + "tet:label-step/tet:technology" { + when "../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range step for the TE node connectivity + matrices information source."; + case otn { + uses l1-types:otn-label-step; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay primary path + of the TE node connectivity matrices of the information + source entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay backup path + of the TE node connectivity matrices of the information + source entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:optimizations/tet:algorithm/tet:metric/" + + "tet:optimization-metric/" + + "tet:explicit-route-exclude-objects/" + + "tet:route-object-exclude-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects excluded + by the path computation of the TE node connectivity matrices + information source."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:optimizations/tet:algorithm/tet:metric/" + + "tet:optimization-metric/" + + "tet:explicit-route-include-objects/" + + "tet:route-object-include-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects included + by the path computation of the TE node connectivity matrices + information source."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:path-properties/tet:path-route-objects/" + + "tet:path-route-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the computed path route objects + of the TE node connectivity matrices information source."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:from/tet:label-restrictions/" + + "tet:label-restriction/" + + "tet:label-start/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range start for the source LTP + of the connectivity matrix entry information source."; + case otn { + uses l1-types:otn-label-start-end; + } + } + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:from/tet:label-restrictions/" + + "tet:label-restriction/" + + "tet:label-end/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range end for the source LTP + of the connectivity matrix entry information source."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:from/tet:label-restrictions/" + + "tet:label-restriction/" + + "tet:label-step/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range step for the source LTP + of the connectivity matrix entry information source."; + case otn { + uses l1-types:otn-label-step; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:to/tet:label-restrictions/tet:label-restriction/" + + "tet:label-start/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range start for the destination LTP + of the connectivity matrix entry information source."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:to/tet:label-restrictions/tet:label-restriction/" + + "tet:label-end/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range end for the destination LTP + of the connectivity matrix entry information source."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:to/tet:label-restrictions/tet:label-restriction/" + + "tet:label-step/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range step for the destination LTP + of the connectivity matrix entry information source."; + case otn { + uses l1-types:otn-label-step; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay primary path + of the connectivity matrix entry information source."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay backup path + of the connectivity matrix entry information source."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:optimizations/tet:algorithm/tet:metric/" + + "tet:optimization-metric/" + + "tet:explicit-route-exclude-objects/" + + "tet:route-object-exclude-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects excluded + by the path computation of the connectivity matrix entry + information source."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:optimizations/tet:algorithm/tet:metric/" + + "tet:optimization-metric/" + + "tet:explicit-route-include-objects/" + + "tet:route-object-include-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects included + by the path computation of the connectivity matrix entry + information source."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:path-properties/tet:path-route-objects/" + + "tet:path-route-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the computed path route objects + of the connectivity matrix entry information source."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-start/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range start for the TTP + Local Link Connectivities."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-end/" + + "tet:te-label/tet:technology"{ + when "../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range end for the TTP + Local Link Connectivities."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-step/" + + "tet:technology"{ + when "../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range step for the TTP + Local Link Connectivities."; + case otn { + uses l1-types:otn-label-step; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay primary path + of the TTP Local Link Connectivities."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay backup path + of the TTP Local Link Connectivities."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:optimizations/tet:algorithm/tet:metric/" + + "tet:optimization-metric/" + + "tet:explicit-route-exclude-objects/" + + "tet:route-object-exclude-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects excluded + by the path computation of the TTP Local Link + Connectivities."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:optimizations/tet:algorithm/tet:metric/" + + "tet:optimization-metric/" + + "tet:explicit-route-include-objects/" + + "tet:route-object-include-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects included + by the path computation of the TTP Local Link + Connectivities."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:path-properties/tet:path-route-objects/" + + "tet:path-route-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the computed path route objects + of the TTP Local Link Connectivities."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:local-link-connectivity/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-start/tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range start for the TTP + Local Link Connectivity entry."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:local-link-connectivity/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-end/tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range end for the TTP + Local Link Connectivity entry."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:local-link-connectivity/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-step/tet:technology" { + when "../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range step for the TTP + Local Link Connectivity entry."; + case otn { + uses l1-types:otn-label-step; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:local-link-connectivity/" + + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay primary path + of the TTP Local Link Connectivity entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:local-link-connectivity/" + + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay backup path + of the TTP Local Link Connectivity entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:local-link-connectivity/" + + "tet:optimizations/tet:algorithm/tet:metric/" + + "tet:optimization-metric/" + + "tet:explicit-route-exclude-objects/" + + "tet:route-object-exclude-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects excluded + by the path computation of the TTP Local Link + Connectivity entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:local-link-connectivity/" + + "tet:optimizations/tet:algorithm/tet:metric/" + + "tet:optimization-metric/" + + "tet:explicit-route-include-objects/" + + "tet:route-object-include-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects included + by the path computation of the TTP Local Link + Connectivity entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:local-link-connectivity/" + + "tet:path-properties/tet:path-route-objects/" + + "tet:path-route-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the computed path route objects + of the TTP Local Link Connectivity entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes/" + + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay primary path + of the TE link."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes/" + + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay backup path + of the TE link."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-start/tet:te-label/tet:technology" { + when "../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range start for the TE link."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-end/tet:te-label/tet:technology" { + when "../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range end for the TE link."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-step/tet:technology" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range step for the TE link."; + case otn { + uses l1-types:otn-label-step; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:information-source-entry/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-start/tet:te-label/tet:technology" { + when "../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range start for the TE link + information source."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:information-source-entry/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-end/tet:te-label/tet:technology" { + when "../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range end for the TE link + information source."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:information-source-entry/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-step/tet:technology" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range step for the TE link + information source."; + case otn { + uses l1-types:otn-label-step; + } + } + + augment "/nw:networks/tet:te/tet:templates/" + + "tet:link-template/tet:te-link-attributes/" + + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + description + "Augment TE label hop for the underlay primary path + of the TE link template."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/tet:te/tet:templates/" + + "tet:link-template/tet:te-link-attributes/" + + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + description + "Augment TE label hop for the underlay backup path + of the TE link template."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/tet:te/tet:templates/" + + "tet:link-template/tet:te-link-attributes/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-start/tet:te-label/tet:technology" { + description + "Augment TE label range start for the TE link template."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/tet:te/tet:templates/" + + "tet:link-template/tet:te-link-attributes/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-end/tet:te-label/tet:technology" { + description + "Augment TE label range end for the TE link template."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/tet:te/tet:templates/" + + "tet:link-template/tet:te-link-attributes/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-step/tet:technology" { + description + "Augment TE label range step for the TE link template."; + case otn { + uses l1-types:otn-label-step; + } + } +} diff --git a/src/nbi/service/ietf_network/yang/ietf-trans-client-service@2023-10-23.yang b/src/nbi/service/ietf_network/yang/ietf-trans-client-service@2023-10-23.yang deleted file mode 100644 index f0157bcc82e70d1da523074974e8db061d06c32a..0000000000000000000000000000000000000000 --- a/src/nbi/service/ietf_network/yang/ietf-trans-client-service@2023-10-23.yang +++ /dev/null @@ -1,325 +0,0 @@ - module ietf-trans-client-service { - /* TODO: FIXME */ - yang-version 1.1; - - namespace "urn:ietf:params:xml:ns:yang:ietf-trans-client-service"; - prefix "clntsvc"; - - import ietf-network { - prefix "nw"; - reference "RFC8345 - A YANG Data Model for Network Topologies"; - } - - import ietf-network-topology { - prefix "nt"; - reference "RFC8345 - A YANG Data Model for Network Topologies"; - } - - import ietf-te-types { - prefix "te-types"; - reference "RFC 8776 - Traffic Engineering Common YANG Types"; - } - - import ietf-layer1-types { - prefix "layer1-types"; - reference "RFC ZZZZ - A YANG Data Model for Layer 1 Types"; - } - - import ietf-yang-types { - prefix "yang"; - reference "RFC 6991 - Common YANG Data Types"; - } - - import ietf-trans-client-svc-types { - prefix "clntsvc-types"; - reference "RFC XXXX - A YANG Data Model for - Transport Network Client Signals"; - } - - organization - "Internet Engineering Task Force (IETF) CCAMP WG"; - contact - " - ID-draft editor: - Haomian Zheng (zhenghaomian@huawei.com); - Aihua Guo (aihuaguo.ietf@gmail.com); - Italo Busi (italo.busi@huawei.com); - Anton Snitser (antons@sedonasys.com); - Francesco Lazzeri (francesco.lazzeri@ericsson.com); - Yunbin Xu (xuyunbin@caict.ac.cn); - Yang Zhao (zhaoyangyjy@chinamobile.com); - Xufeng Liu (Xufeng_Liu@jabil.com); - Giuseppe Fioccola (giuseppe.fioccola@huawei.com); - Chaode Yu (yuchaode@huawei.com); - "; - - description - "This module defines a YANG data model for describing - transport network client services. The model fully conforms - to the Network Management Datastore Architecture (NMDA). - - Copyright (c) 2021 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 XXXX; see - the RFC itself for full legal notices."; - revision 2023-10-23 { - description - "version -04 as a WG document"; - reference - "draft-ietf-ccamp-client-signal-yang"; - } - - /* - * Groupings - */ - grouping client-svc-access-parameters { - description - "Transport network client signals access parameters"; - - leaf access-node-id { - type te-types:te-node-id; - description - "The identifier of the access node in the TE topology."; - } - - leaf access-node-uri { - type nw:node-id; - description - "The identifier of the access node in the network."; - } - - leaf access-ltp-id { - type te-types:te-tp-id; - description - "The TE link termination point identifier in TE topology, used - together with access-node-id to identify the access LTP."; - } - - leaf access-ltp-uri { - type nt:tp-id; - description - "The link termination point identifier in network topology, - used together with access-node-uri to identify the access LTP"; - } - - leaf client-signal { - type identityref { - base layer1-types:client-signal; - } - description - "Identify the client signal type associated with this port"; - } - - } - - grouping pm-state-grouping { - leaf latency { - description "latency value of the E2E client signal service"; - type uint32; - units microsecond; - } - } - - grouping error-info-grouping { - leaf error-code { - description "error code"; - type uint16; - } - - leaf error-description { - description "detail message of error"; - type string; - } - - leaf error-timestamp { - description "the date and time error is happened"; - type yang:date-and-time; - } - } - - grouping alarm-shreshold-grouping { - leaf latency-threshold { - description "a threshold for the E2E client signal service's - latency. Once the latency value exceed this threshold, an alarm - should be triggered."; - type uint32; - units microsecond; - } - } - - grouping client-svc-tunnel-parameters { - description - "Transport network client signals tunnel parameters"; - - leaf tunnel-name { - type string; - description - "TE tunnel instance name."; - } - } - - grouping client-svc-instance-config { - description - "Configuration parameters for client services."; - leaf client-svc-name { - type string; - description - "Identifier of the p2p transport network client signals."; - } - - leaf client-svc-title { - type string; - description - "Name of the p2p transport network client signals."; - } - - leaf user-label { - type string; - description - "Alias of the p2p transport network client signals."; - } - - leaf client-svc-descr { - type string; - description - "Description of the transport network client signals."; - } - - leaf client-svc-customer { - type string; - description - "Customer of the transport network client signals."; - } - - container resilience { - description "Place holder for resilience functionalities"; - } - - uses te-types:te-topology-identifier; - - leaf admin-status { - type identityref { - base te-types:tunnel-admin-state-type; - } - default te-types:tunnel-admin-state-up; - description "Client signals administrative state."; - } - - container src-access-ports { - description - "Source access port of a client signal."; - uses client-svc-access-parameters; - } - container dst-access-ports { - description - "Destination access port of a client signal."; - uses client-svc-access-parameters; - } - - container pm-state { - config false; - description "PM data of E2E client signal"; - uses pm-state-grouping; - } - - container error-info { - config false; - description "error messages of configuration"; - uses error-info-grouping; - } - - container alarm-shreshold { - description "threshold configuration for the E2E client signal"; - uses alarm-shreshold-grouping; - } - - leaf direction { - type identityref { - base clntsvc-types:direction; - } - description "Uni-dir or Bi-dir for the client signal."; - } - - list svc-tunnels { - key tunnel-name; - description - "List of the TE Tunnels supporting the client signal."; - uses client-svc-tunnel-parameters; - } - } - - grouping client-svc-instance-state { - description - "State parameters for client services."; - leaf operational-state { - type identityref { - base te-types:tunnel-state-type; - } - config false; - description "Client signal operational state."; - } - leaf provisioning-state { - type identityref { - base te-types:lsp-state-type; - } - config false; - description "Client signal provisioning state."; - } - leaf creation-time { - type yang:date-and-time; - config false; - description "The time of the client signal be created."; - } - leaf last-updated-time { - type yang:date-and-time; - config false; - description "The time of the client signal's latest update."; - } - leaf created-by { - type string; - config false; - description - "The client signal is created by whom, - can be a system or staff ID."; - } - leaf last-updated-by { - type string; - config false; - description - "The client signal is last updated by whom, - can be a system or staff ID."; - } - leaf owned-by { - type string; - config false; - description - "The client signal is owned by whom, - can be a system ID."; - } - } - - /* - * Data nodes - */ - - container client-svc { - description - "Transport client services."; - - list client-svc-instances { - key client-svc-name; - description - "The list of p2p transport client service instances"; - - uses client-svc-instance-config; - uses client-svc-instance-state; - } - } - } diff --git a/src/nbi/service/ietf_network/yang/ietf-trans-client-service@2024-01-11.yang b/src/nbi/service/ietf_network/yang/ietf-trans-client-service@2024-01-11.yang new file mode 100644 index 0000000000000000000000000000000000000000..60d9ea6735f7df0ec8346c52c6dd14533e39b008 --- /dev/null +++ b/src/nbi/service/ietf_network/yang/ietf-trans-client-service@2024-01-11.yang @@ -0,0 +1,338 @@ +module ietf-trans-client-service { + yang-version 1.1; + namespace + "urn:ietf:params:xml:ns:yang:ietf-trans-client-service"; + prefix clnt-svc; + + import ietf-yang-types { + prefix yang; + reference "RFC 6991: Common YANG Data Types"; + } + + import ietf-te-types { + prefix te-types; + reference "RFCYYYY: Traffic Engineering Common YANG Types"; + } + // RFC Editor: replace YYYY with the actual RFC number assigned + // to the RFC once draft-ietf-teas-rfc8776-update + // becomes an RFC, update date information and remove this note. + + import ietf-layer1-types { + prefix l1-types; + reference "RFCZZZZ: A YANG Data Model for Layer 1 Types"; + } + // RFC Editor: replace ZZZZ with the actual RFC number assigned + // to the RFC once draft-ietf-ccamp-layer1-types + // becomes an RFC, update date information and remove this note. + + import ietf-network { + prefix nw; + reference "RFC8345: A YANG Data Model for Network Topologies"; + } + + import ietf-network-topology { + prefix nt; + reference "RFC8345: A YANG Data Model for Network Topologies"; + } + + import ietf-trans-client-svc-types { + prefix clnt-types; + reference + "RFCXXXX: A YANG Data Model for Transport Network Client + Signals"; + } + // RFC Editor: replace XXXX with the actual RFC number assigned + // to the RFC once this draft + // becomes an RFC, update date information and remove this note. + + organization + "Internet Engineering Task Force (IETF) CCAMP WG"; + contact + "WG Web: + WG List: + + Editor: Haomian Zheng + + + Editor: Aihua Guo + + + Editor: Italo Busi + + + Editor: Anton Snitser + + + Editor: Chaode Yu + "; + + description + "This module defines a YANG data model for describing + transport network client services. + + The model fully conforms to the Network Management + Datastore Architecture (NMDA). + + Copyright (c) 2024 IETF Trust and the persons + identified as authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC XXXX; see + the RFC itself for full legal notices."; + + revision 2024-01-11 { + description + "Initial Version"; + reference + "RFC XXXX: A YANG Data Model for Transport Network Client + Signals"; + } + // RFC Editor: replace XXXX with the actual RFC number assigned + // to the RFC once this draft + // becomes an RFC, update date information and remove this note. + + /* + * Groupings + */ + + grouping client-svc-access-parameters { + description + "Transport network client signals access parameters"; + + leaf access-node-id { + type te-types:te-node-id; + description + "The identifier of the access node in the TE topology."; + } + leaf access-node-uri { + type nw:node-id; + description + "The identifier of the access node in the network."; + } + leaf access-ltp-id { + type te-types:te-tp-id; + description + "The TE link termination point identifier in TE topology, + used together with access-node-id to identify the access + Link Termination Point (LTP)."; + } + leaf access-ltp-uri { + type nt:tp-id; + description + "The link termination point identifier in network topology, + used together with access-node-uri to identify the access + LTP"; + } + leaf client-signal { + type identityref { + base l1-types:client-signal; + } + description + "Identify the client signal type associated with this port"; + } + } + + grouping pm-state-grouping { + description + "Performance Monitoring (PM) state attributes"; + leaf latency { + type uint32; + units microsecond; + description + "latency value of the E2E client signal service"; + } + } + + grouping error-info-grouping { + description + "Error information parameters"; + leaf error-code { + type uint16; + description "error code"; + } + leaf error-description { + type string; + description "detail message of error"; + } + leaf error-timestamp { + type yang:date-and-time; + description "the date and time error is happened"; + } + } + + grouping alarm-threshold-grouping { + description + "Alarm threshold parameters."; + leaf latency-threshold { + type uint32; + units microsecond; + description + "a threshold for the E2E client signal service's + latency. Once the latency value exceed this threshold, + an alarm should be triggered."; + } + } + + grouping client-svc-tunnel-parameters { + description + "Transport network client signals tunnel parameters"; + + leaf tunnel-name { + type string; + description + "TE tunnel instance name."; + } + } + + grouping client-svc-instance-config { + description + "Configuration parameters for client services."; + + leaf client-svc-name { + type string; + description + "Identifier of the p2p transport network client signals."; + } + leaf client-svc-title { + type string; + description + "Name of the p2p transport network client signals."; + } + leaf user-label { + type string; + description + "Alias of the p2p transport network client signals."; + } + leaf client-svc-descr { + type string; + description + "Description of the transport network client signals."; + } + leaf client-svc-customer { + type string; + description + "Customer of the transport network client signals."; + } + container resilience { + description "Place holder for resilience functionalities"; + } + uses te-types:te-topology-identifier; + leaf admin-status { + type identityref { + base te-types:tunnel-admin-state-type; + } + default te-types:tunnel-admin-state-up; + description "Client signals administrative state."; + } + container src-access-ports { + description + "Source access port of a client signal."; + uses client-svc-access-parameters; + } + container dst-access-ports { + description + "Destination access port of a client signal."; + uses client-svc-access-parameters; + } + container pm-state { + config false; + description "PM data of E2E client signal"; + uses pm-state-grouping; + } + container error-info { + config false; + description "error messages of configuration"; + uses error-info-grouping; + } + container alarm-threshold { + description + "threshold configuration for the E2E client signal"; + uses alarm-threshold-grouping; + } + leaf direction { + type identityref { + base clnt-types:direction; + } + description "Uni-dir or Bi-dir for the client signal."; + } + list svc-tunnels { + key tunnel-name; + description + "List of the TE Tunnels supporting the client signal."; + uses client-svc-tunnel-parameters; + } + } + + grouping client-svc-instance-state { + description + "State parameters for client services."; + leaf operational-state { + type identityref { + base te-types:tunnel-state-type; + } + config false; + description "Client signal operational state."; + } + leaf provisioning-state { + type identityref { + base te-types:lsp-state-type; + } + config false; + description "Client signal provisioning state."; + } + leaf creation-time { + type yang:date-and-time; + config false; + description "The time of the client signal be created."; + } + leaf last-updated-time { + type yang:date-and-time; + config false; + description "The time of the client signal's latest update."; + } + leaf created-by { + type string; + config false; + description + "The client signal is created by whom, + can be a system or staff ID."; + } + leaf last-updated-by { + type string; + config false; + description + "The client signal is last updated by whom, + can be a system or staff ID."; + } + leaf owned-by { + type string; + config false; + description + "The client signal is owned by whom, + can be a system ID."; + } + } + + /* + * Data nodes + */ + + container client-svc { + description + "Transport client services."; + + list client-svc-instances { + key client-svc-name; + description + "The list of p2p transport client service instances"; + uses client-svc-instance-config; + uses client-svc-instance-state; + } + } +} diff --git a/src/nbi/service/ietf_network/yang/ietf-trans-client-svc-types@2023-10-23.yang b/src/nbi/service/ietf_network/yang/ietf-trans-client-svc-types@2023-10-23.yang deleted file mode 100644 index 60db5633af691c53678870dc5f087b911726f2c6..0000000000000000000000000000000000000000 --- a/src/nbi/service/ietf_network/yang/ietf-trans-client-svc-types@2023-10-23.yang +++ /dev/null @@ -1,63 +0,0 @@ - module ietf-trans-client-svc-types { - namespace "urn:ietf:params:xml:ns:yang:ietf-trans-client-svc-types"; - prefix "clntsvc-types"; - - organization - "Internet Engineering Task Force (IETF) CCAMP WG"; - contact - " - ID-draft editor: - Haomian Zheng (zhenghaomian@huawei.com); - Aihua Guo (aihuaguo.ietf@gmail.com); - Italo Busi (italo.busi@huawei.com); - Anton Snitser (antons@sedonasys.com); - Francesco Lazzeri (francesco.lazzeri@ericsson.com); - Yunbin Xu (xuyunbin@caict.ac.cn); - Yang Zhao (zhaoyangyjy@chinamobile.com); - Xufeng Liu (Xufeng_Liu@jabil.com); - Giuseppe Fioccola (giuseppe.fioccola@huawei.com); - Chaode Yu (yuchaode@huawei.com); - "; - - description - "This module defines a YANG data model for describing - transport network client types. The model fully conforms - to the Network Management Datastore Architecture (NMDA). - - Copyright (c) 2019 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 XXXX; see - the RFC itself for full legal notices."; - - revision 2023-10-23 { - description - "version -01 as a WG document"; - reference - "draft-ietf-ccamp-client-signal-yang"; - } - - identity direction { - description - "Direction information of Client Signal."; - } - - identity bidirectional { - base direction; - description - "Client Signal is bi-directional."; - } - - identity unidirectional { - base direction; - description - "Client Signal is uni-directional."; - } - - } diff --git a/src/nbi/service/ietf_network/yang/ietf-trans-client-svc-types@2024-01-11.yang b/src/nbi/service/ietf_network/yang/ietf-trans-client-svc-types@2024-01-11.yang new file mode 100644 index 0000000000000000000000000000000000000000..dd40c9a81a40a8c6dcd1c845f192e9c629cd20b8 --- /dev/null +++ b/src/nbi/service/ietf_network/yang/ietf-trans-client-svc-types@2024-01-11.yang @@ -0,0 +1,77 @@ +module ietf-trans-client-svc-types { + yang-version 1.1; + namespace + "urn:ietf:params:xml:ns:yang:ietf-trans-client-svc-types"; + prefix clnt-types; + + organization + "Internet Engineering Task Force (IETF) CCAMP WG"; + contact + "WG Web: + WG List: + + Editor: Haomian Zheng + + + Editor: Aihua Guo + + + Editor: Italo Busi + + + Editor: Anton Snitser + + + Editor: Chaode Yu + "; + + description + "This module defines a collection of common YANG identity + definitions for describing Costant Bit Rate (CBR) transport + network clients. + + Copyright (c) 2024 IETF Trust and the persons + identified as authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC XXXX; see + the RFC itself for full legal notices."; + + revision 2024-01-11 { + description + "Initial Version"; + reference + "RFC XXXX: A YANG Data Model for Transport Network Client + Signals"; + } + // RFC Editor: replace XXXX with the actual RFC number assigned + // to the RFC once this draft + // becomes an RFC, update date information and remove this note. + + /* + * Identities + */ + + identity direction { + description + "Direction information of Client Signal."; + } + + identity bidirectional { + base direction; + description + "Client Signal is bi-directional."; + } + + identity unidirectional { + base direction; + description + "Client Signal is uni-directional."; + } +} diff --git a/src/nbi/service/ietf_network/yang/ietf-yang-types@2025-12-22.yang b/src/nbi/service/ietf_network/yang/ietf-yang-types@2025-12-22.yang new file mode 100644 index 0000000000000000000000000000000000000000..09218bbd4a2be9c3d223fabe55990c9c7fd99138 --- /dev/null +++ b/src/nbi/service/ietf_network/yang/ietf-yang-types@2025-12-22.yang @@ -0,0 +1,764 @@ +module ietf-yang-types { + namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types"; + prefix yang; + + organization + "IETF Network Modeling (NETMOD) Working Group"; + contact + "WG Web: + WG List: + + Editor: Jürgen Schönwälder + "; + description + "This module contains a collection of generally useful derived + YANG data types. + + The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL + NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', + 'MAY', and 'OPTIONAL' in this document are to be interpreted as + described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, + they appear in all capitals, as shown here. + + Copyright (c) 2025 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 9911; + see the RFC itself for full legal notices."; + + revision 2025-12-22 { + description + "This revision adds the following new data types: + - yang:date + - yang:date-no-zone + - yang:time + - yang:time-no-zone + - yang:hours32 + - yang:minutes32 + - yang:seconds32 + - yang:centiseconds32 + - yang:milliseconds32 + - yang:microseconds32 + - yang:microseconds64 + - yang:nanoseconds32 + - yang:nanoseconds64 + - yang:language-tag + The yang-identifier definition has been aligned with YANG + 1.1, and types representing time support the representation + of leap seconds. The representation of time zone offsets + has been aligned with RFC 9557. Several description and + pattern statements have been improved."; + reference + "RFC 9911: Common YANG Data Types"; + } + revision 2013-07-15 { + description + "This revision adds the following new data types: + - yang:yang-identifier + - yang:hex-string + - yang:uuid + - yang: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 + discontinuities occur at times other than re-initialization + (for example, at the instantiation of a schema node of type + counter32), 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 counter32; + default "0"; + description + "The zero-based-counter32 type represents a counter32 + that has the defined 'initial' value zero. + + A data tree node using 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 data tree node + using 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 + discontinuities occur at times other than re-initialization + (for example, at the instantiation of a schema node of type + counter64), 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 counter64; + default "0"; + description + "The zero-based-counter64 type represents a counter64 that + has the defined 'initial' value zero. + + A data tree node using 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 data tree node + using 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 + the maximum value, the gauge32 also decreases; likewise, if + the information increases above the minimum value, the + gauge32 also 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][0-9]*))))' + + '(\.(0|([1-9][0-9]*)))*'; + } + 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 + "ISO 9834-1: Information technology -- Procedures for the + operation of object identifier registration authorities -- + Part 1: General procedures and top arcs of the international + object identifier tree"; + } + + typedef object-identifier-128 { + type object-identifier { + pattern '[0-9]*(\.[0-9]*){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)"; + } + + /*** collection of types related to date and time ***/ + + typedef date-and-time { + type string { + pattern + '[0-9]{4}-(1[0-2]|0[1-9])-(0[1-9]|[1-2][0-9]|3[0-1])' + + 'T(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)' + + '(\.[0-9]+)?' + + '(Z|[\+\-]((1[0-3]|0[0-9]):([0-5][0-9])|14:00))?'; + } + 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 and the + update defined in Section 2 of RFC 9557. The value of + 60 for seconds is allowed only in the case of leap seconds. + + The date-and-time type is compatible with the dateTime XML + schema dateTime type with the following notable exceptions: + + (a) The date-and-time type does not allow negative years. + + (b) The time-offset Z indicates that the date-and-time + value is reported in UTC and that the local time zone + reference point is unknown. The time-offset +00:00 + indicates that the date-and-time value is reported in + UTC and that the local time zone reference point is UTC + (see Section 2 of RFC 9557). + + 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 if a server automatically follows + daylight saving time (DST) time zone offset changes. The + canonical format for date-and-time values reported in UTC + with an unknown local time zone offset SHOULD use the + time-offset Z and MAY use -00:00 for backwards + compatibility."; + reference + "ISO 8601: Data elements and interchange formats -- Information + interchange -- Representation of dates and times + RFC 3339: Date and Time on the Internet: Timestamps + RFC 9557: Date and Time on the Internet: Timestamps + with Additional Information + RFC 2579: Textual Conventions for SMIv2 + XSD-TYPES: XML Schema Definition Language (XSD) 1.1 + Part 2: Datatypes"; + } + + typedef date { + type string { + pattern '[0-9]{4}-(1[0-2]|0[1-9])-(0[1-9]|[1-2][0-9]|3[0-1])' + + '(Z|[\+\-]((1[0-3]|0[0-9]):([0-5][0-9])|14:00))?'; + } + description + "The date type represents a time-interval of the length + of a day, i.e., 24 hours. It includes an optional time + zone offset. + + The date type is compatible with the XML schema date + type with the following notable exceptions: + + (a) The date type does not allow negative years. + + (b) The time-offset Z indicates that the date value is + reported in UTC and that the local time zone reference + point is unknown. The time-offset +00:00 indicates that + the date value is reported in UTC and that the local + time zone reference point is UTC (see Section 2 of + RFC 9557). + + The canonical format for date 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 values + to change accordingly. Such changes might happen periodically + if a server automatically follows daylight saving time + (DST) time zone offset changes. The canonical format for + date values reported in UTC with an unknown local time zone + offset uses the time-offset Z."; + reference + "RFC 3339: Date and Time on the Internet: Timestamps + RFC 9557: Date and Time on the Internet: Timestamps + with Additional Information + XSD-TYPES: XML Schema Definition Language (XSD) 1.1 + Part 2: Datatypes"; + } + + typedef date-no-zone { + type date { + pattern '[0-9]{4}-(1[0-2]|0[1-9])-(0[1-9]|[1-2][0-9]|3[0-1])'; + } + description + "The date-no-zone type represents a date without the optional + time zone offset information."; + } + + typedef time { + type string { + pattern + '(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)' + + '(\.[0-9]+)?' + + '(Z|[\+\-]((1[0-3]|0[0-9]):([0-5][0-9])|14:00))?'; + } + description + "The time type represents an instance of time of zero duration + that recurs every day. It includes an optional time zone + offset. The value of 60 for seconds is allowed only in the + case of leap seconds. + + The time type is compatible with the XML schema time + type with the following notable exception: + + (a) The time-offset Z indicates that the time value is + reported in UTC and that the local time zone reference + point is unknown. The time-offset +00:00 indicates that + the time value is reported in UTC and that the local + time zone reference point is UTC (see Section 2 of + RFC 9557). + + The canonical format for 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 time values + to change accordingly. Such changes might happen periodically + if a server automatically follows daylight saving time + (DST) time zone offset changes. The canonical format for + time values reported in UTC with an unknown local time zone + offset uses the time-offset Z."; + reference + "RFC 3339: Date and Time on the Internet: Timestamps + RFC 9557: Date and Time on the Internet: Timestamps + with Additional Information + XSD-TYPES: XML Schema Definition Language (XSD) 1.1 + Part 2: Datatypes"; + } + + typedef time-no-zone { + type time { + pattern + '(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)' + + '(\.[0-9]+)?'; + } + description + "The time-no-zone type represents a time without the optional + time zone offset information."; + } + + typedef hours32 { + type int32; + units "hours"; + description + "A period of time measured in units of hours. + + The maximum time period that can be expressed is in the + range [-89478485 days 08:00:00 to 89478485 days 07:00:00]. + + This type should be range-restricted in situations + where only non-negative time periods are desirable + (i.e., range '0..max')."; + } + + typedef minutes32 { + type int32; + units "minutes"; + description + "A period of time measured in units of minutes. + + The maximum time period that can be expressed is in the + range [-1491308 days 2:08:00 to 1491308 days 2:07:00]. + + This type should be range-restricted in situations + where only non-negative time periods are desirable + (i.e., range '0..max')."; + } + + typedef seconds32 { + type int32; + units "seconds"; + description + "A period of time measured in units of seconds. + + The maximum time period that can be expressed is in the + range [-24855 days 03:14:08 to 24855 days 03:14:07]. + + This type should be range-restricted in situations + where only non-negative time periods are desirable + (i.e., range '0..max')."; + } + + typedef centiseconds32 { + type int32; + units "centiseconds"; + description + "A period of time measured in units of 10^-2 seconds. + + The maximum time period that can be expressed is in the + range [-248 days 13:13:56 to 248 days 13:13:56]. + + This type should be range-restricted in situations + where only non-negative time periods are desirable + (i.e., range '0..max')."; + } + + typedef milliseconds32 { + type int32; + units "milliseconds"; + description + "A period of time measured in units of 10^-3 seconds. + + The maximum time period that can be expressed is in the + range [-24 days 20:31:23 to 24 days 20:31:23]. + + This type should be range-restricted in situations + where only non-negative time periods are desirable + (i.e., range '0..max')."; + } + + typedef microseconds32 { + type int32; + units "microseconds"; + description + "A period of time measured in units of 10^-6 seconds. + + The maximum time period that can be expressed is in the + range [-00:35:47 to 00:35:47]. + + This type should be range-restricted in situations + where only non-negative time periods are desirable + (i.e., range '0..max')."; + } + + typedef microseconds64 { + type int64; + units "microseconds"; + description + "A period of time measured in units of 10^-6 seconds. + + The maximum time period that can be expressed is in the + range [-106751991 days 04:00:54 to 106751991 days 04:00:54]. + + This type should be range-restricted in situations + where only non-negative time periods are desirable + (i.e., range '0..max')."; + } + + typedef nanoseconds32 { + type int32; + units "nanoseconds"; + description + "A period of time measured in units of 10^-9 seconds. + + The maximum time period that can be expressed is in the + range [-00:00:02 to 00:00:02]. + + This type should be range-restricted in situations + where only non-negative time periods are desirable + (i.e., range '0..max')."; + } + + typedef nanoseconds64 { + type int64; + units "nanoseconds"; + description + "A period of time measured in units of 10^-9 seconds. + + The maximum time period that can be expressed is in the + range [-106753 days 23:12:44 to 106752 days 0:47:16]. + + This type should be range-restricted in situations + where only non-negative time periods are desirable + (i.e., range '0..max')."; + } + + 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 timeticks; + description + "The timestamp type represents the value of an associated + timeticks schema node instance 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 schema node instance 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 schema node + instance 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 of 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 a 48-bit IEEE 802 Media + Access Control (MAC) address. The canonical representation + uses lowercase characters. Note that there are IEEE 802 MAC + addresses with a different length that this type cannot + represent. The phys-address type may be used to represent + physical addresses of varying length. + + 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 9562. The canonical representation uses + lowercase characters. + + The following is an example of a UUID in string + representation: + f81d4fae-7dec-11d0-a765-00a0c91e6bf6. + "; + reference + "RFC 9562: Universally Unique IDentifiers (UUIDs)"; + } + + 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."; + } + + typedef language-tag { + type string; + description + "A language tag according to RFC 5646 (BCP 47). The + canonical representation uses lowercase characters. + + Values of this type must be well-formed language tags, + in conformance with the definition of well-formed tags + in BCP 47. Implementations MAY further limit the values + they accept to those permitted by a 'validating' + processor, as defined in BCP 47. + + The canonical representation of values of this type is + aligned with the SMIv2 LangTag textual convention for + language tags fitting the length constraints imposed + by the LangTag textual convention."; + reference + "RFC 5646: Tags for Identifying Languages + RFC 5131: A MIB Textual Convention for Language Tags"; + } + + /*** collection of YANG-specific types ***/ + + typedef yang-identifier { + type string { + length "1..max"; + pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*'; + } + description + "A YANG identifier string as defined by the 'identifier' + rule in Section 14 of RFC 7950. 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. + + This definition conforms to YANG 1.1 defined in RFC + 7950. In RFC 6991, this definition excluded + all identifiers starting with any possible combination + of the lowercase or uppercase character sequence 'xml', + as required by YANG 1 defined in RFC 6020. If this type + is used in a YANG 1 context, then this restriction still + applies."; + reference + "RFC 7950: The YANG 1.1 Data Modeling Language + RFC 6991: Common YANG Data Types + RFC 6020: YANG - A Data Modeling Language for the + Network Configuration Protocol (NETCONF)"; + } +} diff --git a/src/nbi/service/ietf_network_slice/bindings/__init__.py b/src/nbi/service/ietf_network_slice/bindings/__init__.py index 1ce8327f5ad525b2bf49b9c84a229aa2d958bb57..ebcdd717ab70423deda85079ab469da83897efbe 100644 --- a/src/nbi/service/ietf_network_slice/bindings/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/__init__.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/nbi/service/ietf_network_slice/bindings/nacm/__init__.py b/src/nbi/service/ietf_network_slice/bindings/nacm/__init__.py index eeddff20c41d9819c03c79232a7ec6e763b32239..232a40dd07b7c03f0ce4a08b6fba7634b991b6dc 100644 --- a/src/nbi/service/ietf_network_slice/bindings/nacm/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/nacm/__init__.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/nbi/service/ietf_network_slice/bindings/nacm/groups/__init__.py b/src/nbi/service/ietf_network_slice/bindings/nacm/groups/__init__.py index 43035855bbd9742ee0e38556a4fc9cbd411ba8ef..8f9cec53089fab54f5ab8e8d4b81ff25631eb6b1 100644 --- a/src/nbi/service/ietf_network_slice/bindings/nacm/groups/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/nacm/groups/__init__.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/nbi/service/ietf_network_slice/bindings/nacm/groups/group/__init__.py b/src/nbi/service/ietf_network_slice/bindings/nacm/groups/group/__init__.py index 25c76f6808935ff2ea0f188c10d02ccab648e9c4..5ffbb1991880ea5ff5a70f608a812fc12b3b8492 100644 --- a/src/nbi/service/ietf_network_slice/bindings/nacm/groups/group/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/nacm/groups/group/__init__.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/nbi/service/ietf_network_slice/bindings/nacm/rule_list/__init__.py b/src/nbi/service/ietf_network_slice/bindings/nacm/rule_list/__init__.py index a4886cb86a625210cdc5b1bcba9413f525c1b81b..9512bb80063c9b8b7c2a43cfbaa90eda5624adc0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/nacm/rule_list/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/nacm/rule_list/__init__.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/nbi/service/ietf_network_slice/bindings/nacm/rule_list/rule/__init__.py b/src/nbi/service/ietf_network_slice/bindings/nacm/rule_list/rule/__init__.py index 955ce25383328c5f02d3c644fed415cc9a384b85..0e7f801e26eb707675c7a74bdf8dc22071f7442f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/nacm/rule_list/rule/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/nacm/rule_list/rule/__init__.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/nbi/service/ietf_network_slice/bindings/nacm/rule_list/rule/rule_type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/nacm/rule_list/rule/rule_type/__init__.py index 2e904a74e9430d7b96a4b864721294797bc6c8e1..65afdd24ebed8e73930058c7de3a23cf17aa824b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/nacm/rule_list/rule/rule_type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/nacm/rule_list/rule/rule_type/__init__.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/nbi/service/ietf_network_slice/bindings/nacm/rule_list/rule/rule_type/data_node/__init__.py b/src/nbi/service/ietf_network_slice/bindings/nacm/rule_list/rule/rule_type/data_node/__init__.py index 6dee458b28d386c8f0165ee3ae5ca8b8106bb5b1..f3aee3998af289a6e1c2582ec25d454755625f87 100644 --- a/src/nbi/service/ietf_network_slice/bindings/nacm/rule_list/rule/rule_type/data_node/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/nacm/rule_list/rule/rule_type/data_node/__init__.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/nbi/service/ietf_network_slice/bindings/nacm/rule_list/rule/rule_type/notification/__init__.py b/src/nbi/service/ietf_network_slice/bindings/nacm/rule_list/rule/rule_type/notification/__init__.py index 651b60be76807ce54114aab53f8edda043529f36..020ff68107b88620112384cf4063d18e0c75468f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/nacm/rule_list/rule/rule_type/notification/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/nacm/rule_list/rule/rule_type/notification/__init__.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/nbi/service/ietf_network_slice/bindings/nacm/rule_list/rule/rule_type/protocol_operation/__init__.py b/src/nbi/service/ietf_network_slice/bindings/nacm/rule_list/rule/rule_type/protocol_operation/__init__.py index 57c048d408159e02b9702486d7a2574e65d5b4e9..46e308b9257e69b50da34c2bffec0e6bf288104f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/nacm/rule_list/rule/rule_type/protocol_operation/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/nacm/rule_list/rule/rule_type/protocol_operation/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/__init__.py index 8441bdeb0694db003fee46ec8887a69331bed355..e6e79bd3bfb872f60cadaee3b0cee217a17b7f78 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/__init__.py index e353bf60b5ee6aa3cf5d15722bb943ce2ed624ad..c55b113d696a7e7a18365c9395607b3ec4c8bc62 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/__init__.py index 296b0c9c8f53142821807ee1c3b86cb36b202e8b..2d93ed4848e1a493b96cd98659ad965f92324a64 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/__init__.py index adb053989315379cc890bc0891981bf8a0a9255b..e32a6de222cc857feb5a7d452de66450f19702b8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connection_group_monitoring/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connection_group_monitoring/__init__.py index 4c3c0bba33f0ac654a4ad4f5f0150350de2fd3b1..9ab3dfddbeac8eea8c734790bbd46a6cb129b387 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connection_group_monitoring/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connection_group_monitoring/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/__init__.py index e172ea22fccd98d865fb99a441e8849d67694cfa..1e444d181f0c11c7d0086a458d7cef7378cab6c3 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_monitoring/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_monitoring/__init__.py index 0de7b4ae596aaaf99209c82418dafb32fefefe1e..9f4ef5bab8f69fc2fcef5689c76c815a2bef16f1 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_monitoring/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_monitoring/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/__init__.py index 8c8e02942244f4961d0aafb9c4b128ee48d8148d..541ade643ba63523fda04ddd8e597e57eda5080c 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/__init__.py index 4224da0be010ed8f7e13f085c38ea1f3f3ace9d9..2d177391784b8c7b50ff59e93df07fffae1870f9 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/__init__.py index 447517ee1da2d271189eb6ac03faf7c66934d434..1f3cf9464eae30db9d25c1dfbd7e4f40b9805469 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/__init__.py index 9b3e158596cf4aa62fd219f91742afa046d286a3..306bd9643da3b52a90cea6a0b1b90545ec838610 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/__init__.py index b2b1f998e42cffeeebd9a89c8f64503831d3b65c..c554750de7292b0e682f86947878828b688e7dbf 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/__init__.py index e542083d84663afe77efc98b57401bca2ebdff89..07d50f95cbafc1a2d9b2b9847eb27f4df80b99e9 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/__init__.py index 36ed9c582b84713ae7d2ff3b5b5c961eefce64cd..230c81bb6e184010de90f18a63ae275314c856ad 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/metric_bound/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/metric_bound/__init__.py index b8c97e698a3241058ea813f1aa37f9f0613aff9d..54775ed4ddd193a5c1b8c779dcce9cd58a4cd0d0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/metric_bound/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/metric_bound/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/__init__.py index b27058bcda070017c573c2ac62e22c98e9501be7..6bc03c5dc6ebfa676e44c4b7de18a12cdf18a800 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/path_constraints/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/path_constraints/__init__.py index bdf32c475add75b454b03f6e9b45e35f6b556593..76c7f221a31d5a87e963a5e08d0f50ea2619c818 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/path_constraints/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/path_constraints/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/service_function/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/service_function/__init__.py index 297fdc436d5a324e011d4db71d10103b17fa86a5..4da57e17de2294656260cef31de9ac6672cadcbc 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/service_function/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/service_function/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/standard/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/standard/__init__.py index 639f8336ced845d0f4c8c459676f27144a2ef2e7..575fa1d7682839987a9d5f252da59eed8c6fe925 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/standard/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/a2a/a2a_sdp/slo_sle_policy/standard/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/p2mp/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/p2mp/__init__.py index fb95db32893dd51d33560d08fa461a1b8a81dbab..2aded7ebb357c11f5289706a112e28a005a67a7c 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/p2mp/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/p2mp/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/p2p/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/p2p/__init__.py index 23c354154783908636ae387f5e644275f76a7da8..ebf37924512f377553fdd505107ee0c650227101 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/p2p/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/connectivity_construct_type/p2p/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/__init__.py index 9b3e158596cf4aa62fd219f91742afa046d286a3..306bd9643da3b52a90cea6a0b1b90545ec838610 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/__init__.py index b2b1f998e42cffeeebd9a89c8f64503831d3b65c..c554750de7292b0e682f86947878828b688e7dbf 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/__init__.py index e542083d84663afe77efc98b57401bca2ebdff89..07d50f95cbafc1a2d9b2b9847eb27f4df80b99e9 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/__init__.py index 36ed9c582b84713ae7d2ff3b5b5c961eefce64cd..230c81bb6e184010de90f18a63ae275314c856ad 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/metric_bound/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/metric_bound/__init__.py index fd09001989f239be28683e3662212a67a9928e5a..0c9611302ae417c18fc81e5223ef52cec52cd568 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/metric_bound/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/metric_bound/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/__init__.py index 9ac75543b9cef16b0c4229c57bc16ac020404b92..96f536c265ef25654ebf86c79ce65528a63b7639 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/path_constraints/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/path_constraints/__init__.py index bdf32c475add75b454b03f6e9b45e35f6b556593..76c7f221a31d5a87e963a5e08d0f50ea2619c818 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/path_constraints/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/path_constraints/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/service_function/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/service_function/__init__.py index 297fdc436d5a324e011d4db71d10103b17fa86a5..4da57e17de2294656260cef31de9ac6672cadcbc 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/service_function/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/service_function/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/standard/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/standard/__init__.py index 639f8336ced845d0f4c8c459676f27144a2ef2e7..575fa1d7682839987a9d5f252da59eed8c6fe925 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/standard/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/connectivity_construct/slo_sle_policy/standard/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/__init__.py index 9b3e158596cf4aa62fd219f91742afa046d286a3..306bd9643da3b52a90cea6a0b1b90545ec838610 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/__init__.py index b2b1f998e42cffeeebd9a89c8f64503831d3b65c..c554750de7292b0e682f86947878828b688e7dbf 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/__init__.py index f30bd594b6f890d6c41a71c26951c04b818397bc..b43464046230fb8c8f07a28b4e8c91f2ce38465b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/__init__.py index 36ed9c582b84713ae7d2ff3b5b5c961eefce64cd..230c81bb6e184010de90f18a63ae275314c856ad 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/metric_bound/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/metric_bound/__init__.py index e1385f4d0f397416f48a6293f343e83062c6cf0f..e611bb14bb46a5535271d9d454dc01ff125feaf1 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/metric_bound/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/metric_bound/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/__init__.py index 9ac75543b9cef16b0c4229c57bc16ac020404b92..96f536c265ef25654ebf86c79ce65528a63b7639 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/path_constraints/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/path_constraints/__init__.py index bdf32c475add75b454b03f6e9b45e35f6b556593..76c7f221a31d5a87e963a5e08d0f50ea2619c818 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/path_constraints/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/path_constraints/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/service_function/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/service_function/__init__.py index 297fdc436d5a324e011d4db71d10103b17fa86a5..4da57e17de2294656260cef31de9ac6672cadcbc 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/service_function/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/service_function/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/standard/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/standard/__init__.py index 639f8336ced845d0f4c8c459676f27144a2ef2e7..575fa1d7682839987a9d5f252da59eed8c6fe925 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/standard/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/connection_groups/connection_group/slo_sle_policy/standard/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/__init__.py index 73ce59f0c595c23f1843bcfd8caf1762d50b1076..a32ca56022522cb51a33400cd8788f5b9ef4c427 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/__init__.py index 3727a0a9b4f9300693fa6e89c523c7b493bea7c5..1a46b0e0bb03174563cbc2e022c12a709cc81378 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/__init__.py index 9f31168ac33bbb7a741f5527e8807e30d89e7745..402a9a9283d0b147917e8fb4142542272cc595ee 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/__init__.py index a5bb242343b9510c3babe658d5687fd050e8437c..60fdf5a6aa296688340f8c20db3050a3eb5eda33 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/ac_tags/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/ac_tags/__init__.py index 1ad33efea7f6765432dc979c4e02bd2ad2fa1127..30be918e120592b10a9b45c7691d4d09a5e559a2 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/ac_tags/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/ac_tags/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/ac_tags/ac_tag_opaque/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/ac_tags/ac_tag_opaque/__init__.py index da51291e64f46be7bcfa387dd4c22644873208cc..eb3dc7faa44b65086e89bd424330fc40601dde9c 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/ac_tags/ac_tag_opaque/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/ac_tags/ac_tag_opaque/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/ac_tags/ac_tags/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/ac_tags/ac_tags/__init__.py index a4bf2a4babfdfd9a6878b464321dd019694cc919..8cb6b3aa43352bf497d696d33949e37fc16bf3b6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/ac_tags/ac_tags/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/ac_tags/ac_tags/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/incoming_qos_policy/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/incoming_qos_policy/__init__.py index 1803594454aa66ca639ae483b23d5c75623bbfbb..cd537e19b20556aa4994e537fa4b183c4ac59891 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/incoming_qos_policy/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/incoming_qos_policy/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/incoming_qos_policy/rate_limits/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/incoming_qos_policy/rate_limits/__init__.py index 644b85a6cb5851dcd73f41cbe4928706d9438006..0fcaf98bd3aaa244114f8f730ca8b9a9e65340e5 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/incoming_qos_policy/rate_limits/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/incoming_qos_policy/rate_limits/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/outgoing_qos_policy/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/outgoing_qos_policy/__init__.py index 438ecad18cf453c82f246c0b2e01b6c7867d1502..f39c2f9988d172d424c631462f9deb0eafb00455 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/outgoing_qos_policy/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/outgoing_qos_policy/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/outgoing_qos_policy/rate_limits/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/outgoing_qos_policy/rate_limits/__init__.py index 7b4c7ea22540c575f2bca546c2c8f841f5a40fbc..41c2ae2c5927d7d335b9edb033beafe78caf39ef 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/outgoing_qos_policy/rate_limits/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/outgoing_qos_policy/rate_limits/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/sdp_peering/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/sdp_peering/__init__.py index bff2bb9c153ab12693b750b73213ace0797faf4e..b63287c912c67c0eee2d6d54f87e45e6b5772e8e 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/sdp_peering/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/sdp_peering/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/sdp_peering/opaque/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/sdp_peering/opaque/__init__.py index c397ebdd74959a116c4f420d7f1de67805052eba..5bb1f4bd64133251bfe32561bca5158c6e34b179 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/sdp_peering/opaque/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/sdp_peering/opaque/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/sdp_peering/protocol/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/sdp_peering/protocol/__init__.py index 428e2dbee6177178cc516f50c7516de4a89ec7cc..49cf03ea9cbeaa049ced2c1a99d7a1ea4aff1ec8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/sdp_peering/protocol/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/sdp_peering/protocol/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/sdp_peering/protocol/attribute/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/sdp_peering/protocol/attribute/__init__.py index ff3ba97325ed43f4a256a471b61d78dcd6317569..31a45f64040037e2a6f54240b4800584077e4ff0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/sdp_peering/protocol/attribute/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/attachment_circuits/attachment_circuit/sdp_peering/protocol/attribute/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/incoming_qos_policy/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/incoming_qos_policy/__init__.py index 1803594454aa66ca639ae483b23d5c75623bbfbb..cd537e19b20556aa4994e537fa4b183c4ac59891 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/incoming_qos_policy/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/incoming_qos_policy/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/incoming_qos_policy/rate_limits/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/incoming_qos_policy/rate_limits/__init__.py index 929407f497a9bcc46b4d63fe71284abb0aad353b..ca8c8a32244e270724720fd186bd94c67da233df 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/incoming_qos_policy/rate_limits/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/incoming_qos_policy/rate_limits/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/location/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/location/__init__.py index 11f0d0d786a6787fe2296e1567b681d5ac864ba1..fdb0065e85e1983b796fe98b93d5d8ef0b117d68 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/location/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/location/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/outgoing_qos_policy/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/outgoing_qos_policy/__init__.py index 438ecad18cf453c82f246c0b2e01b6c7867d1502..f39c2f9988d172d424c631462f9deb0eafb00455 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/outgoing_qos_policy/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/outgoing_qos_policy/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/outgoing_qos_policy/rate_limits/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/outgoing_qos_policy/rate_limits/__init__.py index 620fcb65ba0b007d7a998b8b6a66d633ffb335d8..cec99e125486364a815119c3afad5ef4761c7cc8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/outgoing_qos_policy/rate_limits/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/outgoing_qos_policy/rate_limits/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/sdp_monitoring/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/sdp_monitoring/__init__.py index b3ceabd8562fb89fba74c1567767161132b7cb5b..dc64c69b81a4314c4d78af27cc68f708ff0d48df 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/sdp_monitoring/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/sdp_monitoring/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/sdp_peering/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/sdp_peering/__init__.py index cec33be52f6eea99ab416124615ffd284f3b785d..e813f22206eee0d488267a55363ce472ee7673c4 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/sdp_peering/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/sdp_peering/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/sdp_peering/opaque/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/sdp_peering/opaque/__init__.py index c397ebdd74959a116c4f420d7f1de67805052eba..5bb1f4bd64133251bfe32561bca5158c6e34b179 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/sdp_peering/opaque/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/sdp_peering/opaque/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/sdp_peering/protocol/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/sdp_peering/protocol/__init__.py index 428e2dbee6177178cc516f50c7516de4a89ec7cc..49cf03ea9cbeaa049ced2c1a99d7a1ea4aff1ec8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/sdp_peering/protocol/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/sdp_peering/protocol/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/sdp_peering/protocol/attribute/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/sdp_peering/protocol/attribute/__init__.py index ff3ba97325ed43f4a256a471b61d78dcd6317569..31a45f64040037e2a6f54240b4800584077e4ff0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/sdp_peering/protocol/attribute/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/sdp_peering/protocol/attribute/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/service_match_criteria/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/service_match_criteria/__init__.py index 5d6e28b31589b748832c45afd4f1db3b75c1ec2c..02a4e0ccd08b26d513cb37ce43159628a57c54a9 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/service_match_criteria/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/service_match_criteria/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/service_match_criteria/match_criterion/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/service_match_criteria/match_criterion/__init__.py index 0eb9e966eab889db7f6983acec5bdb6503a856e5..c7b0c4ba5d497e9a52f5d6cd8740b46ee6f58428 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/service_match_criteria/match_criterion/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/service_match_criteria/match_criterion/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/status/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/status/__init__.py index 637502c60b97e0dc7ba074411ffd051e75e0d59c..38be5671acc2d7ed2b063bfebb750fa0f199c55c 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/status/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/status/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/status/admin_status/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/status/admin_status/__init__.py index 8be09818ece8ad1e4863a37e3695bb8766e221db..bddc103f29c7c38910421c6b030b46478c75a6f1 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/status/admin_status/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/status/admin_status/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/status/oper_status/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/status/oper_status/__init__.py index 1e2ef07ed29711474f94764f2e2b30f7ee53a853..295aa1060e426948a9c340a21b507e1b0639576c 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/status/oper_status/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/sdps/sdp/status/oper_status/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/service_tags/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/service_tags/__init__.py index 361525f8b1b9fc28b95f3b6d6f53454737e75524..9597e79a9f8a9eb6f6df5991e072806efae5bf5e 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/service_tags/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/service_tags/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/service_tags/tag_opaque/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/service_tags/tag_opaque/__init__.py index 62c13c73d3921150c4c6dec83eca2b0fb187e33d..68cd304b42f3326626a06d24dcc15cd26d9c6494 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/service_tags/tag_opaque/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/service_tags/tag_opaque/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/service_tags/tag_type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/service_tags/tag_type/__init__.py index cc114d6147813bcffa28bed6c42359f7687b6ec2..e6445e883c451946e581115fd9a9273fd88e77b7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/service_tags/tag_type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/service_tags/tag_type/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/__init__.py index 9b3e158596cf4aa62fd219f91742afa046d286a3..306bd9643da3b52a90cea6a0b1b90545ec838610 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/__init__.py index b2b1f998e42cffeeebd9a89c8f64503831d3b65c..c554750de7292b0e682f86947878828b688e7dbf 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/__init__.py index 39b030bcbe5ec1e26ae544823a11392e8f502c49..d1c08e962b06f1b03ffc83e143423f53cdb86473 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/__init__.py index 36ed9c582b84713ae7d2ff3b5b5c961eefce64cd..230c81bb6e184010de90f18a63ae275314c856ad 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/metric_bound/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/metric_bound/__init__.py index a1898734d977fde94a8f3bacbf382af2f3a39ffd..40d7be9e110d2314480672c1b9c65b554791dafc 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/metric_bound/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/metric_bounds/metric_bound/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/__init__.py index b27058bcda070017c573c2ac62e22c98e9501be7..6bc03c5dc6ebfa676e44c4b7de18a12cdf18a800 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/path_constraints/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/path_constraints/__init__.py index bdf32c475add75b454b03f6e9b45e35f6b556593..76c7f221a31d5a87e963a5e08d0f50ea2619c818 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/path_constraints/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/path_constraints/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/service_function/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/service_function/__init__.py index 297fdc436d5a324e011d4db71d10103b17fa86a5..4da57e17de2294656260cef31de9ac6672cadcbc 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/service_function/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/custom/service_slo_sle_policy/steering_constraints/service_function/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/standard/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/standard/__init__.py index 639f8336ced845d0f4c8c459676f27144a2ef2e7..575fa1d7682839987a9d5f252da59eed8c6fe925 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/standard/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/slo_sle_policy/standard/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/status/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/status/__init__.py index c1e5d9a4edc937e3bec9bef13912b46c5c25595c..dd5f0dce1241b9a846839e5fd414d64f780341a1 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/status/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/status/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/status/admin_status/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/status/admin_status/__init__.py index 8be09818ece8ad1e4863a37e3695bb8766e221db..bddc103f29c7c38910421c6b030b46478c75a6f1 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/status/admin_status/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/status/admin_status/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/status/oper_status/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/status/oper_status/__init__.py index c8c38236ce056f5a400e99b4d948f908f1a54f59..abda39cb3e1a85abcdb37881df851e40c7cc3bc6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/status/oper_status/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/status/oper_status/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/te_topology_identifier/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/te_topology_identifier/__init__.py index 500ec92619ae5a6dcc32b14d34ccea0f40737191..213b1b84bce74bab6319c2953d30bbf7649b579f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/te_topology_identifier/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slice_service/te_topology_identifier/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/__init__.py index f4558fd1bbb1dd822b32f445e66339143b2478e9..574cf554e870ab8c7c04cc7a7ef70fffb1399f4a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/__init__.py index 94bd457d698c576c1f5b959ee1cf610d29c6d607..da6f73b2ff1bb6658be2c713f4b1c8faead0b1cf 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/__init__.py index 4bbee9dd66033a713b6da00dcf56ee91e9be9eee..0e53eada407bb79617288c93f181eb44e8746c21 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/metric_bounds/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/metric_bounds/__init__.py index 36ed9c582b84713ae7d2ff3b5b5c961eefce64cd..230c81bb6e184010de90f18a63ae275314c856ad 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/metric_bounds/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/metric_bounds/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/metric_bounds/metric_bound/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/metric_bounds/metric_bound/__init__.py index 5fc6a303a36a47ff9d3457f69556b935e1dee0db..a5349d2f9563ef06e02e1cf61ae6ba81af07789e 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/metric_bounds/metric_bound/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/metric_bounds/metric_bound/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/steering_constraints/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/steering_constraints/__init__.py index 9ac75543b9cef16b0c4229c57bc16ac020404b92..96f536c265ef25654ebf86c79ce65528a63b7639 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/steering_constraints/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/steering_constraints/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/steering_constraints/path_constraints/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/steering_constraints/path_constraints/__init__.py index bdf32c475add75b454b03f6e9b45e35f6b556593..76c7f221a31d5a87e963a5e08d0f50ea2619c818 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/steering_constraints/path_constraints/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/steering_constraints/path_constraints/__init__.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/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/steering_constraints/service_function/__init__.py b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/steering_constraints/service_function/__init__.py index 297fdc436d5a324e011d4db71d10103b17fa86a5..4da57e17de2294656260cef31de9ac6672cadcbc 100644 --- a/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/steering_constraints/service_function/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/network_slice_services/slo_sle_templates/slo_sle_template/service_slo_sle_policy/steering_constraints/service_function/__init__.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/nbi/service/ietf_network_slice/bindings/networks/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/__init__.py index 829a50433257eb9a5584655e13f99d80dd214320..bc23279553b3181f572400c7eb66c9978f961425 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/__init__.py index 9d4ece4ea74f4c31d35b98a115e33517eafe1398..6356fd464947d32fed5c1f2b935ddf51e51ca128 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/__init__.py index 44ba6bd98295d3c48e92dacb5a6cfb176238e37d..fa985aa32d72b91e9aec35d28e828e87cc5d0b8f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/destination/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/destination/__init__.py index 09e7e7583fc57d75bcad193dfb593abfc02346d5..39c6acfade4cba852450d44228cf278fd284a346 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/destination/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/destination/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/source/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/source/__init__.py index 5f37f2c29a0d1030c1f2634b065b62dbe6733dc3..361e262744e0970b6a57d8e9f4cd252a7e61e248 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/source/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/source/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/supporting_link/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/supporting_link/__init__.py index 8cf3fcc8e94948a7f4fa93c5a7430049c3a5d3a6..c5c8f671d59e8c097d2a41fdc1d90be2c44d2861 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/supporting_link/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/supporting_link/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/__init__.py index 6c80a7e3152191c8b6b38c9618e7b49072b42b7a..a5f2301641a006617635c67c24eed5e8112f42d7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/__init__.py index 651d9ad0743836b195f95a19d193acc233663f09..8fcae0cfb27d1676464bf474e2d8bdf0e3f38526 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/bundle/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/bundle/__init__.py index 99efa3fb5f08dedddca2df887243ef74cf8198b4..6afe62a220e09a70eaf6acf6107dc6b939d86fee 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/bundle/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/bundle/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/bundle/bundled_links/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/bundle/bundled_links/__init__.py index 20087ee95e5ecd1948d3cdf49a4a5751bb6dbbe7..1ffa2cd7e34f4eecd8bf4f396d7a4eaf2861e7aa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/bundle/bundled_links/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/bundle/bundled_links/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/bundle/bundled_links/bundled_link/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/bundle/bundled_links/bundled_link/__init__.py index f5fb3a8768a7a0035ca00db0bb6e7e17de23d73a..e3ab212ba7b58066d6ce17e6dff67afe2e0d1cf8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/bundle/bundled_links/bundled_link/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/bundle/bundled_links/bundled_link/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/component/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/component/__init__.py index 4758899a4fea940be6709d45f85641230259b579..f964388b304b77d160ea36e3366084e62a49ab88 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/component/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/component/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/component/component_links/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/component/component_links/__init__.py index 4eb9596f6babe6de0e1f0b9108266fed242a5bc6..95cf7e5c1c732217903b8bf0d2cf6cd7471c1150 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/component/component_links/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/component/component_links/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/component/component_links/component_link/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/component/component_links/component_link/__init__.py index 89077be905cdd8c4c862acc2d29662bc6072954b..e830deb1959b8c72b99d1ec000ff79e577361726 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/component/component_links/component_link/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/bundle_stack_level/component/component_links/component_link/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/__init__.py index 11983d935bb7a66b021733eb99e48ccf33da4c15..f96d871a8ecd91c5b0d970ee2cea63165c469d30 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/information_source_state/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/information_source_state/__init__.py index 7cfdd77bffc1ccb5983b51c0b80ce4ee7228ee82..e93a409b1b330cac3ea33d7c67baf185870f6977 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/information_source_state/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/information_source_state/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/information_source_state/topology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/information_source_state/topology/__init__.py index 04d31ad2e080990497efe7c49c7114d12b24a401..f5c0175d7a1770d778aa231355db4b8c91c5ad26 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/information_source_state/topology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/information_source_state/topology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/interface_switching_capability/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/interface_switching_capability/__init__.py index 5354fe13e6dde61a2eefd3866e17d29bd14755cf..ad32fba62a14875c77061a34c0635dce979ec512 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/interface_switching_capability/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/interface_switching_capability/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/interface_switching_capability/max_lsp_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/interface_switching_capability/max_lsp_bandwidth/__init__.py index c01e6ec6a9bb1e56c0081e4166af677aa037260b..9eac5d44ffbd214cdac33774be1a76a2dbf928aa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/interface_switching_capability/max_lsp_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/interface_switching_capability/max_lsp_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/__init__.py index a99bde6c2635120459c33e9f546690e43a5ac9de..c464e72a2a62b21d797773ebca89e86ba4970e39 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/__init__.py index a7af90c987a8211e777258468be7eafd2edb16c3..95fa033e5d5131ebce1b6ca3fdad006f02382702 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/__init__.py index e009a37246936ab2045ab0ddd25f67f855d54a2a..8634f076eb837cc61d761cebcc7ad271ce8a774b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_end/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_end/__init__.py index 93b8edd584c855acdb31e357a7745f38dc606e30..461d66e40c691c75edd5e86803f1673e6817ca51 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_end/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_end/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_end/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_end/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_end/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_end/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_end/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_start/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_start/__init__.py index 1ad793f388a08a6a26a42470299e9bd653d403a3..18919cd0df4b6fb055d378df3322555bb918d89b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_start/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_start/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_start/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_start/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_start/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_start/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_start/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_step/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_step/__init__.py index 57901c59123251588a65d3ee10009ded935bb1f8..06ffef4054af1ce49ec4d455c23a6628c80f6f30 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_step/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_step/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_step/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_step/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_step/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_step/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_step/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_step/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_step/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/label_restrictions/label_restriction/label_step/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_link_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_link_bandwidth/__init__.py index c92c7b9e1e3e7db8f65b4ee54b817da0c779bf08..919164eab26f63382dbabc4ae9435df0502dad6d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_link_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_link_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_link_bandwidth/te_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_link_bandwidth/te_bandwidth/__init__.py index a99bde6c2635120459c33e9f546690e43a5ac9de..c464e72a2a62b21d797773ebca89e86ba4970e39 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_link_bandwidth/te_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_link_bandwidth/te_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_link_bandwidth/te_bandwidth/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_link_bandwidth/te_bandwidth/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_link_bandwidth/te_bandwidth/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_link_bandwidth/te_bandwidth/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_link_bandwidth/te_bandwidth/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_link_bandwidth/te_bandwidth/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_link_bandwidth/te_bandwidth/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_link_bandwidth/te_bandwidth/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_resv_link_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_resv_link_bandwidth/__init__.py index 968d401f366d3005a5d8cda261606b480e272da3..53a06becf8f78b9c747744b4ad6167866c6624f3 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_resv_link_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_resv_link_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_resv_link_bandwidth/te_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_resv_link_bandwidth/te_bandwidth/__init__.py index a99bde6c2635120459c33e9f546690e43a5ac9de..c464e72a2a62b21d797773ebca89e86ba4970e39 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_resv_link_bandwidth/te_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_resv_link_bandwidth/te_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_resv_link_bandwidth/te_bandwidth/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_resv_link_bandwidth/te_bandwidth/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_resv_link_bandwidth/te_bandwidth/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_resv_link_bandwidth/te_bandwidth/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_resv_link_bandwidth/te_bandwidth/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_resv_link_bandwidth/te_bandwidth/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_resv_link_bandwidth/te_bandwidth/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/max_resv_link_bandwidth/te_bandwidth/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/te_nsrlgs/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/te_nsrlgs/__init__.py index 43b0c777f396ce9bb2c63e09b91942ce5f72c57a..df2ea88b9d55e8bf3aae7c9d2b6ccb8abb3aa907 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/te_nsrlgs/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/te_nsrlgs/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/te_srlgs/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/te_srlgs/__init__.py index f9c1d141a1127dbb1f1e43d86c1ed2b347e6c86a..64eed911ea205bb2f9f4258d4c337c41a928b18d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/te_srlgs/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/te_srlgs/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/unreserved_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/unreserved_bandwidth/__init__.py index 7aecfd9bad7b90745226b34cdc6bcd3354537c1b..daa35056c667e7b9b65ef20c106d32df325d9553 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/unreserved_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/unreserved_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/unreserved_bandwidth/te_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/unreserved_bandwidth/te_bandwidth/__init__.py index a99bde6c2635120459c33e9f546690e43a5ac9de..c464e72a2a62b21d797773ebca89e86ba4970e39 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/unreserved_bandwidth/te_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/unreserved_bandwidth/te_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/unreserved_bandwidth/te_bandwidth/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/unreserved_bandwidth/te_bandwidth/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/unreserved_bandwidth/te_bandwidth/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/unreserved_bandwidth/te_bandwidth/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/unreserved_bandwidth/te_bandwidth/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/unreserved_bandwidth/te_bandwidth/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/unreserved_bandwidth/te_bandwidth/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_entry/unreserved_bandwidth/te_bandwidth/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_state/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_state/__init__.py index 253f6b7f324045d3cbe94315c623a1650c9d44ec..5f66514335cb18090df66ee35acae6f2e692392c 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_state/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_state/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_state/topology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_state/topology/__init__.py index 04d31ad2e080990497efe7c49c7114d12b24a401..f5c0175d7a1770d778aa231355db4b8c91c5ad26 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_state/topology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/information_source_state/topology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/recovery/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/recovery/__init__.py index ce56898d373d62bea60122c428ec5202a16b3bdb..4e14fa05b3f9a1a06d9e0a9d9d34f0c93bf2f0f1 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/recovery/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/recovery/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/statistics/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/statistics/__init__.py index aaedda522742f2164959f090bf267285af0b5ab8..0d53a3d8f300fbde1e3c93b287968895d7bdb13a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/statistics/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/statistics/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/__init__.py index 60cc483bfca459c15ceaf59f1695b504c786b2de..68e369035c7c152afc1b89f0ce67d0036bd456ea 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/external_domain/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/external_domain/__init__.py index 9f0e311f823234f26e0d474e682bae647868bbcf..ec2252d8d6491d719303e2f66b30c8d0ade79c49 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/external_domain/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/external_domain/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/interface_switching_capability/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/interface_switching_capability/__init__.py index 5354fe13e6dde61a2eefd3866e17d29bd14755cf..ad32fba62a14875c77061a34c0635dce979ec512 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/interface_switching_capability/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/interface_switching_capability/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/__init__.py index c01e6ec6a9bb1e56c0081e4166af677aa037260b..9eac5d44ffbd214cdac33774be1a76a2dbf928aa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/__init__.py index a99bde6c2635120459c33e9f546690e43a5ac9de..c464e72a2a62b21d797773ebca89e86ba4970e39 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/__init__.py index a7af90c987a8211e777258468be7eafd2edb16c3..95fa033e5d5131ebce1b6ca3fdad006f02382702 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/__init__.py index 24d80112a5857618b108fc413e2f5532cf0f5131..45e75bac3b0bb38c10a9ee1d4e480d869165b608 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_end/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_end/__init__.py index 93b8edd584c855acdb31e357a7745f38dc606e30..461d66e40c691c75edd5e86803f1673e6817ca51 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_end/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_end/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_start/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_start/__init__.py index 1ad793f388a08a6a26a42470299e9bd653d403a3..18919cd0df4b6fb055d378df3322555bb918d89b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_start/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_start/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_step/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_step/__init__.py index 57901c59123251588a65d3ee10009ded935bb1f8..06ffef4054af1ce49ec4d455c23a6628c80f6f30 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_step/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_step/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_step/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_step/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_step/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_step/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_step/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_step/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_step/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/label_restrictions/label_restriction/label_step/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_link_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_link_bandwidth/__init__.py index c92c7b9e1e3e7db8f65b4ee54b817da0c779bf08..919164eab26f63382dbabc4ae9435df0502dad6d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_link_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_link_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_link_bandwidth/te_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_link_bandwidth/te_bandwidth/__init__.py index a99bde6c2635120459c33e9f546690e43a5ac9de..c464e72a2a62b21d797773ebca89e86ba4970e39 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_link_bandwidth/te_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_link_bandwidth/te_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_link_bandwidth/te_bandwidth/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_link_bandwidth/te_bandwidth/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_link_bandwidth/te_bandwidth/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_link_bandwidth/te_bandwidth/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_link_bandwidth/te_bandwidth/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_link_bandwidth/te_bandwidth/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_link_bandwidth/te_bandwidth/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_link_bandwidth/te_bandwidth/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_resv_link_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_resv_link_bandwidth/__init__.py index 968d401f366d3005a5d8cda261606b480e272da3..53a06becf8f78b9c747744b4ad6167866c6624f3 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_resv_link_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_resv_link_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/__init__.py index a99bde6c2635120459c33e9f546690e43a5ac9de..c464e72a2a62b21d797773ebca89e86ba4970e39 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/te_nsrlgs/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/te_nsrlgs/__init__.py index 43b0c777f396ce9bb2c63e09b91942ce5f72c57a..df2ea88b9d55e8bf3aae7c9d2b6ccb8abb3aa907 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/te_nsrlgs/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/te_nsrlgs/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/te_srlgs/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/te_srlgs/__init__.py index f9c1d141a1127dbb1f1e43d86c1ed2b347e6c86a..64eed911ea205bb2f9f4258d4c337c41a928b18d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/te_srlgs/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/te_srlgs/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/__init__.py index 78ef423bba5d1b3fa3b53e1b352e472d8f63ad73..4f15ef163fca46a9ac284b9f72627927ecbdaefd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/__init__.py index ed635c2bbcd9aa08db82c44fb82a07b71715a70f..1743b834b20e56afb59489ae6fd8873981380413 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/__init__.py index 74d9c60e33c6546724dff8784a18e8d339021ae7..fc0da7cd3585f4230c02352d8c3be57647a4c2ae 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/__init__.py index ef4c66a9a11288b9f73beb51bb55aacce369aab5..7d355d071bc8105e8318c51f352f0660b25e2022 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py index ef725f1a920a3c2097d601ccbcd68d49e5f28aec..59638071b9ffc578f62d4d3519efd36d7d38bd1a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py index b36a11e14f1390ca2f84a276886752dd19fa7bb4..05b0fe1e0c91349bdf9f1f9058405cf6f62a9130 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 635a53cb52cc3c1fddff4a4aa7531456661d03a8..35f11fe0084cd8f1eeb4901d48da4edf2545b529 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/__init__.py index 10f04b0ab7b9835e2d61e24fbcb233e3412fb6b6..b0da4f2e8cc8738b8c69016826d37aff47c50c45 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/__init__.py index 74d9c60e33c6546724dff8784a18e8d339021ae7..fc0da7cd3585f4230c02352d8c3be57647a4c2ae 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/__init__.py index f63a6bff07a0ad221f5111610cc95c0a27588efb..b5d0c513caa859c49744b3388d1d08d4ef5b24b7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py index e4493e09abb5de09b0e339755232b59a7443a1d5..c07a53a8a620c9b4be21562e178364614ad73acd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py index 5e0c0aebdbe40cf83887665d56f35ceed1f45ceb..e9899935ba38a993f78f531fb0573f16c50057f5 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 34a7b45cc1ea419d4ebdc88b4aea977a4810b942..e60c1ab541956b3d62ad4a4095f9eb375ab9f0e8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/tunnel_termination_points/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/tunnel_termination_points/__init__.py index 3f481cdb5adcd93e124ab370f5cea07a7368a08a..f34e300f7d52fd043d68f63981f7928343f07b67 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/tunnel_termination_points/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/tunnel_termination_points/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/tunnels/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/tunnels/__init__.py index f362c1c8490c912a65a726bebf3172edc3a99107..ee463eb1b0e86509adf775915ed81a1c6da25711 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/tunnels/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/tunnels/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/tunnels/tunnel/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/tunnels/tunnel/__init__.py index 94c595725b80725776d1dea823dce5076560cf72..dfb86b109a13b30b65f7c200f2579b35255dd01a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/tunnels/tunnel/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/underlay/tunnels/tunnel/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/unreserved_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/unreserved_bandwidth/__init__.py index 7aecfd9bad7b90745226b34cdc6bcd3354537c1b..daa35056c667e7b9b65ef20c106d32df325d9553 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/unreserved_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/unreserved_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/unreserved_bandwidth/te_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/unreserved_bandwidth/te_bandwidth/__init__.py index a99bde6c2635120459c33e9f546690e43a5ac9de..c464e72a2a62b21d797773ebca89e86ba4970e39 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/unreserved_bandwidth/te_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/unreserved_bandwidth/te_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/unreserved_bandwidth/te_bandwidth/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/unreserved_bandwidth/te_bandwidth/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/unreserved_bandwidth/te_bandwidth/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/unreserved_bandwidth/te_bandwidth/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/unreserved_bandwidth/te_bandwidth/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/unreserved_bandwidth/te_bandwidth/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/unreserved_bandwidth/te_bandwidth/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/te_link_attributes/unreserved_bandwidth/te_bandwidth/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/link/te/underlay/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/underlay/__init__.py index ad317168f140e131179e6774022963459c556364..1810d340e4fb1f69e88a96ce056336e6ffd27259 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/underlay/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/link/te/underlay/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/network_types/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/network_types/__init__.py index 4a4fce484c23330a6e9f80465501b15ed317c9c3..c03ca9931130df718fd6b8eb9b3d7c9f2730cf8f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/network_types/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/network_types/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/network_types/te_topology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/network_types/te_topology/__init__.py index 951167fa07b78ba9cbdc02efa6ce728a3efd66fe..51a1b78aec7f8c4ca081b1ee484b1efaa69eaeac 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/network_types/te_topology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/network_types/te_topology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/__init__.py index 758a7e0a331379d960b5878e49c12a1bc5a620de..12b79c14345ad0e5ebf0144bf186e9bbcf8bf73c 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/supporting_node/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/supporting_node/__init__.py index c946dabadb72e6f2debf412559955ed8aa435da5..2d545b9c206e374a72a2ba53f96dcf6eb8df4118 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/supporting_node/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/supporting_node/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/__init__.py index be22df4039439e3275b7ff55649428fa77ff42e6..4d5bc09663fd06e5d5fdaf44a061a23adddb8664 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/geolocation/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/geolocation/__init__.py index aac7b3acf8634789427ab387046e673a61c3666c..0f5f8f9ef1653b63d662722bedafb64b1ac6077d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/geolocation/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/geolocation/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/__init__.py index 9fb753a1d0e019353d129a83f3484de1c43e30a8..d64456a5ad16f9074a5ae7072c3f80aaf0e4b280 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/__init__.py index 87ed01e106a7560233cdcb41f274a5171264d1eb..da5a0070dedc74b83319aa127c6ce741d97786fc 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/__init__.py index ec322aff112906fa42559de9ea92be249570c14e..6add374d12e4646dcea6ffe7ecf92e360ab3e1cb 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/__init__.py index 6486624f9daaaad05b919842131e28bbd81a407b..1230f5f8f0d3401a37fafda50e3c84b4f5ad4afd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/__init__.py index a7af90c987a8211e777258468be7eafd2edb16c3..95fa033e5d5131ebce1b6ca3fdad006f02382702 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/__init__.py index be56b984df305b9174426cf043a51c72a36dd6a2..61388e679c66d2d062761f9291355968cd2eedff 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/__init__.py index 93b8edd584c855acdb31e357a7745f38dc606e30..461d66e40c691c75edd5e86803f1673e6817ca51 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/__init__.py index 1ad793f388a08a6a26a42470299e9bd653d403a3..18919cd0df4b6fb055d378df3322555bb918d89b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/__init__.py index 57901c59123251588a65d3ee10009ded935bb1f8..06ffef4054af1ce49ec4d455c23a6628c80f6f30 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/__init__.py index 1257f182084440ec2861c7ce483bf21d652a94d1..66ac8383c008a4ab15cf4c8e5e64e05938f8a090 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/__init__.py index 0e76372276e9aab4a2c308403c1696c5d67c8512..18b0094852a5232baa0ed97c37666a3cc53c9418 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/__init__.py index cb5f56c53dae00c6a87c0a59e371d697081ecefe..b8cdccb1fc2f6e765c8e9c1b292243a40df633f5 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/__init__.py index 502239d3ea98eac2557f64bc432fd10577eb2aa7..f7bbf71b7ab909c5166f2c68b9307db656048b15 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.py index 4391fe136a0f34d077ecf814491e3b8ad82d3205..5579074a61fa7c5a612078a3267cc6475454b4f3 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.py index 8e61150797e91559da2a053b43f6de36521f05f0..410fd6ca5832e43e2b41667a0cc9da9b05795255 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.py index 4f2b509861ae4676ad459bf3d0f8c45f327be06a..bbda439f230d00bc93ad2e727ac4a68a9fee7e47 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.py index e4493e09abb5de09b0e339755232b59a7443a1d5..c07a53a8a620c9b4be21562e178364614ad73acd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.py index 573491548f562faa99328926d4bc12112cb988cf..1b1a8ff4099c1707f2bdbe6fb31255dd94751378 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.py index 575b87c2ca55f147595e9e46b3630008c9b3e82c..ee6794aa86391ac63e6fb125fe00217216b319e7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.py index a9fc6d28634249cd36568b467c3507802cc7cd0a..8e929d0072351144f2dd0d7e029cfb3384ba7751 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.py index b1b7d3820b941df345336a5748c3883a8962df86..9996968e1458cc311f24ba41747a2fb5d073f633 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 34a7b45cc1ea419d4ebdc88b4aea977a4810b942..e60c1ab541956b3d62ad4a4095f9eb375ab9f0e8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.py index 51f74a1f81e2d11d4c4e05b5e729953274f028da..4d46a796951b65ad15bfd121f7d2c36bf4f17703 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.py index 0e354783d167536f9e27bf84396e4710303e5999..1fdf39e11fa020154238f20c5d97bb6fa14fbacf 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.py index 930b912099950a1f57b444cfb98cadae531cc8d8..895c80e7ee5302134691eed0b56b8c66a1ca116d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.py index ef725f1a920a3c2097d601ccbcd68d49e5f28aec..59638071b9ffc578f62d4d3519efd36d7d38bd1a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.py index feef9127c74765b06c4b607b005973df604edfc9..173ce30da67f7faf8a2b3a4505070b4bd56f2ef1 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 34a7b45cc1ea419d4ebdc88b4aea977a4810b942..e60c1ab541956b3d62ad4a4095f9eb375ab9f0e8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/tiebreakers/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/tiebreakers/__init__.py index 8857cb729926b1533c5e0b64d5bb7cbe73aa6bcb..d370c1b46d192bf5ecf23ce2f7c1db4ecb6bde4c 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/tiebreakers/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/tiebreakers/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.py index 737f59a0c9331975625796491cc12a33ad0b0084..4c99011d956c4cb9dfe97830856eb3f4af1984d6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/objective_function/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/objective_function/__init__.py index 2a43b9e9d6e1746ad99e0fc96b5f9c2621175574..694a38092b614d620ce20ddd252b6f5380b8daca 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/objective_function/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/objective_function/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/objective_function/objective_function/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/objective_function/objective_function/__init__.py index af56528baedd2b98c7f0c2513bab087ad9cc40cb..e8a698892c1feb5811fa53c2ade6198837fa13a2 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/objective_function/objective_function/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/optimizations/algorithm/objective_function/objective_function/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/__init__.py index f240be1ce2f34a9cd43818ae8b7ac760d4a16991..e77707b12a81cd743c40feddc151215adcbb8e11 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_affinities_values/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_affinities_values/__init__.py index 834d54004adcb031a0aa22c0ab0876645ef5adc5..78b38bebdf7349833d22245c2879b1f9f2cd9414 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_affinities_values/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_affinities_values/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_affinities_values/path_affinities_value/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_affinities_values/path_affinities_value/__init__.py index 4c70f00d2b4b449e762d99b86b1a5e6f0ed1df74..cf1f779850e63326464eb1d7172952a74af58b63 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_affinities_values/path_affinities_value/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_affinities_values/path_affinities_value/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/__init__.py index e4c2f928e3fce6b000c351d4657e70e4ec9b868c..02b4d2f72cdb82dd50a2ceb193f5cd17e007da64 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/path_affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/path_affinity_name/__init__.py index b4c89473a6e74b2b177960f04d1c00bac61bf132..78f648572823e5d96c7413cabe3c8a8a59580b2f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/path_affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/path_affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.py index abbcd1fe709062e8e480966ade273c0804c4844f..0cefd34c386d8d85170e5650303bc9d463b3f46f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_metric_bounds/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_metric_bounds/__init__.py index 3c37b21ef6ff73f0639da5503747fc6251df864d..87d3609dd254b1e1afa31df1472d0cebbfbeccef 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_metric_bounds/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_metric_bounds/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_metric_bounds/path_metric_bound/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_metric_bounds/path_metric_bound/__init__.py index 56eb60da5846332a1583d255378a1b4c27238b43..ae2f19bcd23c3fcef87704875ef8505f13277c9f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_metric_bounds/path_metric_bound/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_metric_bounds/path_metric_bound/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_lists/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_lists/__init__.py index 43d3f73de0797a8c98cb86e80f50dde70243eb4d..6608c4efdc41912a74c1ee24b3014857d24de012 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_lists/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_lists/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.py index e9d2655479fb23505f5b3bbcfb6b5c7c70472a04..31e9c19184144fceccb5cc4268671e0a92376c09 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_names/__init__.py index 373798e80fd66cbd707eaff7c2376c42fcbbf2f6..609c69f207785e2fcc81423fd20c2e5fc91ebcd7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_names/path_srlgs_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_names/path_srlgs_name/__init__.py index 7b65a97db822417ce80967fa5ad29f217d0818e1..66680c1f16489c5afcbad2e0dad5da48a9104a4b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_names/path_srlgs_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_names/path_srlgs_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/__init__.py index a99bde6c2635120459c33e9f546690e43a5ac9de..c464e72a2a62b21d797773ebca89e86ba4970e39 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/__init__.py index 45551ddebf14106b2983092be05580c8a7e07256..7656d28fa5bc2335ee34b2e7c7c3a32bc474742a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_affinities_values/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_affinities_values/__init__.py index 834d54004adcb031a0aa22c0ab0876645ef5adc5..78b38bebdf7349833d22245c2879b1f9f2cd9414 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_affinities_values/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_affinities_values/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_affinities_values/path_affinities_value/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_affinities_values/path_affinities_value/__init__.py index 4c70f00d2b4b449e762d99b86b1a5e6f0ed1df74..cf1f779850e63326464eb1d7172952a74af58b63 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_affinities_values/path_affinities_value/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_affinities_values/path_affinities_value/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/__init__.py index e4c2f928e3fce6b000c351d4657e70e4ec9b868c..02b4d2f72cdb82dd50a2ceb193f5cd17e007da64 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/path_affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/path_affinity_name/__init__.py index b4c89473a6e74b2b177960f04d1c00bac61bf132..78f648572823e5d96c7413cabe3c8a8a59580b2f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/path_affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/path_affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.py index abbcd1fe709062e8e480966ade273c0804c4844f..0cefd34c386d8d85170e5650303bc9d463b3f46f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_metric/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_metric/__init__.py index 6c791afde38fd0bdb53b3518addff3834fc0f95d..01a0c07678fb590bdc57ad5ce5e2694f3c2ed24f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_metric/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_metric/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/__init__.py index 4368687ae2b141d4df60f3c4a5cf1eefbfca716c..1f43a712f292761feb078df81ccaf82dd60f76e8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/__init__.py index d7b77da59516bfd8a9b9a731138bd8805b3bee6e..da099f93b1e04dbd1d200276af0c461f9bf40346 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/__init__.py index c25dc023092d4a407989f068d8ddc96e883dd0ad..00197662db4270289f16e712a202b029450f2f1b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.py index ef725f1a920a3c2097d601ccbcd68d49e5f28aec..59638071b9ffc578f62d4d3519efd36d7d38bd1a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.py index 61c36913f51193ec26b4136a06a1ddf0a40b5841..526af416a15930ab37043156494d35eb07b61923 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.py index 575b87c2ca55f147595e9e46b3630008c9b3e82c..ee6794aa86391ac63e6fb125fe00217216b319e7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 2ec5da1f9f269488520fbc8b546dc67ac2894821..09b31e1ed6e066945f18d41c86034f6e4ab9cf28 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_lists/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_lists/__init__.py index 43d3f73de0797a8c98cb86e80f50dde70243eb4d..6608c4efdc41912a74c1ee24b3014857d24de012 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_lists/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_lists/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_lists/path_srlgs_list/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_lists/path_srlgs_list/__init__.py index e9d2655479fb23505f5b3bbcfb6b5c7c70472a04..31e9c19184144fceccb5cc4268671e0a92376c09 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_lists/path_srlgs_list/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_lists/path_srlgs_list/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_names/__init__.py index 373798e80fd66cbd707eaff7c2376c42fcbbf2f6..609c69f207785e2fcc81423fd20c2e5fc91ebcd7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_names/path_srlgs_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_names/path_srlgs_name/__init__.py index 7b65a97db822417ce80967fa5ad29f217d0818e1..66680c1f16489c5afcbad2e0dad5da48a9104a4b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_names/path_srlgs_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_names/path_srlgs_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/__init__.py index ae89b6b3c1c152159860a966088badc509baa86e..5debb6069f5970419d20412341d3ee79f45d1657 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/__init__.py index a7af90c987a8211e777258468be7eafd2edb16c3..95fa033e5d5131ebce1b6ca3fdad006f02382702 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/__init__.py index 1ecbaea57fb9c3c8c5460b10537c0c0c548dc492..aab2d885927c15e7f688b6d4a83fa8743d11a080 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/__init__.py index 93b8edd584c855acdb31e357a7745f38dc606e30..461d66e40c691c75edd5e86803f1673e6817ca51 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/__init__.py index 1ad793f388a08a6a26a42470299e9bd653d403a3..18919cd0df4b6fb055d378df3322555bb918d89b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/__init__.py index 57901c59123251588a65d3ee10009ded935bb1f8..06ffef4054af1ce49ec4d455c23a6628c80f6f30 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/__init__.py index d9631fe4e489e99da52b0303f57c541195530d51..c80c73933eb21211344fd5ea06ba783e72fdb4f3 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/__init__.py index ed635c2bbcd9aa08db82c44fb82a07b71715a70f..1743b834b20e56afb59489ae6fd8873981380413 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/__init__.py index 74d9c60e33c6546724dff8784a18e8d339021ae7..fc0da7cd3585f4230c02352d8c3be57647a4c2ae 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/__init__.py index 81e9184235996cdc735673a26cd6836164cc3ab0..b5db9f66b76c6c1229693c4c9dcba5799b6ef5df 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py index e4493e09abb5de09b0e339755232b59a7443a1d5..c07a53a8a620c9b4be21562e178364614ad73acd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py index 573491548f562faa99328926d4bc12112cb988cf..1b1a8ff4099c1707f2bdbe6fb31255dd94751378 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index e08c97bda84c433f29489fbd04c982f55625eff9..341b04370b2a33f342187cd68b8adfa635b50ed2 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/__init__.py index 10f04b0ab7b9835e2d61e24fbcb233e3412fb6b6..b0da4f2e8cc8738b8c69016826d37aff47c50c45 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/__init__.py index 74d9c60e33c6546724dff8784a18e8d339021ae7..fc0da7cd3585f4230c02352d8c3be57647a4c2ae 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/__init__.py index 0ea042535a7a9cecf2c747380f1bd46a827b6ea4..a7e62bd75a80d27795f2cb0184ca5ab5890a870e 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py index e4493e09abb5de09b0e339755232b59a7443a1d5..c07a53a8a620c9b4be21562e178364614ad73acd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py index feef9127c74765b06c4b607b005973df604edfc9..173ce30da67f7faf8a2b3a4505070b4bd56f2ef1 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py index 575b87c2ca55f147595e9e46b3630008c9b3e82c..ee6794aa86391ac63e6fb125fe00217216b319e7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index da3404be850f79069df9a65c0508cedc3c6e32c0..9d887933696e541802a491060e0cc8b703ab872a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/tunnel_termination_points/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/tunnel_termination_points/__init__.py index 3f481cdb5adcd93e124ab370f5cea07a7368a08a..f34e300f7d52fd043d68f63981f7928343f07b67 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/tunnel_termination_points/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/tunnel_termination_points/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/tunnels/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/tunnels/__init__.py index f362c1c8490c912a65a726bebf3172edc3a99107..ee463eb1b0e86509adf775915ed81a1c6da25711 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/tunnels/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/tunnels/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/tunnels/tunnel/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/tunnels/tunnel/__init__.py index 94c595725b80725776d1dea823dce5076560cf72..dfb86b109a13b30b65f7c200f2579b35255dd01a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/tunnels/tunnel/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/connectivity_matrix/underlay/tunnels/tunnel/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/__init__.py index a7af90c987a8211e777258468be7eafd2edb16c3..95fa033e5d5131ebce1b6ca3fdad006f02382702 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/__init__.py index 546817dac1b92ecc98cc8d0fda9d2dbc0d36e228..e675b17b51c20659aa269176cdc9123cf26c12ec 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_end/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_end/__init__.py index 93b8edd584c855acdb31e357a7745f38dc606e30..461d66e40c691c75edd5e86803f1673e6817ca51 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_end/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_end/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_start/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_start/__init__.py index 1ad793f388a08a6a26a42470299e9bd653d403a3..18919cd0df4b6fb055d378df3322555bb918d89b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_start/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_start/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_step/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_step/__init__.py index 57901c59123251588a65d3ee10009ded935bb1f8..06ffef4054af1ce49ec4d455c23a6628c80f6f30 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_step/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_step/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_step/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_step/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_step/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_step/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_step/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_step/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_step/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/label_restrictions/label_restriction/label_step/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/__init__.py index 1257f182084440ec2861c7ce483bf21d652a94d1..66ac8383c008a4ab15cf4c8e5e64e05938f8a090 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/__init__.py index a91e05652fcdca54a271558e3283666ac15c484c..6e787bfbae8edb7945ca079b93620f5ab0dc4487 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/__init__.py index cb5f56c53dae00c6a87c0a59e371d697081ecefe..b8cdccb1fc2f6e765c8e9c1b292243a40df633f5 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/__init__.py index b746643f51e5a9d16ec00bb9d24067fa9b55c521..4e518989faa6721f94cba0e055f0e748eaf4acfc 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.py index 4391fe136a0f34d077ecf814491e3b8ad82d3205..5579074a61fa7c5a612078a3267cc6475454b4f3 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.py index 8e61150797e91559da2a053b43f6de36521f05f0..410fd6ca5832e43e2b41667a0cc9da9b05795255 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.py index f3f808715167961bfa3c5bdb1f1e36d0db26a98d..320c5a5fa71aa9ff2c9544807e88e6aff2c41573 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.py index ef725f1a920a3c2097d601ccbcd68d49e5f28aec..59638071b9ffc578f62d4d3519efd36d7d38bd1a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.py index 63951853192e194fa96b0b7aa5709c77a4606858..29fec0613786e92de897a5a4786ddb2ddadfd7c2 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.py index a9fc6d28634249cd36568b467c3507802cc7cd0a..8e929d0072351144f2dd0d7e029cfb3384ba7751 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.py index b1b7d3820b941df345336a5748c3883a8962df86..9996968e1458cc311f24ba41747a2fb5d073f633 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 7603810c7318aadf6698f81ec71b375049998f83..251fa4d92b2d34e911c5090c0830fc2b364019b4 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.py index 51f74a1f81e2d11d4c4e05b5e729953274f028da..4d46a796951b65ad15bfd121f7d2c36bf4f17703 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.py index 0e354783d167536f9e27bf84396e4710303e5999..1fdf39e11fa020154238f20c5d97bb6fa14fbacf 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.py index 0989e8e060bcd176179c9c981fb2a81d5a69c1cd..24ebd3bcb4fde28cc10ecf51dd45ac78de12596b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.py index e4493e09abb5de09b0e339755232b59a7443a1d5..c07a53a8a620c9b4be21562e178364614ad73acd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.py index 5e0c0aebdbe40cf83887665d56f35ceed1f45ceb..e9899935ba38a993f78f531fb0573f16c50057f5 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 16d6614d27d4a9be4d3bedf263e0340a2697ff09..ddc51931df017bce91193ca29ac1a0fb30573522 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/tiebreakers/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/tiebreakers/__init__.py index 8857cb729926b1533c5e0b64d5bb7cbe73aa6bcb..d370c1b46d192bf5ecf23ce2f7c1db4ecb6bde4c 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/tiebreakers/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/tiebreakers/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.py index 737f59a0c9331975625796491cc12a33ad0b0084..4c99011d956c4cb9dfe97830856eb3f4af1984d6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/objective_function/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/objective_function/__init__.py index 2a43b9e9d6e1746ad99e0fc96b5f9c2621175574..694a38092b614d620ce20ddd252b6f5380b8daca 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/objective_function/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/objective_function/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/objective_function/objective_function/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/objective_function/objective_function/__init__.py index af56528baedd2b98c7f0c2513bab087ad9cc40cb..e8a698892c1feb5811fa53c2ade6198837fa13a2 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/objective_function/objective_function/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/optimizations/algorithm/objective_function/objective_function/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/__init__.py index 0e6674d0ba32376abdd142cc6a71b95ac7c244a6..c33a628efb91c362c0e0912110ae4e9f44769e38 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_affinities_values/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_affinities_values/__init__.py index 834d54004adcb031a0aa22c0ab0876645ef5adc5..78b38bebdf7349833d22245c2879b1f9f2cd9414 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_affinities_values/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_affinities_values/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_affinities_values/path_affinities_value/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_affinities_values/path_affinities_value/__init__.py index e7c0f7d0ad00f60c264db926fb11a9c7d62b362a..e8877f3f6aa22dbe475ab7df7340dd96759684b8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_affinities_values/path_affinities_value/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_affinities_values/path_affinities_value/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_affinity_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_affinity_names/__init__.py index e4c2f928e3fce6b000c351d4657e70e4ec9b868c..02b4d2f72cdb82dd50a2ceb193f5cd17e007da64 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_affinity_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_affinity_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_affinity_names/path_affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_affinity_names/path_affinity_name/__init__.py index b4c89473a6e74b2b177960f04d1c00bac61bf132..78f648572823e5d96c7413cabe3c8a8a59580b2f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_affinity_names/path_affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_affinity_names/path_affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.py index abbcd1fe709062e8e480966ade273c0804c4844f..0cefd34c386d8d85170e5650303bc9d463b3f46f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_metric_bounds/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_metric_bounds/__init__.py index 3c37b21ef6ff73f0639da5503747fc6251df864d..87d3609dd254b1e1afa31df1472d0cebbfbeccef 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_metric_bounds/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_metric_bounds/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_metric_bounds/path_metric_bound/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_metric_bounds/path_metric_bound/__init__.py index feb233a12838560886937f082666d91c3263bbd7..d22f78c46fd53d8e26ebd8ceb8cc77e38f39d364 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_metric_bounds/path_metric_bound/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_metric_bounds/path_metric_bound/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_srlgs_lists/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_srlgs_lists/__init__.py index 43d3f73de0797a8c98cb86e80f50dde70243eb4d..6608c4efdc41912a74c1ee24b3014857d24de012 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_srlgs_lists/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_srlgs_lists/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.py index e9d2655479fb23505f5b3bbcfb6b5c7c70472a04..31e9c19184144fceccb5cc4268671e0a92376c09 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_srlgs_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_srlgs_names/__init__.py index 373798e80fd66cbd707eaff7c2376c42fcbbf2f6..609c69f207785e2fcc81423fd20c2e5fc91ebcd7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_srlgs_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_srlgs_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_srlgs_names/path_srlgs_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_srlgs_names/path_srlgs_name/__init__.py index 7b65a97db822417ce80967fa5ad29f217d0818e1..66680c1f16489c5afcbad2e0dad5da48a9104a4b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_srlgs_names/path_srlgs_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/path_srlgs_names/path_srlgs_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/te_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/te_bandwidth/__init__.py index a99bde6c2635120459c33e9f546690e43a5ac9de..c464e72a2a62b21d797773ebca89e86ba4970e39 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/te_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/te_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/te_bandwidth/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/te_bandwidth/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/te_bandwidth/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/te_bandwidth/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/te_bandwidth/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/te_bandwidth/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/te_bandwidth/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_constraints/te_bandwidth/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/__init__.py index b38535a5cf0a6d23a93249bde0f87d1abee629e0..ddfbc52337c19f6c817c410b43e66725b2e691ba 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_affinities_values/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_affinities_values/__init__.py index 834d54004adcb031a0aa22c0ab0876645ef5adc5..78b38bebdf7349833d22245c2879b1f9f2cd9414 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_affinities_values/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_affinities_values/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_affinities_values/path_affinities_value/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_affinities_values/path_affinities_value/__init__.py index e7c0f7d0ad00f60c264db926fb11a9c7d62b362a..e8877f3f6aa22dbe475ab7df7340dd96759684b8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_affinities_values/path_affinities_value/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_affinities_values/path_affinities_value/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_affinity_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_affinity_names/__init__.py index e4c2f928e3fce6b000c351d4657e70e4ec9b868c..02b4d2f72cdb82dd50a2ceb193f5cd17e007da64 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_affinity_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_affinity_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_affinity_names/path_affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_affinity_names/path_affinity_name/__init__.py index b4c89473a6e74b2b177960f04d1c00bac61bf132..78f648572823e5d96c7413cabe3c8a8a59580b2f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_affinity_names/path_affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_affinity_names/path_affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.py index abbcd1fe709062e8e480966ade273c0804c4844f..0cefd34c386d8d85170e5650303bc9d463b3f46f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_metric/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_metric/__init__.py index 1080dfb7faf4b66e35f5230510cdb978b326a259..629b4552d295e19c7eb79915df6c039518ea9432 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_metric/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_metric/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/__init__.py index 4368687ae2b141d4df60f3c4a5cf1eefbfca716c..1f43a712f292761feb078df81ccaf82dd60f76e8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/__init__.py index d7b77da59516bfd8a9b9a731138bd8805b3bee6e..da099f93b1e04dbd1d200276af0c461f9bf40346 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/__init__.py index ffb5b8cbf56e542f898e5e5aa3859273a00014cd..e76be30dc33b2deb438a284fc3997078c912d200 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.py index e4493e09abb5de09b0e339755232b59a7443a1d5..c07a53a8a620c9b4be21562e178364614ad73acd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.py index 5e0c0aebdbe40cf83887665d56f35ceed1f45ceb..e9899935ba38a993f78f531fb0573f16c50057f5 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.py index 575b87c2ca55f147595e9e46b3630008c9b3e82c..ee6794aa86391ac63e6fb125fe00217216b319e7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 73bd3f8b8f86e1e187346218246c61378e972613..64f6bd1c5951edfc5ba5db45e20a533ae9e31079 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_srlgs_lists/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_srlgs_lists/__init__.py index 43d3f73de0797a8c98cb86e80f50dde70243eb4d..6608c4efdc41912a74c1ee24b3014857d24de012 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_srlgs_lists/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_srlgs_lists/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_srlgs_lists/path_srlgs_list/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_srlgs_lists/path_srlgs_list/__init__.py index e9d2655479fb23505f5b3bbcfb6b5c7c70472a04..31e9c19184144fceccb5cc4268671e0a92376c09 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_srlgs_lists/path_srlgs_list/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_srlgs_lists/path_srlgs_list/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_srlgs_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_srlgs_names/__init__.py index 373798e80fd66cbd707eaff7c2376c42fcbbf2f6..609c69f207785e2fcc81423fd20c2e5fc91ebcd7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_srlgs_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_srlgs_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_srlgs_names/path_srlgs_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_srlgs_names/path_srlgs_name/__init__.py index 7b65a97db822417ce80967fa5ad29f217d0818e1..66680c1f16489c5afcbad2e0dad5da48a9104a4b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_srlgs_names/path_srlgs_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/path_properties/path_srlgs_names/path_srlgs_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/__init__.py index 9e579ec9ab6f8612255ede56aa0a057e9dc45b61..3d83fc9f424dd0cbe0fc74c601d3f28b16bc8d4a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/__init__.py index ed635c2bbcd9aa08db82c44fb82a07b71715a70f..1743b834b20e56afb59489ae6fd8873981380413 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/__init__.py index 74d9c60e33c6546724dff8784a18e8d339021ae7..fc0da7cd3585f4230c02352d8c3be57647a4c2ae 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/__init__.py index c19acc9cf020fe194a2b8e2ad0ee9c221b897cc4..76b69fffa519cc77d01d43d183527620bef099c1 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py index e4493e09abb5de09b0e339755232b59a7443a1d5..c07a53a8a620c9b4be21562e178364614ad73acd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py index feef9127c74765b06c4b607b005973df604edfc9..173ce30da67f7faf8a2b3a4505070b4bd56f2ef1 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py index 575b87c2ca55f147595e9e46b3630008c9b3e82c..ee6794aa86391ac63e6fb125fe00217216b319e7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index e08c97bda84c433f29489fbd04c982f55625eff9..341b04370b2a33f342187cd68b8adfa635b50ed2 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/__init__.py index 10f04b0ab7b9835e2d61e24fbcb233e3412fb6b6..b0da4f2e8cc8738b8c69016826d37aff47c50c45 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/__init__.py index 74d9c60e33c6546724dff8784a18e8d339021ae7..fc0da7cd3585f4230c02352d8c3be57647a4c2ae 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/__init__.py index 5d24ec2ab137da5973010363ae7718d01e8829c2..021f87b6b2da517f854a7cb061e31e315aee6c24 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py index e4493e09abb5de09b0e339755232b59a7443a1d5..c07a53a8a620c9b4be21562e178364614ad73acd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py index 61c36913f51193ec26b4136a06a1ddf0a40b5841..526af416a15930ab37043156494d35eb07b61923 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py index 575b87c2ca55f147595e9e46b3630008c9b3e82c..ee6794aa86391ac63e6fb125fe00217216b319e7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 5b53df5b3449137d91f7367eea60b81294e00d92..db2a8eeaf9d19e91726225408c7024698fd03427 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/tunnel_termination_points/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/tunnel_termination_points/__init__.py index 3b5e2b21abf48ad098dffdf0ced49481e149907e..7d38afed20f1a5d207a6c3d15444c40c23adeb64 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/tunnel_termination_points/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/tunnel_termination_points/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/tunnels/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/tunnels/__init__.py index f362c1c8490c912a65a726bebf3172edc3a99107..ee463eb1b0e86509adf775915ed81a1c6da25711 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/tunnels/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/tunnels/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/tunnels/tunnel/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/tunnels/tunnel/__init__.py index 42aaaf5da928847f7ffff584ef6f95dab602ca58..c127e751a74689cc38519f9b9d260fa621569666 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/tunnels/tunnel/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/connectivity_matrices/underlay/tunnels/tunnel/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/information_source_state/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/information_source_state/__init__.py index 7cfdd77bffc1ccb5983b51c0b80ce4ee7228ee82..e93a409b1b330cac3ea33d7c67baf185870f6977 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/information_source_state/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/information_source_state/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/information_source_state/topology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/information_source_state/topology/__init__.py index f7f920217b7c42cba381b7cd07dca1cca1eee208..3afc883356dbb141a037a30bdab4bc6d470fbf23 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/information_source_state/topology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/information_source_state/topology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/underlay_topology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/underlay_topology/__init__.py index 98a97272439700148abb9c1dd10f7ae5ba74813e..b85b7150492cf1d76e42d50896162b16855cabe0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/underlay_topology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_entry/underlay_topology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_state/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_state/__init__.py index acc5295a1ec45a760ddc723bc911db82e09f9970..96d4838b83898d6a414a2adb327591fd5c70dbc2 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_state/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_state/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_state/topology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_state/topology/__init__.py index f7f920217b7c42cba381b7cd07dca1cca1eee208..3afc883356dbb141a037a30bdab4bc6d470fbf23 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_state/topology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/information_source_state/topology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/statistics/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/statistics/__init__.py index 87f6a80d862a20f9df12eeccf247e99735a092a1..3be9e2f0852dd1eb3a033177969fc67a90fe8755 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/statistics/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/statistics/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/statistics/connectivity_matrix_entry/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/statistics/connectivity_matrix_entry/__init__.py index c74c02877a206d5b21ef5eccd803730cba149e3b..8edde3f8421d30d357728a2316e1b15602bf1889 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/statistics/connectivity_matrix_entry/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/statistics/connectivity_matrix_entry/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/statistics/node/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/statistics/node/__init__.py index f330888e380e44e64897b288d0dc69085e8f3414..f43f3b41476788850fdc5d6a08b6642ade197421 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/statistics/node/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/statistics/node/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/__init__.py index 2662639b07176d4161d952d06a5df8f49505a174..1c694f8a9991489d7efb65a8fa2ad1df082373ef 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/__init__.py index 50d59c20a61b5b1803404aea119d0955cefcf6d5..b39494a774f2bafc50524910cf4c3fb849fe00b0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/__init__.py index ad8de3fae24ee14097fc3b4c8e325694bceeca48..1c755feeebd0edee3807b43e3b9f86675cdcd48b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/__init__.py index 6486624f9daaaad05b919842131e28bbd81a407b..1230f5f8f0d3401a37fafda50e3c84b4f5ad4afd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/__init__.py index a7af90c987a8211e777258468be7eafd2edb16c3..95fa033e5d5131ebce1b6ca3fdad006f02382702 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/__init__.py index a72e4bffab12b545ac4d9eacb0eaf21864ce9eac..6818d48acb36d3ba53cd191d8ac0e34f78d98866 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/__init__.py index 93b8edd584c855acdb31e357a7745f38dc606e30..461d66e40c691c75edd5e86803f1673e6817ca51 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/__init__.py index 1ad793f388a08a6a26a42470299e9bd653d403a3..18919cd0df4b6fb055d378df3322555bb918d89b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/__init__.py index 57901c59123251588a65d3ee10009ded935bb1f8..06ffef4054af1ce49ec4d455c23a6628c80f6f30 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/from/label_restrictions/label_restriction/label_step/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/__init__.py index 1257f182084440ec2861c7ce483bf21d652a94d1..66ac8383c008a4ab15cf4c8e5e64e05938f8a090 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/__init__.py index a91e05652fcdca54a271558e3283666ac15c484c..6e787bfbae8edb7945ca079b93620f5ab0dc4487 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/__init__.py index cb5f56c53dae00c6a87c0a59e371d697081ecefe..b8cdccb1fc2f6e765c8e9c1b292243a40df633f5 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/__init__.py index b746643f51e5a9d16ec00bb9d24067fa9b55c521..4e518989faa6721f94cba0e055f0e748eaf4acfc 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.py index 4391fe136a0f34d077ecf814491e3b8ad82d3205..5579074a61fa7c5a612078a3267cc6475454b4f3 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.py index 8e61150797e91559da2a053b43f6de36521f05f0..410fd6ca5832e43e2b41667a0cc9da9b05795255 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.py index 552a94614f13a7607e01b4405ac00ced2c4b776a..e108aadf5e8264b4698795358edcd450e605bb0f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.py index e4493e09abb5de09b0e339755232b59a7443a1d5..c07a53a8a620c9b4be21562e178364614ad73acd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.py index 61c36913f51193ec26b4136a06a1ddf0a40b5841..526af416a15930ab37043156494d35eb07b61923 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.py index a9fc6d28634249cd36568b467c3507802cc7cd0a..8e929d0072351144f2dd0d7e029cfb3384ba7751 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.py index b1b7d3820b941df345336a5748c3883a8962df86..9996968e1458cc311f24ba41747a2fb5d073f633 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 666a4944c218e136894366e463bfdead4e815250..510cde3002973020066ea2a460cfd2cdf69c70c8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.py index 51f74a1f81e2d11d4c4e05b5e729953274f028da..4d46a796951b65ad15bfd121f7d2c36bf4f17703 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.py index 0e354783d167536f9e27bf84396e4710303e5999..1fdf39e11fa020154238f20c5d97bb6fa14fbacf 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.py index 28bf34bb30c62c2657f0e12a4258feccebfa3220..83b6d4255f04e5c230f8df0b0c66407e25b9f2d4 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.py index ef725f1a920a3c2097d601ccbcd68d49e5f28aec..59638071b9ffc578f62d4d3519efd36d7d38bd1a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.py index 573491548f562faa99328926d4bc12112cb988cf..1b1a8ff4099c1707f2bdbe6fb31255dd94751378 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.py index 575b87c2ca55f147595e9e46b3630008c9b3e82c..ee6794aa86391ac63e6fb125fe00217216b319e7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 666a4944c218e136894366e463bfdead4e815250..510cde3002973020066ea2a460cfd2cdf69c70c8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/tiebreakers/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/tiebreakers/__init__.py index 8857cb729926b1533c5e0b64d5bb7cbe73aa6bcb..d370c1b46d192bf5ecf23ce2f7c1db4ecb6bde4c 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/tiebreakers/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/tiebreakers/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.py index 737f59a0c9331975625796491cc12a33ad0b0084..4c99011d956c4cb9dfe97830856eb3f4af1984d6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/objective_function/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/objective_function/__init__.py index 2a43b9e9d6e1746ad99e0fc96b5f9c2621175574..694a38092b614d620ce20ddd252b6f5380b8daca 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/objective_function/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/objective_function/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/objective_function/objective_function/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/objective_function/objective_function/__init__.py index af56528baedd2b98c7f0c2513bab087ad9cc40cb..e8a698892c1feb5811fa53c2ade6198837fa13a2 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/objective_function/objective_function/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/optimizations/algorithm/objective_function/objective_function/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/__init__.py index e24bb820367bc6410b2a20dd53ad6d51920abd0a..77acb109e7e8ef0ffdc3306e1a076190eff6fd4d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_affinities_values/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_affinities_values/__init__.py index 834d54004adcb031a0aa22c0ab0876645ef5adc5..78b38bebdf7349833d22245c2879b1f9f2cd9414 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_affinities_values/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_affinities_values/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_affinities_values/path_affinities_value/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_affinities_values/path_affinities_value/__init__.py index e7c0f7d0ad00f60c264db926fb11a9c7d62b362a..e8877f3f6aa22dbe475ab7df7340dd96759684b8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_affinities_values/path_affinities_value/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_affinities_values/path_affinities_value/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/__init__.py index e4c2f928e3fce6b000c351d4657e70e4ec9b868c..02b4d2f72cdb82dd50a2ceb193f5cd17e007da64 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/path_affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/path_affinity_name/__init__.py index b4c89473a6e74b2b177960f04d1c00bac61bf132..78f648572823e5d96c7413cabe3c8a8a59580b2f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/path_affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/path_affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.py index abbcd1fe709062e8e480966ade273c0804c4844f..0cefd34c386d8d85170e5650303bc9d463b3f46f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_metric_bounds/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_metric_bounds/__init__.py index 3c37b21ef6ff73f0639da5503747fc6251df864d..87d3609dd254b1e1afa31df1472d0cebbfbeccef 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_metric_bounds/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_metric_bounds/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_metric_bounds/path_metric_bound/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_metric_bounds/path_metric_bound/__init__.py index 56eb60da5846332a1583d255378a1b4c27238b43..ae2f19bcd23c3fcef87704875ef8505f13277c9f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_metric_bounds/path_metric_bound/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_metric_bounds/path_metric_bound/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_lists/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_lists/__init__.py index 43d3f73de0797a8c98cb86e80f50dde70243eb4d..6608c4efdc41912a74c1ee24b3014857d24de012 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_lists/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_lists/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.py index e9d2655479fb23505f5b3bbcfb6b5c7c70472a04..31e9c19184144fceccb5cc4268671e0a92376c09 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_names/__init__.py index 373798e80fd66cbd707eaff7c2376c42fcbbf2f6..609c69f207785e2fcc81423fd20c2e5fc91ebcd7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_names/path_srlgs_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_names/path_srlgs_name/__init__.py index 7b65a97db822417ce80967fa5ad29f217d0818e1..66680c1f16489c5afcbad2e0dad5da48a9104a4b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_names/path_srlgs_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/path_srlgs_names/path_srlgs_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/__init__.py index a99bde6c2635120459c33e9f546690e43a5ac9de..c464e72a2a62b21d797773ebca89e86ba4970e39 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_constraints/te_bandwidth/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/__init__.py index c2e4f9b346e038e1a47e8f69a21443c76abfc32c..f3b65d27aba2710c5e129d40817ff8c8ffff3306 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_affinities_values/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_affinities_values/__init__.py index 834d54004adcb031a0aa22c0ab0876645ef5adc5..78b38bebdf7349833d22245c2879b1f9f2cd9414 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_affinities_values/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_affinities_values/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_affinities_values/path_affinities_value/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_affinities_values/path_affinities_value/__init__.py index 4c70f00d2b4b449e762d99b86b1a5e6f0ed1df74..cf1f779850e63326464eb1d7172952a74af58b63 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_affinities_values/path_affinities_value/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_affinities_values/path_affinities_value/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/__init__.py index e4c2f928e3fce6b000c351d4657e70e4ec9b868c..02b4d2f72cdb82dd50a2ceb193f5cd17e007da64 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/path_affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/path_affinity_name/__init__.py index b4c89473a6e74b2b177960f04d1c00bac61bf132..78f648572823e5d96c7413cabe3c8a8a59580b2f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/path_affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/path_affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.py index abbcd1fe709062e8e480966ade273c0804c4844f..0cefd34c386d8d85170e5650303bc9d463b3f46f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_metric/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_metric/__init__.py index 6c791afde38fd0bdb53b3518addff3834fc0f95d..01a0c07678fb590bdc57ad5ce5e2694f3c2ed24f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_metric/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_metric/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/__init__.py index 4368687ae2b141d4df60f3c4a5cf1eefbfca716c..1f43a712f292761feb078df81ccaf82dd60f76e8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/__init__.py index d7b77da59516bfd8a9b9a731138bd8805b3bee6e..da099f93b1e04dbd1d200276af0c461f9bf40346 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/__init__.py index b2619d382c9e65548e02e684a63b6a08b535d47b..2e49aead963daf6e165520365e1ad8db83cd1375 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.py index e4493e09abb5de09b0e339755232b59a7443a1d5..c07a53a8a620c9b4be21562e178364614ad73acd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.py index b36a11e14f1390ca2f84a276886752dd19fa7bb4..05b0fe1e0c91349bdf9f1f9058405cf6f62a9130 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 635a53cb52cc3c1fddff4a4aa7531456661d03a8..35f11fe0084cd8f1eeb4901d48da4edf2545b529 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_lists/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_lists/__init__.py index 43d3f73de0797a8c98cb86e80f50dde70243eb4d..6608c4efdc41912a74c1ee24b3014857d24de012 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_lists/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_lists/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_lists/path_srlgs_list/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_lists/path_srlgs_list/__init__.py index e9d2655479fb23505f5b3bbcfb6b5c7c70472a04..31e9c19184144fceccb5cc4268671e0a92376c09 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_lists/path_srlgs_list/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_lists/path_srlgs_list/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_names/__init__.py index 373798e80fd66cbd707eaff7c2376c42fcbbf2f6..609c69f207785e2fcc81423fd20c2e5fc91ebcd7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_names/path_srlgs_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_names/path_srlgs_name/__init__.py index 7b65a97db822417ce80967fa5ad29f217d0818e1..66680c1f16489c5afcbad2e0dad5da48a9104a4b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_names/path_srlgs_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/path_properties/path_srlgs_names/path_srlgs_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/__init__.py index ae89b6b3c1c152159860a966088badc509baa86e..5debb6069f5970419d20412341d3ee79f45d1657 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/__init__.py index a7af90c987a8211e777258468be7eafd2edb16c3..95fa033e5d5131ebce1b6ca3fdad006f02382702 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/__init__.py index fc3958eb38e4f9366f6ebf1590c8e4f2ca576017..455080df75f16dea6be5b5a2c328273b7a2ed585 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/__init__.py index 93b8edd584c855acdb31e357a7745f38dc606e30..461d66e40c691c75edd5e86803f1673e6817ca51 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/__init__.py index 1ad793f388a08a6a26a42470299e9bd653d403a3..18919cd0df4b6fb055d378df3322555bb918d89b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/__init__.py index 57901c59123251588a65d3ee10009ded935bb1f8..06ffef4054af1ce49ec4d455c23a6628c80f6f30 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/to/label_restrictions/label_restriction/label_step/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/__init__.py index 9e579ec9ab6f8612255ede56aa0a057e9dc45b61..3d83fc9f424dd0cbe0fc74c601d3f28b16bc8d4a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/__init__.py index 6cbc3678b58078b0b8a268d515e2f498c5c94065..dc24b33cea8b7453267b73476f036e08011f38b9 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/__init__.py index 74d9c60e33c6546724dff8784a18e8d339021ae7..fc0da7cd3585f4230c02352d8c3be57647a4c2ae 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/__init__.py index 77baef445b63af7e459bf0924547faca0cd3abd9..dbd9e221c3b5157ace4af1e9b89fc0be7a4db91c 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py index e4493e09abb5de09b0e339755232b59a7443a1d5..c07a53a8a620c9b4be21562e178364614ad73acd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py index b36a11e14f1390ca2f84a276886752dd19fa7bb4..05b0fe1e0c91349bdf9f1f9058405cf6f62a9130 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 0a737e2ab428952c2bd58d3a532d25e42d36b38a..397ea71655278c5db99901e37205555d6865980f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/__init__.py index 10f04b0ab7b9835e2d61e24fbcb233e3412fb6b6..b0da4f2e8cc8738b8c69016826d37aff47c50c45 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/__init__.py index 74d9c60e33c6546724dff8784a18e8d339021ae7..fc0da7cd3585f4230c02352d8c3be57647a4c2ae 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/__init__.py index 47100076a4231ff37ecde6b30496244edeba3b24..3e3cfc40212a1d189e9cd1d4e04c9f6cd332e782 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py index e4493e09abb5de09b0e339755232b59a7443a1d5..c07a53a8a620c9b4be21562e178364614ad73acd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py index feef9127c74765b06c4b607b005973df604edfc9..173ce30da67f7faf8a2b3a4505070b4bd56f2ef1 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 635a53cb52cc3c1fddff4a4aa7531456661d03a8..35f11fe0084cd8f1eeb4901d48da4edf2545b529 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/tunnel_termination_points/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/tunnel_termination_points/__init__.py index 3b5e2b21abf48ad098dffdf0ced49481e149907e..7d38afed20f1a5d207a6c3d15444c40c23adeb64 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/tunnel_termination_points/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/tunnel_termination_points/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/tunnels/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/tunnels/__init__.py index f362c1c8490c912a65a726bebf3172edc3a99107..ee463eb1b0e86509adf775915ed81a1c6da25711 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/tunnels/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/tunnels/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/tunnels/tunnel/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/tunnels/tunnel/__init__.py index 94c595725b80725776d1dea823dce5076560cf72..dfb86b109a13b30b65f7c200f2579b35255dd01a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/tunnels/tunnel/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/connectivity_matrix/underlay/tunnels/tunnel/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/__init__.py index a7af90c987a8211e777258468be7eafd2edb16c3..95fa033e5d5131ebce1b6ca3fdad006f02382702 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/__init__.py index 53b92404caf9b8033bffd3a7e3863927857841ba..b2fa4d37c7f5e6598761a03cccac198a9e8267ee 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_end/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_end/__init__.py index 93b8edd584c855acdb31e357a7745f38dc606e30..461d66e40c691c75edd5e86803f1673e6817ca51 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_end/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_end/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_start/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_start/__init__.py index 1ad793f388a08a6a26a42470299e9bd653d403a3..18919cd0df4b6fb055d378df3322555bb918d89b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_start/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_start/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_step/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_step/__init__.py index 57901c59123251588a65d3ee10009ded935bb1f8..06ffef4054af1ce49ec4d455c23a6628c80f6f30 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_step/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_step/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_step/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_step/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_step/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_step/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_step/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_step/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_step/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/label_restrictions/label_restriction/label_step/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/__init__.py index 1257f182084440ec2861c7ce483bf21d652a94d1..66ac8383c008a4ab15cf4c8e5e64e05938f8a090 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/__init__.py index a91e05652fcdca54a271558e3283666ac15c484c..6e787bfbae8edb7945ca079b93620f5ab0dc4487 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/__init__.py index cb5f56c53dae00c6a87c0a59e371d697081ecefe..b8cdccb1fc2f6e765c8e9c1b292243a40df633f5 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/__init__.py index 0f37ddf83b4f66dbc8f5f250ff1fff2491dc520e..507410ec5d97c14a47f7a3719e13f7c95379818e 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.py index 4391fe136a0f34d077ecf814491e3b8ad82d3205..5579074a61fa7c5a612078a3267cc6475454b4f3 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.py index 8e61150797e91559da2a053b43f6de36521f05f0..410fd6ca5832e43e2b41667a0cc9da9b05795255 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.py index 7435f6184d52a64580318932272c5bcd6164ddf5..5746ec9f8fa39d00f3a0b28deda2e55e14d7b499 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.py index ef725f1a920a3c2097d601ccbcd68d49e5f28aec..59638071b9ffc578f62d4d3519efd36d7d38bd1a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.py index feef9127c74765b06c4b607b005973df604edfc9..173ce30da67f7faf8a2b3a4505070b4bd56f2ef1 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.py index 575b87c2ca55f147595e9e46b3630008c9b3e82c..ee6794aa86391ac63e6fb125fe00217216b319e7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.py index a9fc6d28634249cd36568b467c3507802cc7cd0a..8e929d0072351144f2dd0d7e029cfb3384ba7751 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.py index b1b7d3820b941df345336a5748c3883a8962df86..9996968e1458cc311f24ba41747a2fb5d073f633 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 4927f1f4b68adcaf6c7219ac66c993b22aaf9120..bbc032199884788e41fa37db59fe78ccce849442 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.py index 51f74a1f81e2d11d4c4e05b5e729953274f028da..4d46a796951b65ad15bfd121f7d2c36bf4f17703 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.py index 0e354783d167536f9e27bf84396e4710303e5999..1fdf39e11fa020154238f20c5d97bb6fa14fbacf 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.py index 7042fd9f17c38668f7c2be37de07bb78d84a268e..b4f7e6f1d75fb9f88998b29cf62439ea1a9acc33 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.py index e4493e09abb5de09b0e339755232b59a7443a1d5..c07a53a8a620c9b4be21562e178364614ad73acd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.py index feef9127c74765b06c4b607b005973df604edfc9..173ce30da67f7faf8a2b3a4505070b4bd56f2ef1 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.py index 575b87c2ca55f147595e9e46b3630008c9b3e82c..ee6794aa86391ac63e6fb125fe00217216b319e7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 04310d99136c797b48c15ba47ea556c46d928127..8112c3ae6941c927803ff84f537a9f71420ec9ab 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/tiebreakers/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/tiebreakers/__init__.py index 8857cb729926b1533c5e0b64d5bb7cbe73aa6bcb..d370c1b46d192bf5ecf23ce2f7c1db4ecb6bde4c 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/tiebreakers/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/tiebreakers/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.py index 737f59a0c9331975625796491cc12a33ad0b0084..4c99011d956c4cb9dfe97830856eb3f4af1984d6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/objective_function/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/objective_function/__init__.py index 2a43b9e9d6e1746ad99e0fc96b5f9c2621175574..694a38092b614d620ce20ddd252b6f5380b8daca 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/objective_function/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/objective_function/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/objective_function/objective_function/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/objective_function/objective_function/__init__.py index af56528baedd2b98c7f0c2513bab087ad9cc40cb..e8a698892c1feb5811fa53c2ade6198837fa13a2 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/objective_function/objective_function/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/optimizations/algorithm/objective_function/objective_function/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/__init__.py index db7709e55216c3747b7cf50403e7f37d54e37c9c..71e3a0e9cdf808e80e0a204cb970b8325f23cada 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_affinities_values/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_affinities_values/__init__.py index 834d54004adcb031a0aa22c0ab0876645ef5adc5..78b38bebdf7349833d22245c2879b1f9f2cd9414 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_affinities_values/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_affinities_values/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_affinities_values/path_affinities_value/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_affinities_values/path_affinities_value/__init__.py index e7c0f7d0ad00f60c264db926fb11a9c7d62b362a..e8877f3f6aa22dbe475ab7df7340dd96759684b8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_affinities_values/path_affinities_value/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_affinities_values/path_affinities_value/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_affinity_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_affinity_names/__init__.py index e4c2f928e3fce6b000c351d4657e70e4ec9b868c..02b4d2f72cdb82dd50a2ceb193f5cd17e007da64 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_affinity_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_affinity_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_affinity_names/path_affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_affinity_names/path_affinity_name/__init__.py index b4c89473a6e74b2b177960f04d1c00bac61bf132..78f648572823e5d96c7413cabe3c8a8a59580b2f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_affinity_names/path_affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_affinity_names/path_affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.py index abbcd1fe709062e8e480966ade273c0804c4844f..0cefd34c386d8d85170e5650303bc9d463b3f46f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_metric_bounds/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_metric_bounds/__init__.py index 3c37b21ef6ff73f0639da5503747fc6251df864d..87d3609dd254b1e1afa31df1472d0cebbfbeccef 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_metric_bounds/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_metric_bounds/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_metric_bounds/path_metric_bound/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_metric_bounds/path_metric_bound/__init__.py index 56eb60da5846332a1583d255378a1b4c27238b43..ae2f19bcd23c3fcef87704875ef8505f13277c9f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_metric_bounds/path_metric_bound/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_metric_bounds/path_metric_bound/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_srlgs_lists/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_srlgs_lists/__init__.py index 43d3f73de0797a8c98cb86e80f50dde70243eb4d..6608c4efdc41912a74c1ee24b3014857d24de012 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_srlgs_lists/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_srlgs_lists/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.py index e9d2655479fb23505f5b3bbcfb6b5c7c70472a04..31e9c19184144fceccb5cc4268671e0a92376c09 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_srlgs_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_srlgs_names/__init__.py index 373798e80fd66cbd707eaff7c2376c42fcbbf2f6..609c69f207785e2fcc81423fd20c2e5fc91ebcd7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_srlgs_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_srlgs_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_srlgs_names/path_srlgs_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_srlgs_names/path_srlgs_name/__init__.py index 7b65a97db822417ce80967fa5ad29f217d0818e1..66680c1f16489c5afcbad2e0dad5da48a9104a4b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_srlgs_names/path_srlgs_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/path_srlgs_names/path_srlgs_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/te_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/te_bandwidth/__init__.py index a99bde6c2635120459c33e9f546690e43a5ac9de..c464e72a2a62b21d797773ebca89e86ba4970e39 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/te_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/te_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/te_bandwidth/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/te_bandwidth/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/te_bandwidth/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/te_bandwidth/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/te_bandwidth/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/te_bandwidth/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/te_bandwidth/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_constraints/te_bandwidth/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/__init__.py index b38535a5cf0a6d23a93249bde0f87d1abee629e0..ddfbc52337c19f6c817c410b43e66725b2e691ba 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_affinities_values/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_affinities_values/__init__.py index 834d54004adcb031a0aa22c0ab0876645ef5adc5..78b38bebdf7349833d22245c2879b1f9f2cd9414 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_affinities_values/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_affinities_values/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_affinities_values/path_affinities_value/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_affinities_values/path_affinities_value/__init__.py index 4c70f00d2b4b449e762d99b86b1a5e6f0ed1df74..cf1f779850e63326464eb1d7172952a74af58b63 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_affinities_values/path_affinities_value/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_affinities_values/path_affinities_value/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_affinity_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_affinity_names/__init__.py index e4c2f928e3fce6b000c351d4657e70e4ec9b868c..02b4d2f72cdb82dd50a2ceb193f5cd17e007da64 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_affinity_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_affinity_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_affinity_names/path_affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_affinity_names/path_affinity_name/__init__.py index b4c89473a6e74b2b177960f04d1c00bac61bf132..78f648572823e5d96c7413cabe3c8a8a59580b2f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_affinity_names/path_affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_affinity_names/path_affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.py index abbcd1fe709062e8e480966ade273c0804c4844f..0cefd34c386d8d85170e5650303bc9d463b3f46f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_metric/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_metric/__init__.py index 1080dfb7faf4b66e35f5230510cdb978b326a259..629b4552d295e19c7eb79915df6c039518ea9432 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_metric/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_metric/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/__init__.py index 4368687ae2b141d4df60f3c4a5cf1eefbfca716c..1f43a712f292761feb078df81ccaf82dd60f76e8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/__init__.py index d7b77da59516bfd8a9b9a731138bd8805b3bee6e..da099f93b1e04dbd1d200276af0c461f9bf40346 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/__init__.py index 28bf34bb30c62c2657f0e12a4258feccebfa3220..83b6d4255f04e5c230f8df0b0c66407e25b9f2d4 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.py index ef725f1a920a3c2097d601ccbcd68d49e5f28aec..59638071b9ffc578f62d4d3519efd36d7d38bd1a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.py index 5e0c0aebdbe40cf83887665d56f35ceed1f45ceb..e9899935ba38a993f78f531fb0573f16c50057f5 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 7603810c7318aadf6698f81ec71b375049998f83..251fa4d92b2d34e911c5090c0830fc2b364019b4 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_srlgs_lists/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_srlgs_lists/__init__.py index 43d3f73de0797a8c98cb86e80f50dde70243eb4d..6608c4efdc41912a74c1ee24b3014857d24de012 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_srlgs_lists/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_srlgs_lists/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_srlgs_lists/path_srlgs_list/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_srlgs_lists/path_srlgs_list/__init__.py index e9d2655479fb23505f5b3bbcfb6b5c7c70472a04..31e9c19184144fceccb5cc4268671e0a92376c09 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_srlgs_lists/path_srlgs_list/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_srlgs_lists/path_srlgs_list/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_srlgs_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_srlgs_names/__init__.py index 373798e80fd66cbd707eaff7c2376c42fcbbf2f6..609c69f207785e2fcc81423fd20c2e5fc91ebcd7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_srlgs_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_srlgs_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_srlgs_names/path_srlgs_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_srlgs_names/path_srlgs_name/__init__.py index 7b65a97db822417ce80967fa5ad29f217d0818e1..66680c1f16489c5afcbad2e0dad5da48a9104a4b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_srlgs_names/path_srlgs_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/path_properties/path_srlgs_names/path_srlgs_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/__init__.py index 78ef423bba5d1b3fa3b53e1b352e472d8f63ad73..4f15ef163fca46a9ac284b9f72627927ecbdaefd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/__init__.py index 6cbc3678b58078b0b8a268d515e2f498c5c94065..dc24b33cea8b7453267b73476f036e08011f38b9 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/__init__.py index 74d9c60e33c6546724dff8784a18e8d339021ae7..fc0da7cd3585f4230c02352d8c3be57647a4c2ae 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/__init__.py index a6d2377c188304201e1e29a23987d2f750435889..a504cbf66e7ef0b5b3183b4ba46c89542b5ad71f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py index ef725f1a920a3c2097d601ccbcd68d49e5f28aec..59638071b9ffc578f62d4d3519efd36d7d38bd1a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py index 5e0c0aebdbe40cf83887665d56f35ceed1f45ceb..e9899935ba38a993f78f531fb0573f16c50057f5 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 9231728edfff063dff2e8ed8488b6430ccec2483..96df7b970c8af304681414efc1b1aebbbb11bda3 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/__init__.py index 10f04b0ab7b9835e2d61e24fbcb233e3412fb6b6..b0da4f2e8cc8738b8c69016826d37aff47c50c45 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/__init__.py index 74d9c60e33c6546724dff8784a18e8d339021ae7..fc0da7cd3585f4230c02352d8c3be57647a4c2ae 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/__init__.py index 51db93b318b42c58ad7652fb57144394e6203a0b..9121ecf2f45e645c72c950c560533202de2e787d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py index e4493e09abb5de09b0e339755232b59a7443a1d5..c07a53a8a620c9b4be21562e178364614ad73acd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py index b36a11e14f1390ca2f84a276886752dd19fa7bb4..05b0fe1e0c91349bdf9f1f9058405cf6f62a9130 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 9b4644d74ea685590d8a9fafeabf60c7e0760208..4d92cd1ac307464cd965746436812240608ad5e8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/tunnel_termination_points/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/tunnel_termination_points/__init__.py index 3b5e2b21abf48ad098dffdf0ced49481e149907e..7d38afed20f1a5d207a6c3d15444c40c23adeb64 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/tunnel_termination_points/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/tunnel_termination_points/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/tunnels/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/tunnels/__init__.py index f362c1c8490c912a65a726bebf3172edc3a99107..ee463eb1b0e86509adf775915ed81a1c6da25711 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/tunnels/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/tunnels/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/tunnels/tunnel/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/tunnels/tunnel/__init__.py index 42aaaf5da928847f7ffff584ef6f95dab602ca58..c127e751a74689cc38519f9b9d260fa621569666 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/tunnels/tunnel/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/connectivity_matrices/underlay/tunnels/tunnel/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/underlay_topology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/underlay_topology/__init__.py index 98a97272439700148abb9c1dd10f7ae5ba74813e..b85b7150492cf1d76e42d50896162b16855cabe0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/underlay_topology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/te_node_attributes/underlay_topology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/__init__.py index d84e212a1b74ce8626802ad0f6ee33a242e05bfa..82f4fdc4bfcb0ce7fb6ea4b6ef9fd7e45a50d483 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/client_layer_adaptation/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/client_layer_adaptation/__init__.py index 29e367ba1172a6f868f8f48af3c7cea58ca41fe1..7b72b9b2ddedb288151273f00b41823a48ffe053 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/client_layer_adaptation/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/client_layer_adaptation/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/client_layer_adaptation/switching_capability/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/client_layer_adaptation/switching_capability/__init__.py index a31c5e52972e7669a0b4e953ec2da1a404e97cdd..8daa2296cd56406b7e152099186c2ec21d743052 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/client_layer_adaptation/switching_capability/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/client_layer_adaptation/switching_capability/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/client_layer_adaptation/switching_capability/te_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/client_layer_adaptation/switching_capability/te_bandwidth/__init__.py index a99bde6c2635120459c33e9f546690e43a5ac9de..c464e72a2a62b21d797773ebca89e86ba4970e39 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/client_layer_adaptation/switching_capability/te_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/client_layer_adaptation/switching_capability/te_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/client_layer_adaptation/switching_capability/te_bandwidth/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/client_layer_adaptation/switching_capability/te_bandwidth/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/client_layer_adaptation/switching_capability/te_bandwidth/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/client_layer_adaptation/switching_capability/te_bandwidth/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/client_layer_adaptation/switching_capability/te_bandwidth/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/client_layer_adaptation/switching_capability/te_bandwidth/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/client_layer_adaptation/switching_capability/te_bandwidth/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/client_layer_adaptation/switching_capability/te_bandwidth/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/geolocation/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/geolocation/__init__.py index 9f07c18a1ad9b6d1dd96849f72b24555cc998a51..6bf006d99fa3c613aa425dbad1df3df68fbb3043 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/geolocation/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/geolocation/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/__init__.py index a9b4bf47b828a382a8aedd6c49e65ed3540247f2..4f3f119469aa8bc2906b6c36bc9a0f6aa203ba3f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/__init__.py index a7af90c987a8211e777258468be7eafd2edb16c3..95fa033e5d5131ebce1b6ca3fdad006f02382702 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/__init__.py index 3c81a52cc41a8debfff6abacde3e7c7a1e166ab9..56da3079c9aa2d524b39d9e04c8a3c052e338dbf 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_end/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_end/__init__.py index 93b8edd584c855acdb31e357a7745f38dc606e30..461d66e40c691c75edd5e86803f1673e6817ca51 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_end/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_end/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_end/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_end/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_end/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_end/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_end/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_start/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_start/__init__.py index 1ad793f388a08a6a26a42470299e9bd653d403a3..18919cd0df4b6fb055d378df3322555bb918d89b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_start/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_start/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_start/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_start/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_start/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_start/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_start/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_step/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_step/__init__.py index 57901c59123251588a65d3ee10009ded935bb1f8..06ffef4054af1ce49ec4d455c23a6628c80f6f30 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_step/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_step/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_step/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_step/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_step/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_step/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_step/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_step/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_step/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/label_restrictions/label_restriction/label_step/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/__init__.py index cb26fb3ce4b145884c4cc25a4bb1c7328b64d15c..fa502cc4a0a6f5b25d019ee2e77437def582d061 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/__init__.py index a7af90c987a8211e777258468be7eafd2edb16c3..95fa033e5d5131ebce1b6ca3fdad006f02382702 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/__init__.py index d119f79ae73c9e5663821b4370b8b869362e73da..11a7f595893f5c79e14c90c1c26f3b7d695d48d0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_end/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_end/__init__.py index 93b8edd584c855acdb31e357a7745f38dc606e30..461d66e40c691c75edd5e86803f1673e6817ca51 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_end/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_end/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_end/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_end/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_end/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_end/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_end/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_start/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_start/__init__.py index 1ad793f388a08a6a26a42470299e9bd653d403a3..18919cd0df4b6fb055d378df3322555bb918d89b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_start/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_start/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_start/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_start/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_start/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_start/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_start/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_step/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_step/__init__.py index 57901c59123251588a65d3ee10009ded935bb1f8..06ffef4054af1ce49ec4d455c23a6628c80f6f30 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_step/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_step/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_step/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_step/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_step/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_step/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_step/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_step/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_step/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/label_restrictions/label_restriction/label_step/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/__init__.py index 1257f182084440ec2861c7ce483bf21d652a94d1..66ac8383c008a4ab15cf4c8e5e64e05938f8a090 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/__init__.py index 0e76372276e9aab4a2c308403c1696c5d67c8512..18b0094852a5232baa0ed97c37666a3cc53c9418 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/__init__.py index cb5f56c53dae00c6a87c0a59e371d697081ecefe..b8cdccb1fc2f6e765c8e9c1b292243a40df633f5 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/__init__.py index 0f37ddf83b4f66dbc8f5f250ff1fff2491dc520e..507410ec5d97c14a47f7a3719e13f7c95379818e 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.py index 4391fe136a0f34d077ecf814491e3b8ad82d3205..5579074a61fa7c5a612078a3267cc6475454b4f3 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.py index 8e61150797e91559da2a053b43f6de36521f05f0..410fd6ca5832e43e2b41667a0cc9da9b05795255 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.py index 9e869ca3263903b212f1a3afa65185cef65e6394..603a52bfbbdfb5722b15455f1a3ac1a8368e1eef 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.py index e4493e09abb5de09b0e339755232b59a7443a1d5..c07a53a8a620c9b4be21562e178364614ad73acd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.py index feef9127c74765b06c4b607b005973df604edfc9..173ce30da67f7faf8a2b3a4505070b4bd56f2ef1 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.py index 575b87c2ca55f147595e9e46b3630008c9b3e82c..ee6794aa86391ac63e6fb125fe00217216b319e7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.py index a9fc6d28634249cd36568b467c3507802cc7cd0a..8e929d0072351144f2dd0d7e029cfb3384ba7751 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.py index b1b7d3820b941df345336a5748c3883a8962df86..9996968e1458cc311f24ba41747a2fb5d073f633 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 7603810c7318aadf6698f81ec71b375049998f83..251fa4d92b2d34e911c5090c0830fc2b364019b4 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.py index 51f74a1f81e2d11d4c4e05b5e729953274f028da..4d46a796951b65ad15bfd121f7d2c36bf4f17703 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.py index 0e354783d167536f9e27bf84396e4710303e5999..1fdf39e11fa020154238f20c5d97bb6fa14fbacf 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.py index 1577c82ea3fbd8b049673ef886ccd78b9cd7e01e..e8dbfadf5f2526a87adc03099d596d7fcdd1a9fe 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.py index ef725f1a920a3c2097d601ccbcd68d49e5f28aec..59638071b9ffc578f62d4d3519efd36d7d38bd1a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.py index 61c36913f51193ec26b4136a06a1ddf0a40b5841..526af416a15930ab37043156494d35eb07b61923 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 7603810c7318aadf6698f81ec71b375049998f83..251fa4d92b2d34e911c5090c0830fc2b364019b4 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/tiebreakers/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/tiebreakers/__init__.py index 8857cb729926b1533c5e0b64d5bb7cbe73aa6bcb..d370c1b46d192bf5ecf23ce2f7c1db4ecb6bde4c 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/tiebreakers/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/tiebreakers/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.py index 737f59a0c9331975625796491cc12a33ad0b0084..4c99011d956c4cb9dfe97830856eb3f4af1984d6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/objective_function/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/objective_function/__init__.py index 2a43b9e9d6e1746ad99e0fc96b5f9c2621175574..694a38092b614d620ce20ddd252b6f5380b8daca 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/objective_function/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/objective_function/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/objective_function/objective_function/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/objective_function/objective_function/__init__.py index af56528baedd2b98c7f0c2513bab087ad9cc40cb..e8a698892c1feb5811fa53c2ade6198837fa13a2 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/objective_function/objective_function/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/optimizations/algorithm/objective_function/objective_function/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/__init__.py index 4701163f7f023c806d9dde440ccc17d8862587c9..20309806019b37f84d4b5a5ca77f21b19865cbdc 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_affinities_values/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_affinities_values/__init__.py index 834d54004adcb031a0aa22c0ab0876645ef5adc5..78b38bebdf7349833d22245c2879b1f9f2cd9414 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_affinities_values/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_affinities_values/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_affinities_values/path_affinities_value/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_affinities_values/path_affinities_value/__init__.py index e7c0f7d0ad00f60c264db926fb11a9c7d62b362a..e8877f3f6aa22dbe475ab7df7340dd96759684b8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_affinities_values/path_affinities_value/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_affinities_values/path_affinities_value/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_affinity_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_affinity_names/__init__.py index e4c2f928e3fce6b000c351d4657e70e4ec9b868c..02b4d2f72cdb82dd50a2ceb193f5cd17e007da64 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_affinity_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_affinity_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_affinity_names/path_affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_affinity_names/path_affinity_name/__init__.py index b4c89473a6e74b2b177960f04d1c00bac61bf132..78f648572823e5d96c7413cabe3c8a8a59580b2f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_affinity_names/path_affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_affinity_names/path_affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.py index abbcd1fe709062e8e480966ade273c0804c4844f..0cefd34c386d8d85170e5650303bc9d463b3f46f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_metric_bounds/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_metric_bounds/__init__.py index 3c37b21ef6ff73f0639da5503747fc6251df864d..87d3609dd254b1e1afa31df1472d0cebbfbeccef 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_metric_bounds/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_metric_bounds/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_metric_bounds/path_metric_bound/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_metric_bounds/path_metric_bound/__init__.py index feb233a12838560886937f082666d91c3263bbd7..d22f78c46fd53d8e26ebd8ceb8cc77e38f39d364 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_metric_bounds/path_metric_bound/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_metric_bounds/path_metric_bound/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_srlgs_lists/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_srlgs_lists/__init__.py index 43d3f73de0797a8c98cb86e80f50dde70243eb4d..6608c4efdc41912a74c1ee24b3014857d24de012 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_srlgs_lists/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_srlgs_lists/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.py index e9d2655479fb23505f5b3bbcfb6b5c7c70472a04..31e9c19184144fceccb5cc4268671e0a92376c09 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_srlgs_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_srlgs_names/__init__.py index 373798e80fd66cbd707eaff7c2376c42fcbbf2f6..609c69f207785e2fcc81423fd20c2e5fc91ebcd7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_srlgs_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_srlgs_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_srlgs_names/path_srlgs_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_srlgs_names/path_srlgs_name/__init__.py index 7b65a97db822417ce80967fa5ad29f217d0818e1..66680c1f16489c5afcbad2e0dad5da48a9104a4b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_srlgs_names/path_srlgs_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/path_srlgs_names/path_srlgs_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/te_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/te_bandwidth/__init__.py index a99bde6c2635120459c33e9f546690e43a5ac9de..c464e72a2a62b21d797773ebca89e86ba4970e39 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/te_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/te_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/te_bandwidth/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/te_bandwidth/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/te_bandwidth/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/te_bandwidth/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/te_bandwidth/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/te_bandwidth/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/te_bandwidth/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_constraints/te_bandwidth/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/__init__.py index 30d5aada10464228ddd4010bc1b2a3afd23d9cae..31aa3a506ede98021832c1fe05209b00b505f272 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_affinities_values/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_affinities_values/__init__.py index 834d54004adcb031a0aa22c0ab0876645ef5adc5..78b38bebdf7349833d22245c2879b1f9f2cd9414 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_affinities_values/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_affinities_values/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_affinities_values/path_affinities_value/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_affinities_values/path_affinities_value/__init__.py index e7c0f7d0ad00f60c264db926fb11a9c7d62b362a..e8877f3f6aa22dbe475ab7df7340dd96759684b8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_affinities_values/path_affinities_value/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_affinities_values/path_affinities_value/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_affinity_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_affinity_names/__init__.py index e4c2f928e3fce6b000c351d4657e70e4ec9b868c..02b4d2f72cdb82dd50a2ceb193f5cd17e007da64 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_affinity_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_affinity_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_affinity_names/path_affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_affinity_names/path_affinity_name/__init__.py index b4c89473a6e74b2b177960f04d1c00bac61bf132..78f648572823e5d96c7413cabe3c8a8a59580b2f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_affinity_names/path_affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_affinity_names/path_affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.py index abbcd1fe709062e8e480966ade273c0804c4844f..0cefd34c386d8d85170e5650303bc9d463b3f46f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_metric/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_metric/__init__.py index 1080dfb7faf4b66e35f5230510cdb978b326a259..629b4552d295e19c7eb79915df6c039518ea9432 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_metric/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_metric/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/__init__.py index 4368687ae2b141d4df60f3c4a5cf1eefbfca716c..1f43a712f292761feb078df81ccaf82dd60f76e8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/__init__.py index d7b77da59516bfd8a9b9a731138bd8805b3bee6e..da099f93b1e04dbd1d200276af0c461f9bf40346 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/__init__.py index f44836634ee58281027ecc53c136ee0d38433fe3..f3203a078bda79be37cfcd5ec6d6539f467930a7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.py index ef725f1a920a3c2097d601ccbcd68d49e5f28aec..59638071b9ffc578f62d4d3519efd36d7d38bd1a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.py index 5e0c0aebdbe40cf83887665d56f35ceed1f45ceb..e9899935ba38a993f78f531fb0573f16c50057f5 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.py index 575b87c2ca55f147595e9e46b3630008c9b3e82c..ee6794aa86391ac63e6fb125fe00217216b319e7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 666a4944c218e136894366e463bfdead4e815250..510cde3002973020066ea2a460cfd2cdf69c70c8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_srlgs_lists/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_srlgs_lists/__init__.py index 43d3f73de0797a8c98cb86e80f50dde70243eb4d..6608c4efdc41912a74c1ee24b3014857d24de012 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_srlgs_lists/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_srlgs_lists/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_srlgs_lists/path_srlgs_list/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_srlgs_lists/path_srlgs_list/__init__.py index e9d2655479fb23505f5b3bbcfb6b5c7c70472a04..31e9c19184144fceccb5cc4268671e0a92376c09 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_srlgs_lists/path_srlgs_list/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_srlgs_lists/path_srlgs_list/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_srlgs_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_srlgs_names/__init__.py index 373798e80fd66cbd707eaff7c2376c42fcbbf2f6..609c69f207785e2fcc81423fd20c2e5fc91ebcd7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_srlgs_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_srlgs_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_srlgs_names/path_srlgs_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_srlgs_names/path_srlgs_name/__init__.py index 7b65a97db822417ce80967fa5ad29f217d0818e1..66680c1f16489c5afcbad2e0dad5da48a9104a4b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_srlgs_names/path_srlgs_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/path_properties/path_srlgs_names/path_srlgs_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/__init__.py index 775d362110498321a919d71fbad8509cc1de7bc4..20d7cb24454156c1b7231afc1ec77e5907ceb256 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/__init__.py index 6cbc3678b58078b0b8a268d515e2f498c5c94065..dc24b33cea8b7453267b73476f036e08011f38b9 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/__init__.py index 74d9c60e33c6546724dff8784a18e8d339021ae7..fc0da7cd3585f4230c02352d8c3be57647a4c2ae 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/__init__.py index 5d24ec2ab137da5973010363ae7718d01e8829c2..021f87b6b2da517f854a7cb061e31e315aee6c24 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py index e4493e09abb5de09b0e339755232b59a7443a1d5..c07a53a8a620c9b4be21562e178364614ad73acd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py index 573491548f562faa99328926d4bc12112cb988cf..1b1a8ff4099c1707f2bdbe6fb31255dd94751378 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 42a68ea3530f1991f2396b711e1f54f7929f21c0..92260a8b0f711f9dc2a70d3bdbff92ca7c61657f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/__init__.py index 10f04b0ab7b9835e2d61e24fbcb233e3412fb6b6..b0da4f2e8cc8738b8c69016826d37aff47c50c45 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/__init__.py index 74d9c60e33c6546724dff8784a18e8d339021ae7..fc0da7cd3585f4230c02352d8c3be57647a4c2ae 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/__init__.py index df23385f8f41a7cddb61e6d09c86abc77ee74a13..f8df4df54409a88d875aada1c0ec9dbbbf9b7bb4 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py index ef725f1a920a3c2097d601ccbcd68d49e5f28aec..59638071b9ffc578f62d4d3519efd36d7d38bd1a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py index 5e0c0aebdbe40cf83887665d56f35ceed1f45ceb..e9899935ba38a993f78f531fb0573f16c50057f5 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 3d011eb224962cde6d2abcfed75201f4b2b2dd8c..0e2f58c2a4126c5016c0529324bc3d2eef6b47fd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/tunnel_termination_points/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/tunnel_termination_points/__init__.py index 3b5e2b21abf48ad098dffdf0ced49481e149907e..7d38afed20f1a5d207a6c3d15444c40c23adeb64 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/tunnel_termination_points/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/tunnel_termination_points/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/tunnels/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/tunnels/__init__.py index f362c1c8490c912a65a726bebf3172edc3a99107..ee463eb1b0e86509adf775915ed81a1c6da25711 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/tunnels/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/tunnels/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/tunnels/tunnel/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/tunnels/tunnel/__init__.py index 42aaaf5da928847f7ffff584ef6f95dab602ca58..c127e751a74689cc38519f9b9d260fa621569666 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/tunnels/tunnel/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/local_link_connectivity/underlay/tunnels/tunnel/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/__init__.py index 1257f182084440ec2861c7ce483bf21d652a94d1..66ac8383c008a4ab15cf4c8e5e64e05938f8a090 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/__init__.py index 0e76372276e9aab4a2c308403c1696c5d67c8512..18b0094852a5232baa0ed97c37666a3cc53c9418 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/__init__.py index cb5f56c53dae00c6a87c0a59e371d697081ecefe..b8cdccb1fc2f6e765c8e9c1b292243a40df633f5 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/__init__.py index 502239d3ea98eac2557f64bc432fd10577eb2aa7..f7bbf71b7ab909c5166f2c68b9307db656048b15 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.py index 4391fe136a0f34d077ecf814491e3b8ad82d3205..5579074a61fa7c5a612078a3267cc6475454b4f3 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.py index 8e61150797e91559da2a053b43f6de36521f05f0..410fd6ca5832e43e2b41667a0cc9da9b05795255 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.py index f8aa811f38e9580c00607aade4dd80f0e81ed2ae..2118be76fad5c1f10a0c837307e405362f162261 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.py index ef725f1a920a3c2097d601ccbcd68d49e5f28aec..59638071b9ffc578f62d4d3519efd36d7d38bd1a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.py index b36a11e14f1390ca2f84a276886752dd19fa7bb4..05b0fe1e0c91349bdf9f1f9058405cf6f62a9130 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.py index 575b87c2ca55f147595e9e46b3630008c9b3e82c..ee6794aa86391ac63e6fb125fe00217216b319e7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.py index a9fc6d28634249cd36568b467c3507802cc7cd0a..8e929d0072351144f2dd0d7e029cfb3384ba7751 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.py index b1b7d3820b941df345336a5748c3883a8962df86..9996968e1458cc311f24ba41747a2fb5d073f633 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/srlg/srlg/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 9b4644d74ea685590d8a9fafeabf60c7e0760208..4d92cd1ac307464cd965746436812240608ad5e8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_exclude_objects/route_object_exclude_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.py index 51f74a1f81e2d11d4c4e05b5e729953274f028da..4d46a796951b65ad15bfd121f7d2c36bf4f17703 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.py index 0e354783d167536f9e27bf84396e4710303e5999..1fdf39e11fa020154238f20c5d97bb6fa14fbacf 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.py index c977b70e200806f1e56bf19a396784d683bc8832..1bc7e1c7a4734da04d86978b07f95605427603fd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.py index e4493e09abb5de09b0e339755232b59a7443a1d5..c07a53a8a620c9b4be21562e178364614ad73acd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.py index b36a11e14f1390ca2f84a276886752dd19fa7bb4..05b0fe1e0c91349bdf9f1f9058405cf6f62a9130 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 3739c508c82eb0d4727839aec748b1377669bf98..7dfc9d3b40e11356fb5ad6cdc5b7a44ceb19b6e3 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/optimization_metric/explicit_route_include_objects/route_object_include_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/tiebreakers/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/tiebreakers/__init__.py index 8857cb729926b1533c5e0b64d5bb7cbe73aa6bcb..d370c1b46d192bf5ecf23ce2f7c1db4ecb6bde4c 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/tiebreakers/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/tiebreakers/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.py index 737f59a0c9331975625796491cc12a33ad0b0084..4c99011d956c4cb9dfe97830856eb3f4af1984d6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/metric/tiebreakers/tiebreaker/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/objective_function/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/objective_function/__init__.py index 2a43b9e9d6e1746ad99e0fc96b5f9c2621175574..694a38092b614d620ce20ddd252b6f5380b8daca 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/objective_function/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/objective_function/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/objective_function/objective_function/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/objective_function/objective_function/__init__.py index af56528baedd2b98c7f0c2513bab087ad9cc40cb..e8a698892c1feb5811fa53c2ade6198837fa13a2 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/objective_function/objective_function/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/optimizations/algorithm/objective_function/objective_function/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/__init__.py index dd5de9ea12a9c1f298c87f922e1d337768e30390..cfefe2c5a3c4d01daf73ae807415aeb131315270 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_affinities_values/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_affinities_values/__init__.py index 834d54004adcb031a0aa22c0ab0876645ef5adc5..78b38bebdf7349833d22245c2879b1f9f2cd9414 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_affinities_values/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_affinities_values/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_affinities_values/path_affinities_value/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_affinities_values/path_affinities_value/__init__.py index 4c70f00d2b4b449e762d99b86b1a5e6f0ed1df74..cf1f779850e63326464eb1d7172952a74af58b63 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_affinities_values/path_affinities_value/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_affinities_values/path_affinities_value/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_affinity_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_affinity_names/__init__.py index e4c2f928e3fce6b000c351d4657e70e4ec9b868c..02b4d2f72cdb82dd50a2ceb193f5cd17e007da64 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_affinity_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_affinity_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_affinity_names/path_affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_affinity_names/path_affinity_name/__init__.py index b4c89473a6e74b2b177960f04d1c00bac61bf132..78f648572823e5d96c7413cabe3c8a8a59580b2f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_affinity_names/path_affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_affinity_names/path_affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.py index abbcd1fe709062e8e480966ade273c0804c4844f..0cefd34c386d8d85170e5650303bc9d463b3f46f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_affinity_names/path_affinity_name/affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_metric_bounds/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_metric_bounds/__init__.py index 3c37b21ef6ff73f0639da5503747fc6251df864d..87d3609dd254b1e1afa31df1472d0cebbfbeccef 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_metric_bounds/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_metric_bounds/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_metric_bounds/path_metric_bound/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_metric_bounds/path_metric_bound/__init__.py index 56eb60da5846332a1583d255378a1b4c27238b43..ae2f19bcd23c3fcef87704875ef8505f13277c9f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_metric_bounds/path_metric_bound/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_metric_bounds/path_metric_bound/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_srlgs_lists/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_srlgs_lists/__init__.py index 43d3f73de0797a8c98cb86e80f50dde70243eb4d..6608c4efdc41912a74c1ee24b3014857d24de012 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_srlgs_lists/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_srlgs_lists/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.py index e9d2655479fb23505f5b3bbcfb6b5c7c70472a04..31e9c19184144fceccb5cc4268671e0a92376c09 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_srlgs_lists/path_srlgs_list/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_srlgs_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_srlgs_names/__init__.py index 373798e80fd66cbd707eaff7c2376c42fcbbf2f6..609c69f207785e2fcc81423fd20c2e5fc91ebcd7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_srlgs_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_srlgs_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_srlgs_names/path_srlgs_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_srlgs_names/path_srlgs_name/__init__.py index 7b65a97db822417ce80967fa5ad29f217d0818e1..66680c1f16489c5afcbad2e0dad5da48a9104a4b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_srlgs_names/path_srlgs_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/path_srlgs_names/path_srlgs_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/te_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/te_bandwidth/__init__.py index a99bde6c2635120459c33e9f546690e43a5ac9de..c464e72a2a62b21d797773ebca89e86ba4970e39 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/te_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/te_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/te_bandwidth/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/te_bandwidth/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/te_bandwidth/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/te_bandwidth/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/te_bandwidth/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/te_bandwidth/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/te_bandwidth/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_constraints/te_bandwidth/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/__init__.py index 1f2491ba0fae8f7d281bb4433b6f009890bd3b2f..26794231b9dfab6f91dfea1be24ef9eb3df93618 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_affinities_values/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_affinities_values/__init__.py index 834d54004adcb031a0aa22c0ab0876645ef5adc5..78b38bebdf7349833d22245c2879b1f9f2cd9414 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_affinities_values/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_affinities_values/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_affinities_values/path_affinities_value/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_affinities_values/path_affinities_value/__init__.py index e7c0f7d0ad00f60c264db926fb11a9c7d62b362a..e8877f3f6aa22dbe475ab7df7340dd96759684b8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_affinities_values/path_affinities_value/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_affinities_values/path_affinities_value/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_affinity_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_affinity_names/__init__.py index e4c2f928e3fce6b000c351d4657e70e4ec9b868c..02b4d2f72cdb82dd50a2ceb193f5cd17e007da64 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_affinity_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_affinity_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_affinity_names/path_affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_affinity_names/path_affinity_name/__init__.py index b4c89473a6e74b2b177960f04d1c00bac61bf132..78f648572823e5d96c7413cabe3c8a8a59580b2f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_affinity_names/path_affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_affinity_names/path_affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.py index abbcd1fe709062e8e480966ade273c0804c4844f..0cefd34c386d8d85170e5650303bc9d463b3f46f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_affinity_names/path_affinity_name/affinity_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_metric/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_metric/__init__.py index 6c791afde38fd0bdb53b3518addff3834fc0f95d..01a0c07678fb590bdc57ad5ce5e2694f3c2ed24f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_metric/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_metric/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/__init__.py index 4368687ae2b141d4df60f3c4a5cf1eefbfca716c..1f43a712f292761feb078df81ccaf82dd60f76e8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/__init__.py index d7b77da59516bfd8a9b9a731138bd8805b3bee6e..da099f93b1e04dbd1d200276af0c461f9bf40346 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/__init__.py index 45d5e33dadf589d825f78a9e14818a4871d9542a..c6fc0e24c1c79415f9ef8502e001afe5de7fd34c 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.py index e4493e09abb5de09b0e339755232b59a7443a1d5..c07a53a8a620c9b4be21562e178364614ad73acd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.py index b36a11e14f1390ca2f84a276886752dd19fa7bb4..05b0fe1e0c91349bdf9f1f9058405cf6f62a9130 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index da3404be850f79069df9a65c0508cedc3c6e32c0..9d887933696e541802a491060e0cc8b703ab872a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_route_objects/path_route_object/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_srlgs_lists/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_srlgs_lists/__init__.py index 43d3f73de0797a8c98cb86e80f50dde70243eb4d..6608c4efdc41912a74c1ee24b3014857d24de012 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_srlgs_lists/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_srlgs_lists/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_srlgs_lists/path_srlgs_list/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_srlgs_lists/path_srlgs_list/__init__.py index e9d2655479fb23505f5b3bbcfb6b5c7c70472a04..31e9c19184144fceccb5cc4268671e0a92376c09 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_srlgs_lists/path_srlgs_list/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_srlgs_lists/path_srlgs_list/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_srlgs_names/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_srlgs_names/__init__.py index 373798e80fd66cbd707eaff7c2376c42fcbbf2f6..609c69f207785e2fcc81423fd20c2e5fc91ebcd7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_srlgs_names/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_srlgs_names/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_srlgs_names/path_srlgs_name/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_srlgs_names/path_srlgs_name/__init__.py index 7b65a97db822417ce80967fa5ad29f217d0818e1..66680c1f16489c5afcbad2e0dad5da48a9104a4b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_srlgs_names/path_srlgs_name/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/path_properties/path_srlgs_names/path_srlgs_name/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/__init__.py index 78ef423bba5d1b3fa3b53e1b352e472d8f63ad73..4f15ef163fca46a9ac284b9f72627927ecbdaefd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/__init__.py index 6cbc3678b58078b0b8a268d515e2f498c5c94065..dc24b33cea8b7453267b73476f036e08011f38b9 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/__init__.py index 74d9c60e33c6546724dff8784a18e8d339021ae7..fc0da7cd3585f4230c02352d8c3be57647a4c2ae 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/__init__.py index c1f2efeb0931f3cf5eb391791c17e4c5db620998..500c3ffb92c5ba38e5aac78d260f751fb34de1b8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py index ef725f1a920a3c2097d601ccbcd68d49e5f28aec..59638071b9ffc578f62d4d3519efd36d7d38bd1a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py index 5e0c0aebdbe40cf83887665d56f35ceed1f45ceb..e9899935ba38a993f78f531fb0573f16c50057f5 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py index 575b87c2ca55f147595e9e46b3630008c9b3e82c..ee6794aa86391ac63e6fb125fe00217216b319e7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 2ec5da1f9f269488520fbc8b546dc67ac2894821..09b31e1ed6e066945f18d41c86034f6e4ab9cf28 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/__init__.py index 10f04b0ab7b9835e2d61e24fbcb233e3412fb6b6..b0da4f2e8cc8738b8c69016826d37aff47c50c45 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/__init__.py index 74d9c60e33c6546724dff8784a18e8d339021ae7..fc0da7cd3585f4230c02352d8c3be57647a4c2ae 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/__init__.py index 8caf79ea324c509eb0ca88c8dca47b8561d3b35c..50a264cd18949190df8bcf252d31e62ec8ab24cd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py index e4493e09abb5de09b0e339755232b59a7443a1d5..c07a53a8a620c9b4be21562e178364614ad73acd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py index 573491548f562faa99328926d4bc12112cb988cf..1b1a8ff4099c1707f2bdbe6fb31255dd94751378 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 04310d99136c797b48c15ba47ea556c46d928127..8112c3ae6941c927803ff84f537a9f71420ec9ab 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/tunnel_termination_points/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/tunnel_termination_points/__init__.py index 3b5e2b21abf48ad098dffdf0ced49481e149907e..7d38afed20f1a5d207a6c3d15444c40c23adeb64 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/tunnel_termination_points/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/tunnel_termination_points/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/tunnels/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/tunnels/__init__.py index f362c1c8490c912a65a726bebf3172edc3a99107..ee463eb1b0e86509adf775915ed81a1c6da25711 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/tunnels/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/tunnels/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/tunnels/tunnel/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/tunnels/tunnel/__init__.py index 94c595725b80725776d1dea823dce5076560cf72..dfb86b109a13b30b65f7c200f2579b35255dd01a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/tunnels/tunnel/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/local_link_connectivities/underlay/tunnels/tunnel/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/statistics/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/statistics/__init__.py index 0843b19e7eee06b4f34e593e213933e14b221c26..4aedf71133e8f2735733fe3cb5c9313ade115fbb 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/statistics/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/statistics/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/statistics/local_link_connectivity/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/statistics/local_link_connectivity/__init__.py index 99bbc4a004bc41fb2380778864c8994fc5f500e1..7617ee27eeea7f98e8d31e6c99dbdb055d81224f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/statistics/local_link_connectivity/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/statistics/local_link_connectivity/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/statistics/tunnel_termination_point/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/statistics/tunnel_termination_point/__init__.py index 704b1675e40fec76bb7522a59034982403ddeade..346a9b615369c4e134cd34ed808a38cf20e52e75 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/statistics/tunnel_termination_point/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/statistics/tunnel_termination_point/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/supporting_tunnel_termination_point/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/supporting_tunnel_termination_point/__init__.py index e69cca10ba8baf8171618b3c9c8c4b8d6d12cf80..56f152b297e00a87a2c298f2bdb468f5f4a6229c 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/supporting_tunnel_termination_point/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/te/tunnel_termination_point/supporting_tunnel_termination_point/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/__init__.py index 5fb792f1e19b1048e4e5559df5f71e96b64d67b5..16c001897b5741094ef346ee0ce89074847bc4cc 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/supporting_termination_point/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/supporting_termination_point/__init__.py index ab6b1ab350099c196a5d48c90c9648ae0c2b8845..8958971dab3a520e3bc8c68565bc9c03129df502 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/supporting_termination_point/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/supporting_termination_point/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/__init__.py index cd1201a2fdbb10f3c5c82c52219a00e3a8157dd4..54d9d637be2dd59dd025f4be7f0aded102d4420c 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/geolocation/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/geolocation/__init__.py index 9f07c18a1ad9b6d1dd96849f72b24555cc998a51..6bf006d99fa3c613aa425dbad1df3df68fbb3043 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/geolocation/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/geolocation/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/interface_switching_capability/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/interface_switching_capability/__init__.py index 44868147145744526f4f19a30327953562d1ddfc..02d3900e49f19d6c5599e9ca6af8964e19d51d5c 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/interface_switching_capability/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/interface_switching_capability/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/interface_switching_capability/max_lsp_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/interface_switching_capability/max_lsp_bandwidth/__init__.py index c01e6ec6a9bb1e56c0081e4166af677aa037260b..9eac5d44ffbd214cdac33774be1a76a2dbf928aa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/interface_switching_capability/max_lsp_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/interface_switching_capability/max_lsp_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/__init__.py index a99bde6c2635120459c33e9f546690e43a5ac9de..c464e72a2a62b21d797773ebca89e86ba4970e39 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/node/termination_point/te/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/supporting_network/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/supporting_network/__init__.py index c63b557fba163692647309ff8fa3a40e16c9cbe7..323796c5f76e120a767c3bcd87fca89af86b13e7 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/supporting_network/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/supporting_network/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/te/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/te/__init__.py index 3ac92f6456460fe80e517e6625fa94e520bc6a35..5cf429a1c2daec7e27b71fcb96b0be7b741f275b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/te/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/te/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/te/geolocation/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/te/geolocation/__init__.py index aac7b3acf8634789427ab387046e673a61c3666c..0f5f8f9ef1653b63d662722bedafb64b1ac6077d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/te/geolocation/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/te/geolocation/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/te/nsrlg/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/te/nsrlg/__init__.py index b1a2ffc2750d3fbc25c579c3f62e7c80751b7682..55fdcb89a7e61aff04d744a13a71e11505d4b368 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/te/nsrlg/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/te/nsrlg/__init__.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/nbi/service/ietf_network_slice/bindings/networks/network/te_topology_identifier/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/network/te_topology_identifier/__init__.py index 64d1116166a665234678e54a27e22c14b586fbd0..6088cc315e4e00926e44a959a2de81e3731a8ad9 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/network/te_topology_identifier/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/network/te_topology_identifier/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/__init__.py index d3dfb208ef11e13e0b19f22f5c0a43bb7476596e..2c88f905c764da56d13d9bb4cfc064e4a9beb716 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/__init__.py index ace0c17429c496e9cc392f65a9865fc38463c434..cfd0abd594d495f0fdd161eb8555704625c73366 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/__init__.py index ee927abada0c668abff9587a17dd9aa1ba48b71a..be20a045dc6b86d95e562294f1ea886e14cdb757 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/__init__.py index e25c257725a76c39746a4f1ca589885a6aeddef3..89fb24eb9fe6f0a1609fb35649cf8f5be0257eae 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/external_domain/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/external_domain/__init__.py index 14954b5130f690dae465cc4df68709f50544df84..fe910beace02b2d89f06039ca8aac35dd3af34e9 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/external_domain/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/external_domain/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/interface_switching_capability/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/interface_switching_capability/__init__.py index 44868147145744526f4f19a30327953562d1ddfc..02d3900e49f19d6c5599e9ca6af8964e19d51d5c 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/interface_switching_capability/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/interface_switching_capability/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/__init__.py index c01e6ec6a9bb1e56c0081e4166af677aa037260b..9eac5d44ffbd214cdac33774be1a76a2dbf928aa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/__init__.py index a99bde6c2635120459c33e9f546690e43a5ac9de..c464e72a2a62b21d797773ebca89e86ba4970e39 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/interface_switching_capability/max_lsp_bandwidth/te_bandwidth/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/__init__.py index a7af90c987a8211e777258468be7eafd2edb16c3..95fa033e5d5131ebce1b6ca3fdad006f02382702 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/__init__.py index 0fb55cd606c7e4d2ca4a1061dcf4c4cd8d3d8891..1bbdd347705aa2f5d8b6a5fee1876870558ba5f4 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_end/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_end/__init__.py index 93b8edd584c855acdb31e357a7745f38dc606e30..461d66e40c691c75edd5e86803f1673e6817ca51 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_end/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_end/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_end/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_start/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_start/__init__.py index 1ad793f388a08a6a26a42470299e9bd653d403a3..18919cd0df4b6fb055d378df3322555bb918d89b 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_start/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_start/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_start/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_step/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_step/__init__.py index 57901c59123251588a65d3ee10009ded935bb1f8..06ffef4054af1ce49ec4d455c23a6628c80f6f30 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_step/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_step/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_step/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_step/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_step/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_step/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_step/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_step/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_step/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/label_restrictions/label_restriction/label_step/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_link_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_link_bandwidth/__init__.py index c92c7b9e1e3e7db8f65b4ee54b817da0c779bf08..919164eab26f63382dbabc4ae9435df0502dad6d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_link_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_link_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_link_bandwidth/te_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_link_bandwidth/te_bandwidth/__init__.py index a99bde6c2635120459c33e9f546690e43a5ac9de..c464e72a2a62b21d797773ebca89e86ba4970e39 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_link_bandwidth/te_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_link_bandwidth/te_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_link_bandwidth/te_bandwidth/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_link_bandwidth/te_bandwidth/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_link_bandwidth/te_bandwidth/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_link_bandwidth/te_bandwidth/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_link_bandwidth/te_bandwidth/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_link_bandwidth/te_bandwidth/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_link_bandwidth/te_bandwidth/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_link_bandwidth/te_bandwidth/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_resv_link_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_resv_link_bandwidth/__init__.py index 968d401f366d3005a5d8cda261606b480e272da3..53a06becf8f78b9c747744b4ad6167866c6624f3 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_resv_link_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_resv_link_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/__init__.py index a99bde6c2635120459c33e9f546690e43a5ac9de..c464e72a2a62b21d797773ebca89e86ba4970e39 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/max_resv_link_bandwidth/te_bandwidth/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/te_nsrlgs/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/te_nsrlgs/__init__.py index 43b0c777f396ce9bb2c63e09b91942ce5f72c57a..df2ea88b9d55e8bf3aae7c9d2b6ccb8abb3aa907 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/te_nsrlgs/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/te_nsrlgs/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/te_srlgs/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/te_srlgs/__init__.py index f9c1d141a1127dbb1f1e43d86c1ed2b347e6c86a..64eed911ea205bb2f9f4258d4c337c41a928b18d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/te_srlgs/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/te_srlgs/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/__init__.py index 78ef423bba5d1b3fa3b53e1b352e472d8f63ad73..4f15ef163fca46a9ac284b9f72627927ecbdaefd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/__init__.py index 6cbc3678b58078b0b8a268d515e2f498c5c94065..dc24b33cea8b7453267b73476f036e08011f38b9 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/__init__.py index 74d9c60e33c6546724dff8784a18e8d339021ae7..fc0da7cd3585f4230c02352d8c3be57647a4c2ae 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/__init__.py index a6d2377c188304201e1e29a23987d2f750435889..a504cbf66e7ef0b5b3183b4ba46c89542b5ad71f 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py index e4493e09abb5de09b0e339755232b59a7443a1d5..c07a53a8a620c9b4be21562e178364614ad73acd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py index feef9127c74765b06c4b607b005973df604edfc9..173ce30da67f7faf8a2b3a4505070b4bd56f2ef1 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 3d011eb224962cde6d2abcfed75201f4b2b2dd8c..0e2f58c2a4126c5016c0529324bc3d2eef6b47fd 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/backup_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/__init__.py index 10f04b0ab7b9835e2d61e24fbcb233e3412fb6b6..b0da4f2e8cc8738b8c69016826d37aff47c50c45 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/__init__.py index 74d9c60e33c6546724dff8784a18e8d339021ae7..fc0da7cd3585f4230c02352d8c3be57647a4c2ae 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/__init__.py index 82bfbf3490f09d9e42a7a53b5d43d4d0fb68c55d..3a6f29a3b22fff75bb106cb3b1dae7ce946e6439 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/as_number/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/as_number/__init__.py index 0798edc8485bf20defd44df5fcc2d46496bce1a7..85d3597fe048f798bbd840abf78212ce5c0336c6 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/as_number/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/as_number/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py index ef725f1a920a3c2097d601ccbcd68d49e5f28aec..59638071b9ffc578f62d4d3519efd36d7d38bd1a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/as_number/as_number_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/label/__init__.py index 08961924d9b651ff50f979d9b9b255432248bc3a..b2b189a32269e6914dbdeb6c88e044040ef46804 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/__init__.py index ee838763987d96e9d2fb29b4b92b43b327ad997e..e9b63776548bd844cc6ce3257ed86885a03ac5fa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py index 39bd9752bdf0f6b88a29554fb360a80a477ead7f..fae14686dbd74f7d60ad617f24c4d3a47bb4f6a0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/label/label_hop/te_label/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py index ac0b29b9c2c29227a8d992da1eefd507ff8f1f9f..d60d9d7edf0e76ea4f4a35b1e2c9cc381179a728 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py index 5e0c0aebdbe40cf83887665d56f35ceed1f45ceb..e9899935ba38a993f78f531fb0573f16c50057f5 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/numbered_link_hop/numbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py index 1bf9ddb7e54f8adac59366f7264efb13e0b86ca3..8f8a0e0821707829aaedd422070f25c4ab0d2b05 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py index 398a2f86f81d59ff4bafdce5f81735cc0f2a564d..76a408f9ad076026c93f9bd1052faf903a5a521a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/numbered_node_hop/numbered_node_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py index 6629bc5376df2acabae1307b203117c0090bcdd2..4bc29bc8132d870e28f0c40dce2be4456fc31284 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py index 9b4644d74ea685590d8a9fafeabf60c7e0760208..4d92cd1ac307464cd965746436812240608ad5e8 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/primary_path/path_element/type/unnumbered_link_hop/unnumbered_link_hop/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/tunnel_termination_points/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/tunnel_termination_points/__init__.py index 3f481cdb5adcd93e124ab370f5cea07a7368a08a..f34e300f7d52fd043d68f63981f7928343f07b67 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/tunnel_termination_points/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/tunnel_termination_points/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/tunnels/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/tunnels/__init__.py index f362c1c8490c912a65a726bebf3172edc3a99107..ee463eb1b0e86509adf775915ed81a1c6da25711 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/tunnels/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/tunnels/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/tunnels/tunnel/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/tunnels/tunnel/__init__.py index 94c595725b80725776d1dea823dce5076560cf72..dfb86b109a13b30b65f7c200f2579b35255dd01a 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/tunnels/tunnel/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/underlay/tunnels/tunnel/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/unreserved_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/unreserved_bandwidth/__init__.py index 7aecfd9bad7b90745226b34cdc6bcd3354537c1b..daa35056c667e7b9b65ef20c106d32df325d9553 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/unreserved_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/unreserved_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/unreserved_bandwidth/te_bandwidth/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/unreserved_bandwidth/te_bandwidth/__init__.py index a99bde6c2635120459c33e9f546690e43a5ac9de..c464e72a2a62b21d797773ebca89e86ba4970e39 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/unreserved_bandwidth/te_bandwidth/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/unreserved_bandwidth/te_bandwidth/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/unreserved_bandwidth/te_bandwidth/technology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/unreserved_bandwidth/te_bandwidth/technology/__init__.py index a59dd255fbc95fb177f810b325c78d55c3e563c7..677c62ad3848d386acb57027f650ee9b7232ff2d 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/unreserved_bandwidth/te_bandwidth/technology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/unreserved_bandwidth/te_bandwidth/technology/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/unreserved_bandwidth/te_bandwidth/technology/generic/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/unreserved_bandwidth/te_bandwidth/technology/generic/__init__.py index dbeeea278475848caafdf8c1af0f77643faf266f..cbf74c0d7ee64c839cb48f93c2e03e7a77f99caa 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/unreserved_bandwidth/te_bandwidth/technology/generic/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/link_template/te_link_attributes/unreserved_bandwidth/te_bandwidth/technology/generic/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/node_template/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/node_template/__init__.py index 269a754015ede7bd2097dd815fadc3312e94d36b..d89886bfa9b9b5f1343d7bd504d705921ce0e35e 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/node_template/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/node_template/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/node_template/te_node_attributes/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/node_template/te_node_attributes/__init__.py index e7a437de67312a23030dcadc4090e75bbed6f7fe..2ba9a631306694936589cd3de5b49a59b4726795 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/node_template/te_node_attributes/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/node_template/te_node_attributes/__init__.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/nbi/service/ietf_network_slice/bindings/networks/te/templates/node_template/te_node_attributes/underlay_topology/__init__.py b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/node_template/te_node_attributes/underlay_topology/__init__.py index 98a97272439700148abb9c1dd10f7ae5ba74813e..b85b7150492cf1d76e42d50896162b16855cabe0 100644 --- a/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/node_template/te_node_attributes/underlay_topology/__init__.py +++ b/src/nbi/service/ietf_network_slice/bindings/networks/te/templates/node_template/te_node_attributes/underlay_topology/__init__.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/nbi/service/ietf_network_slice/ietf_slice_handler.py b/src/nbi/service/ietf_network_slice/ietf_slice_handler.py index e3e8ea6f8a2ff4956d945f47f3d14909ed0e41d4..d18729d870472ac00baa123389aceb96c8ca2850 100644 --- a/src/nbi/service/ietf_network_slice/ietf_slice_handler.py +++ b/src/nbi/service/ietf_network_slice/ietf_slice_handler.py @@ -29,7 +29,7 @@ from common.proto.context_pb2 import ( Slice, SliceStatusEnum, ) -from common.tools.context_queries.Slice import get_slice_by_defualt_name +from common.tools.context_queries.Slice import get_slice_by_default_name from common.tools.grpc.ConfigRules import update_config_rule_custom from common.tools.object_factory.Device import json_device_id from common.DeviceTypes import DeviceTypeEnum @@ -474,7 +474,7 @@ class IETFSliceHandler: raise Exception("Number of SDPs to create must be exactly 1") new_sdp = sdps[0] - slice_request = get_slice_by_defualt_name( + slice_request = get_slice_by_default_name( context_client, slice_uuid, rw_copy=False ) ietf_data = get_ietf_data_from_config(slice_request, CANDIDATE_RESOURCE_KEY) @@ -494,7 +494,7 @@ class IETFSliceHandler: """ Delete the specified SDP from an existing slice's candidate IETF data. """ - slice_request = get_slice_by_defualt_name( + slice_request = get_slice_by_default_name( context_client, slice_uuid, rw_copy=False ) ietf_data = get_ietf_data_from_config(slice_request, CANDIDATE_RESOURCE_KEY) @@ -525,7 +525,7 @@ class IETFSliceHandler: raise Exception("Number of connection groups to create must be exactly 1") new_connection_group = connection_groups[0] - slice_request = get_slice_by_defualt_name( + slice_request = get_slice_by_default_name( context_client, slice_id, rw_copy=False ) ietf_data = get_ietf_data_from_config(slice_request, CANDIDATE_RESOURCE_KEY) @@ -548,7 +548,7 @@ class IETFSliceHandler: """ Update an existing connection group in the candidate IETF data. """ - slice_request = get_slice_by_defualt_name( + slice_request = get_slice_by_default_name( context_client, slice_name, rw_copy=False ) candidate_ietf_data = get_ietf_data_from_config( @@ -583,7 +583,7 @@ class IETFSliceHandler: """ Remove an existing connection group from the candidate IETF data of a slice. """ - slice_request = get_slice_by_defualt_name( + slice_request = get_slice_by_default_name( context_client, slice_uuid, rw_copy=False ) candidate_ietf_data = get_ietf_data_from_config( @@ -632,7 +632,7 @@ class IETFSliceHandler: new_match_criterion = match_criteria[0] target_connection_group_id = new_match_criterion["target-connection-group-id"] - slice_request = get_slice_by_defualt_name( + slice_request = get_slice_by_default_name( context_client, slice_name, rw_copy=False ) ietf_data = get_ietf_data_from_config(slice_request, CANDIDATE_RESOURCE_KEY) @@ -681,7 +681,7 @@ class IETFSliceHandler: """ Delete the specified match-criterion from an SDP in the slice's candidate IETF data. """ - slice_request = get_slice_by_defualt_name( + slice_request = get_slice_by_default_name( context_client, slice_uuid, rw_copy=False ) ietf_data = get_ietf_data_from_config(slice_request, CANDIDATE_RESOURCE_KEY) @@ -719,7 +719,7 @@ class IETFSliceHandler: """ Copy candidate IETF slice data to the running IETF slice data for a given slice. """ - slice_request = get_slice_by_defualt_name( + slice_request = get_slice_by_default_name( context_client, slice_uuid, rw_copy=False ) candidate_ietf_data = get_ietf_data_from_config( diff --git a/src/nbi/service/tfs_api/Resources.py b/src/nbi/service/tfs_api/Resources.py index 8e41c60098266a8fd05ef1cfa5246917249c06bd..c0ce6cb401ae550c1506fcd6526088202fc098eb 100644 --- a/src/nbi/service/tfs_api/Resources.py +++ b/src/nbi/service/tfs_api/Resources.py @@ -19,6 +19,7 @@ from flask.json import jsonify from flask_restful import Resource, request from werkzeug.exceptions import BadRequest from common.proto.context_pb2 import Empty, LinkTypeEnum +from common.tools.descriptor.Tools import format_device_custom_config_rules, format_service_custom_config_rules from common.tools.grpc.Tools import grpc_message_to_json from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient @@ -215,7 +216,8 @@ class Service(_Resource): raise BadRequest('Mismatching context_uuid') if service_uuid != service['service_id']['service_uuid']['uuid']: raise BadRequest('Mismatching service_uuid') - return format_grpc_to_json(self.service_client.UpdateService(grpc_service(service))) + svc = format_service_custom_config_rules(service) + return format_grpc_to_json(self.service_client.UpdateService(grpc_service(svc))) def delete(self, context_uuid : str, service_uuid : str): return format_grpc_to_json(self.service_client.DeleteService(grpc_service_id(context_uuid, service_uuid))) @@ -267,9 +269,15 @@ class Devices(_Resource): json_requests = request.get_json() if 'devices' in json_requests: json_requests = json_requests['devices'] + + dev_list = [] + for device in json_requests: + dev = format_device_custom_config_rules(device) + dev_list.append(dev) + return jsonify([ grpc_message_to_json(self.device_client.AddDevice(grpc_device(device))) - for device in json_requests + for device in dev_list ]) class Device(_Resource): diff --git a/src/nbi/tests/test_ietf_l2vpn.py b/src/nbi/tests/test_ietf_l2vpn.py index 3ffa576dea5b30d8ff25a638da2f504980ece76f..1882a6e60a4d1d33515c3eaf246cecb65afe6c11 100644 --- a/src/nbi/tests/test_ietf_l2vpn.py +++ b/src/nbi/tests/test_ietf_l2vpn.py @@ -20,18 +20,24 @@ eventlet.monkey_patch() #pylint: disable=wrong-import-position import logging from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.proto.context_pb2 import ContextId, ServiceStatusEnum +from common.tools.context_queries.Service import get_service_by_uuid +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from tests.tools.mock_osm.MockOSM import MockOSM -from .OSM_Constants import SERVICE_CONNECTION_POINTS_1, SERVICE_CONNECTION_POINTS_2, SERVICE_TYPE +from .OSM_Constants import ( + SERVICE_CONNECTION_POINTS_1, SERVICE_CONNECTION_POINTS_2, SERVICE_TYPE +) from .PrepareTestScenario import ( # pylint: disable=unused-import # be careful, order of symbols is important here! nbi_application, osm_wim, context_client ) +logging.getLogger('ro.sdn.ietfl2vpn').setLevel(logging.DEBUG) LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -53,9 +59,21 @@ def test_prepare_environment(context_client : ContextClient) -> None: # pylint: assert len(response.service_ids ) == 0 assert len(response.slice_ids ) == 0 -def test_create_service(osm_wim : MockOSM): # pylint: disable=redefined-outer-name +def test_create_service(osm_wim : MockOSM, context_client : ContextClient): # pylint: disable=redefined-outer-name osm_wim.create_connectivity_service(SERVICE_TYPE, SERVICE_CONNECTION_POINTS_1) + # Emulate service activation for the test + service_uuid = list(osm_wim.conn_info.keys())[0] # this test adds a single service + + service = get_service_by_uuid( + context_client, service_uuid, rw_copy=True, include_endpoint_ids=False, + include_constraints=False, include_config_rules=False + ) + if service is None: + raise Exception('Unable to find Service({:s})'.format(str(service_uuid))) + service.service_status.service_status = ServiceStatusEnum.SERVICESTATUS_ACTIVE + context_client.SetService(service) + def test_get_service_status(osm_wim : MockOSM): # pylint: disable=redefined-outer-name service_uuid = list(osm_wim.conn_info.keys())[0] # this test adds a single service osm_wim.get_connectivity_service_status(service_uuid) diff --git a/src/pathcomp/frontend/service/algorithms/tools/ResourceGroups.py b/src/pathcomp/frontend/service/algorithms/tools/ResourceGroups.py index 6a696501307313903b9ac5d242479dbb679ec19e..825998cc94c4b36e01879b55a983e1e9d99d505c 100644 --- a/src/pathcomp/frontend/service/algorithms/tools/ResourceGroups.py +++ b/src/pathcomp/frontend/service/algorithms/tools/ResourceGroups.py @@ -30,7 +30,7 @@ DEVICE_TYPE_TO_DEEPNESS = { DeviceTypeEnum.IP_SDN_CONTROLLER.value : 80, DeviceTypeEnum.IETF_SLICE.value : 80, DeviceTypeEnum.NCE.value : 80, - + DeviceTypeEnum.OPENFLOW_RYU_CONTROLLER.value : 80, DeviceTypeEnum.EMULATED_PACKET_ROUTER.value : 70, DeviceTypeEnum.PACKET_POP.value : 70, diff --git a/src/policy/.gitlab-ci.yml b/src/policy/.gitlab-ci.yml index 7385444d1390e3dd9755ddda9e0a9ce8115d13ed..be2313f20f41ecefa0b231af587fa9896014934a 100644 --- a/src/policy/.gitlab-ci.yml +++ b/src/policy/.gitlab-ci.yml @@ -24,10 +24,10 @@ build policy: - docker image prune --force - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY script: - - export IMAGE_TAG=$(grep -m1 '' ./src/$IMAGE_NAME_POLICY/pom.xml | grep -oP '(?<=>).*(?=<)') - - echo "IMAGE_TAG=${IMAGE_TAG}" >> ${BUILD_ENV_POLICY} + - export POL_IMAGE_TAG=$(grep -m1 '' ./src/$IMAGE_NAME_POLICY/pom.xml | grep -oP '(?<=>).*(?=<)') + - echo "POL_IMAGE_TAG=${POL_IMAGE_TAG}" >> ${BUILD_ENV_POLICY} - cat ${BUILD_ENV_POLICY} - - docker buildx build -t "$IMAGE_NAME_POLICY:$IMAGE_TAG" -f ./src/$IMAGE_NAME_POLICY/src/main/docker/Dockerfile.multistage.jvm ./src/$IMAGE_NAME_POLICY/ --target builder + - docker buildx build -t "$IMAGE_NAME_POLICY:$POL_IMAGE_TAG" -f ./src/$IMAGE_NAME_POLICY/src/main/docker/Dockerfile.multistage.jvm ./src/$IMAGE_NAME_POLICY/ --target builder after_script: - docker image prune --force artifacts: @@ -52,10 +52,10 @@ unit_test policy: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - docker rm ${REPORTS_CONTAINER} || true script: - - echo "Running tests for image ${IMAGE_TAG}" - - docker buildx build -t "$IMAGE_NAME_POLICY:$IMAGE_TAG" -f ./src/$IMAGE_NAME_POLICY/src/main/docker/Dockerfile.multistage.jvm ./src/$IMAGE_NAME_POLICY/ --target unit-test + - echo "Running tests for image ${POL_IMAGE_TAG}" + - docker buildx build -t "$IMAGE_NAME_POLICY:$POL_IMAGE_TAG" -f ./src/$IMAGE_NAME_POLICY/src/main/docker/Dockerfile.multistage.jvm ./src/$IMAGE_NAME_POLICY/ --target unit-test # Transfer JaCoCo and Surefire reports from within tests image - - docker create --name ${REPORTS_CONTAINER} "$IMAGE_NAME_POLICY:$IMAGE_TAG" + - docker create --name ${REPORTS_CONTAINER} "$IMAGE_NAME_POLICY:$POL_IMAGE_TAG" - mkdir -p ${REPORTS_PATH_POLICY} - docker cp ${REPORTS_CONTAINER}:/app/target/site/jacoco/index.html ${REPORTS_PATH_POLICY}/coverage.html - docker cp ${REPORTS_CONTAINER}:/app/target/site/jacoco/jacoco.xml ${REPORTS_PATH_POLICY}/jacoco.xml @@ -63,12 +63,12 @@ unit_test policy: - cat ${REPORTS_PATH_POLICY}/coverage.html | grep -o 'Total[^%]*%' | sed 's/<.*>/ /; s/Total/JaCoCo Coverage Total:/' - docker run -v "$(pwd)/src/${IMAGE_NAME_POLICY}:/${IMAGE_NAME_POLICY}" --rm registry.gitlab.com/haynes/jacoco2cobertura:1.0.7 python /opt/cover2cover.py ${IMAGE_NAME_POLICY}/reports/jacoco.xml ${IMAGE_NAME_POLICY}/src/main/java > ${REPORTS_PATH_POLICY}/cobertura.xml # Build final image - - docker buildx build -t "$IMAGE_NAME_POLICY:$IMAGE_TAG" -f ./src/$IMAGE_NAME_POLICY/src/main/docker/Dockerfile.multistage.jvm ./src/$IMAGE_NAME_POLICY/ --target release - - docker tag "$IMAGE_NAME_POLICY:$IMAGE_TAG" "$CI_REGISTRY_IMAGE/$IMAGE_NAME_POLICY:$IMAGE_TAG" - - docker push "$CI_REGISTRY_IMAGE/$IMAGE_NAME_POLICY:$IMAGE_TAG" + - docker buildx build -t "$IMAGE_NAME_POLICY:$POL_IMAGE_TAG" -f ./src/$IMAGE_NAME_POLICY/src/main/docker/Dockerfile.multistage.jvm ./src/$IMAGE_NAME_POLICY/ --target release + - docker tag "$IMAGE_NAME_POLICY:$POL_IMAGE_TAG" "$CI_REGISTRY_IMAGE/$IMAGE_NAME_POLICY:$POL_IMAGE_TAG" + - docker push "$CI_REGISTRY_IMAGE/$IMAGE_NAME_POLICY:$POL_IMAGE_TAG" after_script: - docker rm ${REPORTS_CONTAINER} - - docker rm -f "$IMAGE_NAME_POLICY:$IMAGE_TAG" + - docker rm -f "$IMAGE_NAME_POLICY:$POL_IMAGE_TAG" coverage: '/JaCoCo Coverage Total: ([0-9]{1,3})%/' artifacts: reports: 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 7fc4c8b8cd1b02050ad655059b5d747538eb3b2b..1e299542d887b91a1cd602f6602cf0eabc1fca6e 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 @@ -27,13 +27,8 @@ import context.ContextOuterClass.Location.LocationCase; import context.ContextOuterClass.Uuid; import jakarta.inject.Singleton; import java.util.ArrayList; -import java.util.List; import java.util.stream.Collectors; import kpi_sample_types.KpiSampleTypes; -import monitoring.Monitoring; -import monitoring.Monitoring.AlarmID; -import monitoring.Monitoring.KpiId; -import monitoring.Monitoring.SubscriptionID; import org.etsi.tfs.policy.acl.AclAction; import org.etsi.tfs.policy.acl.AclEntry; import org.etsi.tfs.policy.acl.AclForwardActionEnum; @@ -43,40 +38,11 @@ import org.etsi.tfs.policy.acl.AclRuleSet; import org.etsi.tfs.policy.acl.AclRuleTypeEnum; import org.etsi.tfs.policy.context.model.*; import org.etsi.tfs.policy.kpi_sample_types.model.KpiSampleType; -import org.etsi.tfs.policy.monitoring.model.AlarmDescriptor; -import org.etsi.tfs.policy.monitoring.model.AlarmResponse; -import org.etsi.tfs.policy.monitoring.model.AlarmSubscription; -import org.etsi.tfs.policy.monitoring.model.BooleanKpiValue; -import org.etsi.tfs.policy.monitoring.model.FloatKpiValue; -import org.etsi.tfs.policy.monitoring.model.IntegerKpiValue; -import org.etsi.tfs.policy.monitoring.model.Kpi; -import org.etsi.tfs.policy.monitoring.model.KpiDescriptor; -import org.etsi.tfs.policy.monitoring.model.KpiValue; -import org.etsi.tfs.policy.monitoring.model.KpiValueRange; -import org.etsi.tfs.policy.monitoring.model.LongKpiValue; -import org.etsi.tfs.policy.monitoring.model.MonitorKpiRequest; -import org.etsi.tfs.policy.monitoring.model.StringKpiValue; -import org.etsi.tfs.policy.monitoring.model.SubsDescriptor; -import org.etsi.tfs.policy.monitoring.model.SubsResponse; import org.etsi.tfs.policy.policy.model.*; -import org.etsi.tfs.policy.policy.model.BooleanOperator; -import org.etsi.tfs.policy.policy.model.NumericalOperator; -import org.etsi.tfs.policy.policy.model.PolicyRule; -import org.etsi.tfs.policy.policy.model.PolicyRuleAction; -import org.etsi.tfs.policy.policy.model.PolicyRuleActionConfig; -import org.etsi.tfs.policy.policy.model.PolicyRuleActionEnum; -import org.etsi.tfs.policy.policy.model.PolicyRuleBasic; -import org.etsi.tfs.policy.policy.model.PolicyRuleCondition; -import org.etsi.tfs.policy.policy.model.PolicyRuleDevice; -import org.etsi.tfs.policy.policy.model.PolicyRuleService; -import org.etsi.tfs.policy.policy.model.PolicyRuleState; -import org.etsi.tfs.policy.policy.model.PolicyRuleStateEnum; -import org.etsi.tfs.policy.policy.model.PolicyRuleTypeDevice; -import org.etsi.tfs.policy.policy.model.PolicyRuleTypeService; import policy.Policy; import policy.Policy.PolicyRuleId; +import policy.Policy.PolicyRuleKpiId; import policy.PolicyAction; -import policy.PolicyCondition; @Singleton public class Serializer { @@ -120,6 +86,19 @@ public class Serializer { return policyRuleId.getUuid().getUuid(); } + public PolicyRuleKpiId serializePolicyRuleKpiId(String expectedPolicyRuleKpiId) { + final var builder = PolicyRuleKpiId.newBuilder(); + final var uuid = serializeUuid(expectedPolicyRuleKpiId); + + builder.setPolicyRuleKpiUuid(uuid); + + return builder.build(); + } + + public String deserialize(PolicyRuleKpiId policyRuleKpiId) { + return policyRuleKpiId.getPolicyRuleKpiUuid().getUuid(); + } + public ContextOuterClass.TopologyId serialize(TopologyId topologyId) { final var builder = ContextOuterClass.TopologyId.newBuilder(); @@ -1450,434 +1429,6 @@ public class Serializer { return new PolicyRuleState(ruleState, serializedRuleStateMessage); } - public PolicyCondition.NumericalOperator serialize(NumericalOperator numericalOperator) { - switch (numericalOperator) { - case POLICY_RULE_CONDITION_NUMERICAL_EQUAL: - return PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_EQUAL; - case POLICY_RULE_CONDITION_NUMERICAL_NOT_EQUAL: - return PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_NOT_EQUAL; - case POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN: - return PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_LESS_THAN; - case POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL: - return PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL; - case POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN: - return PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN; - case POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL: - return PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL; - case POLICY_RULE_CONDITION_NUMERICAL_UNDEFINED: - return PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_UNDEFINED; - default: - return PolicyCondition.NumericalOperator.UNRECOGNIZED; - } - } - - public NumericalOperator deserialize( - PolicyCondition.NumericalOperator serializedNumericalOperator) { - switch (serializedNumericalOperator) { - case POLICYRULE_CONDITION_NUMERICAL_EQUAL: - return NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_EQUAL; - case POLICYRULE_CONDITION_NUMERICAL_NOT_EQUAL: - return NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_NOT_EQUAL; - case POLICYRULE_CONDITION_NUMERICAL_LESS_THAN: - return NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN; - case POLICYRULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL: - return NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL; - case POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN: - return NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN; - case POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL: - return NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL; - case POLICYRULE_CONDITION_NUMERICAL_UNDEFINED: - case UNRECOGNIZED: - default: - return NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_UNDEFINED; - } - } - - public Monitoring.KpiValue serializeStringKpiValue(KpiValue kpiValue) { - final var builder = Monitoring.KpiValue.newBuilder(); - - return builder.setStringVal(kpiValue.getValue()).build(); - } - - public String deserializeStringKpiValue(Monitoring.KpiValue serializedKpiValue) { - - return serializedKpiValue.getStringVal(); - } - - public Monitoring.KpiValue serializeBooleanKpiValue(KpiValue kpiValue) { - final var builder = Monitoring.KpiValue.newBuilder(); - - return builder.setBoolVal(kpiValue.getValue()).build(); - } - - public boolean deserializeBooleanKpiValue(Monitoring.KpiValue serializedKpiValue) { - - return serializedKpiValue.getBoolVal(); - } - - public Monitoring.KpiValue serializeFloatKpiValue(KpiValue kpiValue) { - final var builder = Monitoring.KpiValue.newBuilder(); - - return builder.setFloatVal(kpiValue.getValue()).build(); - } - - public float deserializeFloatKpiValue(Monitoring.KpiValue serializedKpiValue) { - - return serializedKpiValue.getFloatVal(); - } - - public Monitoring.KpiValue serializeIntegerKpiValue(KpiValue kpiValue) { - final var builder = Monitoring.KpiValue.newBuilder(); - - return builder.setInt32Val(kpiValue.getValue()).build(); - } - - public Monitoring.KpiValue serializeLongKpiValue(KpiValue kpiValue) { - final var builder = Monitoring.KpiValue.newBuilder(); - - return builder.setInt64Val(kpiValue.getValue()).build(); - } - - public int deserializeIntegerKpiValue(Monitoring.KpiValue serializedKpiValue) { - - return serializedKpiValue.getInt32Val(); - } - - public Monitoring.KpiValue serialize(KpiValue kpiValue) { - final var builder = Monitoring.KpiValue.newBuilder(); - - if (kpiValue.getValue() instanceof Integer) { - final var serializedIntegerKpiValue = serializeIntegerKpiValue((KpiValue) kpiValue); - builder.setInt32Val(serializedIntegerKpiValue.getInt32Val()); - } - if (kpiValue.getValue() instanceof Long) { - final var serializedIntegerKpiValue = serializeLongKpiValue((KpiValue) kpiValue); - builder.setInt64Val(serializedIntegerKpiValue.getInt64Val()); - } - if (kpiValue.getValue() instanceof Float) { - final var serializedFloatKpiValue = serializeFloatKpiValue((KpiValue) kpiValue); - builder.setFloatVal(serializedFloatKpiValue.getFloatVal()); - } - if (kpiValue.getValue() instanceof String) { - final var serializedStringKpiValue = serializeStringKpiValue((KpiValue) kpiValue); - builder.setStringVal(serializedStringKpiValue.getStringVal()); - } - if (kpiValue.getValue() instanceof Boolean) { - final var serializedBooleanKpiValue = serializeBooleanKpiValue((KpiValue) kpiValue); - builder.setBoolVal(serializedBooleanKpiValue.getBoolVal()); - } - - return builder.build(); - } - - public KpiValue deserialize(Monitoring.KpiValue serializedKpiValue) { - - final var typeOfKpiValue = serializedKpiValue.getValueCase(); - - switch (typeOfKpiValue) { - case INT32VAL: - final var intValue = deserializeIntegerKpiValue(serializedKpiValue); - return new IntegerKpiValue(intValue); - case UINT32VAL: - final var uintValue = deserializeIntegerKpiValue(serializedKpiValue); - return new IntegerKpiValue(uintValue); - case INT64VAL: - final var longValue = deserializeIntegerKpiValue(serializedKpiValue); - return new LongKpiValue(longValue); - case UINT64VAL: - final var ulongValue = deserializeIntegerKpiValue(serializedKpiValue); - return new LongKpiValue(ulongValue); - case BOOLVAL: - final var booleanValue = deserializeBooleanKpiValue(serializedKpiValue); - return new BooleanKpiValue(booleanValue); - case FLOATVAL: - final var floatValue = deserializeFloatKpiValue(serializedKpiValue); - return new FloatKpiValue(floatValue); - case STRINGVAL: - final var stringValue = deserializeStringKpiValue(serializedKpiValue); - return new StringKpiValue(stringValue); - default: - case VALUE_NOT_SET: - throw new IllegalStateException("Kpi value not set"); - } - } - - public Monitoring.KpiValueRange serialize(KpiValueRange kpiValueRange) { - final var builder = Monitoring.KpiValueRange.newBuilder(); - - final var kpiValueMin = kpiValueRange.getKpiMinValue(); - final var kpiValueMax = kpiValueRange.getKpiMaxValue(); - - Monitoring.KpiValue serializedKpiValueMin; - Monitoring.KpiValue serializedKpiValueMax; - - if (kpiValueMin == null && kpiValueMax == null) { - throw new IllegalStateException("KPI value max and min cannot be both null"); - } else if (kpiValueMax == null) { - serializedKpiValueMin = serialize(kpiValueMin); - serializedKpiValueMax = serialize(new StringKpiValue("NaN")); - } else if (kpiValueMin == null) { - serializedKpiValueMin = serialize(new StringKpiValue("NaN")); - serializedKpiValueMax = serialize(kpiValueMax); - } else { - serializedKpiValueMin = serialize(kpiValueMin); - serializedKpiValueMax = serialize(kpiValueMax); - } - - builder.setKpiMinValue(serializedKpiValueMin); - builder.setKpiMaxValue(serializedKpiValueMax); - - return builder.build(); - } - - public KpiValueRange deserialize(Monitoring.KpiValueRange serializedKpiValueRange) { - final var serializedMinKpiValue = serializedKpiValueRange.getKpiMinValue(); - final var serializedMaxKpiValue = serializedKpiValueRange.getKpiMaxValue(); - final var serializedInRange = serializedKpiValueRange.getInRange(); - final var serializedMaxValue = serializedKpiValueRange.getIncludeMaxValue(); - final var serializedMinValue = serializedKpiValueRange.getIncludeMinValue(); - - final var minKpiValue = deserialize(serializedMinKpiValue); - final var maxKpiValue = deserialize(serializedMaxKpiValue); - - return new KpiValueRange( - minKpiValue, maxKpiValue, serializedInRange, serializedMaxValue, serializedMinValue); - } - - public AlarmID serializeAlarmId(String alarmId) { - final var builder = Monitoring.AlarmID.newBuilder(); - - final var serializedAlarmIdUuid = serializeUuid(alarmId); - builder.setAlarmId(serializedAlarmIdUuid); - - return builder.build(); - } - - public String deserialize(AlarmID serializedAlarmId) { - final var serializedAlarmIdUuid = serializedAlarmId.getAlarmId(); - - return deserialize(serializedAlarmIdUuid); - } - - public Monitoring.AlarmDescriptor serialize(AlarmDescriptor alarmDescriptor) { - final var builder = Monitoring.AlarmDescriptor.newBuilder(); - - final var alarmId = alarmDescriptor.getAlarmId(); - final var alarmDescription = alarmDescriptor.getAlarmDescription(); - final var name = alarmDescriptor.getName(); - final var kpiId = alarmDescriptor.getKpiId(); - final var kpiValueRange = alarmDescriptor.getKpiValueRange(); - final var timestamp = alarmDescriptor.getTimestamp(); - - final var serializedAlarmId = serializeAlarmId(alarmId); - final var serializedKpiId = serializeKpiId(kpiId); - final var serializedKpiValueRange = serialize(kpiValueRange); - final var serializedTimestamp = serialize(timestamp); - - builder.setAlarmId(serializedAlarmId); - builder.setAlarmDescription(alarmDescription); - builder.setName(name); - builder.setKpiId(serializedKpiId); - builder.setKpiValueRange(serializedKpiValueRange); - builder.setTimestamp(serializedTimestamp); - - return builder.build(); - } - - public AlarmDescriptor deserialize(Monitoring.AlarmDescriptor serializedAlarmDescriptor) { - - final var serializedAlarmId = serializedAlarmDescriptor.getAlarmId(); - final var alarmDescription = serializedAlarmDescriptor.getAlarmDescription(); - final var name = serializedAlarmDescriptor.getName(); - final var serializedKpiId = serializedAlarmDescriptor.getKpiId(); - final var serializedKpiValueRange = serializedAlarmDescriptor.getKpiValueRange(); - final var serializeTimestamp = serializedAlarmDescriptor.getTimestamp(); - - final var alarmId = deserialize(serializedAlarmId); - final var kpiId = deserialize(serializedKpiId); - final var kpiValueRange = deserialize(serializedKpiValueRange); - final var timestamp = deserialize(serializeTimestamp); - - return new AlarmDescriptor(alarmId, alarmDescription, name, kpiId, kpiValueRange, timestamp); - } - - public Monitoring.AlarmResponse serialize(AlarmResponse alarmResponse) { - final var builder = Monitoring.AlarmResponse.newBuilder(); - - final var alarmId = alarmResponse.getAlarmId(); - final var kpiList = alarmResponse.getKpiList(); - - final var serializedAlarmIdUuid = serializeUuid(alarmId); - final var serializedAlarmId = - Monitoring.AlarmID.newBuilder().setAlarmId(serializedAlarmIdUuid).build(); - final var serializedKpis = kpiList.stream().map(this::serialize).collect(Collectors.toList()); - final var serializedKpisList = Monitoring.KpiList.newBuilder().addAllKpi(serializedKpis); - - builder.setAlarmId(serializedAlarmId); - builder.setKpiList(serializedKpisList); - - return builder.build(); - } - - public Monitoring.SubsResponse serialize(SubsResponse subsResponse) { - final var builder = Monitoring.SubsResponse.newBuilder(); - - final var subscriptionId = subsResponse.getSubscriptionId(); - final var kpiList = subsResponse.getKpiList(); - - final var serializedSubscriptionIdUuid = serializeSubscriptionIdId(subscriptionId); - final var serializedKpis = kpiList.stream().map(this::serialize).collect(Collectors.toList()); - final var serializedKpisList = Monitoring.KpiList.newBuilder().addAllKpi(serializedKpis); - - builder.setSubsId(serializedSubscriptionIdUuid); - builder.setKpiList(serializedKpisList); - - return builder.build(); - } - - public AlarmResponse deserialize(Monitoring.AlarmResponse serializedAlarmResponse) { - final var serializedAlarmId = serializedAlarmResponse.getAlarmId().getAlarmId(); - final var serializedKpiList = serializedAlarmResponse.getKpiList(); - final var listSerializedKpis = serializedKpiList.getKpiList(); - - final var alarmId = deserialize(serializedAlarmId); - final var kpisList = - listSerializedKpis.stream().map(this::deserialize).collect(Collectors.toList()); - - return new AlarmResponse(alarmId, kpisList); - } - - public Monitoring.MonitorKpiRequest serialize(MonitorKpiRequest monitorKpiRequest) { - final var builder = Monitoring.MonitorKpiRequest.newBuilder(); - - final var kpiId = monitorKpiRequest.getKpiId(); - final var monitoringWindow = monitorKpiRequest.getMonitoringWindow(); - final var samplingRate = monitorKpiRequest.getSamplingRate(); - - final var serializedKpiId = serializeKpiId(kpiId); - - builder.setKpiId(serializedKpiId); - builder.setMonitoringWindowS(monitoringWindow); - builder.setSamplingRateS(samplingRate); - - return builder.build(); - } - - public MonitorKpiRequest deserialize(Monitoring.MonitorKpiRequest serializedMonitorKpiRequest) { - - final var serializedKpiId = serializedMonitorKpiRequest.getKpiId(); - final var kpiId = deserialize(serializedKpiId); - final var monitoringWindow = serializedMonitorKpiRequest.getMonitoringWindowS(); - final var samplingRate = serializedMonitorKpiRequest.getSamplingRateS(); - - return new MonitorKpiRequest(kpiId, monitoringWindow, samplingRate); - } - - public SubsResponse deserialize(Monitoring.SubsResponse serializedSubsResponse) { - final var serializedSubsId = serializedSubsResponse.getSubsId(); - final var serializedKpiList = serializedSubsResponse.getKpiList(); - final var listSerializedKpis = serializedKpiList.getKpiList(); - - final var subsId = deserialize(serializedSubsId); - final var kpiList = - listSerializedKpis.stream().map(this::deserialize).collect(Collectors.toList()); - - return new SubsResponse(subsId, kpiList); - } - - public Monitoring.SubsDescriptor serialize(SubsDescriptor subDescriptor) { - final var builder = Monitoring.SubsDescriptor.newBuilder(); - - final var subscriptionId = subDescriptor.getSubscriptionId(); - final var kpiId = subDescriptor.getKpiId(); - final var samplingDurationS = subDescriptor.getSamplingDurationS(); - final var samplingIntervalS = subDescriptor.getSamplingIntervalS(); - final var startTimestamp = subDescriptor.getStartTimestamp(); - final var endTimestamp = subDescriptor.getEndTimestamp(); - - final var serializedSubscriptionIdUuid = serializeSubscriptionIdId(subscriptionId); - final var serializedKpiIdUuid = serializeUuid(kpiId); - final var serializedKpiId = Monitoring.KpiId.newBuilder().setKpiId(serializedKpiIdUuid).build(); - final var serializedStartTimestamp = serialize(startTimestamp); - final var serializedEndTimestamp = serialize(endTimestamp); - - builder.setSubsId(serializedSubscriptionIdUuid); - builder.setKpiId(serializedKpiId); - builder.setSamplingDurationS(samplingDurationS); - builder.setSamplingIntervalS(samplingIntervalS); - builder.setStartTimestamp(serializedStartTimestamp); - builder.setEndTimestamp(serializedEndTimestamp); - - return builder.build(); - } - - public SubsDescriptor deserialize(Monitoring.SubsDescriptor serializedSubDescriptor) { - final var serializedSubscriptionId = serializedSubDescriptor.getSubsId(); - final var serializedKpiId = serializedSubDescriptor.getKpiId(); - final var samplingDurationS = serializedSubDescriptor.getSamplingDurationS(); - final var samplingIntervalS = serializedSubDescriptor.getSamplingIntervalS(); - final var serializedStartTimestamp = serializedSubDescriptor.getStartTimestamp(); - final var serializedEndTimestamp = serializedSubDescriptor.getEndTimestamp(); - - final var subscriptionId = deserialize(serializedSubscriptionId); - final var kpiId = deserialize(serializedKpiId); - final var startTimestamp = deserialize(serializedStartTimestamp); - final var endTimestamp = deserialize(serializedEndTimestamp); - - return new SubsDescriptor( - subscriptionId, kpiId, samplingDurationS, samplingIntervalS, startTimestamp, endTimestamp); - } - - public SubscriptionID serializeSubscriptionIdId(String subscriptionId) { - final var builder = Monitoring.SubscriptionID.newBuilder(); - - final var serializedSubscriptionIdUuid = serializeUuid(subscriptionId); - builder.setSubsId(serializedSubscriptionIdUuid); - - return builder.build(); - } - - public String deserialize(SubscriptionID serializedSubscriptionId) { - final var serializedSubscriptionIdUuid = serializedSubscriptionId.getSubsId(); - - return deserialize(serializedSubscriptionIdUuid); - } - - public PolicyCondition.PolicyRuleCondition serialize(PolicyRuleCondition policyRuleCondition) { - final var builder = PolicyCondition.PolicyRuleCondition.newBuilder(); - - final var policyRuleConditionKpiId = policyRuleCondition.getKpiId(); - final var numericalOperator = policyRuleCondition.getNumericalOperator(); - final var policyRuleConditionKpiValue = policyRuleCondition.getKpiValue(); - - final var serializedKpiIdUuid = serializeUuid(policyRuleConditionKpiId); - final var serializedKpiId = KpiId.newBuilder().setKpiId(serializedKpiIdUuid).build(); - final var serializedNumericalOperator = serialize(numericalOperator); - final var serializedPolicyRuleConditionKpiValue = serialize(policyRuleConditionKpiValue); - - builder.setKpiId(serializedKpiId); - builder.setNumericalOperator(serializedNumericalOperator); - builder.setKpiValue(serializedPolicyRuleConditionKpiValue); - - return builder.build(); - } - - public PolicyRuleCondition deserialize( - PolicyCondition.PolicyRuleCondition serializedPolicyRuleCondition) { - - final var serializedPolicyRuleConditionKpiId = - serializedPolicyRuleCondition.getKpiId().getKpiId(); - final var serializedNumericalOperator = serializedPolicyRuleCondition.getNumericalOperator(); - final var serializedPolicyRuleConditionKpiValue = serializedPolicyRuleCondition.getKpiValue(); - - final var policyRuleConditionKpiId = deserialize(serializedPolicyRuleConditionKpiId); - final var numericalOperator = deserialize(serializedNumericalOperator); - final var policyRuleConditionKpiValue = deserialize(serializedPolicyRuleConditionKpiValue); - - return new PolicyRuleCondition( - policyRuleConditionKpiId, numericalOperator, policyRuleConditionKpiValue); - } - public PolicyAction.PolicyRuleActionEnum serialize(PolicyRuleActionEnum policyRuleActionEnum) { switch (policyRuleActionEnum) { case POLICY_RULE_ACTION_SET_DEVICE_STATUS: @@ -1968,51 +1519,27 @@ public class Serializer { return new PolicyRuleAction(policyRuleActionEnum, policyRuleActionActionConfigs); } - public PolicyCondition.BooleanOperator serialize(BooleanOperator booleanOperator) { - switch (booleanOperator) { - case POLICYRULE_CONDITION_BOOLEAN_AND: - return PolicyCondition.BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_AND; - case POLICYRULE_CONDITION_BOOLEAN_OR: - return PolicyCondition.BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR; - case POLICYRULE_CONDITION_BOOLEAN_UNDEFINED: - return PolicyCondition.BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_UNDEFINED; - default: - return PolicyCondition.BooleanOperator.UNRECOGNIZED; - } - } - - public BooleanOperator deserialize(PolicyCondition.BooleanOperator serializedBooleanOperator) { - switch (serializedBooleanOperator) { - case POLICYRULE_CONDITION_BOOLEAN_OR: - return BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR; - case POLICYRULE_CONDITION_BOOLEAN_AND: - return BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_AND; - case POLICYRULE_CONDITION_BOOLEAN_UNDEFINED: - case UNRECOGNIZED: - default: - return BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_UNDEFINED; - } - } - public Policy.PolicyRuleBasic serialize(PolicyRuleBasic policyRuleBasic) { final var builder = Policy.PolicyRuleBasic.newBuilder(); final var policyRuleId = policyRuleBasic.getPolicyRuleId(); final var policyRuleState = policyRuleBasic.getPolicyRuleState(); - final var priority = policyRuleBasic.getPriority(); - final var kpiId = policyRuleBasic.getKpiId(); + final var policyRulePriority = policyRuleBasic.getPolicyRulePriority(); final var policyRuleActions = policyRuleBasic.getPolicyRuleActions(); + final var policyRuleKPIs = policyRuleBasic.getPolicyRuleKPIs(); final var serializedPolicyRuleId = serializePolicyRuleId(policyRuleId); final var serializedPolicyRuleState = serialize(policyRuleState); final var serializedPolicyRuleActions = policyRuleActions.stream().map(this::serialize).collect(Collectors.toList()); + final var serializedPolicyRuleKPIs = + policyRuleKPIs.stream().map(this::serializePolicyRuleKpiId).collect(Collectors.toList()); builder.setPolicyRuleId(serializedPolicyRuleId); builder.setPolicyRuleState(serializedPolicyRuleState); - builder.setPriority(priority); - builder.setKpiId(KpiId.newBuilder().setKpiId(Uuid.newBuilder().setUuid("kpiId").build())); + builder.setPolicyRulePriority(policyRulePriority); builder.addAllActionList(serializedPolicyRuleActions); + builder.addAllPolicyRuleKpiList(serializedPolicyRuleKPIs); return builder.build(); } @@ -2020,17 +1547,19 @@ public class Serializer { public PolicyRuleBasic deserialize(Policy.PolicyRuleBasic serializedPolicyRuleBasic) { final var serializedPolicyRuleId = serializedPolicyRuleBasic.getPolicyRuleId(); final var serializedPolicyRuleState = serializedPolicyRuleBasic.getPolicyRuleState(); - final var priority = serializedPolicyRuleBasic.getPriority(); + final var policyRulePriority = serializedPolicyRuleBasic.getPolicyRulePriority(); final var serializedPolicyRuleActions = serializedPolicyRuleBasic.getActionListList(); - final var serializedKpiId = serializedPolicyRuleBasic.getKpiId(); + final var serializedPolicyRuleKPIs = serializedPolicyRuleBasic.getPolicyRuleKpiListList(); final var policyRuleId = deserialize(serializedPolicyRuleId); - final var kpiId = deserialize(serializedKpiId); final var policyRuleState = deserialize(serializedPolicyRuleState); final var policyRuleActions = serializedPolicyRuleActions.stream().map(this::deserialize).collect(Collectors.toList()); + final var policyRuleKPIs = + serializedPolicyRuleKPIs.stream().map(this::deserialize).collect(Collectors.toList()); - return new PolicyRuleBasic(policyRuleId, kpiId, policyRuleState, priority, policyRuleActions); + return new PolicyRuleBasic( + policyRuleId, policyRuleState, policyRulePriority, policyRuleActions, policyRuleKPIs); } public Policy.PolicyRuleService serialize(PolicyRuleService policyRuleService) { @@ -2134,124 +1663,6 @@ public class Serializer { return new PolicyRuleDevice(policyRuleBasic, policyRuleDeviceIds); } - public KpiId serializeKpiId(String kpiId) { - final var builder = Monitoring.KpiId.newBuilder(); - - final var serializedKpiIdUuid = serializeUuid(kpiId); - builder.setKpiId(serializedKpiIdUuid); - - return builder.build(); - } - - public String deserialize(KpiId serializedKpiId) { - final var serializedKpiIdUuid = serializedKpiId.getKpiId(); - - return deserialize(serializedKpiIdUuid); - } - - public Monitoring.Kpi serialize(Kpi kpi) { - final var builder = Monitoring.Kpi.newBuilder(); - - final var kpiId = kpi.getKpiId(); - final var timestamp = kpi.getTimestamp(); - final var kpiValue = kpi.getKpiValue(); - - final var serializedKpiId = serializeKpiId(kpiId); - final var serializedTimestamp = serialize(timestamp); - final var serializedKpiValue = serialize(kpiValue); - - builder.setKpiId(serializedKpiId); - builder.setTimestamp(serializedTimestamp); - builder.setKpiValue(serializedKpiValue); - - return builder.build(); - } - - public Kpi deserialize(Monitoring.Kpi serializedKpi) { - - final var serializedKpiId = serializedKpi.getKpiId(); - final var serializedTimestamp = serializedKpi.getTimestamp(); - final var serializedKpiValue = serializedKpi.getKpiValue(); - - final var kpiId = deserialize(serializedKpiId); - final var timestamp = deserialize(serializedTimestamp); - final var kpiValue = deserialize(serializedKpiValue); - - return new Kpi(kpiId, timestamp, kpiValue); - } - - public List serialize(List kpis) { - List serializedKpis = new ArrayList<>(); - - for (Kpi kpi : kpis) { - final var serializedKpi = serialize(kpi); - - serializedKpis.add(serializedKpi); - } - return serializedKpis; - } - - public List deserialize(List serializedKpis) { - List kpis = new ArrayList<>(); - - for (Monitoring.Kpi serializedKpi : serializedKpis) { - final var kpi = deserialize(serializedKpi); - - kpis.add(kpi); - } - return kpis; - } - - public Monitoring.KpiDescriptor serialize(KpiDescriptor kpiDescriptor) { - final var builder = Monitoring.KpiDescriptor.newBuilder(); - - final var kpiDescriptorDescription = kpiDescriptor.getKpiDescription(); - final var kpiDescriptorKpiSampleType = kpiDescriptor.getKpiSampleType(); - final var kpiDescriptorDeviceId = kpiDescriptor.getDeviceId(); - final var kpiDescriptorEndPointId = kpiDescriptor.getEndPointId(); - final var kpiDescriptorServiceId = kpiDescriptor.getServiceId(); - final var kpiDescriptorSliceId = kpiDescriptor.getSliceId(); - - final var serializedKpiDescriptorKpiSampleType = serialize(kpiDescriptorKpiSampleType); - final var serializedKpiDescriptorDeviceId = serializeDeviceId(kpiDescriptorDeviceId); - final var serializedKpiDescriptorEndPointId = serialize(kpiDescriptorEndPointId); - final var serializedKpiDescriptorServiceId = serialize(kpiDescriptorServiceId); - final var serializedKpiDescriptorSliceId = serialize(kpiDescriptorSliceId); - - builder.setKpiDescription(kpiDescriptorDescription); - builder.setKpiSampleType(serializedKpiDescriptorKpiSampleType); - builder.setDeviceId(serializedKpiDescriptorDeviceId); - builder.setEndpointId(serializedKpiDescriptorEndPointId); - builder.setServiceId(serializedKpiDescriptorServiceId); - builder.setSliceId(serializedKpiDescriptorSliceId); - - return builder.build(); - } - - public KpiDescriptor deserialize(Monitoring.KpiDescriptor serializedKpiDescriptor) { - - final var serializedKpiDescriptorDescription = serializedKpiDescriptor.getKpiDescription(); - final var serializedKpiDescriptorKpiSampleType = serializedKpiDescriptor.getKpiSampleType(); - final var serializedKpiDescriptorDeviceId = serializedKpiDescriptor.getDeviceId(); - final var serializedKpiDescriptorEndPointId = serializedKpiDescriptor.getEndpointId(); - final var serializedKpiDescriptorServiceId = serializedKpiDescriptor.getServiceId(); - final var serializedKpiDescriptorSLiceId = serializedKpiDescriptor.getSliceId(); - - final var kpiSampleType = deserialize(serializedKpiDescriptorKpiSampleType); - final var deviceId = deserialize(serializedKpiDescriptorDeviceId); - final var endPointId = deserialize(serializedKpiDescriptorEndPointId); - final var serviceId = deserialize(serializedKpiDescriptorServiceId); - final var sliceId = deserialize(serializedKpiDescriptorSLiceId); - - return new KpiDescriptor( - serializedKpiDescriptorDescription, - kpiSampleType, - deviceId, - endPointId, - serviceId, - sliceId); - } - public ContextOuterClass.DeviceConfig serialize(DeviceConfig deviceConfig) { final var builder = ContextOuterClass.DeviceConfig.newBuilder(); @@ -2319,8 +1730,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 +1781,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: @@ -2402,33 +1853,6 @@ public class Serializer { return new EndPoint.EndPointBuilder(endPointId, endPointType, kpiSampleTypes).build(); } - public Monitoring.AlarmSubscription serialize(AlarmSubscription alarmSubscription) { - final var builder = Monitoring.AlarmSubscription.newBuilder(); - - final var alarmId = alarmSubscription.getAlarmId(); - final var subscriptionTimeoutS = alarmSubscription.getSubscriptionTimeoutS(); - final var subscriptionFrequencyMs = alarmSubscription.getSubscriptionFrequencyMs(); - - final var serializedAlarmId = serializeAlarmId(alarmId); - - builder.setAlarmId(serializedAlarmId); - builder.setSubscriptionTimeoutS(subscriptionTimeoutS); - builder.setSubscriptionFrequencyMs(subscriptionFrequencyMs); - - return builder.build(); - } - - public AlarmSubscription deserialize(Monitoring.AlarmSubscription serializedAlarmSubscription) { - - final var serializedAlarmId = serializedAlarmSubscription.getAlarmId(); - final var subscriptionTimeoutS = serializedAlarmSubscription.getSubscriptionTimeoutS(); - final var subscriptionFrequencyMs = serializedAlarmSubscription.getSubscriptionFrequencyMs(); - - final var alarmId = deserialize(serializedAlarmId); - - return new AlarmSubscription(alarmId, subscriptionTimeoutS, subscriptionFrequencyMs); - } - public ContextOuterClass.Device serialize(Device device) { final var builder = ContextOuterClass.Device.newBuilder(); diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/context/ContextGatewayImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/context/ContextGatewayImpl.java index b1149ac7d4737fd54cfb8b6824cda52533873ce7..21bd47018b2367564e8f21a60d4fc3ccf91efc5b 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/context/ContextGatewayImpl.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/context/ContextGatewayImpl.java @@ -90,7 +90,6 @@ public class ContextGatewayImpl implements ContextGateway { @Override public Uni setPolicyRule(PolicyRule policyRule) { - // return Uni.createFrom().item("571eabc1-0f59-48da-b608-c45876c3fa8a"); final var serializedPolicyRuleBasic = serializer.serialize(policyRule); return streamingDelegateContextPolicy 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 383e14feeb17af4186803585b5fd377a7e15be8a..efcf40777833656d70daef88e3378868211c9777 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 4436b2b624976c4da8e41c882040bfc0522463a0..b1980c2e223f5d07cbf69ad64418aa0bb596a75d 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/DeviceDriverEnum.java b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/DeviceDriverEnum.java index 1f7a4368cb28fca1a7008c519908389f64e7671f..d7db46f47dfea4bf9441ad53bc4dbdeb7e80f964 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/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 fd1352819087dcd40a308c6a87342248f0183e26..facb4c4bf15f906e5539a13fdb3355da2b6bea16 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 fe7fcff2a227edf4af54ad9e39c361b55b709fa6..c7b0c83ce2f0a623dc7d490863f396901161b7d9 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/policy/src/main/java/org/etsi/tfs/policy/kpi_sample_types/model/KpiSampleType.java b/src/policy/src/main/java/org/etsi/tfs/policy/kpi_sample_types/model/KpiSampleType.java index 0b3510a381f33168306e60ae8eb986e1a70557f6..073a3ffaee31c5e1b277ebb38b6e8970806709e3 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/kpi_sample_types/model/KpiSampleType.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/kpi_sample_types/model/KpiSampleType.java @@ -20,8 +20,46 @@ public enum KpiSampleType { UNKNOWN, PACKETS_TRANSMITTED, PACKETS_RECEIVED, + PACKETS_DROPPED, BYTES_TRANSMITTED, BYTES_RECEIVED, + BYTES_DROPPED, LINK_TOTAL_CAPACITY_GBPS, - LINK_USED_CAPACITY_GBPS + LINK_USED_CAPACITY_GBPS, + ML_CONFIDENCE, + OPTICAL_SECURITY_STATUS, + L3_UNIQUE_ATTACK_CONNS, + L3_TOTAL_DROPPED_PACKTS, + L3_UNIQUE_ATTACKERS, + L3_UNIQUE_COMPROMISED_CLIENTS, + L3_SECURITY_STATUS_CRYPTO, + SERVICE_LATENCY_MS, + PACKETS_TRANSMITTED_AGG_OUTPUT, + PACKETS_RECEIVED_AGG_OUTPUT, + PACKETS_DROPPED_AGG_OUTPUT, + BYTES_TRANSMITTED_AGG_OUTPUT, + BYTES_RECEIVED_AGG_OUTPUT, + BYTES_DROPPED_AGG_OUTPUT, + SERVICE_LATENCY_MS_AGG_OUTPUT, + INT_SEQ_NUM, + INT_TS_ING, + INT_TS_EGR, + INT_HOP_LAT, + INT_PORT_ID_ING, + INT_PORT_ID_EGR, + INT_QUEUE_OCCUP, + INT_QUEUE_ID, + INT_HOP_LAT_SW01, + INT_HOP_LAT_SW02, + INT_HOP_LAT_SW03, + INT_HOP_LAT_SW04, + INT_HOP_LAT_SW05, + INT_HOP_LAT_SW06, + INT_HOP_LAT_SW07, + INT_HOP_LAT_SW08, + INT_HOP_LAT_SW09, + INT_HOP_LAT_SW10, + INT_LAT_ON_TOTAL, + INT_IS_DROP, + INT_DROP_REASON } diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/MonitoringGateway.java b/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/MonitoringGateway.java deleted file mode 100644 index 0f6c6a5fa87e48dca71eed4d02b13a24f2c480a2..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/MonitoringGateway.java +++ /dev/null @@ -1,51 +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. - */ - -package org.etsi.tfs.policy.monitoring; - -import io.smallrye.mutiny.Multi; -import io.smallrye.mutiny.Uni; -import org.etsi.tfs.policy.context.model.Empty; -import org.etsi.tfs.policy.monitoring.model.AlarmDescriptor; -import org.etsi.tfs.policy.monitoring.model.AlarmResponse; -import org.etsi.tfs.policy.monitoring.model.AlarmSubscription; -import org.etsi.tfs.policy.monitoring.model.KpiDescriptor; -import org.etsi.tfs.policy.monitoring.model.MonitorKpiRequest; -import org.etsi.tfs.policy.monitoring.model.SubsDescriptor; -import org.etsi.tfs.policy.monitoring.model.SubsResponse; - -public interface MonitoringGateway { - - Uni setKpi(KpiDescriptor kpiDescriptor); - - Uni getKpiDescriptor(String kpiId); - - Uni monitorKpi(MonitorKpiRequest monitorKpiRequest); - - Multi setKpiSubscription(SubsDescriptor subsDescriptor); - - Uni getSubsDescriptor(String subscriptionId); - - Uni setKpiAlarm(AlarmDescriptor alarmDescriptor); - - Uni getAlarmDescriptor(String alarmId); - - Multi getAlarmResponseStream(AlarmSubscription alarmSubscription); - - Uni deleteAlarm(String deviceId); - - Uni deleteKpi(String kpiId); -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/MonitoringGatewayImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/MonitoringGatewayImpl.java deleted file mode 100644 index ccc12944f2c7820b0159cb0c66d31292f9068ab2..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/MonitoringGatewayImpl.java +++ /dev/null @@ -1,147 +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. - */ - -package org.etsi.tfs.policy.monitoring; - -import io.quarkus.grpc.GrpcClient; -import io.smallrye.mutiny.Multi; -import io.smallrye.mutiny.Uni; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.inject.Inject; -import monitoring.MutinyMonitoringServiceGrpc.MutinyMonitoringServiceStub; -import org.etsi.tfs.policy.Serializer; -import org.etsi.tfs.policy.context.model.Empty; -import org.etsi.tfs.policy.monitoring.model.AlarmDescriptor; -import org.etsi.tfs.policy.monitoring.model.AlarmResponse; -import org.etsi.tfs.policy.monitoring.model.AlarmSubscription; -import org.etsi.tfs.policy.monitoring.model.KpiDescriptor; -import org.etsi.tfs.policy.monitoring.model.MonitorKpiRequest; -import org.etsi.tfs.policy.monitoring.model.SubsDescriptor; -import org.etsi.tfs.policy.monitoring.model.SubsResponse; - -@ApplicationScoped -public class MonitoringGatewayImpl implements MonitoringGateway { - - @GrpcClient("monitoring") - MutinyMonitoringServiceStub streamingDelegateMonitoring; - - private final Serializer serializer; - - @Inject - public MonitoringGatewayImpl(Serializer serializer) { - this.serializer = serializer; - } - - @Override - public Uni setKpi(KpiDescriptor kpiDescriptor) { - final var serializedKpiDescriptor = serializer.serialize(kpiDescriptor); - - return streamingDelegateMonitoring - .setKpi(serializedKpiDescriptor) - .onItem() - .transform(serializer::deserialize); - } - - @Override - public Uni getKpiDescriptor(String kpiId) { - final var serializedKpiId = serializer.serializeKpiId(kpiId); - - return streamingDelegateMonitoring - .getKpiDescriptor(serializedKpiId) - .onItem() - .transform(serializer::deserialize); - } - - @Override - public Uni monitorKpi(MonitorKpiRequest monitorKpiRequest) { - final var serializedKpiId = serializer.serialize(monitorKpiRequest); - - return streamingDelegateMonitoring - .monitorKpi(serializedKpiId) - .onItem() - .transform(serializer::deserializeEmpty); - } - - @Override - public Multi setKpiSubscription(SubsDescriptor subsDescriptor) { - final var serializedSubsDescriptor = serializer.serialize(subsDescriptor); - - return streamingDelegateMonitoring - .setKpiSubscription(serializedSubsDescriptor) - .onItem() - .transform(serializer::deserialize); - } - - @Override - public Uni getSubsDescriptor(String subscriptionId) { - final var serializedSubscriptionId = serializer.serializeSubscriptionIdId(subscriptionId); - - return streamingDelegateMonitoring - .getSubsDescriptor(serializedSubscriptionId) - .onItem() - .transform(serializer::deserialize); - } - - @Override - public Uni setKpiAlarm(AlarmDescriptor alarmDescriptor) { - final var serializedAlarmDescriptor = serializer.serialize(alarmDescriptor); - - return streamingDelegateMonitoring - .setKpiAlarm(serializedAlarmDescriptor) - .onItem() - .transform(serializer::deserialize); - } - - @Override - public Uni getAlarmDescriptor(String alarmId) { - final var serializedAlarmId = serializer.serializeAlarmId(alarmId); - - return streamingDelegateMonitoring - .getAlarmDescriptor(serializedAlarmId) - .onItem() - .transform(serializer::deserialize); - } - - @Override - public Multi getAlarmResponseStream(AlarmSubscription alarmSubscription) { - final var serializedAlarmSubscription = serializer.serialize(alarmSubscription); - - return streamingDelegateMonitoring - .getAlarmResponseStream(serializedAlarmSubscription) - .onItem() - .transform(serializer::deserialize); - } - - @Override - public Uni deleteAlarm(String alarmId) { - final var serializedAlarmId = serializer.serializeAlarmId(alarmId); - - return streamingDelegateMonitoring - .deleteAlarm(serializedAlarmId) - .onItem() - .transform(serializer::deserializeEmpty); - } - - @Override - public Uni deleteKpi(String kpiId) { - final var serializedKpiId = serializer.serializeKpiId(kpiId); - - return streamingDelegateMonitoring - .deleteKpi(serializedKpiId) - .onItem() - .transform(serializer::deserializeEmpty); - } -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/MonitoringService.java b/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/MonitoringService.java deleted file mode 100644 index 5d95457eac8ad3b9a09ebdf389fa2b0420d6f7ce..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/MonitoringService.java +++ /dev/null @@ -1,51 +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. - */ - -package org.etsi.tfs.policy.monitoring; - -import io.smallrye.mutiny.Multi; -import io.smallrye.mutiny.Uni; -import org.etsi.tfs.policy.context.model.Empty; -import org.etsi.tfs.policy.monitoring.model.AlarmDescriptor; -import org.etsi.tfs.policy.monitoring.model.AlarmResponse; -import org.etsi.tfs.policy.monitoring.model.AlarmSubscription; -import org.etsi.tfs.policy.monitoring.model.KpiDescriptor; -import org.etsi.tfs.policy.monitoring.model.MonitorKpiRequest; -import org.etsi.tfs.policy.monitoring.model.SubsDescriptor; -import org.etsi.tfs.policy.monitoring.model.SubsResponse; - -public interface MonitoringService { - - Uni setKpi(KpiDescriptor kpiDescriptor); - - Uni getKpiDescriptor(String kpiId); - - Uni monitorKpi(MonitorKpiRequest monitorKpiRequest); - - Multi setKpiSubscription(SubsDescriptor subsDescriptor); - - Uni getSubsDescriptor(String subscriptionId); - - Uni setKpiAlarm(AlarmDescriptor alarmDescriptor); - - Uni getAlarmDescriptor(String alarmId); - - Multi getAlarmResponseStream(AlarmSubscription alarmSubscription); - - Uni deleteAlarm(String deviceId); - - Uni deleteKpi(String kpiId); -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/MonitoringServiceImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/MonitoringServiceImpl.java deleted file mode 100644 index 80a81f8f55e5f106ff5b2a595a81899b3b1b3284..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/MonitoringServiceImpl.java +++ /dev/null @@ -1,91 +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. - */ - -package org.etsi.tfs.policy.monitoring; - -import io.smallrye.mutiny.Multi; -import io.smallrye.mutiny.Uni; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.inject.Inject; -import org.etsi.tfs.policy.context.model.Empty; -import org.etsi.tfs.policy.monitoring.model.AlarmDescriptor; -import org.etsi.tfs.policy.monitoring.model.AlarmResponse; -import org.etsi.tfs.policy.monitoring.model.AlarmSubscription; -import org.etsi.tfs.policy.monitoring.model.KpiDescriptor; -import org.etsi.tfs.policy.monitoring.model.MonitorKpiRequest; -import org.etsi.tfs.policy.monitoring.model.SubsDescriptor; -import org.etsi.tfs.policy.monitoring.model.SubsResponse; - -@ApplicationScoped -public class MonitoringServiceImpl implements MonitoringService { - - private final MonitoringGateway monitoringGateway; - - @Inject - public MonitoringServiceImpl(MonitoringGateway monitoringGateway) { - this.monitoringGateway = monitoringGateway; - } - - @Override - public Uni setKpi(KpiDescriptor kpiDescriptor) { - return monitoringGateway.setKpi(kpiDescriptor); - } - - @Override - public Uni getKpiDescriptor(String kpiId) { - return monitoringGateway.getKpiDescriptor(kpiId); - } - - @Override - public Uni monitorKpi(MonitorKpiRequest monitorKpiRequest) { - return monitoringGateway.monitorKpi(monitorKpiRequest); - } - - @Override - public Multi setKpiSubscription(SubsDescriptor subsDescriptor) { - return monitoringGateway.setKpiSubscription(subsDescriptor); - } - - @Override - public Uni getSubsDescriptor(String subscriptionId) { - return monitoringGateway.getSubsDescriptor(subscriptionId); - } - - @Override - public Uni setKpiAlarm(AlarmDescriptor alarmDescriptor) { - return monitoringGateway.setKpiAlarm(alarmDescriptor); - } - - @Override - public Uni getAlarmDescriptor(String alarmId) { - return monitoringGateway.getAlarmDescriptor(alarmId); - } - - @Override - public Multi getAlarmResponseStream(AlarmSubscription alarmSubscription) { - return monitoringGateway.getAlarmResponseStream(alarmSubscription); - } - - @Override - public Uni deleteAlarm(String alarmId) { - return monitoringGateway.deleteAlarm(alarmId); - } - - @Override - public Uni deleteKpi(String kpiId) { - return monitoringGateway.deleteKpi(kpiId); - } -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/AlarmDescriptor.java b/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/AlarmDescriptor.java deleted file mode 100644 index 41473a3524bd48439272b46b300f2a6ad9fc27f6..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/AlarmDescriptor.java +++ /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. - */ - -package org.etsi.tfs.policy.monitoring.model; - -public class AlarmDescriptor { - private final String alarmId; - private final String alarmDescription; - private final String name; - private final String kpiId; - private final KpiValueRange kpiValueRange; - private final double timestamp; - - public AlarmDescriptor( - String alarmId, - String alarmDescription, - String name, - String kpiId, - KpiValueRange kpiValueRange, - double timestamp) { - this.alarmId = alarmId; - this.alarmDescription = alarmDescription; - this.name = name; - this.kpiId = kpiId; - this.kpiValueRange = kpiValueRange; - this.timestamp = timestamp; - } - - public String getAlarmId() { - return alarmId; - } - - public String getAlarmDescription() { - return alarmDescription; - } - - public String getName() { - return name; - } - - public String getKpiId() { - return kpiId; - } - - public KpiValueRange getKpiValueRange() { - return kpiValueRange; - } - - public double getTimestamp() { - return timestamp; - } - - @Override - public String toString() { - return String.format( - "%s:{alarmId:\"%s\", alarmDescription:\"%s\", name:\"%s\", [%s], [%s], timestamp:\"%f\"}", - getClass().getSimpleName(), - alarmId, - alarmDescription, - name, - kpiId, - kpiValueRange, - timestamp); - } -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/AlarmResponse.java b/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/AlarmResponse.java deleted file mode 100644 index 091f9e1c3af449391d64d2fcb595b3a460128693..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/AlarmResponse.java +++ /dev/null @@ -1,46 +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. - */ - -package org.etsi.tfs.policy.monitoring.model; - -import java.util.List; -import org.etsi.tfs.policy.common.Util; - -public class AlarmResponse { - - private final String alarmId; - - private final List kpiList; - - public AlarmResponse(String alarmId, List kpiList) { - this.alarmId = alarmId; - this.kpiList = kpiList; - } - - public String getAlarmId() { - return alarmId; - } - - public List getKpiList() { - return kpiList; - } - - @Override - public String toString() { - return String.format( - "%s:{alarmId:\"%s\", %s}", getClass().getSimpleName(), alarmId, Util.toString(kpiList)); - } -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/AlarmSubscription.java b/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/AlarmSubscription.java deleted file mode 100644 index 01a85fdc50eca87ddfab6cdd83108fc59e2cfd91..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/AlarmSubscription.java +++ /dev/null @@ -1,51 +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. - */ - -package org.etsi.tfs.policy.monitoring.model; - -public class AlarmSubscription { - - private final String alarmId; - private final float subscriptionTimeoutS; - private final float subscriptionFrequencyMs; - - // TODO: Refactor the AlarmSubscription constructor to allow infinite subscriptionTimeoutS - public AlarmSubscription( - String alarmId, float subscriptionTimeoutS, float subscriptionFrequencyMs) { - this.alarmId = alarmId; - this.subscriptionTimeoutS = subscriptionTimeoutS; - this.subscriptionFrequencyMs = subscriptionFrequencyMs; - } - - public String getAlarmId() { - return alarmId; - } - - public float getSubscriptionTimeoutS() { - return subscriptionTimeoutS; - } - - public float getSubscriptionFrequencyMs() { - return subscriptionFrequencyMs; - } - - @Override - public String toString() { - return String.format( - "%s:{alarmId:\"%s\", subscriptionTimeoutS:\"%f\", subscriptionFrequencyMs:\"%f\"}", - getClass().getSimpleName(), alarmId, subscriptionTimeoutS, subscriptionFrequencyMs); - } -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/BooleanKpiValue.java b/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/BooleanKpiValue.java deleted file mode 100644 index 0354413c3254d58cab7eb3cc70597c55c5b44b4c..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/BooleanKpiValue.java +++ /dev/null @@ -1,36 +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. - */ - -package org.etsi.tfs.policy.monitoring.model; - -public class BooleanKpiValue implements KpiValue { - - private final boolean value; - - public BooleanKpiValue(boolean value) { - this.value = value; - } - - @Override - public Boolean getValue() { - return this.value; - } - - @Override - public String toString() { - return String.format("%s:{value:\"%b\"}", getClass().getSimpleName(), value); - } -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/FloatKpiValue.java b/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/FloatKpiValue.java deleted file mode 100644 index afb1ffff997f91c66bb4945120f834b21256852f..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/FloatKpiValue.java +++ /dev/null @@ -1,36 +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. - */ - -package org.etsi.tfs.policy.monitoring.model; - -public class FloatKpiValue implements KpiValue { - - private final float value; - - public FloatKpiValue(float value) { - this.value = value; - } - - @Override - public Float getValue() { - return this.value; - } - - @Override - public String toString() { - return String.format("%s:{value:\"%f\"}", getClass().getSimpleName(), value); - } -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/IntegerKpiValue.java b/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/IntegerKpiValue.java deleted file mode 100644 index cdd86163aa719666f87e8403ceebb6cb73f83bd3..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/IntegerKpiValue.java +++ /dev/null @@ -1,36 +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. - */ - -package org.etsi.tfs.policy.monitoring.model; - -public class IntegerKpiValue implements KpiValue { - - private final int value; - - public IntegerKpiValue(int value) { - this.value = value; - } - - @Override - public Integer getValue() { - return this.value; - } - - @Override - public String toString() { - return String.format("%s:{value:\"%d\"}", getClass().getSimpleName(), value); - } -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/Kpi.java b/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/Kpi.java deleted file mode 100644 index 2af26df2dbf4f5a4f49faf1920f5b82ede252a24..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/Kpi.java +++ /dev/null @@ -1,49 +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. - */ - -package org.etsi.tfs.policy.monitoring.model; - -public class Kpi { - - private final String kpiId; - private final double timestamp; - private final KpiValue kpiValue; - - public Kpi(String kpiId, double timestamp, KpiValue kpiValue) { - this.kpiId = kpiId; - this.timestamp = timestamp; - this.kpiValue = kpiValue; - } - - public String getKpiId() { - return kpiId; - } - - public double getTimestamp() { - return timestamp; - } - - public KpiValue getKpiValue() { - return kpiValue; - } - - @Override - public String toString() { - return String.format( - "%s:{kpiId:\"%s\", timeStamp:\"%f\", %s}", - getClass().getSimpleName(), kpiId, timestamp, kpiValue); - } -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/KpiDescriptor.java b/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/KpiDescriptor.java deleted file mode 100644 index 95eeddb56b7d76fd18c1c9fc9bbd85e7250a8eb4..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/KpiDescriptor.java +++ /dev/null @@ -1,84 +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. - */ - -package org.etsi.tfs.policy.monitoring.model; - -import org.etsi.tfs.policy.context.model.EndPointId; -import org.etsi.tfs.policy.context.model.ServiceId; -import org.etsi.tfs.policy.context.model.SliceId; -import org.etsi.tfs.policy.kpi_sample_types.model.KpiSampleType; - -public class KpiDescriptor { - - private final String kpiDescription; - private final KpiSampleType kpiSampleType; - private final String deviceId; - private final EndPointId endPointId; - private final ServiceId serviceId; - private final SliceId sliceId; - - public KpiDescriptor( - String kpiDescription, - KpiSampleType kpiSampleType, - String deviceId, - EndPointId endPointId, - ServiceId serviceId, - SliceId sliceId) { - this.kpiDescription = kpiDescription; - this.kpiSampleType = kpiSampleType; - this.deviceId = deviceId; - this.endPointId = endPointId; - this.serviceId = serviceId; - this.sliceId = sliceId; - } - - public String getKpiDescription() { - return kpiDescription; - } - - public KpiSampleType getKpiSampleType() { - return kpiSampleType; - } - - public String getDeviceId() { - return deviceId; - } - - public EndPointId getEndPointId() { - return endPointId; - } - - public ServiceId getServiceId() { - return serviceId; - } - - public SliceId getSliceId() { - return sliceId; - } - - @Override - public String toString() { - return String.format( - "%s:{kpiDescription:\"%s\", kpiSampleType:\"%s\", deviceId:\"%s\", %s, %s, %s}", - getClass().getSimpleName(), - kpiDescription, - kpiSampleType.toString(), - deviceId, - endPointId, - serviceId, - sliceId); - } -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/KpiValue.java b/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/KpiValue.java deleted file mode 100644 index 713a25ec72b93abfa58c16820f40bee92a975d2b..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/KpiValue.java +++ /dev/null @@ -1,22 +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. - */ - -package org.etsi.tfs.policy.monitoring.model; - -public interface KpiValue { - - public T getValue(); -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/KpiValueRange.java b/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/KpiValueRange.java deleted file mode 100644 index 5a92810d04de32cab5eb9a926bc4dd3119018f02..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/KpiValueRange.java +++ /dev/null @@ -1,84 +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. - */ - -package org.etsi.tfs.policy.monitoring.model; - -public class KpiValueRange { - - private KpiValue kpiMinValue; - private KpiValue kpiMaxValue; - private boolean inRange; - private boolean includeMinValue; - private boolean includeMaxValue; - - public KpiValueRange( - KpiValue kpiMinValue, - KpiValue kpiMaxValue, - boolean inRange, - boolean includeMinValue, - boolean includeMaxValue) { - this.kpiMinValue = kpiMinValue; - this.kpiMaxValue = kpiMaxValue; - this.inRange = inRange; - this.includeMinValue = includeMinValue; - this.includeMaxValue = includeMaxValue; - } - - public KpiValue getKpiMinValue() { - return kpiMinValue; - } - - public KpiValue getKpiMaxValue() { - return kpiMaxValue; - } - - public boolean getInRange() { - return inRange; - } - - public boolean getIncludeMinValue() { - return includeMinValue; - } - - public boolean getIncludeMaxValue() { - return includeMaxValue; - } - - public void setKpiMinValue(KpiValue kpiMinValue) { - this.kpiMinValue = kpiMinValue; - } - - public void setKpiMaxValue(KpiValue kpiMaxValue) { - this.kpiMaxValue = kpiMaxValue; - } - - public void setInRange(boolean inRange) { - this.inRange = inRange; - } - - public void setIncludeMinValue(boolean includeMinValue) { - this.includeMinValue = includeMinValue; - } - - public void setIncludeMaxValue(boolean includeMaxValue) { - this.includeMaxValue = includeMaxValue; - } - - @Override - public String toString() { - return String.format("%s:{%s, %s}", getClass().getSimpleName(), kpiMinValue, kpiMaxValue); - } -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/LongKpiValue.java b/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/LongKpiValue.java deleted file mode 100644 index 3d732432ab90aed58c279578ea8bdde6a296c872..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/LongKpiValue.java +++ /dev/null @@ -1,36 +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. - */ - -package org.etsi.tfs.policy.monitoring.model; - -public class LongKpiValue implements KpiValue { - - private final long value; - - public LongKpiValue(int value) { - this.value = value; - } - - @Override - public Long getValue() { - return this.value; - } - - @Override - public String toString() { - return String.format("%s:{value:\"%d\"}", getClass().getSimpleName(), value); - } -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/MonitorKpiRequest.java b/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/MonitorKpiRequest.java deleted file mode 100644 index c8b890a73d6df1002f4bfdade7ff440aa83de697..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/MonitorKpiRequest.java +++ /dev/null @@ -1,48 +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. - */ - -package org.etsi.tfs.policy.monitoring.model; - -public class MonitorKpiRequest { - private final String kpiId; - private final float monitoringWindow; - private final float samplingRate; - - public MonitorKpiRequest(String kpiId, float monitoringWindow, float samplingRate) { - this.kpiId = kpiId; - this.monitoringWindow = monitoringWindow; - this.samplingRate = samplingRate; - } - - public String getKpiId() { - return kpiId; - } - - public float getMonitoringWindow() { - return monitoringWindow; - } - - public float getSamplingRate() { - return samplingRate; - } - - @Override - public String toString() { - return String.format( - "%s:{KpiId:\"%s\", [%s], [%s]}", - getClass().getSimpleName(), kpiId, monitoringWindow, samplingRate); - } -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/StringKpiValue.java b/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/StringKpiValue.java deleted file mode 100644 index 2d9bd9946144210cfcf765e09b071aef976bc766..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/StringKpiValue.java +++ /dev/null @@ -1,36 +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. - */ - -package org.etsi.tfs.policy.monitoring.model; - -public class StringKpiValue implements KpiValue { - - private final String value; - - public StringKpiValue(String value) { - this.value = value; - } - - @Override - public String getValue() { - return this.value; - } - - @Override - public String toString() { - return String.format("%s:{value:\"%s\"}", getClass().getSimpleName(), value); - } -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/SubsDescriptor.java b/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/SubsDescriptor.java deleted file mode 100644 index 760d58ad19c491ca08874c6e9432ced797fa6b7a..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/SubsDescriptor.java +++ /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. - */ - -package org.etsi.tfs.policy.monitoring.model; - -public class SubsDescriptor { - private final String subscriptionId; - private final String kpiId; - private final float samplingDurationS; - private final float samplingIntervalS; - private final double startTimestamp; - private final double endTimestamp; - - public SubsDescriptor( - String subscriptionId, - String kpiId, - float samplingDurationS, - float samplingIntervalS, - double startTimestamp, - double endTimestamp) { - this.subscriptionId = subscriptionId; - this.kpiId = kpiId; - this.samplingDurationS = samplingDurationS; - this.samplingIntervalS = samplingIntervalS; - this.startTimestamp = startTimestamp; - this.endTimestamp = endTimestamp; - } - - public String getSubscriptionId() { - return subscriptionId; - } - - public String getKpiId() { - return kpiId; - } - - public float getSamplingDurationS() { - return samplingDurationS; - } - - public float getSamplingIntervalS() { - return samplingIntervalS; - } - - public double getStartTimestamp() { - return startTimestamp; - } - - public double getEndTimestamp() { - return endTimestamp; - } - - @Override - public String toString() { - return String.format( - "%s:{subscriptionId:\"%s\", kpiId:\"%s\", samplingDurationS:\"%f\", samplingIntervalS:\"%f\", startTimestamp:\"%f\", endTimestamp:\"%f\"}", - getClass().getSimpleName(), - subscriptionId, - kpiId, - samplingDurationS, - samplingIntervalS, - startTimestamp, - endTimestamp); - } -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/SubsResponse.java b/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/SubsResponse.java deleted file mode 100644 index 6e70e4be48707e9864493b6340dba33ef1dd41bd..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/monitoring/model/SubsResponse.java +++ /dev/null @@ -1,46 +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. - */ - -package org.etsi.tfs.policy.monitoring.model; - -import java.util.List; -import org.etsi.tfs.policy.common.Util; - -public class SubsResponse { - - private final String subscriptionId; - private final List kpiList; - - public SubsResponse(String subscriptionId, List kpiList) { - this.subscriptionId = subscriptionId; - this.kpiList = kpiList; - } - - public String getSubscriptionId() { - return subscriptionId; - } - - public List getKpiList() { - return kpiList; - } - - @Override - public String toString() { - return String.format( - "%s:{subscriptionId:\"%s\", %s}", - getClass().getSimpleName(), subscriptionId, Util.toString(kpiList)); - } -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyDeviceImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyDeviceImpl.java index 29113ca0f58b263e4bf0edeb79934821c3850de9..95c0d51a29ea94c75cb05e4034a702c3358973fb 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyDeviceImpl.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyDeviceImpl.java @@ -39,9 +39,6 @@ public class AddPolicyDeviceImpl { @Inject private PolicyRuleConditionValidator policyRuleConditionValidator; - @Inject private CommonPolicyServiceImpl commonPolicyServiceImpl; - @Inject private CommonAlarmService commonAlarmService; - @Inject private ContextService contextService; public Uni> returnInvalidDeviceIds(List deviceIds) { diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java index 01b0f96d6dfe728b721475b067b3944addca4e1c..cf6364867d76c49424958b1fc61981aa005b7b77 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java @@ -35,7 +35,6 @@ import org.jboss.logging.Logger; @ApplicationScoped public class AddPolicyServiceImpl { - @Inject private CommonPolicyServiceImpl commonPolicyService; @Inject private ContextService contextService; private static final Logger LOGGER = Logger.getLogger(AddPolicyServiceImpl.class); @@ -53,8 +52,9 @@ public class AddPolicyServiceImpl { final var policyRuleTypeService = new PolicyRuleTypeService(policyRuleService); final var policyRule = new PolicyRule(policyRuleTypeService); - final String kpiId = policyRuleService.getPolicyRuleBasic().getKpiId(); - commonPolicyService.getKpiPolicyRuleServiceMap().put(kpiId, policyRuleService); + LOGGER.infof( + "PolicyRuleService %s is inserted", + policyRuleService.getPolicyRuleBasic().getPolicyRuleId()); return setPolicyRuleOnContextAndReturnState(policyRule); } diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonAlarmService.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonAlarmService.java deleted file mode 100644 index c46704368e2ca3e5715d921378fd1523f4ad48a8..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonAlarmService.java +++ /dev/null @@ -1,129 +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. - */ - -package org.etsi.tfs.policy.policy; - -import io.smallrye.mutiny.Multi; -import io.smallrye.mutiny.Uni; -import io.smallrye.mutiny.subscription.Cancellable; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.inject.Inject; -import java.util.ArrayList; -import java.util.List; -import org.etsi.tfs.policy.monitoring.MonitoringService; -import org.etsi.tfs.policy.monitoring.model.AlarmDescriptor; -import org.etsi.tfs.policy.monitoring.model.AlarmResponse; -import org.etsi.tfs.policy.monitoring.model.AlarmSubscription; -import org.etsi.tfs.policy.policy.model.PolicyRuleDevice; -import org.etsi.tfs.policy.policy.model.PolicyRuleService; -import org.jboss.logging.Logger; - -@ApplicationScoped -public class CommonAlarmService { - private static final Logger LOGGER = Logger.getLogger(CommonAlarmService.class); - - @Inject private CommonPolicyServiceImpl commonPolicyServiceImpl; - @Inject private MonitoringService monitoringService; - - /** - * Transform the alarmIds into promised alarms returned from the getAlarmResponseStream - * - * @param alarmIds the list of alarm ids - * @param policyRuleService the policy rule service - * @return - */ - private List> transformAlarmIds( - List> alarmIds, PolicyRuleService policyRuleService) { - List> alarmResponseStreamList = new ArrayList<>(); - for (Uni alarmId : alarmIds) { - Multi alarmResponseStream = - alarmId.onItem().transformToMulti(id -> setPolicyMonitor(policyRuleService, id)); - - alarmResponseStreamList.add(alarmResponseStream); - } - return alarmResponseStreamList; - } - - private List> transformAlarmIds( - List> alarmIds, PolicyRuleDevice policyRuleDevice) { - // Transform the alarmIds into promised alarms returned from the - // getAlarmResponseStream - List> alarmResponseStreamList = new ArrayList<>(); - for (Uni alarmId : alarmIds) { - alarmResponseStreamList.add( - alarmId.onItem().transformToMulti(id -> setPolicyMonitor(policyRuleDevice, id))); - } - return alarmResponseStreamList; - } - - private Multi setPolicyMonitor(PolicyRuleService policyRuleService, String id) { - commonPolicyServiceImpl.getAlarmPolicyRuleServiceMap().put(id, policyRuleService); - - // TODO: Create infinite subscription - var alarmSubscription = new AlarmSubscription(id, 259200, 5000); - return monitoringService.getAlarmResponseStream(alarmSubscription); - } - - private Multi setPolicyMonitor(PolicyRuleDevice policyRuleDevice, String id) { - commonPolicyServiceImpl.getAlarmPolicyRuleDeviceMap().put(id, policyRuleDevice); - - // TODO: Create infinite subscription - var alarmSubscription = new AlarmSubscription(id, 259200, 5000); - return monitoringService.getAlarmResponseStream(alarmSubscription); - } - - /** - * Create an alarmIds list that contains the promised ids returned from setKpiAlarm - * - * @param alarmDescriptorList the list of alarm descriptors - * @return the list of alarm descriptors - */ - public List> createAlarmList(List alarmDescriptorList) { - List> alarmIds = new ArrayList>(); - for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) { - LOGGER.infof("alarmDescriptor:"); - LOGGER.infof(alarmDescriptor.toString()); - alarmIds.add(monitoringService.setKpiAlarm(alarmDescriptor)); - } - return alarmIds; - } - - private Cancellable monitorAlarmResponseForService(Multi multi) { - return multi - .subscribe() - .with( - alarmResponse -> { - LOGGER.infof("**************************Received Alarm!**************************"); - LOGGER.infof("alarmResponse:"); - LOGGER.info(alarmResponse); - LOGGER.info(alarmResponse.getAlarmId()); - commonPolicyServiceImpl.applyActionService(alarmResponse.getAlarmId()); - }); - } - - private Cancellable monitorAlarmResponseForDevice(Multi multi) { - return multi - .subscribe() - .with( - alarmResponse -> { - LOGGER.infof("**************************Received Alarm!**************************"); - LOGGER.infof("alarmResponse:"); - LOGGER.info(alarmResponse); - LOGGER.info(alarmResponse.getAlarmId()); - commonPolicyServiceImpl.applyActionDevice(alarmResponse.getAlarmId()); - }); - } -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonPolicyServiceImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonPolicyServiceImpl.java index c85cdd928f6a1be22a48022a4fc8e9fbee8a33e0..e3841139e106ed0ea120a3b1d315494902b58b20 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonPolicyServiceImpl.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonPolicyServiceImpl.java @@ -20,14 +20,12 @@ import static org.etsi.tfs.policy.common.ApplicationProperties.ACTIVE_POLICYRULE import static org.etsi.tfs.policy.common.ApplicationProperties.ENFORCED_POLICYRULE_STATE; import static org.etsi.tfs.policy.common.ApplicationProperties.INVALID_MESSAGE; -import io.smallrye.mutiny.subscription.Cancellable; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; -import java.time.Instant; +// import java.time.Instant; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Random; +// import java.util.Random; import java.util.concurrent.ConcurrentHashMap; import org.etsi.tfs.policy.context.ContextService; import org.etsi.tfs.policy.context.model.ConfigActionEnum; @@ -39,14 +37,9 @@ import org.etsi.tfs.policy.context.model.ConstraintCustom; import org.etsi.tfs.policy.context.model.ConstraintTypeCustom; import org.etsi.tfs.policy.context.model.ServiceConfig; import org.etsi.tfs.policy.device.DeviceService; -import org.etsi.tfs.policy.monitoring.MonitoringService; -import org.etsi.tfs.policy.monitoring.model.AlarmDescriptor; -import org.etsi.tfs.policy.monitoring.model.KpiValueRange; import org.etsi.tfs.policy.policy.model.PolicyRule; import org.etsi.tfs.policy.policy.model.PolicyRuleAction; import org.etsi.tfs.policy.policy.model.PolicyRuleActionConfig; -import org.etsi.tfs.policy.policy.model.PolicyRuleActionEnum; -import org.etsi.tfs.policy.policy.model.PolicyRuleCondition; import org.etsi.tfs.policy.policy.model.PolicyRuleDevice; import org.etsi.tfs.policy.policy.model.PolicyRuleService; import org.etsi.tfs.policy.policy.model.PolicyRuleState; @@ -61,224 +54,193 @@ public class CommonPolicyServiceImpl { private static final Logger LOGGER = Logger.getLogger(CommonPolicyServiceImpl.class); - @Inject private MonitoringService monitoringService; @Inject private ContextService contextService; @Inject private ServiceService serviceService; @Inject private DeviceService deviceService; - private static final int POLICY_EVALUATION_TIMEOUT = 5; - private static final int ACCEPTABLE_NUMBER_OF_ALARMS = 3; - private static final int MONITORING_WINDOW_IN_SECONDS = 5; - private static final int SAMPLING_RATE_PER_SECOND = 1; + // private static final int POLICY_EVALUATION_TIMEOUT = 5; + // private static final int ACCEPTABLE_NUMBER_OF_ALARMS = 3; + // private static final int MONITORING_WINDOW_IN_SECONDS = 5; - // TODO: Find a better way to disregard alarms while reconfiguring path - // Temporary solution for not calling the same rpc more than it's needed - public static int noAlarms = 0; - private ConcurrentHashMap kpiPolicyRuleServiceMap = + // private static String gen() { + // Random r = new Random(System.currentTimeMillis()); + // return String.valueOf((1 + r.nextInt(2)) * 10000 + r.nextInt(10000)); + // } + + // private static double getTimeStamp() { + // long now = Instant.now().getEpochSecond(); + // return Long.valueOf(now).doubleValue(); + // } + + // ToDo: Find a better way to disregard alarms while reconfiguring path + private ConcurrentHashMap activePolicyRuleServices = new ConcurrentHashMap<>(); - private ConcurrentHashMap alarmPolicyRuleServiceMap = + private ConcurrentHashMap activePolicyRuleDevices = new ConcurrentHashMap<>(); - private ConcurrentHashMap alarmPolicyRuleDeviceMap = + private ConcurrentHashMap activePolicyRuleActions = new ConcurrentHashMap<>(); - private ConcurrentHashMap subscriptionList = new ConcurrentHashMap<>(); - private HashMap policyRuleActionMap = new HashMap<>(); - public ConcurrentHashMap getSubscriptionList() { - return subscriptionList; + // Service-level rules + public ConcurrentHashMap getActivePolicyRuleServices() { + return activePolicyRuleServices; + } + + public void addActivePolicyRuleService( + String policyRuleKpiId, PolicyRuleService policyRuleService) { + activePolicyRuleServices.put(policyRuleKpiId, policyRuleService); + } + + public void removeActivePolicyRuleService(String policyRuleKpiId) { + activePolicyRuleServices.remove(policyRuleKpiId); + } + + public boolean hasActivePolicyRuleService(String policyRuleKpiId) { + return activePolicyRuleServices.contains(policyRuleKpiId); + } + + // Device-level rules + public ConcurrentHashMap getActivePolicyRuleDevices() { + return activePolicyRuleDevices; } - public ConcurrentHashMap getKpiPolicyRuleServiceMap() { - return kpiPolicyRuleServiceMap; + public void addActivePolicyRuleDevice(String policyRuleKpiId, PolicyRuleDevice policyRuleDevice) { + activePolicyRuleDevices.put(policyRuleKpiId, policyRuleDevice); } - public ConcurrentHashMap getAlarmPolicyRuleServiceMap() { - return alarmPolicyRuleServiceMap; + public void removeActivePolicyRuleDevice(String policyRuleKpiId) { + activePolicyRuleDevices.remove(policyRuleKpiId); } - public ConcurrentHashMap getAlarmPolicyRuleDeviceMap() { - return alarmPolicyRuleDeviceMap; + public boolean hasActivePolicyRuleDevice(String policyRuleKpiId) { + return activePolicyRuleDevices.contains(policyRuleKpiId); } - public HashMap getPolicyRuleActionMap() { - return policyRuleActionMap; + // Rule actions + public ConcurrentHashMap getActivePolicyRuleActions() { + return activePolicyRuleActions; } - private static String gen() { - Random r = new Random(System.currentTimeMillis()); - return String.valueOf((1 + r.nextInt(2)) * 10000 + r.nextInt(10000)); + public void addActivePolicyRuleAction(String policyRuleKpiId, PolicyRuleAction policyRuleAction) { + activePolicyRuleActions.put(policyRuleKpiId, policyRuleAction); } - private static double getTimeStamp() { - long now = Instant.now().getEpochSecond(); - return Long.valueOf(now).doubleValue(); + public void removeActivePolicyRuleAction(String policyRuleKpiId) { + activePolicyRuleActions.remove(policyRuleKpiId); } - public void applyActionServiceBasedOnKpiId(String kpiId) { - if (!kpiPolicyRuleServiceMap.containsKey(kpiId)) { - LOGGER.info("No Policy for KpiId"); + public boolean hasActivePolicyRuleAction(String policyRuleKpiId) { + return activePolicyRuleActions.contains(policyRuleKpiId); + } + + public void applyActionServiceBasedOnKpiId(String policyRuleKpiId) { + LOGGER.infof("Apply Policy action for service with KPI ID: %s", policyRuleKpiId); + if (!activePolicyRuleServices.containsKey(policyRuleKpiId)) { + LOGGER.errorf("No Policy for KPI ID %s", policyRuleKpiId); return; } - PolicyRuleService policyRuleService = kpiPolicyRuleServiceMap.get(kpiId); + // Do not re-apply action + if (hasActivePolicyRuleAction(policyRuleKpiId)) { + LOGGER.warnf("Action already applied for KPI ID %s", policyRuleKpiId); + return; + } + + PolicyRuleService policyRuleService = activePolicyRuleServices.get(policyRuleKpiId); PolicyRuleAction policyRuleAction = policyRuleService.getPolicyRuleBasic().getPolicyRuleActions().get(0); setPolicyRuleServiceToContext(policyRuleService, ACTIVE_POLICYRULE_STATE); + boolean applied = true; switch (policyRuleAction.getPolicyRuleActionEnum()) { case POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT: - addServiceConstraint(policyRuleService, policyRuleAction); + { + LOGGER.infof("Policy for KPI %s with action: Add Service Constraint", policyRuleKpiId); + addServiceConstraint(policyRuleService, policyRuleAction); + break; + } case POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE: - addServiceConfigRule(policyRuleService, policyRuleAction); + { + LOGGER.infof("Policy for KPI %s with action: Add Service ConfigRule", policyRuleKpiId); + addServiceConfigRule(policyRuleService, policyRuleAction); + break; + } case POLICY_RULE_ACTION_RECALCULATE_PATH: - callRecalculatePathRPC(policyRuleService, policyRuleAction); + { + LOGGER.infof("Policy for KPI %s with action: Recalculate service path", policyRuleKpiId); + callRecalculatePathRPC(policyRuleService, policyRuleAction); + break; + } case POLICY_RULE_ACTION_CALL_SERVICE_RPC: - callUpdateServiceRpc(policyRuleService, policyRuleAction); + { + LOGGER.infof("Policy for KPI %s with action: Update service", policyRuleKpiId); + callUpdateServiceRpc(policyRuleService, policyRuleAction); + break; + } default: - LOGGER.errorf(INVALID_MESSAGE, policyRuleAction.getPolicyRuleActionEnum()); + { + applied = false; + LOGGER.errorf(INVALID_MESSAGE, policyRuleAction.getPolicyRuleActionEnum()); + break; + } } + + if (applied) addActivePolicyRuleAction(policyRuleKpiId, policyRuleAction); } - public void applyActionService(String alarmId) { - PolicyRuleService policyRuleService = alarmPolicyRuleServiceMap.get(alarmId); + public void applyActionService(String policyRuleKpiId) { + PolicyRuleService policyRuleService = activePolicyRuleServices.get(policyRuleKpiId); + + // Do not re-apply action + if (hasActivePolicyRuleAction(policyRuleKpiId)) { + LOGGER.warnf("Action already applied for KPI ID %s", policyRuleKpiId); + return; + } + PolicyRuleAction policyRuleAction = policyRuleService.getPolicyRuleBasic().getPolicyRuleActions().get(0); setPolicyRuleServiceToContext(policyRuleService, ACTIVE_POLICYRULE_STATE); + boolean applied = true; switch (policyRuleAction.getPolicyRuleActionEnum()) { case POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT: - addServiceConstraint(policyRuleService, policyRuleAction); + { + LOGGER.infof("Policy with action: Add Service Constraint"); + addServiceConstraint(policyRuleService, policyRuleAction); + break; + } case POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE: - addServiceConfigRule(policyRuleService, policyRuleAction); + { + LOGGER.infof("Policy with action: Add Service ConfigRule"); + addServiceConfigRule(policyRuleService, policyRuleAction); + break; + } case POLICY_RULE_ACTION_RECALCULATE_PATH: - callRecalculatePathRPC(policyRuleService, policyRuleAction); + { + LOGGER.infof("Policy with action: Recalculate service path"); + callRecalculatePathRPC(policyRuleService, policyRuleAction); + break; + } default: - LOGGER.errorf(INVALID_MESSAGE, policyRuleAction.getPolicyRuleActionEnum()); + { + applied = false; + LOGGER.errorf(INVALID_MESSAGE, policyRuleAction.getPolicyRuleActionEnum()); + break; + } } - } - private KpiValueRange convertPolicyRuleConditionToKpiValueRange( - PolicyRuleCondition policyRuleCondition) { - - switch (policyRuleCondition.getNumericalOperator()) { - case POLICY_RULE_CONDITION_NUMERICAL_EQUAL: - return new KpiValueRange( - policyRuleCondition.getKpiValue(), policyRuleCondition.getKpiValue(), true, true, true); - case POLICY_RULE_CONDITION_NUMERICAL_NOT_EQUAL: - return new KpiValueRange( - policyRuleCondition.getKpiValue(), - policyRuleCondition.getKpiValue(), - true, - false, - false); - - case POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN: - return new KpiValueRange(null, policyRuleCondition.getKpiValue(), true, false, false); - - case POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL: - return new KpiValueRange(null, policyRuleCondition.getKpiValue(), true, true, false); - - case POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN: - return new KpiValueRange(policyRuleCondition.getKpiValue(), null, true, false, false); - - case POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL: - return new KpiValueRange(policyRuleCondition.getKpiValue(), null, true, false, true); - default: - return null; - } - } - - private KpiValueRange combineKpiValueRanges( - String kpiId, KpiValueRange firstKpiValueRange, KpiValueRange secondKpiValueRange) { - if (secondKpiValueRange.getInRange() == true) { - LOGGER.errorf("KpiId: %s, has already range values", kpiId); - return null; - } - - if ((firstKpiValueRange.getKpiMinValue() != null) - && (secondKpiValueRange.getKpiMinValue() != null)) { - LOGGER.errorf("KpiId: %s, has already min value", kpiId); - return null; - } - - if ((firstKpiValueRange.getKpiMaxValue() != null) - && (secondKpiValueRange.getKpiMinValue() != null)) { - LOGGER.errorf("KpiId: %s, has already max value", kpiId); - return null; - } - - // Objects.nonNull(secondKpiValueRange); - - var kpiMinValue = - firstKpiValueRange.getKpiMinValue() != null - ? firstKpiValueRange.getKpiMinValue() - : secondKpiValueRange.getKpiMinValue(); - var kpiMaxValue = - firstKpiValueRange.getKpiMaxValue() != null - ? firstKpiValueRange.getKpiMaxValue() - : secondKpiValueRange.getKpiMaxValue(); - boolean includeMinValue = - firstKpiValueRange.getIncludeMinValue() || secondKpiValueRange.getIncludeMinValue(); - boolean includeMaxValue = - firstKpiValueRange.getIncludeMaxValue() || secondKpiValueRange.getIncludeMaxValue(); - - return new KpiValueRange(kpiMinValue, kpiMaxValue, true, includeMinValue, includeMaxValue); - } - - private AlarmDescriptor createAlarmDescriptorWithoutRange( - PolicyRuleCondition policyRuleCondition) { - - final var kpiId = policyRuleCondition.getKpiId(); - final var kpiValueRange = convertPolicyRuleConditionToKpiValueRange(policyRuleCondition); - - return new AlarmDescriptor( - "", "alarmDescription", "alarmName-" + gen(), kpiId, kpiValueRange, getTimeStamp()); + if (applied) addActivePolicyRuleAction(policyRuleKpiId, policyRuleAction); } - // TODO: To be refactored or deprecated - // private void evaluateAction( - // PolicyRule policyRule, - // List alarmDescriptorList, - // Multi multi) { - // - // Long count = - // multi - // .collect() - // .with(Collectors.counting()) - // .await() - // .atMost(Duration.ofMinutes(POLICY_EVALUATION_TIMEOUT)); - // - // if (count > ACCEPTABLE_NUMBER_OF_ALARMS) { - // for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) { - // monitoringService - // .deleteAlarm(alarmDescriptor.getAlarmId()) - // .subscribe() - // .with( - // emptyMessage -> - // LOGGER.infof( - // "Alarm [%s] has been deleted as ineffective.\n", - // alarmDescriptor.getAlarmId())); - // } - // setPolicyRuleToContext(policyRule, INEFFECTIVE_POLICYRULE_STATE); - // } else { - // setPolicyRuleToContext(policyRule, EFFECTIVE_POLICYRULE_STATE); - // } - // } - - public void applyActionDevice(String alarmId) { - PolicyRuleDevice policyRuleDevice = alarmPolicyRuleDeviceMap.get(alarmId); - - if (policyRuleActionMap.get(alarmId).getPolicyRuleActionEnum() - == PolicyRuleActionEnum.POLICY_RULE_ACTION_SET_DEVICE_STATUS) { - // In case additional PolicyRuleAction for Devices will be added - } + public void applyActionDevice(String policyRuleKpiId) { + PolicyRuleDevice policyRuleDevice = activePolicyRuleDevices.get(policyRuleKpiId); setPolicyRuleDeviceToContext(policyRuleDevice, ACTIVE_POLICYRULE_STATE); List deviceIds = policyRuleDevice.getDeviceIds(); List actionConfigs = - policyRuleActionMap.get(alarmId).getPolicyRuleActionConfigs(); + activePolicyRuleActions.get(policyRuleKpiId).getPolicyRuleActionConfigs(); if (deviceIds.size() != actionConfigs.size()) { String message = @@ -298,7 +260,6 @@ public class CommonPolicyServiceImpl { } private void activateDevice(String deviceId, PolicyRuleActionConfig actionConfig) { - Boolean toBeEnabled; if (actionConfig.getActionKey() == "ENABLED") { toBeEnabled = true; @@ -330,7 +291,6 @@ public class CommonPolicyServiceImpl { private void addServiceConfigRule( PolicyRuleService policyRuleService, PolicyRuleAction policyRuleAction) { - ConfigActionEnum configActionEnum = ConfigActionEnum.SET; List actionConfigs = policyRuleAction.getPolicyRuleActionConfigs(); List newConfigRules = new ArrayList<>(); @@ -350,6 +310,8 @@ public class CommonPolicyServiceImpl { deserializedService -> { List configRules = deserializedService.getServiceConfig().getConfigRules(); + LOGGER.info("Adding service config rules:"); + LOGGER.info(newConfigRules); configRules.addAll(newConfigRules); deserializedService.setServiceConfig(new ServiceConfig(configRules)); }); @@ -357,7 +319,6 @@ public class CommonPolicyServiceImpl { private void addServiceConstraint( PolicyRuleService policyRuleService, PolicyRuleAction policyRuleAction) { - List actionConfigs = policyRuleAction.getPolicyRuleActionConfigs(); List constraintList = new ArrayList<>(); @@ -374,6 +335,8 @@ public class CommonPolicyServiceImpl { .subscribe() .with( deserializedService -> { + LOGGER.info("Adding service constraints:"); + LOGGER.info(constraintList); deserializedService.appendServiceConstraints(constraintList); serviceService.updateService(deserializedService); setPolicyRuleServiceToContext(policyRuleService, ENFORCED_POLICYRULE_STATE); @@ -382,7 +345,6 @@ public class CommonPolicyServiceImpl { private void callUpdateServiceRpc( PolicyRuleService policyRuleService, PolicyRuleAction policyRuleAction) { - final var deserializedServiceUni = contextService.getService(policyRuleService.getServiceId()); deserializedServiceUni @@ -394,6 +356,7 @@ public class CommonPolicyServiceImpl { .subscribe() .with( x -> { + LOGGER.info("Updating service:"); LOGGER.info(deserializedService); setPolicyRuleServiceToContext(policyRuleService, ENFORCED_POLICYRULE_STATE); }); @@ -402,7 +365,6 @@ public class CommonPolicyServiceImpl { private void callRecalculatePathRPC( PolicyRuleService policyRuleService, PolicyRuleAction policyRuleAction) { - final var deserializedServiceUni = contextService.getService(policyRuleService.getServiceId()); deserializedServiceUni @@ -414,26 +376,13 @@ public class CommonPolicyServiceImpl { .subscribe() .with( x -> { - LOGGER.info("called recomputeConnections with:"); + LOGGER.info("Recomputing connections for service:"); LOGGER.info(deserializedService); setPolicyRuleServiceToContext(policyRuleService, ENFORCED_POLICYRULE_STATE); }); }); } - private void setPolicyRuleToContext(PolicyRule policyRule, PolicyRuleState policyRuleState) { - final var policyRuleType = policyRule.getPolicyRuleType(); - final var policyRuleTypeSpecificType = policyRuleType.getPolicyRuleType(); - - if (policyRuleTypeSpecificType instanceof PolicyRuleService) { - setPolicyRuleServiceToContext( - (PolicyRuleService) policyRuleTypeSpecificType, policyRuleState); - } - if (policyRuleTypeSpecificType instanceof PolicyRuleDevice) { - setPolicyRuleDeviceToContext((PolicyRuleDevice) policyRuleTypeSpecificType, policyRuleState); - } - } - public void setPolicyRuleServiceToContext( PolicyRuleService policyRuleService, PolicyRuleState policyRuleState) { LOGGER.infof("Setting Policy Rule state to [%s]", policyRuleState.toString()); @@ -444,6 +393,8 @@ public class CommonPolicyServiceImpl { final var policyRuleTypeService = new PolicyRuleTypeService(policyRuleService); final var policyRule = new PolicyRule(policyRuleTypeService); contextService.setPolicyRule(policyRule).subscribe().with(x -> {}); + + LOGGER.infof("Policy Rule state is now [%s]", policyRuleState.toString()); } public void setPolicyRuleDeviceToContext( @@ -455,6 +406,6 @@ public class CommonPolicyServiceImpl { final var policyRuleTypeService = new PolicyRuleTypeDevice(policyRuleDevice); final var policyRule = new PolicyRule(policyRuleTypeService); - contextService.setPolicyRule(policyRule).subscribe().with(x -> {}); + final var policyRuleId = contextService.setPolicyRule(policyRule).subscribe().with(x -> {}); } } diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/PolicyServiceImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/PolicyServiceImpl.java index 775d1a3e1e30051c45eb09e454bf71b48ecd1539..f2c48df727e32e237442a4addb859ab42110ae29 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/PolicyServiceImpl.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/PolicyServiceImpl.java @@ -79,10 +79,22 @@ public class PolicyServiceImpl implements PolicyService { return Uni.createFrom().item(policyRuleState); } + final var policyRuleId = policyRuleBasic.getPolicyRuleId(); + LOGGER.infof("PolicyRuleService with ID %s is valid", policyRuleId); + final var serviceId = policyRuleService.getServiceId(); final var deviceIds = policyRuleService.getDeviceIds(); final var isServiceValid = policyRuleConditionValidator.isServiceIdValid(serviceId, deviceIds); + // Add policy rule service + for (String policyRuleKpiId : policyRuleBasic.getPolicyRuleKPIs()) { + LOGGER.infof("PolicyRuleService with KPI ID %s", policyRuleKpiId); + // Add policy rule ID to the map + if (!commonPolicyServiceImpl.hasActivePolicyRuleService(policyRuleKpiId)) { + commonPolicyServiceImpl.addActivePolicyRuleService(policyRuleKpiId, policyRuleService); + } + } + return isServiceValid .onFailure() .transform(failure -> new ExternalServiceFailureException(failure.getMessage())) @@ -116,9 +128,21 @@ public class PolicyServiceImpl implements PolicyService { return Uni.createFrom().item(policyRuleState); } + final var policyRuleId = policyRuleBasic.getPolicyRuleId(); + LOGGER.infof("PolicyRuleDevice with ID %s is valid", policyRuleId); + final var deviceIds = policyRuleDevice.getDeviceIds(); final var areDevicesValid = addPolicyDeviceImpl.returnInvalidDeviceIds(deviceIds); + // Add policy rule service + for (String policyRuleKpiId : policyRuleBasic.getPolicyRuleKPIs()) { + LOGGER.infof("PolicyRuleDevice with KPI ID %s", policyRuleKpiId); + // Add policy rule ID to the map + if (!commonPolicyServiceImpl.hasActivePolicyRuleDevice(policyRuleKpiId)) { + commonPolicyServiceImpl.addActivePolicyRuleDevice(policyRuleKpiId, policyRuleDevice); + } + } + return areDevicesValid .onFailure() .transform(failure -> new ExternalServiceFailureException(failure.getMessage())) @@ -215,16 +239,36 @@ public class PolicyServiceImpl implements PolicyService { @Override public Uni deletePolicy(String policyRuleId) { - LOGGER.infof("Received %s", policyRuleId); + LOGGER.infof("Received policy %s for deletion", policyRuleId); - final var getPolicyRule = contextService.getPolicyRule(policyRuleId); + final var retrievedPolicyRule = contextService.getPolicyRule(policyRuleId); - return getPolicyRule.onItem().transform(policyRule -> removePolicyFromContext(policyRule)); + return retrievedPolicyRule + .onItem() + .transform(policyRule -> removePolicyFromContext(policyRule)); } private PolicyRuleState removePolicyFromContext(PolicyRule policyRule) { + if (policyRule == null) { + LOGGER.error("Retrieved NULL policy rule from Context"); + return new PolicyRuleState(PolicyRuleStateEnum.POLICY_FAILED, String.format(INVALID_MESSAGE)); + } + var policyRuleBasic = policyRule.getPolicyRuleType().getPolicyRuleBasic(); - String policyId = policyRuleBasic.getPolicyRuleId(); + String policyRuleId = policyRuleBasic.getPolicyRuleId(); + + // Remove policy rule service/device + for (String policyRuleKpiId : policyRuleBasic.getPolicyRuleKPIs()) { + if (commonPolicyServiceImpl.hasActivePolicyRuleService(policyRuleKpiId)) { + commonPolicyServiceImpl.removeActivePolicyRuleService(policyRuleKpiId); + } + if (commonPolicyServiceImpl.hasActivePolicyRuleDevice(policyRuleKpiId)) { + commonPolicyServiceImpl.removeActivePolicyRuleDevice(policyRuleKpiId); + } + if (commonPolicyServiceImpl.hasActivePolicyRuleAction(policyRuleKpiId)) { + commonPolicyServiceImpl.removeActivePolicyRuleAction(policyRuleKpiId); + } + } policyRule .getPolicyRuleType() @@ -239,14 +283,11 @@ public class PolicyServiceImpl implements PolicyService { .with( tmp -> LOGGER.infof( - "DeletePolicy with id: " + VALID_MESSAGE, policyRuleBasic.getPolicyRuleId())); - - contextService.removePolicyRule(policyId).subscribe().with(x -> {}); + "Delete Policy with ID: " + VALID_MESSAGE, policyRuleBasic.getPolicyRuleId())); - // TODO: When the Map doesn't contains the policyId we should throw an exception? - if (commonPolicyServiceImpl.getSubscriptionList().contains(policyId)) - commonPolicyServiceImpl.getSubscriptionList().get(policyId).cancel(); + contextService.removePolicyRule(policyRuleId).subscribe().with(x -> {}); - return policyRuleBasic.getPolicyRuleState(); + return new PolicyRuleState( + PolicyRuleStateEnum.POLICY_REMOVED, REMOVED_POLICYRULE_STATE.getPolicyRuleStateMessage()); } } diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/kafka/AlarmListener.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/kafka/AlarmListener.java index 91813003e4d9f1aeafb936ac45b46b7d716051a8..e77397cf838d8240f0a86e82d157684a6e533c1f 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/kafka/AlarmListener.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/kafka/AlarmListener.java @@ -33,18 +33,24 @@ public class AlarmListener { @Inject public AlarmListener(CommonPolicyServiceImpl commonPolicyServiceImpl) { + logger.info("Alarm listener initialized"); this.commonPolicyServiceImpl = commonPolicyServiceImpl; } @Incoming(ALARM_TOPIC) @Blocking public void receiveAlarm(AlarmTopicDTO alarmTopicDto) { - logger.infof("Received message for analytic service backend :\n %s", alarmTopicDto.toString()); - if (alarmTopicDto.isThresholdRaise() || alarmTopicDto.isThresholdFall()) { - logger.infof("**************************Received Alarm!**************************"); - logger.infof( - "Received Alarm for analytic service backend with kpiId: %s", alarmTopicDto.getKpiId()); + logger.infof("Received message from Analytics service:\n %s", alarmTopicDto.toString()); + if (alarmTopicDto.isValid() && alarmTopicDto.isTriggered()) { + logger.info("************************** Alarm **************************"); + logger.infof("Alarm for kpiId: %s", alarmTopicDto.getKpiId()); + logger.infof("Alarm value: %.2f", alarmTopicDto.getValue()); + logger.infof("Alarm value low threshold: %s", alarmTopicDto.getValueThresholdLow()); + logger.infof("Alarm value high threshold: %s", alarmTopicDto.getValueThresholdHigh()); commonPolicyServiceImpl.applyActionServiceBasedOnKpiId(alarmTopicDto.getKpiId()); + logger.info("***********************************************************"); + } else { + logger.warnf("Invalid alarm message: %s", alarmTopicDto); } } } diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/AlarmTopicDTO.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/AlarmTopicDTO.java index 4555f50f6e5a2883bf2759dcd5fb7b4f6c97277a..94cac3c72856555bd8505cc6ecd645eb18739f6a 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/AlarmTopicDTO.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/AlarmTopicDTO.java @@ -16,23 +16,34 @@ package org.etsi.tfs.policy.policy.model; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; @Data +@JsonIgnoreProperties(ignoreUnknown = true) public class AlarmTopicDTO { - @JsonProperty("window_start") - private String windowStart; + @JsonProperty("value_threshold_low") + private Boolean valueThresholdLow; - @JsonProperty("THRESHOLD_FALL") - private boolean thresholdFall; + @JsonProperty("value_threshold_high") + private Boolean valueThresholdHigh; - @JsonProperty("THRESHOLD_RAISE") - private boolean thresholdRaise; - - private String value; + @JsonProperty("value") + private Double value; @JsonProperty("kpi_id") private String kpiId; + + public boolean isValid() { + return this.getKpiId() != null + && this.getValue() != null + && this.getValueThresholdLow() != null + && this.getValueThresholdHigh() != null; + } + + public boolean isTriggered() { + return this.getValueThresholdLow() || this.getValueThresholdHigh(); + } } diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/BooleanOperator.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/BooleanOperator.java deleted file mode 100644 index 7c62621c88985c9556901aaaeb59d214d4400dbb..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/BooleanOperator.java +++ /dev/null @@ -1,23 +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. - */ - -package org.etsi.tfs.policy.policy.model; - -public enum BooleanOperator { - POLICYRULE_CONDITION_BOOLEAN_UNDEFINED, - POLICYRULE_CONDITION_BOOLEAN_AND, - POLICYRULE_CONDITION_BOOLEAN_OR -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/NumericalOperator.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/NumericalOperator.java deleted file mode 100644 index decd5071fbd1dc3ea1be266a0d30fc12c60df740..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/NumericalOperator.java +++ /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. - */ - -package org.etsi.tfs.policy.policy.model; - -public enum NumericalOperator { - POLICY_RULE_CONDITION_NUMERICAL_UNDEFINED, - POLICY_RULE_CONDITION_NUMERICAL_EQUAL, - POLICY_RULE_CONDITION_NUMERICAL_NOT_EQUAL, - POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN, - POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL, - POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN, - POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/PolicyRule.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/PolicyRule.java index 535a1505e193dc6d97051c0a036539e138e5873d..47ade44dd64357e60b44ce3333208a1272540ebd 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/PolicyRule.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/PolicyRule.java @@ -24,13 +24,12 @@ public class PolicyRule { this.policyRuleType = policyRuleType; } - public PolicyRuleType getPolicyRuleType() { + public PolicyRuleType getPolicyRuleType() { return policyRuleType; } @Override public String toString() { - return String.format( - "%s:{configActionEnum:\"%s\", %s}", getClass().getSimpleName(), policyRuleType); + return String.format("%s:{configActionEnum: %s}", getClass().getSimpleName(), policyRuleType); } } diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/PolicyRuleActionEnum.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/PolicyRuleActionEnum.java index e2da581a222b7eae401bf1fb83a1634d35be7af1..638f915c2d381d44781e4945d8382a0f55a23963 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/PolicyRuleActionEnum.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/PolicyRuleActionEnum.java @@ -22,6 +22,5 @@ public enum PolicyRuleActionEnum { POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE, POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT, POLICY_RULE_ACTION_CALL_SERVICE_RPC, - // This is temporary POLICY_RULE_ACTION_RECALCULATE_PATH } diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/PolicyRuleBasic.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/PolicyRuleBasic.java index cfc88a08ed85a1505e80c756248e4c81ce6f0c6c..66c3ee78a06268e03b33bff570d57a286d2a3964 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/PolicyRuleBasic.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/PolicyRuleBasic.java @@ -19,47 +19,40 @@ package org.etsi.tfs.policy.policy.model; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; -import java.util.ArrayList; import java.util.List; import org.etsi.tfs.policy.common.Util; public class PolicyRuleBasic { - private String kpiId; private String policyRuleId; private PolicyRuleState policyRuleState; - private int priority; + private int policyRulePriority; private List policyRuleActions; + private List policyRuleKPIs; private Boolean isValid; private String exceptionMessage; public PolicyRuleBasic( String policyRuleId, - String kpiId, PolicyRuleState policyRuleState, - int priority, - List policyRuleActions) { - - try { - checkArgument(!policyRuleId.isBlank(), "Policy rule ID must not be empty."); - this.policyRuleId = policyRuleId; - this.policyRuleState = policyRuleState; - this.priority = priority; - checkArgument(priority >= 0, "Priority value must be greater or equal than zero."); - checkNotNull(kpiId, "Kpi ID must not be null."); - checkArgument(!kpiId.isBlank(), "Kpi ID must not be empty."); - this.kpiId = kpiId; - checkArgument(!policyRuleActions.isEmpty(), "Policy Rule actions cannot be empty."); - this.policyRuleActions = policyRuleActions; - this.isValid = true; - - } catch (Exception e) { - this.policyRuleId = ""; - this.priority = 0; - this.policyRuleActions = new ArrayList(); - this.isValid = false; - this.exceptionMessage = e.getMessage(); - } + int policyRulePriority, + List policyRuleActions, + List policyRuleKPIs) { + + checkNotNull(policyRuleId, "Policy rule ID must not be NULL."); + checkArgument(!policyRuleId.isBlank(), "Policy rule ID must not be empty."); + this.policyRuleId = policyRuleId; + this.policyRuleState = policyRuleState; + checkArgument(policyRulePriority >= 0, "Priority value must be greater than or equal to zero."); + this.policyRulePriority = policyRulePriority; + checkNotNull(policyRuleActions, "Policy rule actions cannot be NULL."); + checkArgument(!policyRuleActions.isEmpty(), "Policy rule actions cannot be empty."); + this.policyRuleActions = policyRuleActions; + checkNotNull(policyRuleKPIs, "Policy rule KPIs cannot be NULL."); + checkArgument(!policyRuleKPIs.isEmpty(), "Policy rule KPIs cannot be empty."); + this.policyRuleKPIs = policyRuleKPIs; + this.exceptionMessage = ""; + this.isValid = true; } public boolean areArgumentsValid() { @@ -70,18 +63,6 @@ public class PolicyRuleBasic { return exceptionMessage; } - public List getPolicyRuleActions() { - return policyRuleActions; - } - - public String getKpiId() { - return kpiId; - } - - public void setKpiId(String kpiId) { - this.kpiId = kpiId; - } - public String getPolicyRuleId() { return policyRuleId; } @@ -98,22 +79,31 @@ public class PolicyRuleBasic { this.policyRuleState = policyRuleState; } - public int getPriority() { - return priority; + public int getPolicyRulePriority() { + return policyRulePriority; + } + + public void setPolicyRulePriority(int policyRulePriority) { + this.policyRulePriority = policyRulePriority; + } + + public List getPolicyRuleActions() { + return policyRuleActions; } - public void setPriority(int priority) { - this.priority = priority; + public List getPolicyRuleKPIs() { + return policyRuleKPIs; } @Override public String toString() { return String.format( - "%s:{policyRuleId:\"%s\", %s, priority:%d, [%s]}", + "%s:{policyRuleId:\"%s\", %s, policyRulePriority:%d, [%s] [%s]}", getClass().getSimpleName(), policyRuleId, policyRuleState, - priority, - Util.toString(policyRuleActions)); + policyRulePriority, + Util.toString(policyRuleActions), + Util.toString(policyRuleKPIs)); } } diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/PolicyRuleCondition.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/PolicyRuleCondition.java deleted file mode 100644 index 84e9ebb60cb34d55bdd583d7b6bc32b12914b965..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/PolicyRuleCondition.java +++ /dev/null @@ -1,83 +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. - */ - -package org.etsi.tfs.policy.policy.model; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; - -import org.etsi.tfs.policy.monitoring.model.KpiValue; - -public class PolicyRuleCondition { - - private final String kpiId; - private final NumericalOperator numericalOperator; - private final KpiValue kpiValue; - - public PolicyRuleCondition( - String kpiId, NumericalOperator numericalOperator, KpiValue kpiValue) { - checkNotNull(kpiId, "Kpi ID must not be null."); - checkArgument(!kpiId.isBlank(), "Kpi ID must not be empty."); - this.kpiId = kpiId; - checkArgument( - numericalOperator != NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_UNDEFINED, - "Numerical operator cannot be undefined"); - this.numericalOperator = numericalOperator; - checkNotNull(kpiValue, "Kpi value must not be null."); - checkArgument( - isKpiValueValid(kpiValue), - "Kpi value must be: String, Float, Boolean or Integer but it was [%s].", - kpiValue.getValue().getClass().getName()); - this.kpiValue = kpiValue; - } - - public String getKpiId() { - return kpiId; - } - - public NumericalOperator getNumericalOperator() { - return numericalOperator; - } - - public KpiValue getKpiValue() { - return kpiValue; - } - - private boolean isKpiValueValid(KpiValue kpiValue) { - final var kpiValueType = kpiValue.getValue(); - - if (kpiValueType instanceof String) { - return true; - } - - if (kpiValueType instanceof Boolean) { - return true; - } - - if (kpiValueType instanceof Integer) { - return true; - } - - return kpiValueType instanceof Float; - } - - @Override - public String toString() { - return String.format( - "%s:{kpiId:\"%s\", numericalOperator:\"%s\", %s}", - getClass().getSimpleName(), kpiId, numericalOperator.toString(), kpiValue); - } -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/PolicyRuleService.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/PolicyRuleService.java index 7859b9b2550a09057f39a1c5cef5eb78aa7f3e95..45d378c375f6424f002b9b40d72ce9af76881f5e 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/PolicyRuleService.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/model/PolicyRuleService.java @@ -35,11 +35,9 @@ public class PolicyRuleService extends PolicyRuleBase { try { this.policyRuleBasic = policyRuleBasic; checkArgument( - !serviceId.getContextId().isBlank(), "Context Id of Service Id must not be empty."); - checkArgument(!serviceId.getId().isBlank(), "Service Id must not be empty."); + !serviceId.getContextId().isBlank(), "Context ID of Service ID must not be empty."); + checkArgument(!serviceId.getId().isBlank(), "Service ID must not be empty."); this.serviceId = serviceId; - // TODO If device list not empty - // checkArgument(!deviceIds.isEmpty(), "Device Ids must not be empty."); this.deviceIds = deviceIds; this.isValid = true; this.exceptionMessage = ""; diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/service/PolicyRuleConditionFieldsGetter.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/service/PolicyRuleConditionFieldsGetter.java deleted file mode 100644 index 0e955e43e21469c5a77f8aac55432fbb00e9d00a..0000000000000000000000000000000000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/service/PolicyRuleConditionFieldsGetter.java +++ /dev/null @@ -1,47 +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. - */ - -package org.etsi.tfs.policy.policy.service; - -import jakarta.inject.Singleton; -import java.util.List; -import java.util.stream.Collectors; -import org.etsi.tfs.policy.monitoring.model.KpiValue; -import org.etsi.tfs.policy.policy.model.NumericalOperator; -import org.etsi.tfs.policy.policy.model.PolicyRuleCondition; - -@Singleton -public class PolicyRuleConditionFieldsGetter { - - public List getKpiIds(List policyRuleConditions) { - return policyRuleConditions.stream() - .map(PolicyRuleCondition::getKpiId) - .collect(Collectors.toList()); - } - - public List getKpiValues(List policyRuleConditions) { - return policyRuleConditions.stream() - .map(PolicyRuleCondition::getKpiValue) - .collect(Collectors.toList()); - } - - public List getNumericalOperators( - List policyRuleConditions) { - return policyRuleConditions.stream() - .map(PolicyRuleCondition::getNumericalOperator) - .collect(Collectors.toList()); - } -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/service/PolicyRuleConditionValidator.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/service/PolicyRuleConditionValidator.java index dd7fdd92068e21c6a62b640b955df179375a8855..a603e7854fcb704cacec1dc8b2aea6040c6a6caa 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/service/PolicyRuleConditionValidator.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/service/PolicyRuleConditionValidator.java @@ -33,8 +33,6 @@ import org.jboss.logging.Logger; public class PolicyRuleConditionValidator { private static final Logger LOGGER = Logger.getLogger(PolicyRuleConditionValidator.class); - private static final String INVALID_MESSAGE = "%s is invalid."; - private static final String VALID_MESSAGE = "%s is valid."; private final ContextService contextService; diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/service/ServiceGatewayImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/service/ServiceGatewayImpl.java index 86989cc4dbd2fa7a3e879e31af0557b401bde815..b0cc7aad8fb7d3cc8fd802ff98988ea5c5b279c4 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/service/ServiceGatewayImpl.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/service/ServiceGatewayImpl.java @@ -65,8 +65,8 @@ public class ServiceGatewayImpl implements ServiceGateway { .onFailure() .invoke( x -> { - LOGGER.info("recomputeConnections failed with:"); - LOGGER.info(x); + LOGGER.error("Recompute Connections failed with:"); + LOGGER.error(x); }); } } diff --git a/src/policy/src/main/proto/policy_condition.proto b/src/policy/src/main/proto/policy_condition.proto deleted file mode 120000 index 31f7d9d10539de8c0a1bf06cf6393b86ab223c16..0000000000000000000000000000000000000000 --- a/src/policy/src/main/proto/policy_condition.proto +++ /dev/null @@ -1 +0,0 @@ -../../../../../proto/policy_condition.proto \ No newline at end of file diff --git a/src/policy/src/main/resources/application.yml b/src/policy/src/main/resources/application.yml index b6216c8afab47f2cdbd2db5c1a9daa7426b31ec8..ccfbffdf58d49e458647cd30c8fb4db295672d8b 100644 --- a/src/policy/src/main/resources/application.yml +++ b/src/policy/src/main/resources/application.yml @@ -86,7 +86,7 @@ mp: topic-alarms: failure-strategy: ignore connector: smallrye-kafka - topic: topic-alarms + topic: topic_alarms value: deserializer: org.etsi.tfs.policy.policy.kafka.TopicAlarmDeserializer kafka: diff --git a/src/policy/src/test/java/org/etsi/tfs/policy/PolicyAddDeviceTest.java b/src/policy/src/test/java/org/etsi/tfs/policy/PolicyAddDeviceTest.java index 3e08374498d13f85056de959ab14fbea84c296bf..1278c5d68d4c8ba9b2537a7ffc1cd6dc6dea60fd 100644 --- a/src/policy/src/test/java/org/etsi/tfs/policy/PolicyAddDeviceTest.java +++ b/src/policy/src/test/java/org/etsi/tfs/policy/PolicyAddDeviceTest.java @@ -32,16 +32,11 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import org.etsi.tfs.policy.context.ContextService; -import org.etsi.tfs.policy.monitoring.MonitoringService; -import org.etsi.tfs.policy.monitoring.model.IntegerKpiValue; -import org.etsi.tfs.policy.monitoring.model.KpiValue; import org.etsi.tfs.policy.policy.PolicyServiceImpl; -import org.etsi.tfs.policy.policy.model.NumericalOperator; import org.etsi.tfs.policy.policy.model.PolicyRuleAction; import org.etsi.tfs.policy.policy.model.PolicyRuleActionConfig; import org.etsi.tfs.policy.policy.model.PolicyRuleActionEnum; import org.etsi.tfs.policy.policy.model.PolicyRuleBasic; -import org.etsi.tfs.policy.policy.model.PolicyRuleCondition; import org.etsi.tfs.policy.policy.model.PolicyRuleDevice; import org.etsi.tfs.policy.policy.model.PolicyRuleState; import org.etsi.tfs.policy.policy.model.PolicyRuleStateEnum; @@ -59,7 +54,6 @@ class PolicyAddDeviceTest { @InjectMock ContextService contextService; - @InjectMock MonitoringService monitoringService; static PolicyRuleBasic policyRuleBasic; static PolicyRuleDevice policyRuleDevice; @@ -67,11 +61,6 @@ class PolicyAddDeviceTest { static void init() { String policyId = "policyRuleId"; - KpiValue kpiValue = new IntegerKpiValue(100); - - PolicyRuleCondition policyRuleCondition = - new PolicyRuleCondition( - "kpiId", NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN, kpiValue); PolicyRuleActionConfig policyRuleActionConfig = new PolicyRuleActionConfig("key", "value"); @@ -80,13 +69,16 @@ class PolicyAddDeviceTest { PolicyRuleActionEnum.POLICY_RULE_ACTION_NO_ACTION, Arrays.asList(policyRuleActionConfig)); + List policyRuleKpiIds = new ArrayList(); + policyRuleKpiIds.add("df7efb41-8e6f-4af0-a214-d9863402eca3"); + policyRuleBasic = new PolicyRuleBasic( policyId, - "kpiId", new PolicyRuleState(PolicyRuleStateEnum.POLICY_INSERTED, "Failed due to some errors"), 1, - Arrays.asList(policyRuleAction)); + Arrays.asList(policyRuleAction), + policyRuleKpiIds); List deviceIds = Arrays.asList("device1", "device2"); @@ -115,37 +107,6 @@ class PolicyAddDeviceTest { .isEqualTo(expectedResult.getPolicyRuleStateMessage().toString()); } - @Test - void isPolicyRuleBasicValid() throws ExecutionException, InterruptedException, TimeoutException { - CompletableFuture message = new CompletableFuture<>(); - - PolicyRuleBasic policyRuleBasic = - new PolicyRuleBasic( - "policyId", - "kpiId", - new PolicyRuleState(PolicyRuleStateEnum.POLICY_INSERTED, "Failed due to some errors"), - 0, - new ArrayList<>()); - - PolicyRuleDevice policyRuleDevice = - new PolicyRuleDevice(policyRuleBasic, Arrays.asList("device1", "device2")); - - PolicyRuleState expectedResult = - new PolicyRuleState( - PolicyRuleStateEnum.POLICY_FAILED, "Policy Rule actions cannot be empty."); - - policyService - .addPolicyDevice(policyRuleDevice) - .subscribe() - .with( - item -> { - message.complete(item); - }); - - assertThat(message.get(5, TimeUnit.SECONDS).getPolicyRuleStateMessage()) - .isEqualTo(expectedResult.getPolicyRuleStateMessage().toString()); - } - @Test void isPolicyRuleIdValid() throws ExecutionException, InterruptedException, TimeoutException { CompletableFuture message = new CompletableFuture<>(); @@ -203,45 +164,4 @@ class PolicyAddDeviceTest { assertThat(message.get(5, TimeUnit.SECONDS).getPolicyRuleStateMessage()) .isEqualTo(expectedResult.getPolicyRuleStateMessage().toString()); } - - // @Test - // void failurePolicyDevice() throws ExecutionException, InterruptedException, TimeoutException - // { - // CompletableFuture message = new CompletableFuture<>(); - // - // PolicyRuleDevice policyRuleDevice = - // new PolicyRuleDevice(policyRuleBasic, Arrays.asList("device1", "device2")); - // - // // String expectedResult = "Failed1 to set policy rule for testing purposes."; - // - // PolicyRuleState expectedResult = - // new PolicyRuleState( - // PolicyRuleStateEnum.POLICY_VALIDATED, - // "Failed1 to set policy rule for testing purposes."); - // - // Mockito.when(policyRuleConditionValidator.isDeviceIdValid(Mockito.anyString())) - // .thenReturn(Uni.createFrom().item(Boolean.TRUE)); - // - // Mockito.when(contextService.setPolicyRule(Mockito.any())) - // .thenReturn( - // Uni.createFrom() - // .failure( - // new ExternalServiceFailureException( - // "Failed to set policy rule for testing - // purposes."))); - // - // policyService - // .addPolicyDevice(policyRuleDevice) - // .subscribe() - // .with( - // item -> {}, - // error -> { - // - // assertThat(error.getMessage()).isEqualTo(expectedResult.getPolicyRuleStateMessage()); - // message.completeExceptionally(error); - // }); - // - // assertThat(message.get(5, TimeUnit.SECONDS).getMessage()) - // .isEqualTo(expectedResult.getPolicyRuleStateMessage().toString()); - // } } diff --git a/src/policy/src/test/java/org/etsi/tfs/policy/PolicyAddServiceTest.java b/src/policy/src/test/java/org/etsi/tfs/policy/PolicyAddServiceTest.java index f14b51735b3f90682c3e2eca6187c26b61b4013b..7ede1d42548c05d77a1257620b8a59a798a52357 100644 --- a/src/policy/src/test/java/org/etsi/tfs/policy/PolicyAddServiceTest.java +++ b/src/policy/src/test/java/org/etsi/tfs/policy/PolicyAddServiceTest.java @@ -32,20 +32,13 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import org.etsi.tfs.policy.context.ContextService; -import org.etsi.tfs.policy.context.model.Service; import org.etsi.tfs.policy.context.model.ServiceId; -import org.etsi.tfs.policy.context.model.ServiceTypeEnum; -import org.etsi.tfs.policy.monitoring.MonitoringService; -import org.etsi.tfs.policy.monitoring.model.IntegerKpiValue; -import org.etsi.tfs.policy.monitoring.model.KpiValue; import org.etsi.tfs.policy.policy.PolicyServiceImpl; -import org.etsi.tfs.policy.policy.model.NumericalOperator; import org.etsi.tfs.policy.policy.model.PolicyRule; import org.etsi.tfs.policy.policy.model.PolicyRuleAction; import org.etsi.tfs.policy.policy.model.PolicyRuleActionConfig; import org.etsi.tfs.policy.policy.model.PolicyRuleActionEnum; import org.etsi.tfs.policy.policy.model.PolicyRuleBasic; -import org.etsi.tfs.policy.policy.model.PolicyRuleCondition; import org.etsi.tfs.policy.policy.model.PolicyRuleService; import org.etsi.tfs.policy.policy.model.PolicyRuleState; import org.etsi.tfs.policy.policy.model.PolicyRuleStateEnum; @@ -63,8 +56,6 @@ public class PolicyAddServiceTest { @InjectMock ContextService contextService; - @InjectMock MonitoringService monitoringService; - static PolicyRuleBasic policyRuleBasic; static PolicyRuleService policyRuleService; @@ -72,11 +63,6 @@ public class PolicyAddServiceTest { static void init() { String policyId = "policyRuleId"; - KpiValue kpiValue = new IntegerKpiValue(100); - - PolicyRuleCondition policyRuleCondition = - new PolicyRuleCondition( - "kpiId", NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN, kpiValue); PolicyRuleActionConfig policyRuleActionConfig = new PolicyRuleActionConfig("key", "value"); @@ -85,18 +71,19 @@ public class PolicyAddServiceTest { PolicyRuleActionEnum.POLICY_RULE_ACTION_NO_ACTION, Arrays.asList(policyRuleActionConfig)); + List policyRuleKpiIds = new ArrayList(); + policyRuleKpiIds.add("df7efb41-8e6f-4af0-a214-d9863402eca3"); + policyRuleBasic = new PolicyRuleBasic( policyId, - "kpiId", new PolicyRuleState(PolicyRuleStateEnum.POLICY_INSERTED, "Failed due to some errors"), 1, - Arrays.asList(policyRuleAction)); + Arrays.asList(policyRuleAction), + policyRuleKpiIds); ServiceId serviceId = new ServiceId("contextId", "serviceId"); - Service service = new Service(serviceId, ServiceTypeEnum.UNKNOWN, null, null, null, null, 0.0); - List deviceIds = Arrays.asList("device1", "device2"); policyRuleService = new PolicyRuleService(policyRuleBasic, serviceId, deviceIds); @@ -115,7 +102,7 @@ public class PolicyAddServiceTest { PolicyRuleState expectedResult = new PolicyRuleState( - PolicyRuleStateEnum.POLICY_FAILED, "Context Id of Service Id must not be empty."); + PolicyRuleStateEnum.POLICY_FAILED, "Context ID of Service ID must not be empty."); policyService .addPolicyService(policyRuleService) @@ -140,7 +127,7 @@ public class PolicyAddServiceTest { new PolicyRuleService(policyRuleBasic, serviceId, deviceIds); PolicyRuleState expectedResult = - new PolicyRuleState(PolicyRuleStateEnum.POLICY_FAILED, "Service Id must not be empty."); + new PolicyRuleState(PolicyRuleStateEnum.POLICY_FAILED, "Service ID must not be empty."); policyService .addPolicyService(policyRuleService) @@ -151,43 +138,6 @@ public class PolicyAddServiceTest { .isEqualTo(expectedResult.getPolicyRuleStateMessage().toString()); } - @Test - void policyRuleIdMustNotBeEmpty() - throws ExecutionException, InterruptedException, TimeoutException { - CompletableFuture message = new CompletableFuture<>(); - - String policyId = ""; - - PolicyRuleBasic policyRuleBasic = - new PolicyRuleBasic( - policyId, - "kpiId", - new PolicyRuleState(PolicyRuleStateEnum.POLICY_INSERTED, "Failed due to some errors"), - 1, - new ArrayList<>()); - - ServiceId serviceId = new ServiceId("contextId", "serviceId"); - - Service service = new Service(serviceId, ServiceTypeEnum.UNKNOWN, null, null, null, null, 0.0); - - PolicyRuleService policyRuleService = - new PolicyRuleService(policyRuleBasic, serviceId, new ArrayList<>()); - - PolicyRuleState expectedResult = - new PolicyRuleState(PolicyRuleStateEnum.POLICY_FAILED, "Policy rule ID must not be empty."); - - policyService - .addPolicyService(policyRuleService) - .subscribe() - .with( - item -> { - message.complete(item); - }); - - assertThat(message.get(5, TimeUnit.SECONDS).getPolicyRuleStateMessage()) - .isEqualTo(expectedResult.getPolicyRuleStateMessage().toString()); - } - @Test void checkMessageIfServiceIsNotValid() throws ExecutionException, InterruptedException, TimeoutException { diff --git a/src/policy/src/test/java/org/etsi/tfs/policy/PolicyDeleteServiceTest.java b/src/policy/src/test/java/org/etsi/tfs/policy/PolicyDeleteServiceTest.java index 47d1c0b815ae3d20f7c43cf32d6148acfcea1854..b129239921eb6c158c92723feb5bfeee4ccea68e 100644 --- a/src/policy/src/test/java/org/etsi/tfs/policy/PolicyDeleteServiceTest.java +++ b/src/policy/src/test/java/org/etsi/tfs/policy/PolicyDeleteServiceTest.java @@ -23,6 +23,7 @@ import io.quarkus.test.junit.QuarkusTest; import io.quarkus.test.junit.mockito.InjectMock; import io.smallrye.mutiny.Uni; import jakarta.inject.Inject; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -30,20 +31,13 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import org.etsi.tfs.policy.context.ContextService; -import org.etsi.tfs.policy.context.model.Service; import org.etsi.tfs.policy.context.model.ServiceId; -import org.etsi.tfs.policy.context.model.ServiceTypeEnum; -import org.etsi.tfs.policy.monitoring.MonitoringService; -import org.etsi.tfs.policy.monitoring.model.IntegerKpiValue; -import org.etsi.tfs.policy.monitoring.model.KpiValue; import org.etsi.tfs.policy.policy.PolicyServiceImpl; -import org.etsi.tfs.policy.policy.model.NumericalOperator; import org.etsi.tfs.policy.policy.model.PolicyRule; import org.etsi.tfs.policy.policy.model.PolicyRuleAction; import org.etsi.tfs.policy.policy.model.PolicyRuleActionConfig; import org.etsi.tfs.policy.policy.model.PolicyRuleActionEnum; import org.etsi.tfs.policy.policy.model.PolicyRuleBasic; -import org.etsi.tfs.policy.policy.model.PolicyRuleCondition; import org.etsi.tfs.policy.policy.model.PolicyRuleService; import org.etsi.tfs.policy.policy.model.PolicyRuleState; import org.etsi.tfs.policy.policy.model.PolicyRuleStateEnum; @@ -59,20 +53,13 @@ class PolicyDeleteServiceTest { @Inject PolicyServiceImpl policyService; @InjectMock ContextService contextService; - @InjectMock MonitoringService monitoringService; - static PolicyRuleBasic policyRuleBasic; static PolicyRuleService policyRuleService; @BeforeAll static void init() { - String policyId = "policyRuleId"; - KpiValue kpiValue = new IntegerKpiValue(100); - - PolicyRuleCondition policyRuleCondition = - new PolicyRuleCondition( - "kpiId", NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN, kpiValue); + String policyRuleId = "policyRuleId"; PolicyRuleActionConfig policyRuleActionConfig = new PolicyRuleActionConfig("key", "value"); @@ -81,18 +68,19 @@ class PolicyDeleteServiceTest { PolicyRuleActionEnum.POLICY_RULE_ACTION_NO_ACTION, Arrays.asList(policyRuleActionConfig)); + List policyRuleKpiIds = new ArrayList(); + policyRuleKpiIds.add("df7efb41-8e6f-4af0-a214-d9863402eca3"); + policyRuleBasic = new PolicyRuleBasic( - policyId, - "kpiId", - new PolicyRuleState(PolicyRuleStateEnum.POLICY_INSERTED, "Failed due to some errors1"), + policyRuleId, + new PolicyRuleState(PolicyRuleStateEnum.POLICY_INSERTED, "Policy rule inserted"), 1, - Arrays.asList(policyRuleAction)); + Arrays.asList(policyRuleAction), + policyRuleKpiIds); ServiceId serviceId = new ServiceId("contextId", "serviceId"); - Service service = new Service(serviceId, ServiceTypeEnum.UNKNOWN, null, null, null, null, 0.0); - List deviceIds = Arrays.asList("device1", "device2"); policyRuleService = new PolicyRuleService(policyRuleBasic, serviceId, deviceIds); @@ -103,13 +91,13 @@ class PolicyDeleteServiceTest { throws ExecutionException, InterruptedException, TimeoutException { CompletableFuture message = new CompletableFuture<>(); - String policyRuleId = ""; + String policyRuleId = "policyRuleId"; PolicyRuleState expectedResult = new PolicyRuleState( PolicyRuleStateEnum.POLICY_REMOVED, REMOVED_POLICYRULE_STATE.getPolicyRuleStateMessage()); - PolicyRuleType policyRuleType = new PolicyRuleTypeService(policyRuleService); + PolicyRuleType policyRuleType = new PolicyRuleTypeService(policyRuleService); PolicyRule policyRule = new PolicyRule(policyRuleType); diff --git a/src/policy/src/test/java/org/etsi/tfs/policy/PolicyGrpcServiceTest.java b/src/policy/src/test/java/org/etsi/tfs/policy/PolicyGrpcServiceTest.java index 0848414995347d9aa5d98da992a3d5fe65dcd04e..368774e4f9d117cdbe7255051a3d5f400f39d64a 100644 --- a/src/policy/src/test/java/org/etsi/tfs/policy/PolicyGrpcServiceTest.java +++ b/src/policy/src/test/java/org/etsi/tfs/policy/PolicyGrpcServiceTest.java @@ -19,30 +19,16 @@ package org.etsi.tfs.policy; import static org.assertj.core.api.Assertions.assertThat; import context.ContextOuterClass; -import context.ContextOuterClass.Uuid; import io.quarkus.grpc.GrpcClient; import io.quarkus.test.junit.QuarkusTest; -import jakarta.inject.Inject; -import java.util.List; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import monitoring.Monitoring.KpiId; -import org.etsi.tfs.policy.monitoring.model.FloatKpiValue; -import org.etsi.tfs.policy.monitoring.model.IntegerKpiValue; -import org.etsi.tfs.policy.policy.model.PolicyRuleActionConfig; import org.jboss.logging.Logger; import org.junit.jupiter.api.Test; import policy.Policy; -import policy.Policy.PolicyRuleBasic; -import policy.Policy.PolicyRuleStateEnum; -import policy.PolicyAction; -import policy.PolicyAction.PolicyRuleActionEnum; -import policy.PolicyCondition; -import policy.PolicyCondition.NumericalOperator; -import policy.PolicyCondition.PolicyRuleCondition; import policy.PolicyService; @QuarkusTest @@ -50,259 +36,6 @@ class PolicyGrpcServiceTest { private static final Logger LOGGER = Logger.getLogger(PolicyGrpcServiceTest.class); @GrpcClient PolicyService client; - private final Serializer serializer; - - @Inject - PolicyGrpcServiceTest(Serializer serializer) { - this.serializer = serializer; - } - - private context.ContextOuterClass.ServiceId createContextServiceId() { - final var contextIdUuid = serializer.serializeUuid("571eabc1-0f59-48da-b608-c45876c3fa8a"); - - final var serviceIdUuid = serializer.serializeUuid("123456789"); - - context.ContextOuterClass.ContextId contextId = - context.ContextOuterClass.ContextId.newBuilder().setContextUuid(contextIdUuid).build(); - - return context.ContextOuterClass.ServiceId.newBuilder() - .setContextId(contextId) - .setServiceUuid(serviceIdUuid) - .build(); - } - - private PolicyRuleBasic createPolicyRuleBasic() { - final var expectedPolicyRuleIdUuid = - serializer.serializeUuid("571eabc1-0f59-48da-b608-c45876c3fa8a"); - - final var expectedPolicyRuleId = - Policy.PolicyRuleId.newBuilder().setUuid(expectedPolicyRuleIdUuid).build(); - - final var expectedPolicyRuleState = - Policy.PolicyRuleState.newBuilder() - .setPolicyRuleState(PolicyRuleStateEnum.POLICY_INSERTED) - .build(); - - final var expectedFirstKpiValue = new IntegerKpiValue(22); - final var expectedSecondKpiValue = new FloatKpiValue(69.1f); - - final var serializedExpectedFirstKpiValue = serializer.serialize(expectedFirstKpiValue); - final var serializedExpectedSecondKpiValue = serializer.serialize(expectedSecondKpiValue); - - final var firstExpectedPolicyRuleCondition = - PolicyRuleCondition.newBuilder() - .setKpiId( - KpiId.newBuilder() - .setKpiId( - Uuid.newBuilder().setUuid("79e49ba3-a7b4-4b4b-8aaa-28b05c6f888e").build())) - .setNumericalOperator(NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_EQUAL) - .setKpiValue(serializedExpectedFirstKpiValue) - .build(); - - final var secondExpectedPolicyRuleCondition = - PolicyCondition.PolicyRuleCondition.newBuilder() - .setKpiId( - KpiId.newBuilder() - .setKpiId( - Uuid.newBuilder().setUuid("eae900e5-2703-467d-82f2-97aae8b55c15").build())) - .setNumericalOperator(NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN) - .setKpiValue(serializedExpectedSecondKpiValue) - .build(); - - final var expectedPolicyRuleConditions = - List.of(firstExpectedPolicyRuleCondition, secondExpectedPolicyRuleCondition); - - PolicyRuleActionConfig policyRuleActionConfig_1 = - new PolicyRuleActionConfig("paramater1", "parameter2"); - final var serializedPolicyRuleActionConfigList_1 = - serializer.serialize(policyRuleActionConfig_1); - - PolicyRuleActionConfig policyRuleActionConfig_2 = - new PolicyRuleActionConfig("paramater3", "parameter4"); - final var serializedPolicyRuleActionConfigList_2 = - serializer.serialize(policyRuleActionConfig_2); - - final var firstExpectedPolicyRuleAction = - PolicyAction.PolicyRuleAction.newBuilder() - .setAction(PolicyAction.PolicyRuleActionEnum.POLICYRULE_ACTION_ADD_SERVICE_CONFIGRULE) - .addActionConfig(serializedPolicyRuleActionConfigList_1) - .build(); - - final var secondExpectedPolicyRuleAction = - PolicyAction.PolicyRuleAction.newBuilder() - .setAction(PolicyRuleActionEnum.POLICYRULE_ACTION_ADD_SERVICE_CONSTRAINT) - .addActionConfig(serializedPolicyRuleActionConfigList_2) - .build(); - - final var expectedPolicyRuleActions = - List.of(firstExpectedPolicyRuleAction, secondExpectedPolicyRuleAction); - - return PolicyRuleBasic.newBuilder() - .setPolicyRuleId(expectedPolicyRuleId) - .setPolicyRuleState(expectedPolicyRuleState) - .addAllActionList(expectedPolicyRuleActions) - .build(); - } - - // @Test - // void shouldAddPolicyService() throws ExecutionException, InterruptedException, TimeoutException - // { - // CompletableFuture message = new CompletableFuture<>(); - - // final var policyRuleBasic = createPolicyRuleBasic(); - - // final var expectedPolicyRuleState = policyRuleBasic.getPolicyRuleState(); - - // final var serviceId = createContextServiceId(); - - // final var expectedDeviceIdUuid1 = - // serializer.serializeUuid("20db867c-772d-4872-9179-244ecafb3257"); - - // final var expectedDeviceId1 = - // - // ContextOuterClass.DeviceId.newBuilder().setDeviceUuid(expectedDeviceIdUuid1).build(); - - // final var deviceIds = List.of(expectedDeviceId1); - // final var policyRuleService = - // Policy.PolicyRuleService.newBuilder() - // .setPolicyRuleBasic(policyRuleBasic) - // .setServiceId(serviceId) - // .addAllDeviceList(deviceIds) - // .build(); - - // client - // .policyAddService(policyRuleService) - // .subscribe() - // .with(policyRuleState -> - // message.complete(policyRuleState.getPolicyRuleState().toString())); - - // assertThat(message.get(5, TimeUnit.SECONDS)) - // .isEqualTo(expectedPolicyRuleState.getPolicyRuleState().toString()); - // } - - // @Test - // void shouldAddPolicyDevice() throws ExecutionException, InterruptedException, TimeoutException - // { - // CompletableFuture message = new CompletableFuture<>(); - - // final var expectedDeviceIdUuid1 = - // serializer.serializeUuid("20db867c-772d-4872-9179-244ecafb3257"); - // final var expectedDeviceIdUuid2 = - // serializer.serializeUuid("095974ac-d757-412d-b317-bcf355220aa9"); - - // final var expectedDeviceId1 = - // - // ContextOuterClass.DeviceId.newBuilder().setDeviceUuid(expectedDeviceIdUuid1).build(); - // final var expectedDeviceId2 = - // - // ContextOuterClass.DeviceId.newBuilder().setDeviceUuid(expectedDeviceIdUuid2).build(); - - // final var policyRuleBasic = createPolicyRuleBasic(); - // final var deviceIds = List.of(expectedDeviceId1, expectedDeviceId2); - - // final var expectedPolicyRuleState = policyRuleBasic.getPolicyRuleState(); - - // final var policyRuleDevice = - // Policy.PolicyRuleDevice.newBuilder() - // .setPolicyRuleBasic(policyRuleBasic) - // .addAllDeviceList(deviceIds) - // .build(); - - // client - // .policyAddDevice(policyRuleDevice) - // .subscribe() - // .with(policyRuleState -> - // message.complete(policyRuleState.getPolicyRuleState().toString())); - - // assertThat(message.get(5, TimeUnit.SECONDS)) - // .isEqualTo(expectedPolicyRuleState.getPolicyRuleState().toString()); - // } - - @Test - void shouldUpdatePolicyServiceReturnFailedState() - throws ExecutionException, InterruptedException, TimeoutException { - CompletableFuture message = new CompletableFuture<>(); - - final var expectedPolicyRuleState = - Policy.PolicyRuleState.newBuilder() - .setPolicyRuleState(PolicyRuleStateEnum.POLICY_FAILED) - .build(); - - final var policyRuleBasic = - PolicyRuleBasic.newBuilder().setPolicyRuleState(expectedPolicyRuleState).build(); - final var policyRuleService = - Policy.PolicyRuleService.newBuilder().setPolicyRuleBasic(policyRuleBasic).build(); - - client - .policyUpdateService(policyRuleService) - .subscribe() - .with(policyRuleState -> message.complete(policyRuleState.getPolicyRuleState().toString())); - - assertThat(message.get(5, TimeUnit.SECONDS)) - .isEqualTo(expectedPolicyRuleState.getPolicyRuleState().toString()); - } - - @Test - void shouldUpdatePolicyDeviceReturnFailedState() - throws ExecutionException, InterruptedException, TimeoutException { - CompletableFuture message = new CompletableFuture<>(); - - final var expectedDeviceIdUuid = - serializer.serializeUuid("20db867c-772d-4872-9179-244ecafb3257"); - - final var expectedDeviceId = - ContextOuterClass.DeviceId.newBuilder().setDeviceUuid(expectedDeviceIdUuid).build(); - - final var expectedPolicyRuleState = - Policy.PolicyRuleState.newBuilder() - .setPolicyRuleState(PolicyRuleStateEnum.POLICY_FAILED) - .build(); - - final var policyRuleBasic = - PolicyRuleBasic.newBuilder().setPolicyRuleState(expectedPolicyRuleState).build(); - final var deviceIds = List.of(expectedDeviceId); - final var policyRuleDevice = - Policy.PolicyRuleDevice.newBuilder() - .setPolicyRuleBasic(policyRuleBasic) - .addAllDeviceList(deviceIds) - .build(); - - client - .policyUpdateDevice(policyRuleDevice) - .subscribe() - .with(policyRuleState -> message.complete(policyRuleState.getPolicyRuleState().toString())); - - assertThat(message.get(5, TimeUnit.SECONDS)) - .isEqualTo(expectedPolicyRuleState.getPolicyRuleState().toString()); - } - - // TODO: Disable shouldDeletePolicy test until mock context service - // @Test - // void shouldDeletePolicy() throws ExecutionException, InterruptedException, TimeoutException - // { - // CompletableFuture message = new CompletableFuture<>(); - - // final var uuid = - // ContextOuterClass.Uuid.newBuilder() - // - // .setUuid(UUID.fromString("0f14d0ab-9608-7862-a9e4-5ed26688389b").toString()) - // .build(); - // final var policyRuleId = Policy.PolicyRuleId.newBuilder().setUuid(uuid).build(); - - // final var expectedPolicyRuleState = - // Policy.PolicyRuleState.newBuilder() - // .setPolicyRuleState(PolicyRuleStateEnum.POLICY_REMOVED) - // .build(); - - // client - // .policyDelete(policyRuleId) - // .subscribe() - // .with(policyRuleState -> - // message.complete(policyRuleState.getPolicyRuleState().toString())); - - // assertThat(message.get(5, TimeUnit.SECONDS)) - // .isEqualTo(expectedPolicyRuleState.getPolicyRuleState().toString()); - // } @Test void shouldGetPolicyService() throws ExecutionException, InterruptedException, TimeoutException { diff --git a/src/policy/src/test/java/org/etsi/tfs/policy/PolicyRuleBasicValidationTest.java b/src/policy/src/test/java/org/etsi/tfs/policy/PolicyRuleBasicValidationTest.java index b2bebd343ad7919ce08c353ce7d9bae2423ebc65..feaf91e39b75552c4dc36a8dc0a8651cf465414c 100644 --- a/src/policy/src/test/java/org/etsi/tfs/policy/PolicyRuleBasicValidationTest.java +++ b/src/policy/src/test/java/org/etsi/tfs/policy/PolicyRuleBasicValidationTest.java @@ -23,39 +23,26 @@ import io.quarkus.test.junit.QuarkusTest; import java.util.Collections; import java.util.List; import java.util.UUID; -import org.etsi.tfs.policy.monitoring.model.IntegerKpiValue; -import org.etsi.tfs.policy.monitoring.model.KpiValue; -import org.etsi.tfs.policy.policy.model.BooleanOperator; -import org.etsi.tfs.policy.policy.model.NumericalOperator; import org.etsi.tfs.policy.policy.model.PolicyRuleAction; import org.etsi.tfs.policy.policy.model.PolicyRuleActionConfig; import org.etsi.tfs.policy.policy.model.PolicyRuleActionEnum; import org.etsi.tfs.policy.policy.model.PolicyRuleBasic; -import org.etsi.tfs.policy.policy.model.PolicyRuleCondition; import org.etsi.tfs.policy.policy.model.PolicyRuleState; import org.etsi.tfs.policy.policy.model.PolicyRuleStateEnum; import org.junit.jupiter.api.Test; -// TODO: Revisit PolicyRuleBasicValidationTest cases after handling exceptions in PolicyRuleBasic -// constructor @QuarkusTest class PolicyRuleBasicValidationTestHelper { private PolicyRuleBasic createPolicyRuleBasic( String policyRuleId, - String kpiId, PolicyRuleState policyRuleState, - int priority, - List policyRuleActions) { + int policyRulePriority, + List policyRuleActions, + List policyRuleKpiIds) { - return new PolicyRuleBasic(policyRuleId, kpiId, policyRuleState, priority, policyRuleActions); - } - - private List createPolicyRuleConditions( - String kpiId, NumericalOperator numericalOperator, KpiValue kpiValue) { - final var policyRuleCondition = new PolicyRuleCondition(kpiId, numericalOperator, kpiValue); - - return List.of(policyRuleCondition); + return new PolicyRuleBasic( + policyRuleId, policyRuleState, policyRulePriority, policyRuleActions, policyRuleKpiIds); } private List createPolicyRuleActions( @@ -67,11 +54,6 @@ class PolicyRuleBasicValidationTestHelper { @Test void shouldThrowNullPointerExceptionGivenNullPolicyRuleId() { - final var policyRuleConditions = - createPolicyRuleConditions( - UUID.randomUUID().toString(), - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN, - new IntegerKpiValue(3)); final var policyRuleActions = createPolicyRuleActions( PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT, @@ -79,19 +61,19 @@ class PolicyRuleBasicValidationTestHelper { new PolicyRuleActionConfig( UUID.randomUUID().toString(), UUID.randomUUID().toString()))); + final var policyRuleKpiIds = List.of(UUID.randomUUID().toString()); + final var policyRuleState = new PolicyRuleState(PolicyRuleStateEnum.POLICY_EFFECTIVE, "1"); assertThatExceptionOfType(NullPointerException.class) - .isThrownBy(() -> createPolicyRuleBasic(null, "", policyRuleState, 3, policyRuleActions)); + .isThrownBy( + () -> + createPolicyRuleBasic( + null, policyRuleState, 3, policyRuleActions, policyRuleKpiIds)); } @Test void shouldThrowIllegalArgumentExceptionGivenEmptyPolicyRuleId() { - final var policyRuleConditions = - createPolicyRuleConditions( - UUID.randomUUID().toString(), - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN, - new IntegerKpiValue(3)); final var policyRuleActions = createPolicyRuleActions( PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE, @@ -99,19 +81,18 @@ class PolicyRuleBasicValidationTestHelper { new PolicyRuleActionConfig( UUID.randomUUID().toString(), UUID.randomUUID().toString()))); + final var policyRuleKpiIds = List.of(UUID.randomUUID().toString()); + final var policyRuleState = new PolicyRuleState(PolicyRuleStateEnum.POLICY_ENFORCED, "1"); assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy(() -> createPolicyRuleBasic("", "", policyRuleState, 3, policyRuleActions)); + .isThrownBy( + () -> + createPolicyRuleBasic("", policyRuleState, 3, policyRuleActions, policyRuleKpiIds)); } @Test void shouldThrowIllegalArgumentExceptionGivenWhiteSpacedPolicyRuleId() { - final var policyRuleConditions = - createPolicyRuleConditions( - UUID.randomUUID().toString(), - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_NOT_EQUAL, - new IntegerKpiValue(3)); final var policyRuleActions = createPolicyRuleActions( PolicyRuleActionEnum.POLICY_RULE_ACTION_NO_ACTION, @@ -119,19 +100,19 @@ class PolicyRuleBasicValidationTestHelper { new PolicyRuleActionConfig( UUID.randomUUID().toString(), UUID.randomUUID().toString()))); + final var policyRuleKpiIds = List.of(UUID.randomUUID().toString()); + final var policyRuleState = new PolicyRuleState(PolicyRuleStateEnum.POLICY_ENFORCED, "1"); assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy(() -> createPolicyRuleBasic(" ", "", policyRuleState, 3, policyRuleActions)); + .isThrownBy( + () -> + createPolicyRuleBasic( + " ", policyRuleState, 3, policyRuleActions, policyRuleKpiIds)); } @Test void shouldThrowIllegalArgumentExceptionGivenNegativePriority() { - final var policyRuleConditions = - createPolicyRuleConditions( - UUID.randomUUID().toString(), - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL, - new IntegerKpiValue(3)); final var policyRuleActions = createPolicyRuleActions( PolicyRuleActionEnum.POLICY_RULE_ACTION_SET_DEVICE_STATUS, @@ -143,99 +124,83 @@ class PolicyRuleBasicValidationTestHelper { final var policyRuleId = UUID.randomUUID().toString(); + final var policyRuleKpiIds = List.of(UUID.randomUUID().toString()); + assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy( - () -> createPolicyRuleBasic(policyRuleId, "", policyRuleState, 3, policyRuleActions)); + () -> + createPolicyRuleBasic( + policyRuleId, policyRuleState, -1, policyRuleActions, policyRuleKpiIds)); } @Test - void shouldThrowNullPointerExceptionGivenNullPolicyRuleConditions() { - final var policyRuleActions = - createPolicyRuleActions( - PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE, - List.of( - new PolicyRuleActionConfig( - UUID.randomUUID().toString(), UUID.randomUUID().toString()))); - - final var policyRuleState = new PolicyRuleState(PolicyRuleStateEnum.POLICY_ENFORCED, "1"); + void shouldThrowNullPointerExceptionGivenNullPolicyRuleActions() { + final var policyRuleState = new PolicyRuleState(PolicyRuleStateEnum.POLICY_PROVISIONED, "1"); final var policyRuleId = UUID.randomUUID().toString(); + final var policyRuleKpiIds = List.of(UUID.randomUUID().toString()); + assertThatExceptionOfType(NullPointerException.class) - .isThrownBy(() -> createPolicyRuleBasic(null, "", policyRuleState, 3, policyRuleActions)); + .isThrownBy( + () -> createPolicyRuleBasic(policyRuleId, policyRuleState, 3, null, policyRuleKpiIds)); } @Test - void shouldThrowIllegalArgumentExceptionGivenEmptyPolicyRuleConditions() { - final var policyRuleConditions = Collections.emptyList(); - final var policyRuleActions = - createPolicyRuleActions( - PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE, - List.of( - new PolicyRuleActionConfig( - UUID.randomUUID().toString(), UUID.randomUUID().toString()))); + void shouldThrowIllegalArgumentExceptionGivenEmptyPolicyRuleActions() { + final var policyRuleActions = Collections.emptyList(); - final var policyRuleState = new PolicyRuleState(PolicyRuleStateEnum.POLICY_REMOVED, "1"); + final var policyRuleState = new PolicyRuleState(PolicyRuleStateEnum.POLICY_FAILED, "1"); final var policyRuleId = UUID.randomUUID().toString(); + final var policyRuleKpiIds = List.of(UUID.randomUUID().toString()); + assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy(() -> createPolicyRuleBasic(null, "", policyRuleState, 3, policyRuleActions)); + .isThrownBy( + () -> + createPolicyRuleBasic( + policyRuleId, policyRuleState, 3, policyRuleActions, policyRuleKpiIds)); } @Test - void shouldThrowIllegalArgumentExceptionGivenUndefinedBooleanOperator() { - final var policyRuleConditions = - createPolicyRuleConditions( - UUID.randomUUID().toString(), - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN, - new IntegerKpiValue(3)); + void shouldThrowNullPointerExceptionGivenNullPolicyKpis() { final var policyRuleActions = createPolicyRuleActions( - PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE, + PolicyRuleActionEnum.POLICY_RULE_ACTION_SET_DEVICE_STATUS, List.of( new PolicyRuleActionConfig( UUID.randomUUID().toString(), UUID.randomUUID().toString()))); - final var policyRuleState = new PolicyRuleState(PolicyRuleStateEnum.POLICY_VALIDATED, "1"); - - final var policyRuleId = UUID.randomUUID().toString(); - - assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy(() -> createPolicyRuleBasic(null, "", policyRuleState, 3, policyRuleActions)); - } - - @Test - void shouldThrowNullPointerExceptionGivenNullPolicyRuleActions() { - final var policyRuleConditions = - createPolicyRuleConditions( - UUID.randomUUID().toString(), - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN, - new IntegerKpiValue(3)); - final var policyRuleState = new PolicyRuleState(PolicyRuleStateEnum.POLICY_PROVISIONED, "1"); final var policyRuleId = UUID.randomUUID().toString(); assertThatExceptionOfType(NullPointerException.class) - .isThrownBy(() -> createPolicyRuleBasic(null, "", policyRuleState, 3, null)); + .isThrownBy( + () -> createPolicyRuleBasic(policyRuleId, policyRuleState, 3, policyRuleActions, null)); } @Test - void shouldThrowIllegalArgumentExceptionGivenEmptyPolicyPolicyRuleActions() { - final var policyRuleConditions = - createPolicyRuleConditions( - UUID.randomUUID().toString(), - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN, - new IntegerKpiValue(3)); - final var policyRuleActions = Collections.emptyList(); + void shouldThrowIllegalArgumentExceptionGivenEmptyPolicyKpis() { + final var policyRuleActions = + createPolicyRuleActions( + PolicyRuleActionEnum.POLICY_RULE_ACTION_SET_DEVICE_STATUS, + List.of( + new PolicyRuleActionConfig( + UUID.randomUUID().toString(), UUID.randomUUID().toString()))); final var policyRuleState = new PolicyRuleState(PolicyRuleStateEnum.POLICY_FAILED, "1"); final var policyRuleId = UUID.randomUUID().toString(); + final var policyRuleKpiIds = Collections.emptyList(); + assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy(() -> createPolicyRuleBasic(null, "", policyRuleState, 3, policyRuleActions)); + .isThrownBy( + () -> + createPolicyRuleBasic( + policyRuleId, policyRuleState, 3, policyRuleActions, policyRuleKpiIds)); } @Test @@ -245,18 +210,6 @@ class PolicyRuleBasicValidationTestHelper { new PolicyRuleState(PolicyRuleStateEnum.POLICY_EFFECTIVE, "1"); final var expectedPriority = 3; - final var firstKpiValue = new IntegerKpiValue(22); - - final var firstExpectedPolicyRuleCondition = - new PolicyRuleCondition( - "firstExpectedPolicyRuleConditionVariable", - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN, - firstKpiValue); - - final var expectedPolicyRuleConditions = List.of(firstExpectedPolicyRuleCondition); - - final var expectedBooleanOperator = BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR; - final var firstExpectedPolicyRuleAction = new PolicyRuleAction( PolicyRuleActionEnum.POLICY_RULE_ACTION_SET_DEVICE_STATUS, @@ -264,19 +217,17 @@ class PolicyRuleBasicValidationTestHelper { final var expectedPolicyRuleActions = List.of(firstExpectedPolicyRuleAction); + final var firstExpectedPolicyKpi = "df7efb41-8e6f-4af0-a214-d9863402eca3"; + final var expectedPolicyKPIs = List.of(firstExpectedPolicyKpi); + final var expectedPolicyRuleBasic = new PolicyRuleBasic( expectedPolicyRuleId, - "kpiId", expectedPolicyRuleState, expectedPriority, - expectedPolicyRuleActions); + expectedPolicyRuleActions, + expectedPolicyKPIs); - final var policyRuleConditions = - createPolicyRuleConditions( - "firstExpectedPolicyRuleConditionVariable", - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN, - new IntegerKpiValue(22)); final var policyRuleActions = createPolicyRuleActions( PolicyRuleActionEnum.POLICY_RULE_ACTION_SET_DEVICE_STATUS, @@ -284,8 +235,11 @@ class PolicyRuleBasicValidationTestHelper { final var policyRuleState = new PolicyRuleState(PolicyRuleStateEnum.POLICY_EFFECTIVE, "1"); + final var policyRuleKpiIds = List.of("df7efb41-8e6f-4af0-a214-d9863402eca3"); + final var policyRuleBasic = - createPolicyRuleBasic(null, "kpiId", policyRuleState, 3, policyRuleActions); + createPolicyRuleBasic( + expectedPolicyRuleId, policyRuleState, 3, policyRuleActions, policyRuleKpiIds); assertThat(policyRuleBasic).usingRecursiveComparison().isEqualTo(expectedPolicyRuleBasic); } diff --git a/src/policy/src/test/java/org/etsi/tfs/policy/PolicyRuleConditionValidationTest.java b/src/policy/src/test/java/org/etsi/tfs/policy/PolicyRuleConditionValidationTest.java deleted file mode 100644 index 1d523c9a21962ff7ade5d728e730733742e331b9..0000000000000000000000000000000000000000 --- a/src/policy/src/test/java/org/etsi/tfs/policy/PolicyRuleConditionValidationTest.java +++ /dev/null @@ -1,139 +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. - */ - -package org.etsi.tfs.policy; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; - -import io.quarkus.test.junit.QuarkusTest; -import java.util.stream.Stream; -import org.etsi.tfs.policy.monitoring.model.BooleanKpiValue; -import org.etsi.tfs.policy.monitoring.model.FloatKpiValue; -import org.etsi.tfs.policy.monitoring.model.IntegerKpiValue; -import org.etsi.tfs.policy.monitoring.model.KpiValue; -import org.etsi.tfs.policy.monitoring.model.StringKpiValue; -import org.etsi.tfs.policy.policy.model.NumericalOperator; -import org.etsi.tfs.policy.policy.model.PolicyRuleCondition; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.Mockito; - -@QuarkusTest -class PolicyRuleConditionValidationTest { - - private PolicyRuleCondition createPolicyRuleCondition( - String kpiId, NumericalOperator numericalOperator, KpiValue kpiValue) { - - return new PolicyRuleCondition(kpiId, numericalOperator, kpiValue); - } - - private static Stream provideKpiValues() { - return Stream.of( - Arguments.of(new StringKpiValue("stringKpiValue")), - Arguments.of(new BooleanKpiValue(true)), - Arguments.of(new IntegerKpiValue(44)), - Arguments.of(new FloatKpiValue(12.3f))); - } - - @ParameterizedTest - @MethodSource("provideKpiValues") - void shouldThrowNullPointerExceptionGivenNullKpiId(KpiValue kpiValue) { - assertThatExceptionOfType(NullPointerException.class) - .isThrownBy( - () -> - createPolicyRuleCondition( - null, - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN, - kpiValue)); - } - - @ParameterizedTest - @MethodSource("provideKpiValues") - void shouldThrowIllegalArgumentExceptionGivenEmptyKpiId(KpiValue kpiValue) { - assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy( - () -> - createPolicyRuleCondition( - "", NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_NOT_EQUAL, kpiValue)); - } - - @ParameterizedTest - @MethodSource("provideKpiValues") - void shouldThrowIllegalArgumentExceptionGivenWhiteSpacedKpiId(KpiValue kpiValue) { - assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy( - () -> - createPolicyRuleCondition( - " ", NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_NOT_EQUAL, kpiValue)); - } - - @ParameterizedTest - @MethodSource("provideKpiValues") - void shouldThrowIllegalArgumentExceptionGivenUndefinedNumericalOperator(KpiValue kpiValue) { - assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy( - () -> - createPolicyRuleCondition( - "kpiId", - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_UNDEFINED, - kpiValue)); - } - - @Test - void shouldThrowNullPointerExceptionGivenNullKpiValue() { - assertThatExceptionOfType(NullPointerException.class) - .isThrownBy( - () -> - createPolicyRuleCondition( - "kpiId", NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN, null)); - } - - @Test - void shouldThrowIllegalArgumentExceptionIfIsKpiValueIsOfInvalidType() { - final var kpiValue = Mockito.mock(KpiValue.class); - Mockito.when(kpiValue.getValue()).thenReturn(1_2L); - - assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy( - () -> - createPolicyRuleCondition( - "kpiId", - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN, - kpiValue)); - } - - @ParameterizedTest - @MethodSource("provideKpiValues") - void shouldCreatePolicyRuleConditionObject(KpiValue kpiValue) { - final var expectedKpiId = "expectedKpiId"; - final var expectedNumericalOperator = - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN; - - final var expectedPolicyRuleCondition = - new PolicyRuleCondition(expectedKpiId, expectedNumericalOperator, kpiValue); - - final var policyRuleCondition = - createPolicyRuleCondition( - "expectedKpiId", NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN, kpiValue); - - assertThat(policyRuleCondition) - .usingRecursiveComparison() - .isEqualTo(expectedPolicyRuleCondition); - } -} diff --git a/src/policy/src/test/java/org/etsi/tfs/policy/PolicyRuleDeviceValidationTest.java b/src/policy/src/test/java/org/etsi/tfs/policy/PolicyRuleDeviceValidationTest.java index 1a4720e3af5a898cf38c0531092cc91a46110837..b78a605570d95da36bd5480f52534192359a6e97 100644 --- a/src/policy/src/test/java/org/etsi/tfs/policy/PolicyRuleDeviceValidationTest.java +++ b/src/policy/src/test/java/org/etsi/tfs/policy/PolicyRuleDeviceValidationTest.java @@ -21,14 +21,10 @@ import static org.assertj.core.api.Assertions.assertThat; import io.quarkus.test.junit.QuarkusTest; import java.util.List; import java.util.UUID; -import org.etsi.tfs.policy.monitoring.model.IntegerKpiValue; -import org.etsi.tfs.policy.monitoring.model.KpiValue; -import org.etsi.tfs.policy.policy.model.NumericalOperator; import org.etsi.tfs.policy.policy.model.PolicyRuleAction; import org.etsi.tfs.policy.policy.model.PolicyRuleActionConfig; import org.etsi.tfs.policy.policy.model.PolicyRuleActionEnum; import org.etsi.tfs.policy.policy.model.PolicyRuleBasic; -import org.etsi.tfs.policy.policy.model.PolicyRuleCondition; import org.etsi.tfs.policy.policy.model.PolicyRuleDevice; import org.etsi.tfs.policy.policy.model.PolicyRuleState; import org.etsi.tfs.policy.policy.model.PolicyRuleStateEnum; @@ -39,19 +35,13 @@ class PolicyRuleDeviceValidationTest { private PolicyRuleBasic createPolicyRuleBasic( String policyRuleId, - String kpiId, PolicyRuleState policyRuleState, int priority, - List policyRuleActions) { + List policyRuleActions, + List policyRuleKpiIds) { - return new PolicyRuleBasic(policyRuleId, kpiId, policyRuleState, priority, policyRuleActions); - } - - private List createPolicyRuleConditions( - String kpiId, NumericalOperator numericalOperator, KpiValue kpiValue) { - final var policyRuleCondition = new PolicyRuleCondition(kpiId, numericalOperator, kpiValue); - - return List.of(policyRuleCondition); + return new PolicyRuleBasic( + policyRuleId, policyRuleState, priority, policyRuleActions, policyRuleKpiIds); } private List createPolicyRuleActions( @@ -71,79 +61,8 @@ class PolicyRuleDeviceValidationTest { return List.of("deviceId1", "deviceId2"); } - // @Test - // void shouldThrowNullPointerExceptionGivenNullPolicyRuleBasic() { - // final var deviceIds = createDeviceIds(); - - // assertThatExceptionOfType(NullPointerException.class) - // .isThrownBy(() -> createPolicyRuleDevice(null, deviceIds)); - // } - - // @Test - // void shouldThrowNullPointerExceptionGivenNullDeviceIds() { - // final var policyRuleConditions = - // createPolicyRuleConditions( - // UUID.randomUUID().toString(), - // NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN, - // new IntegerKpiValue(3)); - // final var policyRuleActions = - // createPolicyRuleActions( - // PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT, - // List.of(UUID.randomUUID().toString(), UUID.randomUUID().toString())); - - // final var policyRuleState = new PolicyRuleState(PolicyRuleStateEnum.POLICY_EFFECTIVE, - // "1"); - - // final var policyRuleBasic = - // createPolicyRuleBasic( - // "policyRuleId", - // 3, - // policyRuleState, - // BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR, - // policyRuleConditions, - // policyRuleActions); - - // assertThatExceptionOfType(NullPointerException.class) - // .isThrownBy(() -> createPolicyRuleDevice(policyRuleBasic, null)); - // } - - // @Test - // void shouldThrowIllegalArgumentExceptionGivenEmptyDeviceIds() { - // final var policyRuleConditions = - // createPolicyRuleConditions( - // UUID.randomUUID().toString(), - // NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL, - // new IntegerKpiValue(3)); - // final var policyRuleActions = - // createPolicyRuleActions( - // PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE, - // List.of(UUID.randomUUID().toString(), UUID.randomUUID().toString())); - - // final var policyRuleState = new PolicyRuleState(PolicyRuleStateEnum.POLICY_EFFECTIVE, - // "1"); - - // final var policyRuleBasic = - // createPolicyRuleBasic( - // "policyRuleId1", - // 213, - // policyRuleState, - // BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_AND, - // policyRuleConditions, - // policyRuleActions); - - // final var deviceIds = Collections.emptyList(); - - // assertThatExceptionOfType(IllegalArgumentException.class) - // .isThrownBy(() -> createPolicyRuleDevice(policyRuleBasic, deviceIds)); - // } - @Test void shouldCreatePolicyRuleDeviceObject() { - final var policyRuleConditions = - createPolicyRuleConditions( - UUID.randomUUID().toString(), - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_NOT_EQUAL, - new IntegerKpiValue(3)); final var policyRuleActions = createPolicyRuleActions( PolicyRuleActionEnum.POLICY_RULE_ACTION_SET_DEVICE_STATUS, @@ -153,8 +72,11 @@ class PolicyRuleDeviceValidationTest { final var policyRuleState = new PolicyRuleState(PolicyRuleStateEnum.POLICY_EFFECTIVE, "1"); + final var policyRuleKpiIds = List.of("df7efb41-8e6f-4af0-a214-d9863402eca3"); + final var policyRuleBasic = - createPolicyRuleBasic("policyRuleId", "", policyRuleState, 3, policyRuleActions); + createPolicyRuleBasic( + "policyRuleId", policyRuleState, 3, policyRuleActions, policyRuleKpiIds); final var deviceIds = createDeviceIds(); diff --git a/src/policy/src/test/java/org/etsi/tfs/policy/PolicyRuleServiceValidationTest.java b/src/policy/src/test/java/org/etsi/tfs/policy/PolicyRuleServiceValidationTest.java index 05bd3e847fdbca52914aa4aa65b3a4434c68202d..912a51cb6b5fbc01d6265236ed5c060cfe63aea7 100644 --- a/src/policy/src/test/java/org/etsi/tfs/policy/PolicyRuleServiceValidationTest.java +++ b/src/policy/src/test/java/org/etsi/tfs/policy/PolicyRuleServiceValidationTest.java @@ -42,14 +42,10 @@ import org.etsi.tfs.policy.context.model.LocationTypeRegion; import org.etsi.tfs.policy.context.model.ServiceId; import org.etsi.tfs.policy.context.model.TopologyId; import org.etsi.tfs.policy.kpi_sample_types.model.KpiSampleType; -import org.etsi.tfs.policy.monitoring.model.IntegerKpiValue; -import org.etsi.tfs.policy.monitoring.model.KpiValue; -import org.etsi.tfs.policy.policy.model.NumericalOperator; import org.etsi.tfs.policy.policy.model.PolicyRuleAction; import org.etsi.tfs.policy.policy.model.PolicyRuleActionConfig; import org.etsi.tfs.policy.policy.model.PolicyRuleActionEnum; import org.etsi.tfs.policy.policy.model.PolicyRuleBasic; -import org.etsi.tfs.policy.policy.model.PolicyRuleCondition; import org.etsi.tfs.policy.policy.model.PolicyRuleService; import org.etsi.tfs.policy.policy.model.PolicyRuleState; import org.etsi.tfs.policy.policy.model.PolicyRuleStateEnum; @@ -128,13 +124,6 @@ class PolicyRuleServiceValidationTest { endPoints); } - private List createPolicyRuleConditions( - String kpiId, NumericalOperator numericalOperator, KpiValue kpiValue) { - final var policyRuleCondition = new PolicyRuleCondition(kpiId, numericalOperator, kpiValue); - - return List.of(policyRuleCondition); - } - private List createPolicyRuleActions( PolicyRuleActionEnum policyRuleActionEnum, List parameters) { final var policyRuleAction = new PolicyRuleAction(policyRuleActionEnum, parameters); @@ -144,107 +133,30 @@ class PolicyRuleServiceValidationTest { private PolicyRuleBasic createPolicyRuleBasic( String policyRuleId, - String kpiId, PolicyRuleState policyRuleState, int priority, - List policyRuleActions) { + List policyRuleActions, + List policyRuleKpiIds) { - return new PolicyRuleBasic(policyRuleId, kpiId, policyRuleState, priority, policyRuleActions); + return new PolicyRuleBasic( + policyRuleId, policyRuleState, priority, policyRuleActions, policyRuleKpiIds); } private ServiceId createServiceId(String contextId, String id) { return new ServiceId(contextId, id); } - private List createDeviceIds() { - return List.of("deviceIdA", "deviceIdB"); - } - private PolicyRuleService createPolicyRuleService( PolicyRuleBasic policyRuleBasic, ServiceId serviceId, List deviceIds) { return new PolicyRuleService(policyRuleBasic, serviceId, deviceIds); } - // @Test - // void shouldThrowNullPointerExceptionGivenNullPolicyRuleBasic() { - // final var serviceId = createServiceId("CONTEXT_ID", "id"); - // final var deviceIds = createDeviceIds(); - - // assertThatExceptionOfType(NullPointerException.class) - // .isThrownBy(() -> createPolicyRuleService(null, serviceId, deviceIds)); - // } - - // @Test - // void shouldThrowNullPointerExceptionGivenNullServiceId() { - // final var policyRuleConditions = - // createPolicyRuleConditions( - // UUID.randomUUID().toString(), - // NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL, - // new IntegerKpiValue(3)); - // final var policyRuleActions = - // createPolicyRuleActions( - // PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT, - // List.of(UUID.randomUUID().toString(), UUID.randomUUID().toString())); - - // final var policyRuleState = new PolicyRuleState(PolicyRuleStateEnum.POLICY_EFFECTIVE, - // "1"); - - // final var deviceIds = createDeviceIds(); - - // final var policyRuleBasic = - // createPolicyRuleBasic( - // "policyRuleId1", - // 3, - // policyRuleState, - // BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR, - // policyRuleConditions, - // policyRuleActions); - - // assertThatExceptionOfType(NullPointerException.class) - // .isThrownBy(() -> createPolicyRuleService(policyRuleBasic, null, deviceIds)); - // } - - // @Test - // void shouldThrowNullPointerExceptionGivenNullDeviceIds() { - // final var serviceId = createServiceId("contextId", "ID"); - - // final var policyRuleConditions = - // createPolicyRuleConditions( - // UUID.randomUUID().toString(), - // NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN, - // new IntegerKpiValue(3)); - // final var policyRuleActions = - // createPolicyRuleActions( - // PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE, - // List.of(UUID.randomUUID().toString(), UUID.randomUUID().toString())); - - // final var policyRuleState = new PolicyRuleState(PolicyRuleStateEnum.POLICY_EFFECTIVE, - // "1"); - - // final var policyRuleBasic = - // createPolicyRuleBasic( - // "policyRuleId2", - // 2, - // policyRuleState, - // BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_AND, - // policyRuleConditions, - // policyRuleActions); - - // assertThatExceptionOfType(NullPointerException.class) - // .isThrownBy(() -> createPolicyRuleService(policyRuleBasic, serviceId, null)); - // } - @Test void shouldCreatePolicyRuleServiceObjectGivenEmptyDeviceIds() { final var serviceId = createServiceId("contextId", "id"); final var deviceIds = Collections.emptyList(); - final var policyRuleConditions = - createPolicyRuleConditions( - UUID.randomUUID().toString(), - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN, - new IntegerKpiValue(3)); final var policyRuleActions = createPolicyRuleActions( PolicyRuleActionEnum.POLICY_RULE_ACTION_SET_DEVICE_STATUS, @@ -254,8 +166,11 @@ class PolicyRuleServiceValidationTest { final var policyRuleState = new PolicyRuleState(PolicyRuleStateEnum.POLICY_EFFECTIVE, "1"); + final var policyRuleKpiIds = List.of("df7efb41-8e6f-4af0-a214-d9863402eca3"); + final var policyRuleBasic = - createPolicyRuleBasic("policyRuleId", "kpiId", policyRuleState, 0, policyRuleActions); + createPolicyRuleBasic( + "policyRuleId", policyRuleState, 0, policyRuleActions, policyRuleKpiIds); final var expectedPolicyRuleService = new PolicyRuleService(policyRuleBasic, serviceId, deviceIds); @@ -270,11 +185,6 @@ class PolicyRuleServiceValidationTest { final var serviceId = createServiceId("contextId", "id"); final var deviceIds = List.of("deviceIdA", "deviceIdB"); - final var policyRuleConditions = - createPolicyRuleConditions( - UUID.randomUUID().toString(), - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN, - new IntegerKpiValue(3)); final var policyRuleActions = createPolicyRuleActions( PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT, @@ -284,8 +194,11 @@ class PolicyRuleServiceValidationTest { final var policyRuleState = new PolicyRuleState(PolicyRuleStateEnum.POLICY_EFFECTIVE, "1"); + final var policyRuleKpiIds = List.of("df7efb41-8e6f-4af0-a214-d9863402eca3"); + final var policyRuleBasic = - createPolicyRuleBasic("policyRuleId", "kpiId", policyRuleState, 0, policyRuleActions); + createPolicyRuleBasic( + "policyRuleId", policyRuleState, 0, policyRuleActions, policyRuleKpiIds); final var expectedPolicyRuleService = new PolicyRuleService(policyRuleBasic, serviceId, deviceIds); diff --git a/src/policy/src/test/java/org/etsi/tfs/policy/PolicyUpdateDeviceTest.java b/src/policy/src/test/java/org/etsi/tfs/policy/PolicyUpdateDeviceTest.java index ddc8c7b053323530933447918dc2ef74afbc73e6..f4f2944cd1c73bb32c07c227d622734f02b6a855 100644 --- a/src/policy/src/test/java/org/etsi/tfs/policy/PolicyUpdateDeviceTest.java +++ b/src/policy/src/test/java/org/etsi/tfs/policy/PolicyUpdateDeviceTest.java @@ -31,16 +31,11 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import org.etsi.tfs.policy.monitoring.MonitoringService; -import org.etsi.tfs.policy.monitoring.model.IntegerKpiValue; -import org.etsi.tfs.policy.monitoring.model.KpiValue; import org.etsi.tfs.policy.policy.PolicyServiceImpl; -import org.etsi.tfs.policy.policy.model.NumericalOperator; import org.etsi.tfs.policy.policy.model.PolicyRuleAction; import org.etsi.tfs.policy.policy.model.PolicyRuleActionConfig; import org.etsi.tfs.policy.policy.model.PolicyRuleActionEnum; import org.etsi.tfs.policy.policy.model.PolicyRuleBasic; -import org.etsi.tfs.policy.policy.model.PolicyRuleCondition; import org.etsi.tfs.policy.policy.model.PolicyRuleDevice; import org.etsi.tfs.policy.policy.model.PolicyRuleState; import org.etsi.tfs.policy.policy.model.PolicyRuleStateEnum; @@ -56,8 +51,6 @@ class PolicyUpdateDeviceTest { @InjectMock PolicyRuleConditionValidator policyRuleConditionValidator; - @InjectMock MonitoringService monitoringService; - static PolicyRuleBasic policyRuleBasic; static PolicyRuleDevice policyRuleDevice; @@ -65,11 +58,6 @@ class PolicyUpdateDeviceTest { static void init() { String policyId = "policyRuleId"; - KpiValue kpiValue = new IntegerKpiValue(100); - - PolicyRuleCondition policyRuleCondition = - new PolicyRuleCondition( - "kpiId", NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN, kpiValue); PolicyRuleActionConfig policyRuleActionConfig = new PolicyRuleActionConfig("key", "value"); @@ -78,13 +66,15 @@ class PolicyUpdateDeviceTest { PolicyRuleActionEnum.POLICY_RULE_ACTION_NO_ACTION, Arrays.asList(policyRuleActionConfig)); + final var policyRuleKpiIds = List.of("df7efb41-8e6f-4af0-a214-d9863402eca3"); + policyRuleBasic = new PolicyRuleBasic( policyId, - "kpiId", new PolicyRuleState(PolicyRuleStateEnum.POLICY_INSERTED, "Failed due to some errors"), 1, - Arrays.asList(policyRuleAction)); + Arrays.asList(policyRuleAction), + policyRuleKpiIds); List deviceIds = Arrays.asList("device1", "device2"); @@ -117,20 +107,28 @@ class PolicyUpdateDeviceTest { void isPolicyRuleBasicValid() throws ExecutionException, InterruptedException, TimeoutException { CompletableFuture message = new CompletableFuture<>(); + PolicyRuleActionConfig policyRuleActionConfig = new PolicyRuleActionConfig("key", "value"); + + PolicyRuleAction policyRuleAction = + new PolicyRuleAction( + PolicyRuleActionEnum.POLICY_RULE_ACTION_NO_ACTION, + Arrays.asList(policyRuleActionConfig)); + + final var policyRuleKpiIds = List.of("df7efb41-8e6f-4af0-a214-d9863402eca3"); + PolicyRuleBasic policyRuleBasic = new PolicyRuleBasic( "policyId", - "kpiId", new PolicyRuleState(PolicyRuleStateEnum.POLICY_INSERTED, "Failed due to some errors"), 0, - new ArrayList<>()); + Arrays.asList(policyRuleAction), + policyRuleKpiIds); PolicyRuleDevice policyRuleDevice = new PolicyRuleDevice(policyRuleBasic, Arrays.asList("device1", "device2")); PolicyRuleState expectedResult = - new PolicyRuleState( - PolicyRuleStateEnum.POLICY_FAILED, "Policy Rule actions cannot be empty."); + new PolicyRuleState(PolicyRuleStateEnum.POLICY_FAILED, "policyId is invalid."); policyService .updatePolicyDevice(policyRuleDevice) diff --git a/src/policy/src/test/java/org/etsi/tfs/policy/PolicyUpdateServiceTest.java b/src/policy/src/test/java/org/etsi/tfs/policy/PolicyUpdateServiceTest.java index 8c8bcf47e3a4ce155aa4d909155387bab4b22ab8..278fc82e0ab89336a5cce2970e7d47a567166865 100644 --- a/src/policy/src/test/java/org/etsi/tfs/policy/PolicyUpdateServiceTest.java +++ b/src/policy/src/test/java/org/etsi/tfs/policy/PolicyUpdateServiceTest.java @@ -32,19 +32,12 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import org.etsi.tfs.policy.context.ContextService; -import org.etsi.tfs.policy.context.model.Service; import org.etsi.tfs.policy.context.model.ServiceId; -import org.etsi.tfs.policy.context.model.ServiceTypeEnum; -import org.etsi.tfs.policy.monitoring.MonitoringService; -import org.etsi.tfs.policy.monitoring.model.IntegerKpiValue; -import org.etsi.tfs.policy.monitoring.model.KpiValue; import org.etsi.tfs.policy.policy.PolicyServiceImpl; -import org.etsi.tfs.policy.policy.model.NumericalOperator; import org.etsi.tfs.policy.policy.model.PolicyRuleAction; import org.etsi.tfs.policy.policy.model.PolicyRuleActionConfig; import org.etsi.tfs.policy.policy.model.PolicyRuleActionEnum; import org.etsi.tfs.policy.policy.model.PolicyRuleBasic; -import org.etsi.tfs.policy.policy.model.PolicyRuleCondition; import org.etsi.tfs.policy.policy.model.PolicyRuleService; import org.etsi.tfs.policy.policy.model.PolicyRuleState; import org.etsi.tfs.policy.policy.model.PolicyRuleStateEnum; @@ -62,8 +55,6 @@ class PolicyUpdateServiceTest { @InjectMock ContextService contextService; - @InjectMock MonitoringService monitoringService; - static PolicyRuleBasic policyRuleBasic; static PolicyRuleService policyRuleService; @@ -71,11 +62,6 @@ class PolicyUpdateServiceTest { static void init() { String policyId = "policyRuleId"; - KpiValue kpiValue = new IntegerKpiValue(100); - - PolicyRuleCondition policyRuleCondition = - new PolicyRuleCondition( - "kpiId", NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN, kpiValue); PolicyRuleActionConfig policyRuleActionConfig = new PolicyRuleActionConfig("key", "value"); @@ -84,18 +70,18 @@ class PolicyUpdateServiceTest { PolicyRuleActionEnum.POLICY_RULE_ACTION_NO_ACTION, Arrays.asList(policyRuleActionConfig)); + final var policyRuleKpiIds = List.of("df7efb41-8e6f-4af0-a214-d9863402eca3"); + policyRuleBasic = new PolicyRuleBasic( policyId, - "kpiId", new PolicyRuleState(PolicyRuleStateEnum.POLICY_INSERTED, "Failed due to some errors"), 1, - Arrays.asList(policyRuleAction)); + Arrays.asList(policyRuleAction), + policyRuleKpiIds); ServiceId serviceId = new ServiceId("contextId", "serviceId"); - Service service = new Service(serviceId, ServiceTypeEnum.UNKNOWN, null, null, null, null, 0.0); - List deviceIds = Arrays.asList("device1", "device2"); policyRuleService = new PolicyRuleService(policyRuleBasic, serviceId, deviceIds); @@ -114,7 +100,7 @@ class PolicyUpdateServiceTest { PolicyRuleState expectedResult = new PolicyRuleState( - PolicyRuleStateEnum.POLICY_FAILED, "Context Id of Service Id must not be empty."); + PolicyRuleStateEnum.POLICY_FAILED, "Context ID of Service ID must not be empty."); policyService .updatePolicyService(policyRuleService) @@ -139,7 +125,7 @@ class PolicyUpdateServiceTest { new PolicyRuleService(policyRuleBasic, serviceId, deviceIds); PolicyRuleState expectedResult = - new PolicyRuleState(PolicyRuleStateEnum.POLICY_FAILED, "Service Id must not be empty."); + new PolicyRuleState(PolicyRuleStateEnum.POLICY_FAILED, "Service ID must not be empty."); policyService .updatePolicyService(policyRuleService) diff --git a/src/policy/src/test/java/org/etsi/tfs/policy/SerializerTest.java b/src/policy/src/test/java/org/etsi/tfs/policy/SerializerTest.java index 19a7179a702050d65cce7d8cfb9ce82f222bbdb1..168f73cb7696ac4e8e49fa265d4e54d066bcdad1 100644 --- a/src/policy/src/test/java/org/etsi/tfs/policy/SerializerTest.java +++ b/src/policy/src/test/java/org/etsi/tfs/policy/SerializerTest.java @@ -30,10 +30,6 @@ import jakarta.inject.Inject; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; -import kpi_sample_types.KpiSampleTypes; -import monitoring.Monitoring; -import monitoring.Monitoring.AlarmID; -import monitoring.Monitoring.KpiId; import org.etsi.tfs.policy.acl.AclAction; import org.etsi.tfs.policy.acl.AclEntry; import org.etsi.tfs.policy.acl.AclForwardActionEnum; @@ -82,27 +78,12 @@ import org.etsi.tfs.policy.context.model.ServiceId; import org.etsi.tfs.policy.context.model.ServiceStatus; import org.etsi.tfs.policy.context.model.ServiceStatusEnum; import org.etsi.tfs.policy.context.model.ServiceTypeEnum; -import org.etsi.tfs.policy.context.model.SliceId; import org.etsi.tfs.policy.context.model.TopologyId; import org.etsi.tfs.policy.kpi_sample_types.model.KpiSampleType; -import org.etsi.tfs.policy.monitoring.model.AlarmDescriptor; -import org.etsi.tfs.policy.monitoring.model.AlarmResponse; -import org.etsi.tfs.policy.monitoring.model.BooleanKpiValue; -import org.etsi.tfs.policy.monitoring.model.FloatKpiValue; -import org.etsi.tfs.policy.monitoring.model.IntegerKpiValue; -import org.etsi.tfs.policy.monitoring.model.Kpi; -import org.etsi.tfs.policy.monitoring.model.KpiDescriptor; -import org.etsi.tfs.policy.monitoring.model.KpiValue; -import org.etsi.tfs.policy.monitoring.model.KpiValueRange; -import org.etsi.tfs.policy.monitoring.model.StringKpiValue; -import org.etsi.tfs.policy.monitoring.model.SubsDescriptor; -import org.etsi.tfs.policy.policy.model.BooleanOperator; -import org.etsi.tfs.policy.policy.model.NumericalOperator; import org.etsi.tfs.policy.policy.model.PolicyRuleAction; import org.etsi.tfs.policy.policy.model.PolicyRuleActionConfig; import org.etsi.tfs.policy.policy.model.PolicyRuleActionEnum; import org.etsi.tfs.policy.policy.model.PolicyRuleBasic; -import org.etsi.tfs.policy.policy.model.PolicyRuleCondition; import org.etsi.tfs.policy.policy.model.PolicyRuleDevice; import org.etsi.tfs.policy.policy.model.PolicyRuleService; import org.etsi.tfs.policy.policy.model.PolicyRuleState; @@ -114,7 +95,6 @@ import org.junit.jupiter.params.provider.MethodSource; import policy.Policy; import policy.Policy.PolicyRuleId; import policy.PolicyAction; -import policy.PolicyCondition; @QuarkusTest class SerializerTest { @@ -151,20 +131,6 @@ class SerializerTest { new PolicyRuleState(PolicyRuleStateEnum.POLICY_EFFECTIVE, "Policy was effective"); final var expectedPriority = 3; - final var firstKpiValue = new IntegerKpiValue(22); - final var secondKpiValue = new FloatKpiValue(69.1f); - - final var firstExpectedPolicyRuleCondition = - new PolicyRuleCondition( - "firstExpectedPolicyRuleConditionVariable", - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN, - firstKpiValue); - final var secondExpectedPolicyRuleCondition = - new PolicyRuleCondition( - "secondExpectedPolicyRuleConditionVariable", - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_EQUAL, - secondKpiValue); - final var firstExpectedPolicyRuleAction = new PolicyRuleAction( PolicyRuleActionEnum.POLICY_RULE_ACTION_SET_DEVICE_STATUS, @@ -178,12 +144,14 @@ class SerializerTest { final var expectedPolicyRuleActions = List.of(firstExpectedPolicyRuleAction, secondExpectedPolicyRuleAction); + final var expectedPolicyRuleKPIs = List.of("df7efb41-8e6f-4af0-a214-d9863402eca3"); + return new PolicyRuleBasic( expectedPolicyRuleId, - "kpiId", expectedPolicyRuleState, expectedPriority, - expectedPolicyRuleActions); + expectedPolicyRuleActions, + expectedPolicyRuleKPIs); } private ConfigRule createConfigRule() { @@ -1758,14 +1726,6 @@ class SerializerTest { assertThat(constraint).usingRecursiveComparison().isEqualTo(expectedConstraint); } - @Test - void shouldThrowIllegalStateExceptionDuringDeserializationOfNonSpecifiedConstraint() { - final var serializedKpiValue = ContextOuterClass.Constraint.newBuilder().build(); - - assertThatExceptionOfType(IllegalStateException.class) - .isThrownBy(() -> serializer.deserialize(serializedKpiValue)); - } - @Test void shouldSerializeEndPointId() { final var expectedTopologyId = new TopologyId("contextId", "id"); @@ -2198,47 +2158,6 @@ class SerializerTest { assertThat(service).usingRecursiveComparison().isEqualTo(expectedService); } - private static Stream provideKpiSampleType() { - return Stream.of( - Arguments.of( - KpiSampleType.PACKETS_TRANSMITTED, - KpiSampleTypes.KpiSampleType.KPISAMPLETYPE_PACKETS_TRANSMITTED), - Arguments.of( - KpiSampleType.PACKETS_RECEIVED, - KpiSampleTypes.KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED), - Arguments.of( - KpiSampleType.BYTES_TRANSMITTED, - KpiSampleTypes.KpiSampleType.KPISAMPLETYPE_BYTES_TRANSMITTED), - Arguments.of( - KpiSampleType.BYTES_RECEIVED, - KpiSampleTypes.KpiSampleType.KPISAMPLETYPE_BYTES_RECEIVED), - Arguments.of( - KpiSampleType.LINK_TOTAL_CAPACITY_GBPS, - KpiSampleTypes.KpiSampleType.KPISAMPLETYPE_LINK_TOTAL_CAPACITY_GBPS), - Arguments.of( - KpiSampleType.LINK_USED_CAPACITY_GBPS, - KpiSampleTypes.KpiSampleType.KPISAMPLETYPE_LINK_USED_CAPACITY_GBPS), - Arguments.of(KpiSampleType.UNKNOWN, KpiSampleTypes.KpiSampleType.KPISAMPLETYPE_UNKNOWN)); - } - - @ParameterizedTest - @MethodSource("provideKpiSampleType") - void shouldSerializeKpiSampleType( - KpiSampleType kpiSampleType, KpiSampleTypes.KpiSampleType expectedSerializedType) { - final var serializedKpiSampleType = serializer.serialize(kpiSampleType); - - assertThat(serializedKpiSampleType.getNumber()).isEqualTo(expectedSerializedType.getNumber()); - } - - @ParameterizedTest - @MethodSource("provideKpiSampleType") - void shouldDeserializeKpiSampleType( - KpiSampleType expectedKpiSampleType, KpiSampleTypes.KpiSampleType serializedKpiSampleType) { - final var kpiSampleType = serializer.deserialize(serializedKpiSampleType); - - assertThat(kpiSampleType).isEqualTo(expectedKpiSampleType); - } - private static Stream provideRuleState() { return Stream.of( Arguments.of( @@ -2309,666 +2228,6 @@ class SerializerTest { assertThat(policyRuleState).usingRecursiveComparison().isEqualTo(expectedPolicyRuleState); } - private static Stream provideNumericalOperator() { - return Stream.of( - Arguments.of( - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_EQUAL, - PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_EQUAL), - Arguments.of( - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_NOT_EQUAL, - PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_NOT_EQUAL), - Arguments.of( - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN, - PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_LESS_THAN), - Arguments.of( - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL, - PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL), - Arguments.of( - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN, - PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN), - Arguments.of( - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL, - PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL), - Arguments.of( - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_UNDEFINED, - PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_UNDEFINED)); - } - - @ParameterizedTest - @MethodSource("provideNumericalOperator") - void shouldSerializeNumericalOperator( - NumericalOperator numericalOperator, - PolicyCondition.NumericalOperator expectedNumericalOperator) { - final var serializedNumericalOperator = serializer.serialize(numericalOperator); - - assertThat(serializedNumericalOperator).isEqualTo(expectedNumericalOperator); - } - - @ParameterizedTest - @MethodSource("provideNumericalOperator") - void shouldDeserializeNumericalOperator( - NumericalOperator expectedNumericalOperator, - PolicyCondition.NumericalOperator serializedNumericalOperator) { - final var numericalOperator = serializer.deserialize(serializedNumericalOperator); - - assertThat(numericalOperator).isEqualTo(expectedNumericalOperator); - } - - @Test - void shouldSerializeSubscriptionId() { - final var subscriptionId = "subscriptionId"; - - final var subscriptionIdUuid = serializer.serializeUuid(subscriptionId); - - final var expectedSubscriptionId = - Monitoring.SubscriptionID.newBuilder().setSubsId(subscriptionIdUuid).build(); - - final var serializedSubscriptionId = serializer.serializeSubscriptionIdId(subscriptionId); - - assertThat(serializedSubscriptionId) - .usingRecursiveComparison() - .isEqualTo(expectedSubscriptionId); - } - - @Test - void shouldDeserializeSubscriptionId() { - final var expectedSubscriptionId = "expectedSubscriptionId"; - - final var serializedSubscriptionIdUuid = serializer.serializeUuid(expectedSubscriptionId); - final var serializedSubscriptionId = - Monitoring.SubscriptionID.newBuilder().setSubsId(serializedSubscriptionIdUuid).build(); - - final var subscriptionId = serializer.deserialize(serializedSubscriptionId); - - assertThat(subscriptionId).isEqualTo(expectedSubscriptionId); - } - - private static Stream provideNumericalOperators() { - return Stream.of( - Arguments.of( - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_EQUAL, - PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_EQUAL), - Arguments.of( - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_NOT_EQUAL, - PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_NOT_EQUAL), - Arguments.of( - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN, - PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_LESS_THAN), - Arguments.of( - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL, - PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL), - Arguments.of( - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN, - PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN), - Arguments.of( - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL, - PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL)); - } - - @ParameterizedTest - @MethodSource("provideNumericalOperators") - void shouldSerializePolicyRuleConditionGivenMultipleNumericalOperators( - NumericalOperator expectedNumericalOperator) { - final var expectedPolicyRuleConditionKpiId = "expectedPolicyRuleConditionKpiId"; - final var expectedPolicyRuleConditionKpiValue = new IntegerKpiValue(34); - - final var policyRuleCondition = - new PolicyRuleCondition( - expectedPolicyRuleConditionKpiId, - expectedNumericalOperator, - expectedPolicyRuleConditionKpiValue); - - final var serializedPolicyRuleConditionKpiIdUuid = - serializer.serializeUuid(expectedPolicyRuleConditionKpiId); - final var serializedPolicyRuleConditionKpiId = - KpiId.newBuilder().setKpiId(serializedPolicyRuleConditionKpiIdUuid).build(); - final var serializedNumericalOperator = serializer.serialize(expectedNumericalOperator); - final var serializedPolicyRuleConditionKpiValue = - serializer.serializeIntegerKpiValue(expectedPolicyRuleConditionKpiValue); - - final var expectedPolicyRuleCondition = - PolicyCondition.PolicyRuleCondition.newBuilder() - .setKpiId(serializedPolicyRuleConditionKpiId) - .setNumericalOperator(serializedNumericalOperator) - .setKpiValue(serializedPolicyRuleConditionKpiValue) - .build(); - - final var serializedPolicyRuleCondition = serializer.serialize(policyRuleCondition); - - assertThat(serializedPolicyRuleCondition) - .usingRecursiveComparison() - .isEqualTo(expectedPolicyRuleCondition); - } - - private static Stream provideKpiValues() { - return Stream.of( - Arguments.of( - new StringKpiValue("stringKpiValue"), - Monitoring.KpiValue.newBuilder().setStringVal("stringKpiValue").build()), - Arguments.of( - new BooleanKpiValue(true), Monitoring.KpiValue.newBuilder().setBoolVal(true).build()), - Arguments.of( - new IntegerKpiValue(44), Monitoring.KpiValue.newBuilder().setInt32Val(44).build()), - Arguments.of( - new FloatKpiValue(12.3f), Monitoring.KpiValue.newBuilder().setFloatVal(12.3f).build())); - } - - @ParameterizedTest - @MethodSource("provideKpiValues") - void shouldSerializeKpiValues(KpiValue kpiValue, Monitoring.KpiValue expectedKpiValue) { - final var serializedKpiValue = serializer.serialize(kpiValue); - - assertThat(serializedKpiValue).isEqualTo(expectedKpiValue); - } - - @ParameterizedTest - @MethodSource("provideKpiValues") - void shouldDeserializeKpiValues( - KpiValue expectedKpiValue, Monitoring.KpiValue serializedKpiValue) { - final var kpiValue = serializer.deserialize(serializedKpiValue); - - assertThat(kpiValue).usingRecursiveComparison().isEqualTo(expectedKpiValue); - } - - @Test - void shouldThrowIllegalStateExceptionDuringDeserializationOfNonSpecifiedKpiValue() { - final var serializedKpiValue = Monitoring.KpiValue.newBuilder().build(); - - assertThatExceptionOfType(IllegalStateException.class) - .isThrownBy(() -> serializer.deserialize(serializedKpiValue)); - } - - @Test - void shouldDeserializeIntegerKpiValue() { - final var expectedKpiValue = new IntegerKpiValue(66); - - final var intValue = serializer.serializeIntegerKpiValue(expectedKpiValue); - final var deserializedKpiValue = serializer.deserializeIntegerKpiValue(intValue); - - assertThat(deserializedKpiValue).isEqualTo(expectedKpiValue.getValue()); - } - - @Test - void shouldDeserializeStringKpiValue() { - final var expectedKpiValue = new StringKpiValue("StringKpiValue"); - - final var stringValue = serializer.serializeStringKpiValue(expectedKpiValue); - final var deserializedKpiValue = serializer.deserializeStringKpiValue(stringValue); - - assertThat(deserializedKpiValue).isEqualTo(expectedKpiValue.getValue()); - } - - @Test - void shouldDeserializeFloatKpiValue() { - final var expectedKpiValue = new FloatKpiValue(2.2f); - - final var floatValue = serializer.serializeFloatKpiValue(expectedKpiValue); - final var deserializedKpiValue = serializer.deserializeFloatKpiValue(floatValue); - - assertThat(deserializedKpiValue).isEqualTo(expectedKpiValue.getValue()); - } - - @Test - void shouldDeserializeBooleanKpiValue() { - final var expectedKpiValue = new BooleanKpiValue(true); - - final var booleanValue = serializer.serializeBooleanKpiValue(expectedKpiValue); - final var deserializedKpiValue = serializer.deserializeBooleanKpiValue(booleanValue); - - assertThat(deserializedKpiValue).isEqualTo(expectedKpiValue.getValue()); - } - - private static Stream provideKpiValueRanges() { - return Stream.of( - Arguments.of( - new KpiValueRange( - new IntegerKpiValue(32), new IntegerKpiValue(42), false, false, false), - Monitoring.KpiValueRange.newBuilder() - .setKpiMinValue(Monitoring.KpiValue.newBuilder().setInt32Val(32).build()) - .setKpiMaxValue(Monitoring.KpiValue.newBuilder().setInt32Val(42).build()) - .build()), - Arguments.of( - new KpiValueRange( - new IntegerKpiValue(32), new FloatKpiValue(42.2f), false, false, false), - Monitoring.KpiValueRange.newBuilder() - .setKpiMinValue(Monitoring.KpiValue.newBuilder().setInt32Val(32).build()) - .setKpiMaxValue(Monitoring.KpiValue.newBuilder().setFloatVal(42.2f).build()) - .build()), - Arguments.of( - new KpiValueRange( - new IntegerKpiValue(32), new BooleanKpiValue(true), false, false, false), - Monitoring.KpiValueRange.newBuilder() - .setKpiMinValue(Monitoring.KpiValue.newBuilder().setInt32Val(32).build()) - .setKpiMaxValue(Monitoring.KpiValue.newBuilder().setBoolVal(true).build()) - .build()), - Arguments.of( - new KpiValueRange( - new IntegerKpiValue(32), new StringKpiValue("string"), false, false, false), - Monitoring.KpiValueRange.newBuilder() - .setKpiMinValue(Monitoring.KpiValue.newBuilder().setInt32Val(32).build()) - .setKpiMaxValue(Monitoring.KpiValue.newBuilder().setStringVal("string").build()) - .build()), - Arguments.of( - new KpiValueRange( - new FloatKpiValue(56.2f), new IntegerKpiValue(42), false, false, false), - Monitoring.KpiValueRange.newBuilder() - .setKpiMinValue(Monitoring.KpiValue.newBuilder().setFloatVal(56.2f).build()) - .setKpiMaxValue(Monitoring.KpiValue.newBuilder().setInt32Val(42).build()) - .build()), - Arguments.of( - new KpiValueRange( - new FloatKpiValue(56.2f), new FloatKpiValue(42.2f), false, false, false), - Monitoring.KpiValueRange.newBuilder() - .setKpiMinValue(Monitoring.KpiValue.newBuilder().setFloatVal(56.2f).build()) - .setKpiMaxValue(Monitoring.KpiValue.newBuilder().setFloatVal(42.2f).build()) - .build()), - Arguments.of( - new KpiValueRange( - new FloatKpiValue(56.2f), new BooleanKpiValue(true), false, false, false), - Monitoring.KpiValueRange.newBuilder() - .setKpiMinValue(Monitoring.KpiValue.newBuilder().setFloatVal(56.2f).build()) - .setKpiMaxValue(Monitoring.KpiValue.newBuilder().setBoolVal(true).build()) - .build()), - Arguments.of( - new KpiValueRange( - new FloatKpiValue(56.2f), new StringKpiValue("string"), false, false, false), - Monitoring.KpiValueRange.newBuilder() - .setKpiMinValue(Monitoring.KpiValue.newBuilder().setFloatVal(56.2f).build()) - .setKpiMaxValue(Monitoring.KpiValue.newBuilder().setStringVal("string").build()) - .build()), - Arguments.of( - new KpiValueRange( - new BooleanKpiValue(true), new IntegerKpiValue(42), false, false, false), - Monitoring.KpiValueRange.newBuilder() - .setKpiMinValue(Monitoring.KpiValue.newBuilder().setBoolVal(true).build()) - .setKpiMaxValue(Monitoring.KpiValue.newBuilder().setInt32Val(42).build()) - .build()), - Arguments.of( - new KpiValueRange( - new BooleanKpiValue(false), new FloatKpiValue(42.2f), false, false, false), - Monitoring.KpiValueRange.newBuilder() - .setKpiMinValue(Monitoring.KpiValue.newBuilder().setBoolVal(false).build()) - .setKpiMaxValue(Monitoring.KpiValue.newBuilder().setFloatVal(42.2f).build()) - .build()), - Arguments.of( - new KpiValueRange( - new BooleanKpiValue(true), new BooleanKpiValue(true), false, false, false), - Monitoring.KpiValueRange.newBuilder() - .setKpiMinValue(Monitoring.KpiValue.newBuilder().setBoolVal(true).build()) - .setKpiMaxValue(Monitoring.KpiValue.newBuilder().setBoolVal(true).build()) - .build()), - Arguments.of( - new KpiValueRange( - new BooleanKpiValue(false), new StringKpiValue("string"), false, false, false), - Monitoring.KpiValueRange.newBuilder() - .setKpiMinValue(Monitoring.KpiValue.newBuilder().setBoolVal(false).build()) - .setKpiMaxValue(Monitoring.KpiValue.newBuilder().setStringVal("string").build()) - .build()), - Arguments.of( - new KpiValueRange( - new StringKpiValue("string"), new IntegerKpiValue(42), false, false, false), - Monitoring.KpiValueRange.newBuilder() - .setKpiMinValue(Monitoring.KpiValue.newBuilder().setStringVal("string").build()) - .setKpiMaxValue(Monitoring.KpiValue.newBuilder().setInt32Val(42).build()) - .build()), - Arguments.of( - new KpiValueRange( - new StringKpiValue("string"), new FloatKpiValue(42.2f), false, false, false), - Monitoring.KpiValueRange.newBuilder() - .setKpiMinValue(Monitoring.KpiValue.newBuilder().setStringVal("string").build()) - .setKpiMaxValue(Monitoring.KpiValue.newBuilder().setFloatVal(42.2f).build()) - .build()), - Arguments.of( - new KpiValueRange( - new StringKpiValue("string"), new BooleanKpiValue(true), false, false, false), - Monitoring.KpiValueRange.newBuilder() - .setKpiMinValue(Monitoring.KpiValue.newBuilder().setStringVal("string").build()) - .setKpiMaxValue(Monitoring.KpiValue.newBuilder().setBoolVal(true).build()) - .build()), - Arguments.of( - new KpiValueRange( - new StringKpiValue("string"), new StringKpiValue("string"), false, false, false), - Monitoring.KpiValueRange.newBuilder() - .setKpiMinValue(Monitoring.KpiValue.newBuilder().setStringVal("string").build()) - .setKpiMaxValue(Monitoring.KpiValue.newBuilder().setStringVal("string").build()) - .build())); - } - - @ParameterizedTest - @MethodSource("provideKpiValueRanges") - void shouldSerializeKpiValueRange( - KpiValueRange kpiValueRange, Monitoring.KpiValueRange expectedKpiValueRange) { - final var serializedKpiValueRange = serializer.serialize(kpiValueRange); - - assertThat(serializedKpiValueRange.getKpiMinValue()) - .isEqualTo(expectedKpiValueRange.getKpiMinValue()); - assertThat(serializedKpiValueRange.getKpiMaxValue()) - .isEqualTo(expectedKpiValueRange.getKpiMaxValue()); - } - - @ParameterizedTest - @MethodSource("provideKpiValueRanges") - void shouldDeserializeKpiValueRange( - KpiValueRange expectedKpiValueRange, Monitoring.KpiValueRange serializedKpiValueRange) { - final var kpiValueRange = serializer.deserialize(serializedKpiValueRange); - - assertThat(kpiValueRange.getKpiMinValue()) - .usingRecursiveComparison() - .isEqualTo(expectedKpiValueRange.getKpiMinValue()); - assertThat(kpiValueRange.getKpiMaxValue()) - .usingRecursiveComparison() - .isEqualTo(expectedKpiValueRange.getKpiMaxValue()); - } - - @Test - void shouldSerializeAlarmId() { - final var alarmId = "alarmId"; - - final var alarmIdUuid = serializer.serializeUuid(alarmId); - - final var expectedAlarmId = Monitoring.AlarmID.newBuilder().setAlarmId(alarmIdUuid).build(); - - final var serializedAlarmId = serializer.serializeAlarmId(alarmId); - - assertThat(serializedAlarmId).usingRecursiveComparison().isEqualTo(expectedAlarmId); - } - - @Test - void shouldDeserializeAlarmId() { - final var expectedAlarmId = "expectedAlarmId"; - - final var serializedAlarmIdUuid = serializer.serializeUuid(expectedAlarmId); - final var serializedAlarmId = - Monitoring.KpiId.newBuilder().setKpiId(serializedAlarmIdUuid).build(); - - final var alarmId = serializer.deserialize(serializedAlarmId); - - assertThat(alarmId).isEqualTo(expectedAlarmId); - } - - @Test - void shouldSerializeAlarmDescriptor() { - final var alarmId = "alarmId"; - final var alarmDescription = "alarmDescription"; - final var name = "name"; - final var kpiId = "kpiId"; - final double timestamp = 100.0; - final var kpiIds = List.of("kpiId1", "kpiId2"); - - final var kpiValueRange = - new KpiValueRange(new IntegerKpiValue(23), new IntegerKpiValue(1800), false, false, false); - final var kpiValueRanges = List.of(kpiValueRange); - - final var alarmDescriptor = - new AlarmDescriptor( - alarmId, alarmDescription, name, kpiIds.get(0), kpiValueRanges.get(0), timestamp); - - final var serializedalarmIdUuid = serializer.serializeUuid(alarmId); - final var serializedalarmId = AlarmID.newBuilder().setAlarmId(serializedalarmIdUuid).build(); - - final var serializedKpiIdUuid = serializer.serializeUuid("kpiId1"); - final var serializedKpiId1 = KpiId.newBuilder().setKpiId(serializedKpiIdUuid).build(); - // final var serializedKpiId2 = KpiId.newBuilder().setKpiId(serializer.serializeUuid("kpiId2")); - final var serializedKpiValueRange = serializer.serialize(kpiValueRange); - final var serializedTimeStamp = - context.ContextOuterClass.Timestamp.newBuilder().setTimestamp(timestamp); - - final var expectedAlarmDescriptor = - Monitoring.AlarmDescriptor.newBuilder() - .setAlarmId(serializedalarmId) - .setAlarmDescription(alarmDescription) - .setName(name) - .setKpiId(serializedKpiId1) - .setKpiValueRange(serializedKpiValueRange) - .setTimestamp(serializedTimeStamp) - .build(); - - final var serializedAlarmDescriptor = serializer.serialize(alarmDescriptor); - - assertThat(serializedAlarmDescriptor).isEqualTo(expectedAlarmDescriptor); - } - - @Test - void shouldDeserializeAlarmDescriptor() { - final var alarmId = "alarmId"; - final var alarmDescription = "alarmDescription"; - final var name = "name"; - final var kpiId = "kpiId"; - final double timestamp = 100.0; - final var kpiIds = List.of("kpiId1", "kpiId2"); - - final var kpiValueRange = - new KpiValueRange(new IntegerKpiValue(23), new IntegerKpiValue(1800), false, false, false); - final var kpiValueRanges = List.of(kpiValueRange); - - final var expectedAlarmDescriptor = - new AlarmDescriptor( - alarmId, alarmDescription, name, kpiIds.get(0), kpiValueRanges.get(0), timestamp); - - final var serializedalarmIdUuid = serializer.serializeUuid(alarmId); - final var serializedalarmId = AlarmID.newBuilder().setAlarmId(serializedalarmIdUuid).build(); - - final var serializedKpiIdUuid = serializer.serializeUuid("kpiId1"); - final var serializedKpiId1 = KpiId.newBuilder().setKpiId(serializedKpiIdUuid).build(); - final var serializedKpiId2 = KpiId.newBuilder().setKpiId(serializer.serializeUuid("kpiId2")); - - final var serializedKpiValueRange = serializer.serialize(kpiValueRange); - final var serializedTimeStamp = - context.ContextOuterClass.Timestamp.newBuilder().setTimestamp(timestamp); - - final var serializedAlarmDescriptor = - Monitoring.AlarmDescriptor.newBuilder() - .setAlarmId(serializedalarmId) - .setAlarmDescription(alarmDescription) - .setName(name) - .setKpiId(serializedKpiId1) - .setKpiValueRange(serializedKpiValueRange) - .setTimestamp(serializedTimeStamp) - .build(); - - final var alarmDescriptor = serializer.deserialize(serializedAlarmDescriptor); - - assertThat(alarmDescriptor).usingRecursiveComparison().isEqualTo(expectedAlarmDescriptor); - } - - @Test - void shouldSerializeAlarmResponse() { - final var alarmId = "alarmId"; - final var kpiValue = new IntegerKpiValue(12); - final var kpiId = "expectedKpiId"; - final var timestamp = 100.0; - final var kpi = new Kpi(kpiId, timestamp, kpiValue); - final var kpiList = List.of(kpi); - - final var alarmResponse = new AlarmResponse(alarmId, kpiList); - - final var serializedAlarmIdUuid = serializer.serializeUuid(alarmId); - final var serializedAlarmId = AlarmID.newBuilder().setAlarmId(serializedAlarmIdUuid).build(); - final var serializedListKpis = serializer.serialize(List.of(kpi)); - final var serializedKpiList = Monitoring.KpiList.newBuilder().addAllKpi(serializedListKpis); - - final var expectedAlarmResponse = - Monitoring.AlarmResponse.newBuilder() - .setAlarmId(serializedAlarmId) - .setKpiList(serializedKpiList) - .build(); - - final var serializedAlarmResponse = serializer.serialize(alarmResponse); - - assertThat(serializedAlarmResponse).isEqualTo(expectedAlarmResponse); - } - - @Test - void shouldDeserializeAlarmResponse() { - final var alarmId = "alarmId"; - final var kpiValue = new IntegerKpiValue(12); - final var kpiId = "expectedKpiId"; - final var timestamp = 100.0; - final var kpi = new Kpi(kpiId, timestamp, kpiValue); - final var kpiList = List.of(kpi); - - final var expectedAlarmResponse = new AlarmResponse(alarmId, kpiList); - - final var serializedAlarmIdUuid = serializer.serializeUuid(alarmId); - final var serializedAlarmId = AlarmID.newBuilder().setAlarmId(serializedAlarmIdUuid).build(); - final var serializedListKpis = serializer.serialize(List.of(kpi)); - final var serializedKpiList = Monitoring.KpiList.newBuilder().addAllKpi(serializedListKpis); - - final var serializedAlarmResponse = - Monitoring.AlarmResponse.newBuilder() - .setAlarmId(serializedAlarmId) - .setKpiList(serializedKpiList) - .build(); - - final var alarmResponse = serializer.deserialize(serializedAlarmResponse); - - assertThat(alarmResponse).usingRecursiveComparison().isEqualTo(expectedAlarmResponse); - } - - @Test - void shouldSerializeSubDescriptor() { - final var subscriptionId = "subscriptionId"; - final var kpiId = "kpiId"; - final var samplingDurationS = 10f; - final var samplingIntervalS = 45f; - final var startTimestamp = 1.0; - final var endTimestamp = 100.0; - - final var subDescriptor = - new SubsDescriptor( - subscriptionId, - kpiId, - samplingDurationS, - samplingIntervalS, - startTimestamp, - endTimestamp); - - final var serializedSubscriptionIdUuid = serializer.serializeUuid(subscriptionId); - final var serializedSubscriptionId = - monitoring.Monitoring.SubscriptionID.newBuilder() - .setSubsId(serializedSubscriptionIdUuid) - .build(); - final var serializedKpiIdUuid = serializer.serializeUuid(kpiId); - final var serializedKpiId = KpiId.newBuilder().setKpiId(serializedKpiIdUuid).build(); - final var serializedStartTimestamp = - ContextOuterClass.Timestamp.newBuilder().setTimestamp(startTimestamp); - final var serializedEndTimestamp = - ContextOuterClass.Timestamp.newBuilder().setTimestamp(endTimestamp); - - final var expectedSubDescriptor = - Monitoring.SubsDescriptor.newBuilder() - .setSubsId(serializedSubscriptionId) - .setKpiId(serializedKpiId) - .setSamplingDurationS(samplingDurationS) - .setSamplingIntervalS(samplingIntervalS) - .setStartTimestamp(serializedStartTimestamp) - .setEndTimestamp(serializedEndTimestamp) - .build(); - - final var serializedSubDescriptor = serializer.serialize(subDescriptor); - - assertThat(serializedSubDescriptor).isEqualTo(expectedSubDescriptor); - } - - @Test - void shouldDeserializeSubDescriptor() { - final var subscriptionId = "subscriptionId"; - final var kpiId = "kpiId"; - final var samplingDurationS = 10f; - final var samplingIntervalS = 45f; - final var startTimestamp = 1.0; - final var endTimestamp = 100.0; - - final var expectedSubDescriptor = - new SubsDescriptor( - subscriptionId, - kpiId, - samplingDurationS, - samplingIntervalS, - startTimestamp, - endTimestamp); - - final var serializedSubscriptionIdUuid = serializer.serializeUuid(subscriptionId); - final var serializedSubscriptionId = - monitoring.Monitoring.SubscriptionID.newBuilder() - .setSubsId(serializedSubscriptionIdUuid) - .build(); - final var serializedKpiIdUuid = serializer.serializeUuid(kpiId); - final var serializedKpiId = KpiId.newBuilder().setKpiId(serializedKpiIdUuid).build(); - final var serializedStartTimestamp = - ContextOuterClass.Timestamp.newBuilder().setTimestamp(startTimestamp); - final var serializedEndTimestamp = - ContextOuterClass.Timestamp.newBuilder().setTimestamp(endTimestamp); - - final var serializedSubDescriptor = - Monitoring.SubsDescriptor.newBuilder() - .setSubsId(serializedSubscriptionId) - .setKpiId(serializedKpiId) - .setSamplingDurationS(samplingDurationS) - .setSamplingIntervalS(samplingIntervalS) - .setStartTimestamp(serializedStartTimestamp) - .setEndTimestamp(serializedEndTimestamp) - .build(); - - final var subDescriptor = serializer.deserialize(serializedSubDescriptor); - - assertThat(subDescriptor).usingRecursiveComparison().isEqualTo(expectedSubDescriptor); - } - - @Test - void shouldDeserializePolicyRuleCondition() { - final var expectedPolicyRuleConditionKpiId = "expectedPolicyRuleConditionKpiId"; - final var expectedPolicyRuleConditionNumericalOperator = - NumericalOperator.POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN; - final var expectedPolicyRuleConditionKpiValue = new IntegerKpiValue(34); - - final var expectedPolicyRuleCondition = - new PolicyRuleCondition( - expectedPolicyRuleConditionKpiId, - expectedPolicyRuleConditionNumericalOperator, - expectedPolicyRuleConditionKpiValue); - - final var serializedPolicyRuleCondition = serializer.serialize(expectedPolicyRuleCondition); - - final var policyRuleCondition = serializer.deserialize(serializedPolicyRuleCondition); - - assertThat(policyRuleCondition) - .usingRecursiveComparison() - .isEqualTo(expectedPolicyRuleCondition); - } - - private static Stream provideBooleanOperators() { - return Stream.of( - Arguments.of( - BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_AND, - PolicyCondition.BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_AND), - Arguments.of( - BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR, - PolicyCondition.BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR), - Arguments.of( - BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_UNDEFINED, - PolicyCondition.BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_UNDEFINED)); - } - - @ParameterizedTest - @MethodSource("provideBooleanOperators") - void shouldSerializeBooleanOperator( - BooleanOperator booleanOperator, PolicyCondition.BooleanOperator expectedBooleanOperator) { - final var serializedBooleanOperator = serializer.serialize(booleanOperator); - - assertThat(serializedBooleanOperator).isEqualTo(expectedBooleanOperator); - } - - @ParameterizedTest - @MethodSource("provideBooleanOperators") - void shouldDeserializeBooleanOperator( - BooleanOperator expectedBooleanOperator, - PolicyCondition.BooleanOperator serializedBooleanOperator) { - final var booleanOperator = serializer.deserialize(serializedBooleanOperator); - - assertThat(booleanOperator).isEqualTo(expectedBooleanOperator); - } - private static Stream providePolicyRuleActionEnum() { return Stream.of( Arguments.of( @@ -3055,8 +2314,8 @@ class SerializerTest { final var expectedPolicyRuleId = policyRuleBasic.getPolicyRuleId(); final var expectedPolicyRuleState = policyRuleBasic.getPolicyRuleState(); final var expectedPolicyRuleActions = policyRuleBasic.getPolicyRuleActions(); - final var expectedPriority = policyRuleBasic.getPriority(); - final var expectedKpiId = policyRuleBasic.getKpiId(); + final var expectedPolicyRuleKpis = policyRuleBasic.getPolicyRuleKPIs(); + final var expectedPriority = policyRuleBasic.getPolicyRulePriority(); final var serializedPolicyRuleId = serializer.serializePolicyRuleId(expectedPolicyRuleId); final var serializedPolicyRuleState = serializer.serialize(expectedPolicyRuleState); @@ -3066,13 +2325,18 @@ class SerializerTest { .map(policyRuleAction -> serializer.serialize(policyRuleAction)) .collect(Collectors.toList()); + final var serializedPolicyRuleKpis = + expectedPolicyRuleKpis.stream() + .map(policyRuleKpiId -> serializer.serializePolicyRuleKpiId(policyRuleKpiId)) + .collect(Collectors.toList()); + final var expectedPolicyRuleBasic = Policy.PolicyRuleBasic.newBuilder() .setPolicyRuleId(serializedPolicyRuleId) - .setPriority(expectedPriority) - .setKpiId(KpiId.newBuilder().setKpiId(Uuid.newBuilder().setUuid("kpiId").build())) + .setPolicyRulePriority(expectedPriority) .setPolicyRuleState(serializedPolicyRuleState) .addAllActionList(serializedPolicyRuleActions) + .addAllPolicyRuleKpiList(serializedPolicyRuleKpis) .build(); final var serializedPolicyRuleBasic = serializer.serialize(policyRuleBasic); @@ -3088,9 +2352,9 @@ class SerializerTest { final var expectedPolicyRuleId = expectedPolicyRuleBasic.getPolicyRuleId(); final var expectedPolicyRuleState = expectedPolicyRuleBasic.getPolicyRuleState(); - final var expectedPriority = expectedPolicyRuleBasic.getPriority(); - final var expectedKpiId = expectedPolicyRuleBasic.getKpiId(); + final var expectedPriority = expectedPolicyRuleBasic.getPolicyRulePriority(); final var expectedPolicyRuleActions = expectedPolicyRuleBasic.getPolicyRuleActions(); + final var expectedPolicyRuleKpis = expectedPolicyRuleBasic.getPolicyRuleKPIs(); final var serializedPolicyRuleId = serializer.serializePolicyRuleId(expectedPolicyRuleId); final var serializedPolicyRuleState = serializer.serialize(expectedPolicyRuleState); @@ -3100,13 +2364,18 @@ class SerializerTest { .map(policyRuleAction -> serializer.serialize(policyRuleAction)) .collect(Collectors.toList()); + final var serializedPolicyRuleKpis = + expectedPolicyRuleKpis.stream() + .map(policyRuleKpiId -> serializer.serializePolicyRuleKpiId(policyRuleKpiId)) + .collect(Collectors.toList()); + final var serializedPolicyRuleBasic = Policy.PolicyRuleBasic.newBuilder() .setPolicyRuleId(serializedPolicyRuleId) .setPolicyRuleState(serializedPolicyRuleState) - .setKpiId(KpiId.newBuilder().setKpiId(Uuid.newBuilder().setUuid("kpiId").build())) - .setPriority(expectedPriority) + .setPolicyRulePriority(expectedPriority) .addAllActionList(serializedPolicyRuleActions) + .addAllPolicyRuleKpiList(serializedPolicyRuleKpis) .build(); final var policyRuleBasic = serializer.deserialize(serializedPolicyRuleBasic); @@ -3222,240 +2491,6 @@ class SerializerTest { assertThat(policyRuleDevice).usingRecursiveComparison().isEqualTo(expectedPolicyRuleDevice); } - @Test - void shouldSerializeKpiId() { - final var kpiId = "kpiId"; - - final var kpiIdUuid = serializer.serializeUuid(kpiId); - - final var expectedKpiId = Monitoring.KpiId.newBuilder().setKpiId(kpiIdUuid).build(); - - final var serializedKpiId = serializer.serializeKpiId(kpiId); - - assertThat(serializedKpiId).usingRecursiveComparison().isEqualTo(expectedKpiId); - } - - @Test - void shouldDeserializeKpiId() { - final var expectedKpiId = "expectedKpiId"; - - final var serializedKpiIdUuid = serializer.serializeUuid(expectedKpiId); - final var serializedKpiId = Monitoring.KpiId.newBuilder().setKpiId(serializedKpiIdUuid).build(); - - final var kpiId = serializer.deserialize(serializedKpiId); - - assertThat(kpiId).isEqualTo(expectedKpiId); - } - - @Test - void shouldSerializeKpi() { - final var expectedKpiId = "expectedKpiId"; - final var expectedTimestamp = 100.0; - final var expectedKpiValue = new FloatKpiValue(643.45f); - - final var kpi = new Kpi(expectedKpiId, expectedTimestamp, expectedKpiValue); - - final var serializedKpiId = serializer.serializeKpiId(expectedKpiId); - final var serializedKpiValue = serializer.serialize(expectedKpiValue); - final var serializedexpectedTimestamp = - context.ContextOuterClass.Timestamp.newBuilder().setTimestamp(expectedTimestamp); - - final var expectedKpi = - Monitoring.Kpi.newBuilder() - .setKpiId(serializedKpiId) - .setTimestamp(serializedexpectedTimestamp) - .setKpiValue(serializedKpiValue) - .build(); - - final var serializedKpi = serializer.serialize(kpi); - - assertThat(serializedKpi).usingRecursiveComparison().isEqualTo(expectedKpi); - } - - @Test - void shouldDeserializeKpi() { - final var expectedKpiId = "expectedKpiId"; - final var expectedTimestamp = 100.0; - final var expectedKpiValue = new BooleanKpiValue(true); - final var expectedKpi = new Kpi(expectedKpiId, expectedTimestamp, expectedKpiValue); - - final var serializedKpi = serializer.serialize(expectedKpi); - - final var kpi = serializer.deserialize(serializedKpi); - - assertThat(kpi).usingRecursiveComparison().isEqualTo(expectedKpi); - } - - @Test - void shouldSerializeKpisList() { - final var expectedKpiIdA = "expectedKpiIdA"; - final var expectedTimestampA = 100.0; - final var expectedKpiValueA = new FloatKpiValue(643.45f); - final var serializedKpiIdA = serializer.serializeKpiId(expectedKpiIdA); - final var serializedexpectedTimestampA = - context.ContextOuterClass.Timestamp.newBuilder().setTimestamp(expectedTimestampA); - final var serializedKpiValueA = serializer.serialize(expectedKpiValueA); - final var kpiA = new Kpi(expectedKpiIdA, expectedTimestampA, expectedKpiValueA); - - final var expectedKpiIdB = "expectedKpiIdB"; - final var expectedTimestampB = 100.0; - final var expectedKpiValueB = new IntegerKpiValue(32); - final var serializedKpiIdB = serializer.serializeKpiId(expectedKpiIdB); - final var serializedexpectedTimestampB = - context.ContextOuterClass.Timestamp.newBuilder().setTimestamp(expectedTimestampB); - final var serializedKpiValueB = serializer.serialize(expectedKpiValueB); - final var kpiB = new Kpi(expectedKpiIdB, expectedTimestampB, expectedKpiValueB); - - final var kpis = List.of(kpiA, kpiB); - - final var expectedKpiA = - Monitoring.Kpi.newBuilder() - .setKpiId(serializedKpiIdA) - .setTimestamp(serializedexpectedTimestampA) - .setKpiValue(serializedKpiValueA) - .build(); - - final var expectedKpiB = - Monitoring.Kpi.newBuilder() - .setKpiId(serializedKpiIdB) - .setTimestamp(serializedexpectedTimestampB) - .setKpiValue(serializedKpiValueB) - .build(); - - final var expectedKpis = List.of(expectedKpiA, expectedKpiB); - - final var serializedKpis = serializer.serialize(kpis); - - assertThat(serializedKpis).usingRecursiveComparison().isEqualTo(expectedKpis); - } - - @Test - void shouldDeserializeKpisList() { - final var expectedKpiIdA = "expectedKpiIdA"; - final var expectedTimestampA = 100.0; - final var expectedKpiValueA = new FloatKpiValue(643.45f); - final var serializedKpiIdA = serializer.serializeKpiId(expectedKpiIdA); - final var serializedexpectedTimestampA = - context.ContextOuterClass.Timestamp.newBuilder().setTimestamp(expectedTimestampA); - final var serializedKpiValueA = serializer.serialize(expectedKpiValueA); - final var expectedKpiA = new Kpi(expectedKpiIdA, expectedTimestampA, expectedKpiValueA); - - final var expectedKpiIdB = "expectedKpiIdB"; - final var expectedTimestampB = 200.0; - final var expectedKpiValueB = new IntegerKpiValue(32); - final var serializedKpiIdB = serializer.serializeKpiId(expectedKpiIdB); - final var serializedexpectedTimestampB = - context.ContextOuterClass.Timestamp.newBuilder().setTimestamp(expectedTimestampB); - final var serializedKpiValueB = serializer.serialize(expectedKpiValueB); - final var expectedKpiB = new Kpi(expectedKpiIdB, expectedTimestampB, expectedKpiValueB); - - final var expectedKpis = List.of(expectedKpiA, expectedKpiB); - - final var serializedKpiA = - Monitoring.Kpi.newBuilder() - .setKpiId(serializedKpiIdA) - .setTimestamp(serializedexpectedTimestampA) - .setKpiValue(serializedKpiValueA) - .build(); - - final var serializedKpiB = - Monitoring.Kpi.newBuilder() - .setKpiId(serializedKpiIdB) - .setTimestamp(serializedexpectedTimestampB) - .setKpiValue(serializedKpiValueB) - .build(); - - final var serializedKpis = List.of(serializedKpiA, serializedKpiB); - - final var kpis = serializer.deserialize(serializedKpis); - - assertThat(kpis).usingRecursiveComparison().isEqualTo(expectedKpis); - } - - @Test - void shouldSerializeKpiDescriptor() { - final var expectedKpiDescription = "expectedKpiDescription"; - final var expectedKpiSampleType = KpiSampleType.BYTES_RECEIVED; - final var expectedDeviceId = "expectedDeviceId"; - - final var expectedTopologyId = new TopologyId("contextId", "topologyId"); - final var expectedEndPointId = - new EndPointId(expectedTopologyId, expectedDeviceId, "endpointId"); - final var expectedServiceId = new ServiceId("contextId", "serviceId"); - final var expectedSliceId = new SliceId("contextId", "sliceId"); - - final var kpiDescriptor = - new KpiDescriptor( - expectedKpiDescription, - expectedKpiSampleType, - expectedDeviceId, - expectedEndPointId, - expectedServiceId, - expectedSliceId); - - final var serializedKpiSampleType = serializer.serialize(expectedKpiSampleType); - final var serializedDeviceId = serializer.serializeDeviceId(expectedDeviceId); - final var serializedEndPointId = serializer.serialize(expectedEndPointId); - final var serializedServiceId = serializer.serialize(expectedServiceId); - final var serializedSliceId = serializer.serialize(expectedSliceId); - - final var expectedKpiDescriptor = - Monitoring.KpiDescriptor.newBuilder() - .setKpiDescription(expectedKpiDescription) - .setKpiSampleType(serializedKpiSampleType) - .setDeviceId(serializedDeviceId) - .setEndpointId(serializedEndPointId) - .setServiceId(serializedServiceId) - .setSliceId(serializedSliceId) - .build(); - - final var serializedKpiDescriptor = serializer.serialize(kpiDescriptor); - - assertThat(serializedKpiDescriptor).usingRecursiveComparison().isEqualTo(expectedKpiDescriptor); - } - - @Test - void shouldDeserializeKpiDescriptor() { - final var expectedKpiDescription = "expectedKpiDescription"; - final var expectedKpiSampleType = KpiSampleType.BYTES_RECEIVED; - final var expectedDeviceId = "expectedDeviceId"; - - final var expectedTopologyId = new TopologyId("contextId", "topologyId"); - final var expectedEndPointId = - new EndPointId(expectedTopologyId, expectedDeviceId, "endpointId"); - final var expectedServiceId = new ServiceId("contextId", "serviceId"); - final var expectedSliceId = new SliceId("contextId", "sliceId"); - - final var expectedKpiDescriptor = - new KpiDescriptor( - expectedKpiDescription, - expectedKpiSampleType, - expectedDeviceId, - expectedEndPointId, - expectedServiceId, - expectedSliceId); - - final var serializedKpiSampleType = serializer.serialize(expectedKpiSampleType); - final var serializedDeviceId = serializer.serializeDeviceId(expectedDeviceId); - final var serializedEndPointId = serializer.serialize(expectedEndPointId); - final var serializedServiceId = serializer.serialize(expectedServiceId); - final var serializedSliceId = serializer.serialize(expectedSliceId); - - final var serializedKpiDescriptor = - Monitoring.KpiDescriptor.newBuilder() - .setKpiDescription(expectedKpiDescription) - .setKpiSampleType(serializedKpiSampleType) - .setDeviceId(serializedDeviceId) - .setEndpointId(serializedEndPointId) - .setServiceId(serializedServiceId) - .setSliceId(serializedSliceId) - .build(); - - final var kpiDescriptor = serializer.deserialize(serializedKpiDescriptor); - - assertThat(kpiDescriptor).usingRecursiveComparison().isEqualTo(expectedKpiDescriptor); - } - @Test void shouldSerializeDeviceConfig() { final var expectedConfigRuleCustomA = diff --git a/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java b/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java index 558aa9778e38dfa529a0241fc03723e9d8685dcf..27cde66fb4d01c41c0ae39bba4f4da897b2cd0c5 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/generated-sources/grpc/kpi_sample_types/KpiSampleTypes.java b/src/policy/target/generated-sources/grpc/kpi_sample_types/KpiSampleTypes.java index 0c98ddbb4625c12c345226ec5654e475188619f9..3f4a7a2a6d81affb2837cc465268d9085a134466 100644 --- a/src/policy/target/generated-sources/grpc/kpi_sample_types/KpiSampleTypes.java +++ b/src/policy/target/generated-sources/grpc/kpi_sample_types/KpiSampleTypes.java @@ -71,6 +71,14 @@ public final class KpiSampleTypes { * KPISAMPLETYPE_OPTICAL_SECURITY_STATUS = 501; */ KPISAMPLETYPE_OPTICAL_SECURITY_STATUS(501), + /** + * KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT = 502; + */ + KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT(502), + /** + * KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER = 503; + */ + KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER(503), /** * KPISAMPLETYPE_L3_UNIQUE_ATTACK_CONNS = 601; */ @@ -280,6 +288,16 @@ public final class KpiSampleTypes { */ public static final int KPISAMPLETYPE_OPTICAL_SECURITY_STATUS_VALUE = 501; + /** + * KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT = 502; + */ + public static final int KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT_VALUE = 502; + + /** + * KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER = 503; + */ + public static final int KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER_VALUE = 503; + /** * KPISAMPLETYPE_L3_UNIQUE_ATTACK_CONNS = 601; */ @@ -503,6 +521,10 @@ public final class KpiSampleTypes { return KPISAMPLETYPE_ML_CONFIDENCE; case 501: return KPISAMPLETYPE_OPTICAL_SECURITY_STATUS; + case 502: + return KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT; + case 503: + return KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER; case 601: return KPISAMPLETYPE_L3_UNIQUE_ATTACK_CONNS; case 602: @@ -628,7 +650,7 @@ public final class KpiSampleTypes { private static com.google.protobuf.Descriptors.FileDescriptor descriptor; static { - java.lang.String[] descriptorData = { "\n\026kpi_sample_types.proto\022\020kpi_sample_typ" + "es*\346\r\n\rKpiSampleType\022\031\n\025KPISAMPLETYPE_UN" + "KNOWN\020\000\022%\n!KPISAMPLETYPE_PACKETS_TRANSMI" + "TTED\020e\022\"\n\036KPISAMPLETYPE_PACKETS_RECEIVED" + "\020f\022!\n\035KPISAMPLETYPE_PACKETS_DROPPED\020g\022$\n" + "\037KPISAMPLETYPE_BYTES_TRANSMITTED\020\311\001\022!\n\034K" + "PISAMPLETYPE_BYTES_RECEIVED\020\312\001\022 \n\033KPISAM" + "PLETYPE_BYTES_DROPPED\020\313\001\022+\n&KPISAMPLETYP" + "E_LINK_TOTAL_CAPACITY_GBPS\020\255\002\022*\n%KPISAMP" + "LETYPE_LINK_USED_CAPACITY_GBPS\020\256\002\022 \n\033KPI" + "SAMPLETYPE_ML_CONFIDENCE\020\221\003\022*\n%KPISAMPLE" + "TYPE_OPTICAL_SECURITY_STATUS\020\365\003\022)\n$KPISA" + "MPLETYPE_L3_UNIQUE_ATTACK_CONNS\020\331\004\022*\n%KP" + "ISAMPLETYPE_L3_TOTAL_DROPPED_PACKTS\020\332\004\022&" + "\n!KPISAMPLETYPE_L3_UNIQUE_ATTACKERS\020\333\004\0220" + "\n+KPISAMPLETYPE_L3_UNIQUE_COMPROMISED_CL" + "IENTS\020\334\004\022,\n\'KPISAMPLETYPE_L3_SECURITY_ST" + "ATUS_CRYPTO\020\335\004\022%\n KPISAMPLETYPE_SERVICE_" + "LATENCY_MS\020\275\005\0221\n,KPISAMPLETYPE_PACKETS_T" + "RANSMITTED_AGG_OUTPUT\020\315\010\022.\n)KPISAMPLETYP" + "E_PACKETS_RECEIVED_AGG_OUTPUT\020\316\010\022-\n(KPIS" + "AMPLETYPE_PACKETS_DROPPED_AGG_OUTPUT\020\317\010\022" + "/\n*KPISAMPLETYPE_BYTES_TRANSMITTED_AGG_O" + "UTPUT\020\261\t\022,\n\'KPISAMPLETYPE_BYTES_RECEIVED" + "_AGG_OUTPUT\020\262\t\022+\n&KPISAMPLETYPE_BYTES_DR" + "OPPED_AGG_OUTPUT\020\263\t\0220\n+KPISAMPLETYPE_SER" + "VICE_LATENCY_MS_AGG_OUTPUT\020\245\r\022\036\n\031KPISAMP" + "LETYPE_INT_SEQ_NUM\020\321\017\022\035\n\030KPISAMPLETYPE_I" + "NT_TS_ING\020\322\017\022\035\n\030KPISAMPLETYPE_INT_TS_EGR" + "\020\323\017\022\036\n\031KPISAMPLETYPE_INT_HOP_LAT\020\324\017\022\"\n\035K" + "PISAMPLETYPE_INT_PORT_ID_ING\020\325\017\022\"\n\035KPISA" + "MPLETYPE_INT_PORT_ID_EGR\020\326\017\022\"\n\035KPISAMPLE" + "TYPE_INT_QUEUE_OCCUP\020\327\017\022\037\n\032KPISAMPLETYPE" + "_INT_QUEUE_ID\020\330\017\022#\n\036KPISAMPLETYPE_INT_HO" + "P_LAT_SW01\020\265\020\022#\n\036KPISAMPLETYPE_INT_HOP_L" + "AT_SW02\020\266\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_" + "SW03\020\267\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_SW0" + "4\020\270\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_SW05\020\271" + "\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_SW06\020\272\020\022#" + "\n\036KPISAMPLETYPE_INT_HOP_LAT_SW07\020\273\020\022#\n\036K" + "PISAMPLETYPE_INT_HOP_LAT_SW08\020\274\020\022#\n\036KPIS" + "AMPLETYPE_INT_HOP_LAT_SW09\020\275\020\022#\n\036KPISAMP" + "LETYPE_INT_HOP_LAT_SW10\020\276\020\022#\n\036KPISAMPLET" + "YPE_INT_LAT_ON_TOTAL\020\310\020\022\036\n\031KPISAMPLETYPE" + "_INT_IS_DROP\020\231\021\022\"\n\035KPISAMPLETYPE_INT_DRO" + "P_REASON\020\232\021b\006proto3" }; + java.lang.String[] descriptorData = { "\n\026kpi_sample_types.proto\022\020kpi_sample_typ" + "es*\302\016\n\rKpiSampleType\022\031\n\025KPISAMPLETYPE_UN" + "KNOWN\020\000\022%\n!KPISAMPLETYPE_PACKETS_TRANSMI" + "TTED\020e\022\"\n\036KPISAMPLETYPE_PACKETS_RECEIVED" + "\020f\022!\n\035KPISAMPLETYPE_PACKETS_DROPPED\020g\022$\n" + "\037KPISAMPLETYPE_BYTES_TRANSMITTED\020\311\001\022!\n\034K" + "PISAMPLETYPE_BYTES_RECEIVED\020\312\001\022 \n\033KPISAM" + "PLETYPE_BYTES_DROPPED\020\313\001\022+\n&KPISAMPLETYP" + "E_LINK_TOTAL_CAPACITY_GBPS\020\255\002\022*\n%KPISAMP" + "LETYPE_LINK_USED_CAPACITY_GBPS\020\256\002\022 \n\033KPI" + "SAMPLETYPE_ML_CONFIDENCE\020\221\003\022*\n%KPISAMPLE" + "TYPE_OPTICAL_SECURITY_STATUS\020\365\003\022,\n\'KPISA" + "MPLETYPE_OPTICAL_POWER_TOTAL_INPUT\020\366\003\022,\n" + "\'KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER" + "\020\367\003\022)\n$KPISAMPLETYPE_L3_UNIQUE_ATTACK_CO" + "NNS\020\331\004\022*\n%KPISAMPLETYPE_L3_TOTAL_DROPPED" + "_PACKTS\020\332\004\022&\n!KPISAMPLETYPE_L3_UNIQUE_AT" + "TACKERS\020\333\004\0220\n+KPISAMPLETYPE_L3_UNIQUE_CO" + "MPROMISED_CLIENTS\020\334\004\022,\n\'KPISAMPLETYPE_L3" + "_SECURITY_STATUS_CRYPTO\020\335\004\022%\n KPISAMPLET" + "YPE_SERVICE_LATENCY_MS\020\275\005\0221\n,KPISAMPLETY" + "PE_PACKETS_TRANSMITTED_AGG_OUTPUT\020\315\010\022.\n)" + "KPISAMPLETYPE_PACKETS_RECEIVED_AGG_OUTPU" + "T\020\316\010\022-\n(KPISAMPLETYPE_PACKETS_DROPPED_AG" + "G_OUTPUT\020\317\010\022/\n*KPISAMPLETYPE_BYTES_TRANS" + "MITTED_AGG_OUTPUT\020\261\t\022,\n\'KPISAMPLETYPE_BY" + "TES_RECEIVED_AGG_OUTPUT\020\262\t\022+\n&KPISAMPLET" + "YPE_BYTES_DROPPED_AGG_OUTPUT\020\263\t\0220\n+KPISA" + "MPLETYPE_SERVICE_LATENCY_MS_AGG_OUTPUT\020\245" + "\r\022\036\n\031KPISAMPLETYPE_INT_SEQ_NUM\020\321\017\022\035\n\030KPI" + "SAMPLETYPE_INT_TS_ING\020\322\017\022\035\n\030KPISAMPLETYP" + "E_INT_TS_EGR\020\323\017\022\036\n\031KPISAMPLETYPE_INT_HOP" + "_LAT\020\324\017\022\"\n\035KPISAMPLETYPE_INT_PORT_ID_ING" + "\020\325\017\022\"\n\035KPISAMPLETYPE_INT_PORT_ID_EGR\020\326\017\022" + "\"\n\035KPISAMPLETYPE_INT_QUEUE_OCCUP\020\327\017\022\037\n\032K" + "PISAMPLETYPE_INT_QUEUE_ID\020\330\017\022#\n\036KPISAMPL" + "ETYPE_INT_HOP_LAT_SW01\020\265\020\022#\n\036KPISAMPLETY" + "PE_INT_HOP_LAT_SW02\020\266\020\022#\n\036KPISAMPLETYPE_" + "INT_HOP_LAT_SW03\020\267\020\022#\n\036KPISAMPLETYPE_INT" + "_HOP_LAT_SW04\020\270\020\022#\n\036KPISAMPLETYPE_INT_HO" + "P_LAT_SW05\020\271\020\022#\n\036KPISAMPLETYPE_INT_HOP_L" + "AT_SW06\020\272\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_" + "SW07\020\273\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_SW0" + "8\020\274\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_SW09\020\275" + "\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_SW10\020\276\020\022#" + "\n\036KPISAMPLETYPE_INT_LAT_ON_TOTAL\020\310\020\022\036\n\031K" + "PISAMPLETYPE_INT_IS_DROP\020\231\021\022\"\n\035KPISAMPLE" + "TYPE_INT_DROP_REASON\020\232\021b\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] {}); } // @@protoc_insertion_point(outer_class_scope) diff --git a/src/policy/target/generated-sources/grpc/policy/Policy.java b/src/policy/target/generated-sources/grpc/policy/Policy.java index 04d033e66a3566e3d8a4a3298f55f1b96847b81a..16d0d46994c98cdb9f87a01e1b36ce219372057d 100644 --- a/src/policy/target/generated-sources/grpc/policy/Policy.java +++ b/src/policy/target/generated-sources/grpc/policy/Policy.java @@ -53,7 +53,7 @@ public final class Policy { POLICY_VALIDATED(3), /** *
-         * Rule subscribed to Monitoring
+         * Rule subscribed to Analyzer
          * 
* * POLICY_PROVISIONED = 4; @@ -61,7 +61,7 @@ public final class Policy { POLICY_PROVISIONED(4), /** *
-         * Rule is currently active (alarm is just thrown by Monitoring)
+         * Rule is currently active (alarm is just thrown by Analyzer)
          * 
* * POLICY_ACTIVE = 5; @@ -147,7 +147,7 @@ public final class Policy { /** *
-         * Rule subscribed to Monitoring
+         * Rule subscribed to Analyzer
          * 
* * POLICY_PROVISIONED = 4; @@ -156,7 +156,7 @@ public final class Policy { /** *
-         * Rule is currently active (alarm is just thrown by Monitoring)
+         * Rule is currently active (alarm is just thrown by Analyzer)
          * 
* * POLICY_ACTIVE = 5; @@ -303,6 +303,617 @@ public final class Policy { } } + public interface PolicyRuleStateOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleState) + com.google.protobuf.MessageOrBuilder { + + /** + * .policy.PolicyRuleStateEnum policyRuleState = 1; + * @return The enum numeric value on the wire for policyRuleState. + */ + int getPolicyRuleStateValue(); + + /** + * .policy.PolicyRuleStateEnum policyRuleState = 1; + * @return The policyRuleState. + */ + policy.Policy.PolicyRuleStateEnum getPolicyRuleState(); + + /** + * string policyRuleStateMessage = 2; + * @return The policyRuleStateMessage. + */ + java.lang.String getPolicyRuleStateMessage(); + + /** + * string policyRuleStateMessage = 2; + * @return The bytes for policyRuleStateMessage. + */ + com.google.protobuf.ByteString getPolicyRuleStateMessageBytes(); + } + + /** + * Protobuf type {@code policy.PolicyRuleState} + */ + 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; + + // Use PolicyRuleState.newBuilder() to construct. + private PolicyRuleState(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private PolicyRuleState() { + policyRuleState_ = 0; + policyRuleStateMessage_ = ""; + } + + @java.lang.Override + @SuppressWarnings({ "unused" }) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new PolicyRuleState(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return policy.Policy.internal_static_policy_PolicyRuleState_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return policy.Policy.internal_static_policy_PolicyRuleState_fieldAccessorTable.ensureFieldAccessorsInitialized(policy.Policy.PolicyRuleState.class, policy.Policy.PolicyRuleState.Builder.class); + } + + public static final int POLICYRULESTATE_FIELD_NUMBER = 1; + + private int policyRuleState_ = 0; + + /** + * .policy.PolicyRuleStateEnum policyRuleState = 1; + * @return The enum numeric value on the wire for policyRuleState. + */ + @java.lang.Override + public int getPolicyRuleStateValue() { + return policyRuleState_; + } + + /** + * .policy.PolicyRuleStateEnum policyRuleState = 1; + * @return The policyRuleState. + */ + @java.lang.Override + public policy.Policy.PolicyRuleStateEnum getPolicyRuleState() { + policy.Policy.PolicyRuleStateEnum result = policy.Policy.PolicyRuleStateEnum.forNumber(policyRuleState_); + return result == null ? policy.Policy.PolicyRuleStateEnum.UNRECOGNIZED : result; + } + + public static final int POLICYRULESTATEMESSAGE_FIELD_NUMBER = 2; + + @SuppressWarnings("serial") + private volatile java.lang.Object policyRuleStateMessage_ = ""; + + /** + * string policyRuleStateMessage = 2; + * @return The policyRuleStateMessage. + */ + @java.lang.Override + public java.lang.String getPolicyRuleStateMessage() { + java.lang.Object ref = policyRuleStateMessage_; + 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(); + policyRuleStateMessage_ = s; + return s; + } + } + + /** + * string policyRuleStateMessage = 2; + * @return The bytes for policyRuleStateMessage. + */ + @java.lang.Override + public com.google.protobuf.ByteString getPolicyRuleStateMessageBytes() { + java.lang.Object ref = policyRuleStateMessage_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + policyRuleStateMessage_ = 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 (policyRuleState_ != policy.Policy.PolicyRuleStateEnum.POLICY_UNDEFINED.getNumber()) { + output.writeEnum(1, policyRuleState_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(policyRuleStateMessage_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, policyRuleStateMessage_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) + return size; + size = 0; + if (policyRuleState_ != policy.Policy.PolicyRuleStateEnum.POLICY_UNDEFINED.getNumber()) { + size += com.google.protobuf.CodedOutputStream.computeEnumSize(1, policyRuleState_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(policyRuleStateMessage_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, policyRuleStateMessage_); + } + 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 policy.Policy.PolicyRuleState)) { + return super.equals(obj); + } + policy.Policy.PolicyRuleState other = (policy.Policy.PolicyRuleState) obj; + if (policyRuleState_ != other.policyRuleState_) + return false; + if (!getPolicyRuleStateMessage().equals(other.getPolicyRuleStateMessage())) + 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) + POLICYRULESTATE_FIELD_NUMBER; + hash = (53 * hash) + policyRuleState_; + hash = (37 * hash) + POLICYRULESTATEMESSAGE_FIELD_NUMBER; + hash = (53 * hash) + getPolicyRuleStateMessage().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static policy.Policy.PolicyRuleState parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static policy.Policy.PolicyRuleState parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static policy.Policy.PolicyRuleState parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static policy.Policy.PolicyRuleState parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static policy.Policy.PolicyRuleState parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static policy.Policy.PolicyRuleState parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static policy.Policy.PolicyRuleState parseFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static policy.Policy.PolicyRuleState 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 policy.Policy.PolicyRuleState parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static policy.Policy.PolicyRuleState 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 policy.Policy.PolicyRuleState parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static policy.Policy.PolicyRuleState 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(policy.Policy.PolicyRuleState 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 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 com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return policy.Policy.internal_static_policy_PolicyRuleState_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return policy.Policy.internal_static_policy_PolicyRuleState_fieldAccessorTable.ensureFieldAccessorsInitialized(policy.Policy.PolicyRuleState.class, policy.Policy.PolicyRuleState.Builder.class); + } + + // Construct using policy.Policy.PolicyRuleState.newBuilder() + private Builder() { + } + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + policyRuleState_ = 0; + policyRuleStateMessage_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return policy.Policy.internal_static_policy_PolicyRuleState_descriptor; + } + + @java.lang.Override + public policy.Policy.PolicyRuleState getDefaultInstanceForType() { + return policy.Policy.PolicyRuleState.getDefaultInstance(); + } + + @java.lang.Override + public policy.Policy.PolicyRuleState build() { + policy.Policy.PolicyRuleState result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public policy.Policy.PolicyRuleState buildPartial() { + policy.Policy.PolicyRuleState result = new policy.Policy.PolicyRuleState(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(policy.Policy.PolicyRuleState result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.policyRuleState_ = policyRuleState_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.policyRuleStateMessage_ = policyRuleStateMessage_; + } + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof policy.Policy.PolicyRuleState) { + return mergeFrom((policy.Policy.PolicyRuleState) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(policy.Policy.PolicyRuleState other) { + if (other == policy.Policy.PolicyRuleState.getDefaultInstance()) + return this; + if (other.policyRuleState_ != 0) { + setPolicyRuleStateValue(other.getPolicyRuleStateValue()); + } + if (!other.getPolicyRuleStateMessage().isEmpty()) { + policyRuleStateMessage_ = other.policyRuleStateMessage_; + 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: + { + policyRuleState_ = input.readEnum(); + bitField0_ |= 0x00000001; + break; + } + // case 8 + case 18: + { + policyRuleStateMessage_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000002; + break; + } + // case 18 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + // was an endgroup tag + done = true; + } + break; + } + } + // switch (tag) + } + // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } + // finally + return this; + } + + private int bitField0_; + + private int policyRuleState_ = 0; + + /** + * .policy.PolicyRuleStateEnum policyRuleState = 1; + * @return The enum numeric value on the wire for policyRuleState. + */ + @java.lang.Override + public int getPolicyRuleStateValue() { + return policyRuleState_; + } + + /** + * .policy.PolicyRuleStateEnum policyRuleState = 1; + * @param value The enum numeric value on the wire for policyRuleState to set. + * @return This builder for chaining. + */ + public Builder setPolicyRuleStateValue(int value) { + policyRuleState_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * .policy.PolicyRuleStateEnum policyRuleState = 1; + * @return The policyRuleState. + */ + @java.lang.Override + public policy.Policy.PolicyRuleStateEnum getPolicyRuleState() { + policy.Policy.PolicyRuleStateEnum result = policy.Policy.PolicyRuleStateEnum.forNumber(policyRuleState_); + return result == null ? policy.Policy.PolicyRuleStateEnum.UNRECOGNIZED : result; + } + + /** + * .policy.PolicyRuleStateEnum policyRuleState = 1; + * @param value The policyRuleState to set. + * @return This builder for chaining. + */ + public Builder setPolicyRuleState(policy.Policy.PolicyRuleStateEnum value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + policyRuleState_ = value.getNumber(); + onChanged(); + return this; + } + + /** + * .policy.PolicyRuleStateEnum policyRuleState = 1; + * @return This builder for chaining. + */ + public Builder clearPolicyRuleState() { + bitField0_ = (bitField0_ & ~0x00000001); + policyRuleState_ = 0; + onChanged(); + return this; + } + + private java.lang.Object policyRuleStateMessage_ = ""; + + /** + * string policyRuleStateMessage = 2; + * @return The policyRuleStateMessage. + */ + public java.lang.String getPolicyRuleStateMessage() { + java.lang.Object ref = policyRuleStateMessage_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + policyRuleStateMessage_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string policyRuleStateMessage = 2; + * @return The bytes for policyRuleStateMessage. + */ + public com.google.protobuf.ByteString getPolicyRuleStateMessageBytes() { + java.lang.Object ref = policyRuleStateMessage_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + policyRuleStateMessage_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string policyRuleStateMessage = 2; + * @param value The policyRuleStateMessage to set. + * @return This builder for chaining. + */ + public Builder setPolicyRuleStateMessage(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + policyRuleStateMessage_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** + * string policyRuleStateMessage = 2; + * @return This builder for chaining. + */ + public Builder clearPolicyRuleStateMessage() { + policyRuleStateMessage_ = getDefaultInstance().getPolicyRuleStateMessage(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + return this; + } + + /** + * string policyRuleStateMessage = 2; + * @param value The bytes for policyRuleStateMessage to set. + * @return This builder for chaining. + */ + public Builder setPolicyRuleStateMessageBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + policyRuleStateMessage_ = 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:policy.PolicyRuleState) + } + + // @@protoc_insertion_point(class_scope:policy.PolicyRuleState) + private static final policy.Policy.PolicyRuleState DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new policy.Policy.PolicyRuleState(); + } + + public static policy.Policy.PolicyRuleState getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { + + @java.lang.Override + public PolicyRuleState parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public policy.Policy.PolicyRuleState getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + public interface PolicyRuleIdOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleId) com.google.protobuf.MessageOrBuilder { @@ -842,126 +1453,110 @@ public final class Policy { } } - public interface PolicyRuleStateOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleState) + public interface PolicyRuleKpiIdOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleKpiId) com.google.protobuf.MessageOrBuilder { /** - * .policy.PolicyRuleStateEnum policyRuleState = 1; - * @return The enum numeric value on the wire for policyRuleState. - */ - int getPolicyRuleStateValue(); - - /** - * .policy.PolicyRuleStateEnum policyRuleState = 1; - * @return The policyRuleState. + *
+         * Same as defined in kpi_manager.proto
+         * 
+ * + * .context.Uuid policyRuleKpiUuid = 1; + * @return Whether the policyRuleKpiUuid field is set. */ - policy.Policy.PolicyRuleStateEnum getPolicyRuleState(); + boolean hasPolicyRuleKpiUuid(); /** - * string policyRuleStateMessage = 2; - * @return The policyRuleStateMessage. + *
+         * Same as defined in kpi_manager.proto
+         * 
+ * + * .context.Uuid policyRuleKpiUuid = 1; + * @return The policyRuleKpiUuid. */ - java.lang.String getPolicyRuleStateMessage(); + context.ContextOuterClass.Uuid getPolicyRuleKpiUuid(); /** - * string policyRuleStateMessage = 2; - * @return The bytes for policyRuleStateMessage. + *
+         * Same as defined in kpi_manager.proto
+         * 
+ * + * .context.Uuid policyRuleKpiUuid = 1; */ - com.google.protobuf.ByteString getPolicyRuleStateMessageBytes(); + context.ContextOuterClass.UuidOrBuilder getPolicyRuleKpiUuidOrBuilder(); } /** - * Protobuf type {@code policy.PolicyRuleState} + * Protobuf type {@code policy.PolicyRuleKpiId} */ - public static final class PolicyRuleState extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleState) - PolicyRuleStateOrBuilder { + public static final class PolicyRuleKpiId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleKpiId) + PolicyRuleKpiIdOrBuilder { private static final long serialVersionUID = 0L; - // Use PolicyRuleState.newBuilder() to construct. - private PolicyRuleState(com.google.protobuf.GeneratedMessageV3.Builder builder) { + // Use PolicyRuleKpiId.newBuilder() to construct. + private PolicyRuleKpiId(com.google.protobuf.GeneratedMessageV3.Builder builder) { super(builder); } - private PolicyRuleState() { - policyRuleState_ = 0; - policyRuleStateMessage_ = ""; + private PolicyRuleKpiId() { } @java.lang.Override @SuppressWarnings({ "unused" }) protected java.lang.Object newInstance(UnusedPrivateParameter unused) { - return new PolicyRuleState(); + return new PolicyRuleKpiId(); } public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return policy.Policy.internal_static_policy_PolicyRuleState_descriptor; + return policy.Policy.internal_static_policy_PolicyRuleKpiId_descriptor; } @java.lang.Override protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { - return policy.Policy.internal_static_policy_PolicyRuleState_fieldAccessorTable.ensureFieldAccessorsInitialized(policy.Policy.PolicyRuleState.class, policy.Policy.PolicyRuleState.Builder.class); + return policy.Policy.internal_static_policy_PolicyRuleKpiId_fieldAccessorTable.ensureFieldAccessorsInitialized(policy.Policy.PolicyRuleKpiId.class, policy.Policy.PolicyRuleKpiId.Builder.class); } - public static final int POLICYRULESTATE_FIELD_NUMBER = 1; - - private int policyRuleState_ = 0; + public static final int POLICYRULEKPIUUID_FIELD_NUMBER = 1; - /** - * .policy.PolicyRuleStateEnum policyRuleState = 1; - * @return The enum numeric value on the wire for policyRuleState. - */ - @java.lang.Override - public int getPolicyRuleStateValue() { - return policyRuleState_; - } + private context.ContextOuterClass.Uuid policyRuleKpiUuid_; /** - * .policy.PolicyRuleStateEnum policyRuleState = 1; - * @return The policyRuleState. + *
+         * Same as defined in kpi_manager.proto
+         * 
+ * + * .context.Uuid policyRuleKpiUuid = 1; + * @return Whether the policyRuleKpiUuid field is set. */ @java.lang.Override - public policy.Policy.PolicyRuleStateEnum getPolicyRuleState() { - policy.Policy.PolicyRuleStateEnum result = policy.Policy.PolicyRuleStateEnum.forNumber(policyRuleState_); - return result == null ? policy.Policy.PolicyRuleStateEnum.UNRECOGNIZED : result; + public boolean hasPolicyRuleKpiUuid() { + return policyRuleKpiUuid_ != null; } - public static final int POLICYRULESTATEMESSAGE_FIELD_NUMBER = 2; - - @SuppressWarnings("serial") - private volatile java.lang.Object policyRuleStateMessage_ = ""; - /** - * string policyRuleStateMessage = 2; - * @return The policyRuleStateMessage. + *
+         * Same as defined in kpi_manager.proto
+         * 
+ * + * .context.Uuid policyRuleKpiUuid = 1; + * @return The policyRuleKpiUuid. */ @java.lang.Override - public java.lang.String getPolicyRuleStateMessage() { - java.lang.Object ref = policyRuleStateMessage_; - 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(); - policyRuleStateMessage_ = s; - return s; - } + public context.ContextOuterClass.Uuid getPolicyRuleKpiUuid() { + return policyRuleKpiUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : policyRuleKpiUuid_; } /** - * string policyRuleStateMessage = 2; - * @return The bytes for policyRuleStateMessage. + *
+         * Same as defined in kpi_manager.proto
+         * 
+ * + * .context.Uuid policyRuleKpiUuid = 1; */ @java.lang.Override - public com.google.protobuf.ByteString getPolicyRuleStateMessageBytes() { - java.lang.Object ref = policyRuleStateMessage_; - if (ref instanceof java.lang.String) { - com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); - policyRuleStateMessage_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; - } + public context.ContextOuterClass.UuidOrBuilder getPolicyRuleKpiUuidOrBuilder() { + return policyRuleKpiUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : policyRuleKpiUuid_; } private byte memoizedIsInitialized = -1; @@ -979,11 +1574,8 @@ public final class Policy { @java.lang.Override public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { - if (policyRuleState_ != policy.Policy.PolicyRuleStateEnum.POLICY_UNDEFINED.getNumber()) { - output.writeEnum(1, policyRuleState_); - } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(policyRuleStateMessage_)) { - com.google.protobuf.GeneratedMessageV3.writeString(output, 2, policyRuleStateMessage_); + if (policyRuleKpiUuid_ != null) { + output.writeMessage(1, getPolicyRuleKpiUuid()); } getUnknownFields().writeTo(output); } @@ -994,11 +1586,8 @@ public final class Policy { if (size != -1) return size; size = 0; - if (policyRuleState_ != policy.Policy.PolicyRuleStateEnum.POLICY_UNDEFINED.getNumber()) { - size += com.google.protobuf.CodedOutputStream.computeEnumSize(1, policyRuleState_); - } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(policyRuleStateMessage_)) { - size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, policyRuleStateMessage_); + if (policyRuleKpiUuid_ != null) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getPolicyRuleKpiUuid()); } size += getUnknownFields().getSerializedSize(); memoizedSize = size; @@ -1010,14 +1599,16 @@ public final class Policy { if (obj == this) { return true; } - if (!(obj instanceof policy.Policy.PolicyRuleState)) { + if (!(obj instanceof policy.Policy.PolicyRuleKpiId)) { return super.equals(obj); } - policy.Policy.PolicyRuleState other = (policy.Policy.PolicyRuleState) obj; - if (policyRuleState_ != other.policyRuleState_) - return false; - if (!getPolicyRuleStateMessage().equals(other.getPolicyRuleStateMessage())) + policy.Policy.PolicyRuleKpiId other = (policy.Policy.PolicyRuleKpiId) obj; + if (hasPolicyRuleKpiUuid() != other.hasPolicyRuleKpiUuid()) return false; + if (hasPolicyRuleKpiUuid()) { + if (!getPolicyRuleKpiUuid().equals(other.getPolicyRuleKpiUuid())) + return false; + } if (!getUnknownFields().equals(other.getUnknownFields())) return false; return true; @@ -1030,60 +1621,60 @@ public final class Policy { } int hash = 41; hash = (19 * hash) + getDescriptor().hashCode(); - hash = (37 * hash) + POLICYRULESTATE_FIELD_NUMBER; - hash = (53 * hash) + policyRuleState_; - hash = (37 * hash) + POLICYRULESTATEMESSAGE_FIELD_NUMBER; - hash = (53 * hash) + getPolicyRuleStateMessage().hashCode(); + if (hasPolicyRuleKpiUuid()) { + hash = (37 * hash) + POLICYRULEKPIUUID_FIELD_NUMBER; + hash = (53 * hash) + getPolicyRuleKpiUuid().hashCode(); + } hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; } - public static policy.Policy.PolicyRuleState parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + public static policy.Policy.PolicyRuleKpiId parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static policy.Policy.PolicyRuleState parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + public static policy.Policy.PolicyRuleKpiId parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static policy.Policy.PolicyRuleState parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { + public static policy.Policy.PolicyRuleKpiId parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static policy.Policy.PolicyRuleState parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + public static policy.Policy.PolicyRuleKpiId parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static policy.Policy.PolicyRuleState parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + public static policy.Policy.PolicyRuleKpiId parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static policy.Policy.PolicyRuleState parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + public static policy.Policy.PolicyRuleKpiId parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static policy.Policy.PolicyRuleState parseFrom(java.io.InputStream input) throws java.io.IOException { + public static policy.Policy.PolicyRuleKpiId parseFrom(java.io.InputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); } - public static policy.Policy.PolicyRuleState parseFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + public static policy.Policy.PolicyRuleKpiId 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 policy.Policy.PolicyRuleState parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + public static policy.Policy.PolicyRuleKpiId parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); } - public static policy.Policy.PolicyRuleState parseDelimitedFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + public static policy.Policy.PolicyRuleKpiId 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 policy.Policy.PolicyRuleState parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + public static policy.Policy.PolicyRuleKpiId parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); } - public static policy.Policy.PolicyRuleState parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + public static policy.Policy.PolicyRuleKpiId parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); } @@ -1096,7 +1687,7 @@ public final class Policy { return DEFAULT_INSTANCE.toBuilder(); } - public static Builder newBuilder(policy.Policy.PolicyRuleState prototype) { + public static Builder newBuilder(policy.Policy.PolicyRuleKpiId prototype) { return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); } @@ -1112,21 +1703,21 @@ public final class Policy { } /** - * Protobuf type {@code policy.PolicyRuleState} + * Protobuf type {@code policy.PolicyRuleKpiId} */ - 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 Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleKpiId) + policy.Policy.PolicyRuleKpiIdOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return policy.Policy.internal_static_policy_PolicyRuleState_descriptor; + return policy.Policy.internal_static_policy_PolicyRuleKpiId_descriptor; } @java.lang.Override protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { - return policy.Policy.internal_static_policy_PolicyRuleState_fieldAccessorTable.ensureFieldAccessorsInitialized(policy.Policy.PolicyRuleState.class, policy.Policy.PolicyRuleState.Builder.class); + return policy.Policy.internal_static_policy_PolicyRuleKpiId_fieldAccessorTable.ensureFieldAccessorsInitialized(policy.Policy.PolicyRuleKpiId.class, policy.Policy.PolicyRuleKpiId.Builder.class); } - // Construct using policy.Policy.PolicyRuleState.newBuilder() + // Construct using policy.Policy.PolicyRuleKpiId.newBuilder() private Builder() { } @@ -1138,24 +1729,27 @@ public final class Policy { public Builder clear() { super.clear(); bitField0_ = 0; - policyRuleState_ = 0; - policyRuleStateMessage_ = ""; + policyRuleKpiUuid_ = null; + if (policyRuleKpiUuidBuilder_ != null) { + policyRuleKpiUuidBuilder_.dispose(); + policyRuleKpiUuidBuilder_ = null; + } return this; } @java.lang.Override public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { - return policy.Policy.internal_static_policy_PolicyRuleState_descriptor; + return policy.Policy.internal_static_policy_PolicyRuleKpiId_descriptor; } @java.lang.Override - public policy.Policy.PolicyRuleState getDefaultInstanceForType() { - return policy.Policy.PolicyRuleState.getDefaultInstance(); + public policy.Policy.PolicyRuleKpiId getDefaultInstanceForType() { + return policy.Policy.PolicyRuleKpiId.getDefaultInstance(); } @java.lang.Override - public policy.Policy.PolicyRuleState build() { - policy.Policy.PolicyRuleState result = buildPartial(); + public policy.Policy.PolicyRuleKpiId build() { + policy.Policy.PolicyRuleKpiId result = buildPartial(); if (!result.isInitialized()) { throw newUninitializedMessageException(result); } @@ -1163,8 +1757,8 @@ public final class Policy { } @java.lang.Override - public policy.Policy.PolicyRuleState buildPartial() { - policy.Policy.PolicyRuleState result = new policy.Policy.PolicyRuleState(this); + public policy.Policy.PolicyRuleKpiId buildPartial() { + policy.Policy.PolicyRuleKpiId result = new policy.Policy.PolicyRuleKpiId(this); if (bitField0_ != 0) { buildPartial0(result); } @@ -1172,36 +1766,28 @@ public final class Policy { return result; } - private void buildPartial0(policy.Policy.PolicyRuleState result) { + private void buildPartial0(policy.Policy.PolicyRuleKpiId result) { int from_bitField0_ = bitField0_; if (((from_bitField0_ & 0x00000001) != 0)) { - result.policyRuleState_ = policyRuleState_; - } - if (((from_bitField0_ & 0x00000002) != 0)) { - result.policyRuleStateMessage_ = policyRuleStateMessage_; + result.policyRuleKpiUuid_ = policyRuleKpiUuidBuilder_ == null ? policyRuleKpiUuid_ : policyRuleKpiUuidBuilder_.build(); } } @java.lang.Override public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof policy.Policy.PolicyRuleState) { - return mergeFrom((policy.Policy.PolicyRuleState) other); + if (other instanceof policy.Policy.PolicyRuleKpiId) { + return mergeFrom((policy.Policy.PolicyRuleKpiId) other); } else { super.mergeFrom(other); return this; } } - public Builder mergeFrom(policy.Policy.PolicyRuleState other) { - if (other == policy.Policy.PolicyRuleState.getDefaultInstance()) + public Builder mergeFrom(policy.Policy.PolicyRuleKpiId other) { + if (other == policy.Policy.PolicyRuleKpiId.getDefaultInstance()) return this; - if (other.policyRuleState_ != 0) { - setPolicyRuleStateValue(other.getPolicyRuleStateValue()); - } - if (!other.getPolicyRuleStateMessage().isEmpty()) { - policyRuleStateMessage_ = other.policyRuleStateMessage_; - bitField0_ |= 0x00000002; - onChanged(); + if (other.hasPolicyRuleKpiUuid()) { + mergePolicyRuleKpiUuid(other.getPolicyRuleKpiUuid()); } this.mergeUnknownFields(other.getUnknownFields()); onChanged(); @@ -1226,20 +1812,13 @@ public final class Policy { case 0: done = true; break; - case 8: + case 10: { - policyRuleState_ = input.readEnum(); + input.readMessage(getPolicyRuleKpiUuidFieldBuilder().getBuilder(), extensionRegistry); bitField0_ |= 0x00000001; break; } - // case 8 - case 18: - { - policyRuleStateMessage_ = input.readStringRequireUtf8(); - bitField0_ |= 0x00000002; - break; - } - // case 18 + // case 10 default: { if (!super.parseUnknownField(input, extensionRegistry, tag)) { @@ -1263,138 +1842,158 @@ public final class Policy { private int bitField0_; - private int policyRuleState_ = 0; + private context.ContextOuterClass.Uuid policyRuleKpiUuid_; - /** - * .policy.PolicyRuleStateEnum policyRuleState = 1; - * @return The enum numeric value on the wire for policyRuleState. - */ - @java.lang.Override - public int getPolicyRuleStateValue() { - return policyRuleState_; - } + private com.google.protobuf.SingleFieldBuilderV3 policyRuleKpiUuidBuilder_; /** - * .policy.PolicyRuleStateEnum policyRuleState = 1; - * @param value The enum numeric value on the wire for policyRuleState to set. - * @return This builder for chaining. + *
+             * Same as defined in kpi_manager.proto
+             * 
+ * + * .context.Uuid policyRuleKpiUuid = 1; + * @return Whether the policyRuleKpiUuid field is set. */ - public Builder setPolicyRuleStateValue(int value) { - policyRuleState_ = value; - bitField0_ |= 0x00000001; - onChanged(); - return this; + public boolean hasPolicyRuleKpiUuid() { + return ((bitField0_ & 0x00000001) != 0); } /** - * .policy.PolicyRuleStateEnum policyRuleState = 1; - * @return The policyRuleState. + *
+             * Same as defined in kpi_manager.proto
+             * 
+ * + * .context.Uuid policyRuleKpiUuid = 1; + * @return The policyRuleKpiUuid. */ - @java.lang.Override - public policy.Policy.PolicyRuleStateEnum getPolicyRuleState() { - policy.Policy.PolicyRuleStateEnum result = policy.Policy.PolicyRuleStateEnum.forNumber(policyRuleState_); - return result == null ? policy.Policy.PolicyRuleStateEnum.UNRECOGNIZED : result; + public context.ContextOuterClass.Uuid getPolicyRuleKpiUuid() { + if (policyRuleKpiUuidBuilder_ == null) { + return policyRuleKpiUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : policyRuleKpiUuid_; + } else { + return policyRuleKpiUuidBuilder_.getMessage(); + } } /** - * .policy.PolicyRuleStateEnum policyRuleState = 1; - * @param value The policyRuleState to set. - * @return This builder for chaining. + *
+             * Same as defined in kpi_manager.proto
+             * 
+ * + * .context.Uuid policyRuleKpiUuid = 1; */ - public Builder setPolicyRuleState(policy.Policy.PolicyRuleStateEnum value) { - if (value == null) { - throw new NullPointerException(); + public Builder setPolicyRuleKpiUuid(context.ContextOuterClass.Uuid value) { + if (policyRuleKpiUuidBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + policyRuleKpiUuid_ = value; + } else { + policyRuleKpiUuidBuilder_.setMessage(value); } bitField0_ |= 0x00000001; - policyRuleState_ = value.getNumber(); onChanged(); return this; } /** - * .policy.PolicyRuleStateEnum policyRuleState = 1; - * @return This builder for chaining. + *
+             * Same as defined in kpi_manager.proto
+             * 
+ * + * .context.Uuid policyRuleKpiUuid = 1; */ - public Builder clearPolicyRuleState() { - bitField0_ = (bitField0_ & ~0x00000001); - policyRuleState_ = 0; + public Builder setPolicyRuleKpiUuid(context.ContextOuterClass.Uuid.Builder builderForValue) { + if (policyRuleKpiUuidBuilder_ == null) { + policyRuleKpiUuid_ = builderForValue.build(); + } else { + policyRuleKpiUuidBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; onChanged(); return this; } - private java.lang.Object policyRuleStateMessage_ = ""; - /** - * string policyRuleStateMessage = 2; - * @return The policyRuleStateMessage. + *
+             * Same as defined in kpi_manager.proto
+             * 
+ * + * .context.Uuid policyRuleKpiUuid = 1; */ - public java.lang.String getPolicyRuleStateMessage() { - java.lang.Object ref = policyRuleStateMessage_; - if (!(ref instanceof java.lang.String)) { - com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - policyRuleStateMessage_ = s; - return s; + public Builder mergePolicyRuleKpiUuid(context.ContextOuterClass.Uuid value) { + if (policyRuleKpiUuidBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && policyRuleKpiUuid_ != null && policyRuleKpiUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) { + getPolicyRuleKpiUuidBuilder().mergeFrom(value); + } else { + policyRuleKpiUuid_ = value; + } } else { - return (java.lang.String) ref; + policyRuleKpiUuidBuilder_.mergeFrom(value); } + bitField0_ |= 0x00000001; + onChanged(); + return this; } /** - * string policyRuleStateMessage = 2; - * @return The bytes for policyRuleStateMessage. + *
+             * Same as defined in kpi_manager.proto
+             * 
+ * + * .context.Uuid policyRuleKpiUuid = 1; */ - public com.google.protobuf.ByteString getPolicyRuleStateMessageBytes() { - java.lang.Object ref = policyRuleStateMessage_; - if (ref instanceof String) { - com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); - policyRuleStateMessage_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; + public Builder clearPolicyRuleKpiUuid() { + bitField0_ = (bitField0_ & ~0x00000001); + policyRuleKpiUuid_ = null; + if (policyRuleKpiUuidBuilder_ != null) { + policyRuleKpiUuidBuilder_.dispose(); + policyRuleKpiUuidBuilder_ = null; } + onChanged(); + return this; } /** - * string policyRuleStateMessage = 2; - * @param value The policyRuleStateMessage to set. - * @return This builder for chaining. + *
+             * Same as defined in kpi_manager.proto
+             * 
+ * + * .context.Uuid policyRuleKpiUuid = 1; */ - public Builder setPolicyRuleStateMessage(java.lang.String value) { - if (value == null) { - throw new NullPointerException(); - } - policyRuleStateMessage_ = value; - bitField0_ |= 0x00000002; + public context.ContextOuterClass.Uuid.Builder getPolicyRuleKpiUuidBuilder() { + bitField0_ |= 0x00000001; onChanged(); - return this; + return getPolicyRuleKpiUuidFieldBuilder().getBuilder(); } /** - * string policyRuleStateMessage = 2; - * @return This builder for chaining. + *
+             * Same as defined in kpi_manager.proto
+             * 
+ * + * .context.Uuid policyRuleKpiUuid = 1; */ - public Builder clearPolicyRuleStateMessage() { - policyRuleStateMessage_ = getDefaultInstance().getPolicyRuleStateMessage(); - bitField0_ = (bitField0_ & ~0x00000002); - onChanged(); - return this; + public context.ContextOuterClass.UuidOrBuilder getPolicyRuleKpiUuidOrBuilder() { + if (policyRuleKpiUuidBuilder_ != null) { + return policyRuleKpiUuidBuilder_.getMessageOrBuilder(); + } else { + return policyRuleKpiUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : policyRuleKpiUuid_; + } } /** - * string policyRuleStateMessage = 2; - * @param value The bytes for policyRuleStateMessage to set. - * @return This builder for chaining. + *
+             * Same as defined in kpi_manager.proto
+             * 
+ * + * .context.Uuid policyRuleKpiUuid = 1; */ - public Builder setPolicyRuleStateMessageBytes(com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); + private com.google.protobuf.SingleFieldBuilderV3 getPolicyRuleKpiUuidFieldBuilder() { + if (policyRuleKpiUuidBuilder_ == null) { + policyRuleKpiUuidBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getPolicyRuleKpiUuid(), getParentForChildren(), isClean()); + policyRuleKpiUuid_ = null; } - checkByteStringIsUtf8(value); - policyRuleStateMessage_ = value; - bitField0_ |= 0x00000002; - onChanged(); - return this; + return policyRuleKpiUuidBuilder_; } @java.lang.Override @@ -1406,24 +2005,24 @@ public final class Policy { public final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { return super.mergeUnknownFields(unknownFields); } - // @@protoc_insertion_point(builder_scope:policy.PolicyRuleState) + // @@protoc_insertion_point(builder_scope:policy.PolicyRuleKpiId) } - // @@protoc_insertion_point(class_scope:policy.PolicyRuleState) - private static final policy.Policy.PolicyRuleState DEFAULT_INSTANCE; + // @@protoc_insertion_point(class_scope:policy.PolicyRuleKpiId) + private static final policy.Policy.PolicyRuleKpiId DEFAULT_INSTANCE; static { - DEFAULT_INSTANCE = new policy.Policy.PolicyRuleState(); + DEFAULT_INSTANCE = new policy.Policy.PolicyRuleKpiId(); } - public static policy.Policy.PolicyRuleState getDefaultInstance() { + public static policy.Policy.PolicyRuleKpiId getDefaultInstance() { return DEFAULT_INSTANCE; } - private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { + private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { @java.lang.Override - public PolicyRuleState parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + public PolicyRuleKpiId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { Builder builder = newBuilder(); try { builder.mergeFrom(input, extensionRegistry); @@ -1438,17 +2037,17 @@ public final class Policy { } }; - public static com.google.protobuf.Parser parser() { + public static com.google.protobuf.Parser parser() { return PARSER; } @java.lang.Override - public com.google.protobuf.Parser getParserForType() { + public com.google.protobuf.Parser getParserForType() { return PARSER; } @java.lang.Override - public policy.Policy.PolicyRuleState getDefaultInstanceForType() { + public policy.Policy.PolicyRuleKpiId getDefaultInstanceForType() { return DEFAULT_INSTANCE; } } @@ -1457,130 +2056,162 @@ public final class Policy { com.google.protobuf.MessageOrBuilder { /** + *
+         * Unique rule ID
+         * 
+ * * .policy.PolicyRuleId policyRuleId = 1; * @return Whether the policyRuleId field is set. */ boolean hasPolicyRuleId(); /** + *
+         * Unique rule ID
+         * 
+ * * .policy.PolicyRuleId policyRuleId = 1; * @return The policyRuleId. */ policy.Policy.PolicyRuleId getPolicyRuleId(); /** + *
+         * Unique rule ID
+         * 
+ * * .policy.PolicyRuleId policyRuleId = 1; */ policy.Policy.PolicyRuleIdOrBuilder getPolicyRuleIdOrBuilder(); /** - *
-         * policy.proto:58:12: Explicit 'optional' labels are disallowed in the Proto3 syntax. To define 'optional' fields in Proto3, simply remove the 'optional' label, as fields are 'optional' by default.
-         *  
+ *
+         * Rule lifecycle information
+         * 
* - * .policy.PolicyRuleState policyRuleState = 2; - * @return Whether the policyRuleState field is set. + * .policy.PolicyRuleState policyRuleState = 2; + * @return Whether the policyRuleState field is set. */ boolean hasPolicyRuleState(); /** - *
-         * policy.proto:58:12: Explicit 'optional' labels are disallowed in the Proto3 syntax. To define 'optional' fields in Proto3, simply remove the 'optional' label, as fields are 'optional' by default.
-         *  
+ *
+         * Rule lifecycle information
+         * 
+ * + * .policy.PolicyRuleState policyRuleState = 2; + * @return The policyRuleState. + */ + policy.Policy.PolicyRuleState getPolicyRuleState(); + + /** + *
+         * Rule lifecycle information
+         * 
+ * + * .policy.PolicyRuleState policyRuleState = 2; + */ + policy.Policy.PolicyRuleStateOrBuilder getPolicyRuleStateOrBuilder(); + + /** + *
+         * The priority of this rule
+         * 
* - * .policy.PolicyRuleState policyRuleState = 2; - * @return The policyRuleState. + * uint32 policyRulePriority = 3; + * @return The policyRulePriority. */ - policy.Policy.PolicyRuleState getPolicyRuleState(); + int getPolicyRulePriority(); /** - *
-         * policy.proto:58:12: Explicit 'optional' labels are disallowed in the Proto3 syntax. To define 'optional' fields in Proto3, simply remove the 'optional' label, as fields are 'optional' by default.
-         *  
+ *
+         * One or more actions should be applied
+         * 
* - * .policy.PolicyRuleState policyRuleState = 2; + * repeated .policy.PolicyRuleAction actionList = 4; */ - policy.Policy.PolicyRuleStateOrBuilder getPolicyRuleStateOrBuilder(); + java.util.List getActionListList(); /** - * uint32 priority = 3; - * @return The priority. + *
+         * One or more actions should be applied
+         * 
+ * + * repeated .policy.PolicyRuleAction actionList = 4; */ - int getPriority(); + policy.PolicyAction.PolicyRuleAction getActionList(int index); /** *
-         * to be migrated to: "kpi_manager.KpiId"
+         * One or more actions should be applied
          * 
* - * .monitoring.KpiId kpiId = 4; - * @return Whether the kpiId field is set. + * repeated .policy.PolicyRuleAction actionList = 4; */ - boolean hasKpiId(); + int getActionListCount(); /** *
-         * to be migrated to: "kpi_manager.KpiId"
+         * One or more actions should be applied
          * 
* - * .monitoring.KpiId kpiId = 4; - * @return The kpiId. + * repeated .policy.PolicyRuleAction actionList = 4; */ - monitoring.Monitoring.KpiId getKpiId(); + java.util.List getActionListOrBuilderList(); /** *
-         * to be migrated to: "kpi_manager.KpiId"
+         * One or more actions should be applied
          * 
* - * .monitoring.KpiId kpiId = 4; + * repeated .policy.PolicyRuleAction actionList = 4; */ - monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder(); + policy.PolicyAction.PolicyRuleActionOrBuilder getActionListOrBuilder(int index); /** *
-         * Event-Condition-Action (ECA) model
+         * List of KPIs associated with this policy
          * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; */ - java.util.List getActionListList(); + java.util.List getPolicyRuleKpiListList(); /** *
-         * Event-Condition-Action (ECA) model
+         * List of KPIs associated with this policy
          * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; */ - policy.PolicyAction.PolicyRuleAction getActionList(int index); + policy.Policy.PolicyRuleKpiId getPolicyRuleKpiList(int index); /** *
-         * Event-Condition-Action (ECA) model
+         * List of KPIs associated with this policy
          * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; */ - int getActionListCount(); + int getPolicyRuleKpiListCount(); /** *
-         * Event-Condition-Action (ECA) model
+         * List of KPIs associated with this policy
          * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; */ - java.util.List getActionListOrBuilderList(); + java.util.List getPolicyRuleKpiListOrBuilderList(); /** *
-         * Event-Condition-Action (ECA) model
+         * List of KPIs associated with this policy
          * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; */ - policy.PolicyAction.PolicyRuleActionOrBuilder getActionListOrBuilder(int index); + policy.Policy.PolicyRuleKpiIdOrBuilder getPolicyRuleKpiListOrBuilder(int index); } /** @@ -1602,6 +2233,7 @@ public final class Policy { private PolicyRuleBasic() { actionList_ = java.util.Collections.emptyList(); + policyRuleKpiList_ = java.util.Collections.emptyList(); } @java.lang.Override @@ -1624,6 +2256,10 @@ public final class Policy { private policy.Policy.PolicyRuleId policyRuleId_; /** + *
+         * Unique rule ID
+         * 
+ * * .policy.PolicyRuleId policyRuleId = 1; * @return Whether the policyRuleId field is set. */ @@ -1633,6 +2269,10 @@ public final class Policy { } /** + *
+         * Unique rule ID
+         * 
+ * * .policy.PolicyRuleId policyRuleId = 1; * @return The policyRuleId. */ @@ -1642,6 +2282,10 @@ public final class Policy { } /** + *
+         * Unique rule ID
+         * 
+ * * .policy.PolicyRuleId policyRuleId = 1; */ @java.lang.Override @@ -1654,12 +2298,12 @@ public final class Policy { private policy.Policy.PolicyRuleState policyRuleState_; /** - *
-         * policy.proto:58:12: Explicit 'optional' labels are disallowed in the Proto3 syntax. To define 'optional' fields in Proto3, simply remove the 'optional' label, as fields are 'optional' by default.
-         *  
+ *
+         * Rule lifecycle information
+         * 
* - * .policy.PolicyRuleState policyRuleState = 2; - * @return Whether the policyRuleState field is set. + * .policy.PolicyRuleState policyRuleState = 2; + * @return Whether the policyRuleState field is set. */ @java.lang.Override public boolean hasPolicyRuleState() { @@ -1667,12 +2311,12 @@ public final class Policy { } /** - *
-         * policy.proto:58:12: Explicit 'optional' labels are disallowed in the Proto3 syntax. To define 'optional' fields in Proto3, simply remove the 'optional' label, as fields are 'optional' by default.
-         *  
+ *
+         * Rule lifecycle information
+         * 
* - * .policy.PolicyRuleState policyRuleState = 2; - * @return The policyRuleState. + * .policy.PolicyRuleState policyRuleState = 2; + * @return The policyRuleState. */ @java.lang.Override public policy.Policy.PolicyRuleState getPolicyRuleState() { @@ -1680,135 +2324,162 @@ public final class Policy { } /** - *
-         * policy.proto:58:12: Explicit 'optional' labels are disallowed in the Proto3 syntax. To define 'optional' fields in Proto3, simply remove the 'optional' label, as fields are 'optional' by default.
-         *  
+ *
+         * Rule lifecycle information
+         * 
* - * .policy.PolicyRuleState policyRuleState = 2; + * .policy.PolicyRuleState policyRuleState = 2; */ @java.lang.Override public policy.Policy.PolicyRuleStateOrBuilder getPolicyRuleStateOrBuilder() { return policyRuleState_ == null ? policy.Policy.PolicyRuleState.getDefaultInstance() : policyRuleState_; } - public static final int PRIORITY_FIELD_NUMBER = 3; + public static final int POLICYRULEPRIORITY_FIELD_NUMBER = 3; - private int priority_ = 0; + private int policyRulePriority_ = 0; /** - * uint32 priority = 3; - * @return The priority. + *
+         * The priority of this rule
+         * 
+ * + * uint32 policyRulePriority = 3; + * @return The policyRulePriority. */ @java.lang.Override - public int getPriority() { - return priority_; + public int getPolicyRulePriority() { + return policyRulePriority_; } - public static final int KPIID_FIELD_NUMBER = 4; + public static final int ACTIONLIST_FIELD_NUMBER = 4; + + @SuppressWarnings("serial") + private java.util.List actionList_; + + /** + *
+         * One or more actions should be applied
+         * 
+ * + * repeated .policy.PolicyRuleAction actionList = 4; + */ + @java.lang.Override + public java.util.List getActionListList() { + return actionList_; + } - private monitoring.Monitoring.KpiId kpiId_; + /** + *
+         * One or more actions should be applied
+         * 
+ * + * repeated .policy.PolicyRuleAction actionList = 4; + */ + @java.lang.Override + public java.util.List getActionListOrBuilderList() { + return actionList_; + } /** *
-         * to be migrated to: "kpi_manager.KpiId"
+         * One or more actions should be applied
          * 
* - * .monitoring.KpiId kpiId = 4; - * @return Whether the kpiId field is set. + * repeated .policy.PolicyRuleAction actionList = 4; */ @java.lang.Override - public boolean hasKpiId() { - return kpiId_ != null; + public int getActionListCount() { + return actionList_.size(); } /** *
-         * to be migrated to: "kpi_manager.KpiId"
+         * One or more actions should be applied
          * 
* - * .monitoring.KpiId kpiId = 4; - * @return The kpiId. + * repeated .policy.PolicyRuleAction actionList = 4; */ @java.lang.Override - public monitoring.Monitoring.KpiId getKpiId() { - return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_; + public policy.PolicyAction.PolicyRuleAction getActionList(int index) { + return actionList_.get(index); } /** *
-         * to be migrated to: "kpi_manager.KpiId"
+         * One or more actions should be applied
          * 
* - * .monitoring.KpiId kpiId = 4; + * repeated .policy.PolicyRuleAction actionList = 4; */ @java.lang.Override - public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() { - return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_; + public policy.PolicyAction.PolicyRuleActionOrBuilder getActionListOrBuilder(int index) { + return actionList_.get(index); } - public static final int ACTIONLIST_FIELD_NUMBER = 5; + public static final int POLICYRULEKPILIST_FIELD_NUMBER = 5; @SuppressWarnings("serial") - private java.util.List actionList_; + private java.util.List policyRuleKpiList_; /** *
-         * Event-Condition-Action (ECA) model
+         * List of KPIs associated with this policy
          * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; */ @java.lang.Override - public java.util.List getActionListList() { - return actionList_; + public java.util.List getPolicyRuleKpiListList() { + return policyRuleKpiList_; } /** *
-         * Event-Condition-Action (ECA) model
+         * List of KPIs associated with this policy
          * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; */ @java.lang.Override - public java.util.List getActionListOrBuilderList() { - return actionList_; + public java.util.List getPolicyRuleKpiListOrBuilderList() { + return policyRuleKpiList_; } /** *
-         * Event-Condition-Action (ECA) model
+         * List of KPIs associated with this policy
          * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; */ @java.lang.Override - public int getActionListCount() { - return actionList_.size(); + public int getPolicyRuleKpiListCount() { + return policyRuleKpiList_.size(); } /** *
-         * Event-Condition-Action (ECA) model
+         * List of KPIs associated with this policy
          * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; */ @java.lang.Override - public policy.PolicyAction.PolicyRuleAction getActionList(int index) { - return actionList_.get(index); + public policy.Policy.PolicyRuleKpiId getPolicyRuleKpiList(int index) { + return policyRuleKpiList_.get(index); } /** *
-         * Event-Condition-Action (ECA) model
+         * List of KPIs associated with this policy
          * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; */ @java.lang.Override - public policy.PolicyAction.PolicyRuleActionOrBuilder getActionListOrBuilder(int index) { - return actionList_.get(index); + public policy.Policy.PolicyRuleKpiIdOrBuilder getPolicyRuleKpiListOrBuilder(int index) { + return policyRuleKpiList_.get(index); } private byte memoizedIsInitialized = -1; @@ -1832,14 +2503,14 @@ public final class Policy { if (policyRuleState_ != null) { output.writeMessage(2, getPolicyRuleState()); } - if (priority_ != 0) { - output.writeUInt32(3, priority_); - } - if (kpiId_ != null) { - output.writeMessage(4, getKpiId()); + if (policyRulePriority_ != 0) { + output.writeUInt32(3, policyRulePriority_); } for (int i = 0; i < actionList_.size(); i++) { - output.writeMessage(5, actionList_.get(i)); + output.writeMessage(4, actionList_.get(i)); + } + for (int i = 0; i < policyRuleKpiList_.size(); i++) { + output.writeMessage(5, policyRuleKpiList_.get(i)); } getUnknownFields().writeTo(output); } @@ -1856,14 +2527,14 @@ public final class Policy { if (policyRuleState_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getPolicyRuleState()); } - if (priority_ != 0) { - size += com.google.protobuf.CodedOutputStream.computeUInt32Size(3, priority_); - } - if (kpiId_ != null) { - size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, getKpiId()); + if (policyRulePriority_ != 0) { + size += com.google.protobuf.CodedOutputStream.computeUInt32Size(3, policyRulePriority_); } for (int i = 0; i < actionList_.size(); i++) { - size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, actionList_.get(i)); + size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, actionList_.get(i)); + } + for (int i = 0; i < policyRuleKpiList_.size(); i++) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, policyRuleKpiList_.get(i)); } size += getUnknownFields().getSerializedSize(); memoizedSize = size; @@ -1891,16 +2562,12 @@ public final class Policy { if (!getPolicyRuleState().equals(other.getPolicyRuleState())) return false; } - if (getPriority() != other.getPriority()) + if (getPolicyRulePriority() != other.getPolicyRulePriority()) return false; - if (hasKpiId() != other.hasKpiId()) - return false; - if (hasKpiId()) { - if (!getKpiId().equals(other.getKpiId())) - return false; - } if (!getActionListList().equals(other.getActionListList())) return false; + if (!getPolicyRuleKpiListList().equals(other.getPolicyRuleKpiListList())) + return false; if (!getUnknownFields().equals(other.getUnknownFields())) return false; return true; @@ -1921,16 +2588,16 @@ public final class Policy { hash = (37 * hash) + POLICYRULESTATE_FIELD_NUMBER; hash = (53 * hash) + getPolicyRuleState().hashCode(); } - hash = (37 * hash) + PRIORITY_FIELD_NUMBER; - hash = (53 * hash) + getPriority(); - if (hasKpiId()) { - hash = (37 * hash) + KPIID_FIELD_NUMBER; - hash = (53 * hash) + getKpiId().hashCode(); - } + hash = (37 * hash) + POLICYRULEPRIORITY_FIELD_NUMBER; + hash = (53 * hash) + getPolicyRulePriority(); if (getActionListCount() > 0) { hash = (37 * hash) + ACTIONLIST_FIELD_NUMBER; hash = (53 * hash) + getActionListList().hashCode(); } + if (getPolicyRuleKpiListCount() > 0) { + hash = (37 * hash) + POLICYRULEKPILIST_FIELD_NUMBER; + hash = (53 * hash) + getPolicyRuleKpiListList().hashCode(); + } hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -2049,18 +2716,20 @@ public final class Policy { policyRuleStateBuilder_.dispose(); policyRuleStateBuilder_ = null; } - priority_ = 0; - kpiId_ = null; - if (kpiIdBuilder_ != null) { - kpiIdBuilder_.dispose(); - kpiIdBuilder_ = null; - } + policyRulePriority_ = 0; if (actionListBuilder_ == null) { actionList_ = java.util.Collections.emptyList(); } else { actionList_ = null; actionListBuilder_.clear(); } + bitField0_ = (bitField0_ & ~0x00000008); + if (policyRuleKpiListBuilder_ == null) { + policyRuleKpiList_ = java.util.Collections.emptyList(); + } else { + policyRuleKpiList_ = null; + policyRuleKpiListBuilder_.clear(); + } bitField0_ = (bitField0_ & ~0x00000010); return this; } @@ -2097,14 +2766,23 @@ public final class Policy { private void buildPartialRepeatedFields(policy.Policy.PolicyRuleBasic result) { if (actionListBuilder_ == null) { - if (((bitField0_ & 0x00000010) != 0)) { + if (((bitField0_ & 0x00000008) != 0)) { actionList_ = java.util.Collections.unmodifiableList(actionList_); - bitField0_ = (bitField0_ & ~0x00000010); + bitField0_ = (bitField0_ & ~0x00000008); } result.actionList_ = actionList_; } else { result.actionList_ = actionListBuilder_.build(); } + if (policyRuleKpiListBuilder_ == null) { + if (((bitField0_ & 0x00000010) != 0)) { + policyRuleKpiList_ = java.util.Collections.unmodifiableList(policyRuleKpiList_); + bitField0_ = (bitField0_ & ~0x00000010); + } + result.policyRuleKpiList_ = policyRuleKpiList_; + } else { + result.policyRuleKpiList_ = policyRuleKpiListBuilder_.build(); + } } private void buildPartial0(policy.Policy.PolicyRuleBasic result) { @@ -2116,10 +2794,7 @@ public final class Policy { result.policyRuleState_ = policyRuleStateBuilder_ == null ? policyRuleState_ : policyRuleStateBuilder_.build(); } if (((from_bitField0_ & 0x00000004) != 0)) { - result.priority_ = priority_; - } - if (((from_bitField0_ & 0x00000008) != 0)) { - result.kpiId_ = kpiIdBuilder_ == null ? kpiId_ : kpiIdBuilder_.build(); + result.policyRulePriority_ = policyRulePriority_; } } @@ -2142,17 +2817,14 @@ public final class Policy { if (other.hasPolicyRuleState()) { mergePolicyRuleState(other.getPolicyRuleState()); } - if (other.getPriority() != 0) { - setPriority(other.getPriority()); - } - if (other.hasKpiId()) { - mergeKpiId(other.getKpiId()); + if (other.getPolicyRulePriority() != 0) { + setPolicyRulePriority(other.getPolicyRulePriority()); } if (actionListBuilder_ == null) { if (!other.actionList_.isEmpty()) { if (actionList_.isEmpty()) { actionList_ = other.actionList_; - bitField0_ = (bitField0_ & ~0x00000010); + bitField0_ = (bitField0_ & ~0x00000008); } else { ensureActionListIsMutable(); actionList_.addAll(other.actionList_); @@ -2165,13 +2837,37 @@ public final class Policy { actionListBuilder_.dispose(); actionListBuilder_ = null; actionList_ = other.actionList_; - bitField0_ = (bitField0_ & ~0x00000010); + bitField0_ = (bitField0_ & ~0x00000008); actionListBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getActionListFieldBuilder() : null; } else { actionListBuilder_.addAllMessages(other.actionList_); } } } + if (policyRuleKpiListBuilder_ == null) { + if (!other.policyRuleKpiList_.isEmpty()) { + if (policyRuleKpiList_.isEmpty()) { + policyRuleKpiList_ = other.policyRuleKpiList_; + bitField0_ = (bitField0_ & ~0x00000010); + } else { + ensurePolicyRuleKpiListIsMutable(); + policyRuleKpiList_.addAll(other.policyRuleKpiList_); + } + onChanged(); + } + } else { + if (!other.policyRuleKpiList_.isEmpty()) { + if (policyRuleKpiListBuilder_.isEmpty()) { + policyRuleKpiListBuilder_.dispose(); + policyRuleKpiListBuilder_ = null; + policyRuleKpiList_ = other.policyRuleKpiList_; + bitField0_ = (bitField0_ & ~0x00000010); + policyRuleKpiListBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getPolicyRuleKpiListFieldBuilder() : null; + } else { + policyRuleKpiListBuilder_.addAllMessages(other.policyRuleKpiList_); + } + } + } this.mergeUnknownFields(other.getUnknownFields()); onChanged(); return this; @@ -2211,19 +2907,12 @@ public final class Policy { // case 18 case 24: { - priority_ = input.readUInt32(); + policyRulePriority_ = input.readUInt32(); bitField0_ |= 0x00000004; break; } // case 24 case 34: - { - input.readMessage(getKpiIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000008; - break; - } - // case 34 - case 42: { policy.PolicyAction.PolicyRuleAction m = input.readMessage(policy.PolicyAction.PolicyRuleAction.parser(), extensionRegistry); if (actionListBuilder_ == null) { @@ -2234,6 +2923,18 @@ public final class Policy { } break; } + // case 34 + case 42: + { + policy.Policy.PolicyRuleKpiId m = input.readMessage(policy.Policy.PolicyRuleKpiId.parser(), extensionRegistry); + if (policyRuleKpiListBuilder_ == null) { + ensurePolicyRuleKpiListIsMutable(); + policyRuleKpiList_.add(m); + } else { + policyRuleKpiListBuilder_.addMessage(m); + } + break; + } // case 42 default: { @@ -2263,6 +2964,10 @@ public final class Policy { private com.google.protobuf.SingleFieldBuilderV3 policyRuleIdBuilder_; /** + *
+             * Unique rule ID
+             * 
+ * * .policy.PolicyRuleId policyRuleId = 1; * @return Whether the policyRuleId field is set. */ @@ -2271,6 +2976,10 @@ public final class Policy { } /** + *
+             * Unique rule ID
+             * 
+ * * .policy.PolicyRuleId policyRuleId = 1; * @return The policyRuleId. */ @@ -2283,6 +2992,10 @@ public final class Policy { } /** + *
+             * Unique rule ID
+             * 
+ * * .policy.PolicyRuleId policyRuleId = 1; */ public Builder setPolicyRuleId(policy.Policy.PolicyRuleId value) { @@ -2300,6 +3013,10 @@ public final class Policy { } /** + *
+             * Unique rule ID
+             * 
+ * * .policy.PolicyRuleId policyRuleId = 1; */ public Builder setPolicyRuleId(policy.Policy.PolicyRuleId.Builder builderForValue) { @@ -2314,6 +3031,10 @@ public final class Policy { } /** + *
+             * Unique rule ID
+             * 
+ * * .policy.PolicyRuleId policyRuleId = 1; */ public Builder mergePolicyRuleId(policy.Policy.PolicyRuleId value) { @@ -2332,6 +3053,10 @@ public final class Policy { } /** + *
+             * Unique rule ID
+             * 
+ * * .policy.PolicyRuleId policyRuleId = 1; */ public Builder clearPolicyRuleId() { @@ -2346,6 +3071,10 @@ public final class Policy { } /** + *
+             * Unique rule ID
+             * 
+ * * .policy.PolicyRuleId policyRuleId = 1; */ public policy.Policy.PolicyRuleId.Builder getPolicyRuleIdBuilder() { @@ -2355,6 +3084,10 @@ public final class Policy { } /** + *
+             * Unique rule ID
+             * 
+ * * .policy.PolicyRuleId policyRuleId = 1; */ public policy.Policy.PolicyRuleIdOrBuilder getPolicyRuleIdOrBuilder() { @@ -2366,6 +3099,10 @@ public final class Policy { } /** + *
+             * Unique rule ID
+             * 
+ * * .policy.PolicyRuleId policyRuleId = 1; */ private com.google.protobuf.SingleFieldBuilderV3 getPolicyRuleIdFieldBuilder() { @@ -2381,24 +3118,24 @@ public final class Policy { private com.google.protobuf.SingleFieldBuilderV3 policyRuleStateBuilder_; /** - *
-             * policy.proto:58:12: Explicit 'optional' labels are disallowed in the Proto3 syntax. To define 'optional' fields in Proto3, simply remove the 'optional' label, as fields are 'optional' by default.
-             *  
+ *
+             * Rule lifecycle information
+             * 
* - * .policy.PolicyRuleState policyRuleState = 2; - * @return Whether the policyRuleState field is set. + * .policy.PolicyRuleState policyRuleState = 2; + * @return Whether the policyRuleState field is set. */ public boolean hasPolicyRuleState() { return ((bitField0_ & 0x00000002) != 0); } /** - *
-             * policy.proto:58:12: Explicit 'optional' labels are disallowed in the Proto3 syntax. To define 'optional' fields in Proto3, simply remove the 'optional' label, as fields are 'optional' by default.
-             *  
+ *
+             * Rule lifecycle information
+             * 
* - * .policy.PolicyRuleState policyRuleState = 2; - * @return The policyRuleState. + * .policy.PolicyRuleState policyRuleState = 2; + * @return The policyRuleState. */ public policy.Policy.PolicyRuleState getPolicyRuleState() { if (policyRuleStateBuilder_ == null) { @@ -2409,11 +3146,11 @@ public final class Policy { } /** - *
-             * policy.proto:58:12: Explicit 'optional' labels are disallowed in the Proto3 syntax. To define 'optional' fields in Proto3, simply remove the 'optional' label, as fields are 'optional' by default.
-             *  
+ *
+             * Rule lifecycle information
+             * 
* - * .policy.PolicyRuleState policyRuleState = 2; + * .policy.PolicyRuleState policyRuleState = 2; */ public Builder setPolicyRuleState(policy.Policy.PolicyRuleState value) { if (policyRuleStateBuilder_ == null) { @@ -2430,11 +3167,11 @@ public final class Policy { } /** - *
-             * policy.proto:58:12: Explicit 'optional' labels are disallowed in the Proto3 syntax. To define 'optional' fields in Proto3, simply remove the 'optional' label, as fields are 'optional' by default.
-             *  
+ *
+             * Rule lifecycle information
+             * 
* - * .policy.PolicyRuleState policyRuleState = 2; + * .policy.PolicyRuleState policyRuleState = 2; */ public Builder setPolicyRuleState(policy.Policy.PolicyRuleState.Builder builderForValue) { if (policyRuleStateBuilder_ == null) { @@ -2448,282 +3185,140 @@ public final class Policy { } /** - *
-             * policy.proto:58:12: Explicit 'optional' labels are disallowed in the Proto3 syntax. To define 'optional' fields in Proto3, simply remove the 'optional' label, as fields are 'optional' by default.
-             *  
+ *
+             * Rule lifecycle information
+             * 
* - * .policy.PolicyRuleState policyRuleState = 2; + * .policy.PolicyRuleState policyRuleState = 2; */ public Builder mergePolicyRuleState(policy.Policy.PolicyRuleState value) { if (policyRuleStateBuilder_ == null) { if (((bitField0_ & 0x00000002) != 0) && policyRuleState_ != null && policyRuleState_ != policy.Policy.PolicyRuleState.getDefaultInstance()) { getPolicyRuleStateBuilder().mergeFrom(value); - } else { - policyRuleState_ = value; - } - } else { - policyRuleStateBuilder_.mergeFrom(value); - } - bitField0_ |= 0x00000002; - onChanged(); - return this; - } - - /** - *
-             * policy.proto:58:12: Explicit 'optional' labels are disallowed in the Proto3 syntax. To define 'optional' fields in Proto3, simply remove the 'optional' label, as fields are 'optional' by default.
-             *  
- * - * .policy.PolicyRuleState policyRuleState = 2; - */ - public Builder clearPolicyRuleState() { - bitField0_ = (bitField0_ & ~0x00000002); - policyRuleState_ = null; - if (policyRuleStateBuilder_ != null) { - policyRuleStateBuilder_.dispose(); - policyRuleStateBuilder_ = null; - } - onChanged(); - return this; - } - - /** - *
-             * policy.proto:58:12: Explicit 'optional' labels are disallowed in the Proto3 syntax. To define 'optional' fields in Proto3, simply remove the 'optional' label, as fields are 'optional' by default.
-             *  
- * - * .policy.PolicyRuleState policyRuleState = 2; - */ - public policy.Policy.PolicyRuleState.Builder getPolicyRuleStateBuilder() { - bitField0_ |= 0x00000002; - onChanged(); - return getPolicyRuleStateFieldBuilder().getBuilder(); - } - - /** - *
-             * policy.proto:58:12: Explicit 'optional' labels are disallowed in the Proto3 syntax. To define 'optional' fields in Proto3, simply remove the 'optional' label, as fields are 'optional' by default.
-             *  
- * - * .policy.PolicyRuleState policyRuleState = 2; - */ - public policy.Policy.PolicyRuleStateOrBuilder getPolicyRuleStateOrBuilder() { - if (policyRuleStateBuilder_ != null) { - return policyRuleStateBuilder_.getMessageOrBuilder(); - } else { - return policyRuleState_ == null ? policy.Policy.PolicyRuleState.getDefaultInstance() : policyRuleState_; - } - } - - /** - *
-             * policy.proto:58:12: Explicit 'optional' labels are disallowed in the Proto3 syntax. To define 'optional' fields in Proto3, simply remove the 'optional' label, as fields are 'optional' by default.
-             *  
- * - * .policy.PolicyRuleState policyRuleState = 2; - */ - private com.google.protobuf.SingleFieldBuilderV3 getPolicyRuleStateFieldBuilder() { - if (policyRuleStateBuilder_ == null) { - policyRuleStateBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getPolicyRuleState(), getParentForChildren(), isClean()); - policyRuleState_ = null; - } - return policyRuleStateBuilder_; - } - - private int priority_; - - /** - * uint32 priority = 3; - * @return The priority. - */ - @java.lang.Override - public int getPriority() { - return priority_; - } - - /** - * uint32 priority = 3; - * @param value The priority to set. - * @return This builder for chaining. - */ - public Builder setPriority(int value) { - priority_ = value; - bitField0_ |= 0x00000004; - onChanged(); - return this; - } - - /** - * uint32 priority = 3; - * @return This builder for chaining. - */ - public Builder clearPriority() { - bitField0_ = (bitField0_ & ~0x00000004); - priority_ = 0; - onChanged(); - return this; - } - - private monitoring.Monitoring.KpiId kpiId_; - - private com.google.protobuf.SingleFieldBuilderV3 kpiIdBuilder_; - - /** - *
-             * to be migrated to: "kpi_manager.KpiId"
-             * 
- * - * .monitoring.KpiId kpiId = 4; - * @return Whether the kpiId field is set. - */ - public boolean hasKpiId() { - return ((bitField0_ & 0x00000008) != 0); - } - - /** - *
-             * to be migrated to: "kpi_manager.KpiId"
-             * 
- * - * .monitoring.KpiId kpiId = 4; - * @return The kpiId. - */ - public monitoring.Monitoring.KpiId getKpiId() { - if (kpiIdBuilder_ == null) { - return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_; + } else { + policyRuleState_ = value; + } } else { - return kpiIdBuilder_.getMessage(); + policyRuleStateBuilder_.mergeFrom(value); } + bitField0_ |= 0x00000002; + onChanged(); + return this; } /** *
-             * to be migrated to: "kpi_manager.KpiId"
+             * Rule lifecycle information
              * 
* - * .monitoring.KpiId kpiId = 4; + * .policy.PolicyRuleState policyRuleState = 2; */ - public Builder setKpiId(monitoring.Monitoring.KpiId value) { - if (kpiIdBuilder_ == null) { - if (value == null) { - throw new NullPointerException(); - } - kpiId_ = value; - } else { - kpiIdBuilder_.setMessage(value); + public Builder clearPolicyRuleState() { + bitField0_ = (bitField0_ & ~0x00000002); + policyRuleState_ = null; + if (policyRuleStateBuilder_ != null) { + policyRuleStateBuilder_.dispose(); + policyRuleStateBuilder_ = null; } - bitField0_ |= 0x00000008; onChanged(); return this; } /** *
-             * to be migrated to: "kpi_manager.KpiId"
+             * Rule lifecycle information
              * 
* - * .monitoring.KpiId kpiId = 4; + * .policy.PolicyRuleState policyRuleState = 2; */ - public Builder setKpiId(monitoring.Monitoring.KpiId.Builder builderForValue) { - if (kpiIdBuilder_ == null) { - kpiId_ = builderForValue.build(); - } else { - kpiIdBuilder_.setMessage(builderForValue.build()); - } - bitField0_ |= 0x00000008; + public policy.Policy.PolicyRuleState.Builder getPolicyRuleStateBuilder() { + bitField0_ |= 0x00000002; onChanged(); - return this; + return getPolicyRuleStateFieldBuilder().getBuilder(); } /** *
-             * to be migrated to: "kpi_manager.KpiId"
+             * Rule lifecycle information
              * 
* - * .monitoring.KpiId kpiId = 4; + * .policy.PolicyRuleState policyRuleState = 2; */ - public Builder mergeKpiId(monitoring.Monitoring.KpiId value) { - if (kpiIdBuilder_ == null) { - if (((bitField0_ & 0x00000008) != 0) && kpiId_ != null && kpiId_ != monitoring.Monitoring.KpiId.getDefaultInstance()) { - getKpiIdBuilder().mergeFrom(value); - } else { - kpiId_ = value; - } + public policy.Policy.PolicyRuleStateOrBuilder getPolicyRuleStateOrBuilder() { + if (policyRuleStateBuilder_ != null) { + return policyRuleStateBuilder_.getMessageOrBuilder(); } else { - kpiIdBuilder_.mergeFrom(value); + return policyRuleState_ == null ? policy.Policy.PolicyRuleState.getDefaultInstance() : policyRuleState_; } - bitField0_ |= 0x00000008; - onChanged(); - return this; } /** *
-             * to be migrated to: "kpi_manager.KpiId"
+             * Rule lifecycle information
              * 
* - * .monitoring.KpiId kpiId = 4; + * .policy.PolicyRuleState policyRuleState = 2; */ - public Builder clearKpiId() { - bitField0_ = (bitField0_ & ~0x00000008); - kpiId_ = null; - if (kpiIdBuilder_ != null) { - kpiIdBuilder_.dispose(); - kpiIdBuilder_ = null; + private com.google.protobuf.SingleFieldBuilderV3 getPolicyRuleStateFieldBuilder() { + if (policyRuleStateBuilder_ == null) { + policyRuleStateBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getPolicyRuleState(), getParentForChildren(), isClean()); + policyRuleState_ = null; } - onChanged(); - return this; + return policyRuleStateBuilder_; } + private int policyRulePriority_; + /** *
-             * to be migrated to: "kpi_manager.KpiId"
+             * The priority of this rule
              * 
* - * .monitoring.KpiId kpiId = 4; + * uint32 policyRulePriority = 3; + * @return The policyRulePriority. */ - public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() { - bitField0_ |= 0x00000008; - onChanged(); - return getKpiIdFieldBuilder().getBuilder(); + @java.lang.Override + public int getPolicyRulePriority() { + return policyRulePriority_; } /** *
-             * to be migrated to: "kpi_manager.KpiId"
+             * The priority of this rule
              * 
* - * .monitoring.KpiId kpiId = 4; + * uint32 policyRulePriority = 3; + * @param value The policyRulePriority to set. + * @return This builder for chaining. */ - public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() { - if (kpiIdBuilder_ != null) { - return kpiIdBuilder_.getMessageOrBuilder(); - } else { - return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_; - } + public Builder setPolicyRulePriority(int value) { + policyRulePriority_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; } /** *
-             * to be migrated to: "kpi_manager.KpiId"
+             * The priority of this rule
              * 
* - * .monitoring.KpiId kpiId = 4; + * uint32 policyRulePriority = 3; + * @return This builder for chaining. */ - private com.google.protobuf.SingleFieldBuilderV3 getKpiIdFieldBuilder() { - if (kpiIdBuilder_ == null) { - kpiIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getKpiId(), getParentForChildren(), isClean()); - kpiId_ = null; - } - return kpiIdBuilder_; + public Builder clearPolicyRulePriority() { + bitField0_ = (bitField0_ & ~0x00000004); + policyRulePriority_ = 0; + onChanged(); + return this; } private java.util.List actionList_ = java.util.Collections.emptyList(); private void ensureActionListIsMutable() { - if (!((bitField0_ & 0x00000010) != 0)) { + if (!((bitField0_ & 0x00000008) != 0)) { actionList_ = new java.util.ArrayList(actionList_); - bitField0_ |= 0x00000010; + bitField0_ |= 0x00000008; } } @@ -2731,10 +3326,10 @@ public final class Policy { /** *
-             * Event-Condition-Action (ECA) model
+             * One or more actions should be applied
              * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleAction actionList = 4; */ public java.util.List getActionListList() { if (actionListBuilder_ == null) { @@ -2746,10 +3341,10 @@ public final class Policy { /** *
-             * Event-Condition-Action (ECA) model
+             * One or more actions should be applied
              * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleAction actionList = 4; */ public int getActionListCount() { if (actionListBuilder_ == null) { @@ -2761,10 +3356,10 @@ public final class Policy { /** *
-             * Event-Condition-Action (ECA) model
+             * One or more actions should be applied
              * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleAction actionList = 4; */ public policy.PolicyAction.PolicyRuleAction getActionList(int index) { if (actionListBuilder_ == null) { @@ -2776,10 +3371,10 @@ public final class Policy { /** *
-             * Event-Condition-Action (ECA) model
+             * One or more actions should be applied
              * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleAction actionList = 4; */ public Builder setActionList(int index, policy.PolicyAction.PolicyRuleAction value) { if (actionListBuilder_ == null) { @@ -2797,10 +3392,10 @@ public final class Policy { /** *
-             * Event-Condition-Action (ECA) model
+             * One or more actions should be applied
              * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleAction actionList = 4; */ public Builder setActionList(int index, policy.PolicyAction.PolicyRuleAction.Builder builderForValue) { if (actionListBuilder_ == null) { @@ -2815,10 +3410,10 @@ public final class Policy { /** *
-             * Event-Condition-Action (ECA) model
+             * One or more actions should be applied
              * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleAction actionList = 4; */ public Builder addActionList(policy.PolicyAction.PolicyRuleAction value) { if (actionListBuilder_ == null) { @@ -2836,10 +3431,10 @@ public final class Policy { /** *
-             * Event-Condition-Action (ECA) model
+             * One or more actions should be applied
              * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleAction actionList = 4; */ public Builder addActionList(int index, policy.PolicyAction.PolicyRuleAction value) { if (actionListBuilder_ == null) { @@ -2857,10 +3452,10 @@ public final class Policy { /** *
-             * Event-Condition-Action (ECA) model
+             * One or more actions should be applied
              * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleAction actionList = 4; */ public Builder addActionList(policy.PolicyAction.PolicyRuleAction.Builder builderForValue) { if (actionListBuilder_ == null) { @@ -2875,10 +3470,10 @@ public final class Policy { /** *
-             * Event-Condition-Action (ECA) model
+             * One or more actions should be applied
              * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleAction actionList = 4; */ public Builder addActionList(int index, policy.PolicyAction.PolicyRuleAction.Builder builderForValue) { if (actionListBuilder_ == null) { @@ -2893,10 +3488,10 @@ public final class Policy { /** *
-             * Event-Condition-Action (ECA) model
+             * One or more actions should be applied
              * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleAction actionList = 4; */ public Builder addAllActionList(java.lang.Iterable values) { if (actionListBuilder_ == null) { @@ -2911,15 +3506,15 @@ public final class Policy { /** *
-             * Event-Condition-Action (ECA) model
+             * One or more actions should be applied
              * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleAction actionList = 4; */ public Builder clearActionList() { if (actionListBuilder_ == null) { actionList_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000010); + bitField0_ = (bitField0_ & ~0x00000008); onChanged(); } else { actionListBuilder_.clear(); @@ -2929,10 +3524,10 @@ public final class Policy { /** *
-             * Event-Condition-Action (ECA) model
+             * One or more actions should be applied
              * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleAction actionList = 4; */ public Builder removeActionList(int index) { if (actionListBuilder_ == null) { @@ -2947,10 +3542,10 @@ public final class Policy { /** *
-             * Event-Condition-Action (ECA) model
+             * One or more actions should be applied
              * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleAction actionList = 4; */ public policy.PolicyAction.PolicyRuleAction.Builder getActionListBuilder(int index) { return getActionListFieldBuilder().getBuilder(index); @@ -2958,10 +3553,10 @@ public final class Policy { /** *
-             * Event-Condition-Action (ECA) model
+             * One or more actions should be applied
              * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleAction actionList = 4; */ public policy.PolicyAction.PolicyRuleActionOrBuilder getActionListOrBuilder(int index) { if (actionListBuilder_ == null) { @@ -2973,10 +3568,10 @@ public final class Policy { /** *
-             * Event-Condition-Action (ECA) model
+             * One or more actions should be applied
              * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleAction actionList = 4; */ public java.util.List getActionListOrBuilderList() { if (actionListBuilder_ != null) { @@ -2988,10 +3583,10 @@ public final class Policy { /** *
-             * Event-Condition-Action (ECA) model
+             * One or more actions should be applied
              * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleAction actionList = 4; */ public policy.PolicyAction.PolicyRuleAction.Builder addActionListBuilder() { return getActionListFieldBuilder().addBuilder(policy.PolicyAction.PolicyRuleAction.getDefaultInstance()); @@ -2999,10 +3594,10 @@ public final class Policy { /** *
-             * Event-Condition-Action (ECA) model
+             * One or more actions should be applied
              * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleAction actionList = 4; */ public policy.PolicyAction.PolicyRuleAction.Builder addActionListBuilder(int index) { return getActionListFieldBuilder().addBuilder(index, policy.PolicyAction.PolicyRuleAction.getDefaultInstance()); @@ -3010,10 +3605,10 @@ public final class Policy { /** *
-             * Event-Condition-Action (ECA) model
+             * One or more actions should be applied
              * 
* - * repeated .policy.PolicyRuleAction actionList = 5; + * repeated .policy.PolicyRuleAction actionList = 4; */ public java.util.List getActionListBuilderList() { return getActionListFieldBuilder().getBuilderList(); @@ -3021,12 +3616,321 @@ public final class Policy { private com.google.protobuf.RepeatedFieldBuilderV3 getActionListFieldBuilder() { if (actionListBuilder_ == null) { - actionListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(actionList_, ((bitField0_ & 0x00000010) != 0), getParentForChildren(), isClean()); + actionListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(actionList_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean()); actionList_ = null; } return actionListBuilder_; } + private java.util.List policyRuleKpiList_ = java.util.Collections.emptyList(); + + private void ensurePolicyRuleKpiListIsMutable() { + if (!((bitField0_ & 0x00000010) != 0)) { + policyRuleKpiList_ = new java.util.ArrayList(policyRuleKpiList_); + bitField0_ |= 0x00000010; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3 policyRuleKpiListBuilder_; + + /** + *
+             * List of KPIs associated with this policy
+             * 
+ * + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; + */ + public java.util.List getPolicyRuleKpiListList() { + if (policyRuleKpiListBuilder_ == null) { + return java.util.Collections.unmodifiableList(policyRuleKpiList_); + } else { + return policyRuleKpiListBuilder_.getMessageList(); + } + } + + /** + *
+             * List of KPIs associated with this policy
+             * 
+ * + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; + */ + public int getPolicyRuleKpiListCount() { + if (policyRuleKpiListBuilder_ == null) { + return policyRuleKpiList_.size(); + } else { + return policyRuleKpiListBuilder_.getCount(); + } + } + + /** + *
+             * List of KPIs associated with this policy
+             * 
+ * + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; + */ + public policy.Policy.PolicyRuleKpiId getPolicyRuleKpiList(int index) { + if (policyRuleKpiListBuilder_ == null) { + return policyRuleKpiList_.get(index); + } else { + return policyRuleKpiListBuilder_.getMessage(index); + } + } + + /** + *
+             * List of KPIs associated with this policy
+             * 
+ * + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; + */ + public Builder setPolicyRuleKpiList(int index, policy.Policy.PolicyRuleKpiId value) { + if (policyRuleKpiListBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensurePolicyRuleKpiListIsMutable(); + policyRuleKpiList_.set(index, value); + onChanged(); + } else { + policyRuleKpiListBuilder_.setMessage(index, value); + } + return this; + } + + /** + *
+             * List of KPIs associated with this policy
+             * 
+ * + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; + */ + public Builder setPolicyRuleKpiList(int index, policy.Policy.PolicyRuleKpiId.Builder builderForValue) { + if (policyRuleKpiListBuilder_ == null) { + ensurePolicyRuleKpiListIsMutable(); + policyRuleKpiList_.set(index, builderForValue.build()); + onChanged(); + } else { + policyRuleKpiListBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + + /** + *
+             * List of KPIs associated with this policy
+             * 
+ * + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; + */ + public Builder addPolicyRuleKpiList(policy.Policy.PolicyRuleKpiId value) { + if (policyRuleKpiListBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensurePolicyRuleKpiListIsMutable(); + policyRuleKpiList_.add(value); + onChanged(); + } else { + policyRuleKpiListBuilder_.addMessage(value); + } + return this; + } + + /** + *
+             * List of KPIs associated with this policy
+             * 
+ * + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; + */ + public Builder addPolicyRuleKpiList(int index, policy.Policy.PolicyRuleKpiId value) { + if (policyRuleKpiListBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensurePolicyRuleKpiListIsMutable(); + policyRuleKpiList_.add(index, value); + onChanged(); + } else { + policyRuleKpiListBuilder_.addMessage(index, value); + } + return this; + } + + /** + *
+             * List of KPIs associated with this policy
+             * 
+ * + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; + */ + public Builder addPolicyRuleKpiList(policy.Policy.PolicyRuleKpiId.Builder builderForValue) { + if (policyRuleKpiListBuilder_ == null) { + ensurePolicyRuleKpiListIsMutable(); + policyRuleKpiList_.add(builderForValue.build()); + onChanged(); + } else { + policyRuleKpiListBuilder_.addMessage(builderForValue.build()); + } + return this; + } + + /** + *
+             * List of KPIs associated with this policy
+             * 
+ * + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; + */ + public Builder addPolicyRuleKpiList(int index, policy.Policy.PolicyRuleKpiId.Builder builderForValue) { + if (policyRuleKpiListBuilder_ == null) { + ensurePolicyRuleKpiListIsMutable(); + policyRuleKpiList_.add(index, builderForValue.build()); + onChanged(); + } else { + policyRuleKpiListBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + + /** + *
+             * List of KPIs associated with this policy
+             * 
+ * + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; + */ + public Builder addAllPolicyRuleKpiList(java.lang.Iterable values) { + if (policyRuleKpiListBuilder_ == null) { + ensurePolicyRuleKpiListIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll(values, policyRuleKpiList_); + onChanged(); + } else { + policyRuleKpiListBuilder_.addAllMessages(values); + } + return this; + } + + /** + *
+             * List of KPIs associated with this policy
+             * 
+ * + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; + */ + public Builder clearPolicyRuleKpiList() { + if (policyRuleKpiListBuilder_ == null) { + policyRuleKpiList_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000010); + onChanged(); + } else { + policyRuleKpiListBuilder_.clear(); + } + return this; + } + + /** + *
+             * List of KPIs associated with this policy
+             * 
+ * + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; + */ + public Builder removePolicyRuleKpiList(int index) { + if (policyRuleKpiListBuilder_ == null) { + ensurePolicyRuleKpiListIsMutable(); + policyRuleKpiList_.remove(index); + onChanged(); + } else { + policyRuleKpiListBuilder_.remove(index); + } + return this; + } + + /** + *
+             * List of KPIs associated with this policy
+             * 
+ * + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; + */ + public policy.Policy.PolicyRuleKpiId.Builder getPolicyRuleKpiListBuilder(int index) { + return getPolicyRuleKpiListFieldBuilder().getBuilder(index); + } + + /** + *
+             * List of KPIs associated with this policy
+             * 
+ * + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; + */ + public policy.Policy.PolicyRuleKpiIdOrBuilder getPolicyRuleKpiListOrBuilder(int index) { + if (policyRuleKpiListBuilder_ == null) { + return policyRuleKpiList_.get(index); + } else { + return policyRuleKpiListBuilder_.getMessageOrBuilder(index); + } + } + + /** + *
+             * List of KPIs associated with this policy
+             * 
+ * + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; + */ + public java.util.List getPolicyRuleKpiListOrBuilderList() { + if (policyRuleKpiListBuilder_ != null) { + return policyRuleKpiListBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(policyRuleKpiList_); + } + } + + /** + *
+             * List of KPIs associated with this policy
+             * 
+ * + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; + */ + public policy.Policy.PolicyRuleKpiId.Builder addPolicyRuleKpiListBuilder() { + return getPolicyRuleKpiListFieldBuilder().addBuilder(policy.Policy.PolicyRuleKpiId.getDefaultInstance()); + } + + /** + *
+             * List of KPIs associated with this policy
+             * 
+ * + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; + */ + public policy.Policy.PolicyRuleKpiId.Builder addPolicyRuleKpiListBuilder(int index) { + return getPolicyRuleKpiListFieldBuilder().addBuilder(index, policy.Policy.PolicyRuleKpiId.getDefaultInstance()); + } + + /** + *
+             * List of KPIs associated with this policy
+             * 
+ * + * repeated .policy.PolicyRuleKpiId policyRuleKpiList = 5; + */ + public java.util.List getPolicyRuleKpiListBuilderList() { + return getPolicyRuleKpiListFieldBuilder().getBuilderList(); + } + + private com.google.protobuf.RepeatedFieldBuilderV3 getPolicyRuleKpiListFieldBuilder() { + if (policyRuleKpiListBuilder_ == null) { + policyRuleKpiListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(policyRuleKpiList_, ((bitField0_ & 0x00000010) != 0), getParentForChildren(), isClean()); + policyRuleKpiList_ = null; + } + return policyRuleKpiListBuilder_; + } + @java.lang.Override public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { return super.setUnknownFields(unknownFields); @@ -9312,13 +10216,17 @@ public final class Policy { } } + private static final com.google.protobuf.Descriptors.Descriptor internal_static_policy_PolicyRuleState_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_policy_PolicyRuleState_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor internal_static_policy_PolicyRuleId_descriptor; private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_policy_PolicyRuleId_fieldAccessorTable; - private static final com.google.protobuf.Descriptors.Descriptor internal_static_policy_PolicyRuleState_descriptor; + private static final com.google.protobuf.Descriptors.Descriptor internal_static_policy_PolicyRuleKpiId_descriptor; - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_policy_PolicyRuleState_fieldAccessorTable; + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_policy_PolicyRuleKpiId_fieldAccessorTable; private static final com.google.protobuf.Descriptors.Descriptor internal_static_policy_PolicyRuleBasic_descriptor; @@ -9359,32 +10267,32 @@ public final class Policy { private static com.google.protobuf.Descriptors.FileDescriptor descriptor; static { - java.lang.String[] descriptorData = { "\n\014policy.proto\022\006policy\032\rcontext.proto\032\026p" + "olicy_condition.proto\032\023policy_action.pro" + "to\032\020monitoring.proto\"+\n\014PolicyRuleId\022\033\n\004" + "uuid\030\001 \001(\0132\r.context.Uuid\"g\n\017PolicyRuleS" + "tate\0224\n\017policyRuleState\030\001 \001(\0162\033.policy.P" + "olicyRuleStateEnum\022\036\n\026policyRuleStateMes" + "sage\030\002 \001(\t\"\321\001\n\017PolicyRuleBasic\022*\n\014policy" + "RuleId\030\001 \001(\0132\024.policy.PolicyRuleId\0220\n\017po" + "licyRuleState\030\002 \001(\0132\027.policy.PolicyRuleS" + "tate\022\020\n\010priority\030\003 \001(\r\022 \n\005kpiId\030\004 \001(\0132\021." + "monitoring.KpiId\022,\n\nactionList\030\005 \003(\0132\030.p" + "olicy.PolicyRuleAction\"\223\001\n\021PolicyRuleSer" + "vice\0220\n\017policyRuleBasic\030\001 \001(\0132\027.policy.P" + "olicyRuleBasic\022%\n\tserviceId\030\002 \001(\0132\022.cont" + "ext.ServiceId\022%\n\ndeviceList\030\003 \003(\0132\021.cont" + "ext.DeviceId\"k\n\020PolicyRuleDevice\0220\n\017poli" + "cyRuleBasic\030\001 \001(\0132\027.policy.PolicyRuleBas" + "ic\022%\n\ndeviceList\030\002 \003(\0132\021.context.DeviceI" + "d\"u\n\nPolicyRule\022,\n\007service\030\001 \001(\0132\031.polic" + "y.PolicyRuleServiceH\000\022*\n\006device\030\002 \001(\0132\030." + "policy.PolicyRuleDeviceH\000B\r\n\013policy_rule" + "\"B\n\020PolicyRuleIdList\022.\n\020policyRuleIdList" + "\030\001 \003(\0132\024.policy.PolicyRuleId\"Q\n\025PolicyRu" + "leServiceList\0228\n\025policyRuleServiceList\030\001" + " \003(\0132\031.policy.PolicyRuleService\"N\n\024Polic" + "yRuleDeviceList\0226\n\024policyRuleDeviceList\030" + "\001 \003(\0132\030.policy.PolicyRuleDevice\"9\n\016Polic" + "yRuleList\022\'\n\013policyRules\030\001 \003(\0132\022.policy." + "PolicyRule*\377\001\n\023PolicyRuleStateEnum\022\024\n\020PO" + "LICY_UNDEFINED\020\000\022\021\n\rPOLICY_FAILED\020\001\022\023\n\017P" + "OLICY_INSERTED\020\002\022\024\n\020POLICY_VALIDATED\020\003\022\026" + "\n\022POLICY_PROVISIONED\020\004\022\021\n\rPOLICY_ACTIVE\020" + "\005\022\023\n\017POLICY_ENFORCED\020\006\022\026\n\022POLICY_INEFFEC" + "TIVE\020\007\022\024\n\020POLICY_EFFECTIVE\020\010\022\022\n\016POLICY_U" + "PDATED\020\t\022\022\n\016POLICY_REMOVED\020\n2\323\004\n\rPolicyS" + "ervice\022H\n\020PolicyAddService\022\031.policy.Poli" + "cyRuleService\032\027.policy.PolicyRuleState\"\000" + "\022F\n\017PolicyAddDevice\022\030.policy.PolicyRuleD" + "evice\032\027.policy.PolicyRuleState\"\000\022K\n\023Poli" + "cyUpdateService\022\031.policy.PolicyRuleServi" + "ce\032\027.policy.PolicyRuleState\"\000\022I\n\022PolicyU" + "pdateDevice\022\030.policy.PolicyRuleDevice\032\027." + "policy.PolicyRuleState\"\000\022?\n\014PolicyDelete" + "\022\024.policy.PolicyRuleId\032\027.policy.PolicyRu" + "leState\"\000\022E\n\020GetPolicyService\022\024.policy.P" + "olicyRuleId\032\031.policy.PolicyRuleService\"\000" + "\022C\n\017GetPolicyDevice\022\024.policy.PolicyRuleI" + "d\032\030.policy.PolicyRuleDevice\"\000\022K\n\024GetPoli" + "cyByServiceId\022\022.context.ServiceId\032\035.poli" + "cy.PolicyRuleServiceList\"\000b\006proto3" }; - descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] { context.ContextOuterClass.getDescriptor(), policy.PolicyCondition.getDescriptor(), policy.PolicyAction.getDescriptor(), monitoring.Monitoring.getDescriptor() }); - internal_static_policy_PolicyRuleId_descriptor = getDescriptor().getMessageTypes().get(0); - internal_static_policy_PolicyRuleId_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_policy_PolicyRuleId_descriptor, new java.lang.String[] { "Uuid" }); - internal_static_policy_PolicyRuleState_descriptor = getDescriptor().getMessageTypes().get(1); + java.lang.String[] descriptorData = { "\n\014policy.proto\022\006policy\032\rcontext.proto\032\023p" + "olicy_action.proto\"g\n\017PolicyRuleState\0224\n" + "\017policyRuleState\030\001 \001(\0162\033.policy.PolicyRu" + "leStateEnum\022\036\n\026policyRuleStateMessage\030\002 " + "\001(\t\"+\n\014PolicyRuleId\022\033\n\004uuid\030\001 \001(\0132\r.cont" + "ext.Uuid\";\n\017PolicyRuleKpiId\022(\n\021policyRul" + "eKpiUuid\030\001 \001(\0132\r.context.Uuid\"\355\001\n\017Policy" + "RuleBasic\022*\n\014policyRuleId\030\001 \001(\0132\024.policy" + ".PolicyRuleId\0220\n\017policyRuleState\030\002 \001(\0132\027" + ".policy.PolicyRuleState\022\032\n\022policyRulePri" + "ority\030\003 \001(\r\022,\n\nactionList\030\004 \003(\0132\030.policy" + ".PolicyRuleAction\0222\n\021policyRuleKpiList\030\005" + " \003(\0132\027.policy.PolicyRuleKpiId\"\223\001\n\021Policy" + "RuleService\0220\n\017policyRuleBasic\030\001 \001(\0132\027.p" + "olicy.PolicyRuleBasic\022%\n\tserviceId\030\002 \001(\013" + "2\022.context.ServiceId\022%\n\ndeviceList\030\003 \003(\013" + "2\021.context.DeviceId\"k\n\020PolicyRuleDevice\022" + "0\n\017policyRuleBasic\030\001 \001(\0132\027.policy.Policy" + "RuleBasic\022%\n\ndeviceList\030\002 \003(\0132\021.context." + "DeviceId\"u\n\nPolicyRule\022,\n\007service\030\001 \001(\0132" + "\031.policy.PolicyRuleServiceH\000\022*\n\006device\030\002" + " \001(\0132\030.policy.PolicyRuleDeviceH\000B\r\n\013poli" + "cy_rule\"B\n\020PolicyRuleIdList\022.\n\020policyRul" + "eIdList\030\001 \003(\0132\024.policy.PolicyRuleId\"Q\n\025P" + "olicyRuleServiceList\0228\n\025policyRuleServic" + "eList\030\001 \003(\0132\031.policy.PolicyRuleService\"N" + "\n\024PolicyRuleDeviceList\0226\n\024policyRuleDevi" + "ceList\030\001 \003(\0132\030.policy.PolicyRuleDevice\"9" + "\n\016PolicyRuleList\022\'\n\013policyRules\030\001 \003(\0132\022." + "policy.PolicyRule*\377\001\n\023PolicyRuleStateEnu" + "m\022\024\n\020POLICY_UNDEFINED\020\000\022\021\n\rPOLICY_FAILED" + "\020\001\022\023\n\017POLICY_INSERTED\020\002\022\024\n\020POLICY_VALIDA" + "TED\020\003\022\026\n\022POLICY_PROVISIONED\020\004\022\021\n\rPOLICY_" + "ACTIVE\020\005\022\023\n\017POLICY_ENFORCED\020\006\022\026\n\022POLICY_" + "INEFFECTIVE\020\007\022\024\n\020POLICY_EFFECTIVE\020\010\022\022\n\016P" + "OLICY_UPDATED\020\t\022\022\n\016POLICY_REMOVED\020\n2\323\004\n\r" + "PolicyService\022H\n\020PolicyAddService\022\031.poli" + "cy.PolicyRuleService\032\027.policy.PolicyRule" + "State\"\000\022F\n\017PolicyAddDevice\022\030.policy.Poli" + "cyRuleDevice\032\027.policy.PolicyRuleState\"\000\022" + "K\n\023PolicyUpdateService\022\031.policy.PolicyRu" + "leService\032\027.policy.PolicyRuleState\"\000\022I\n\022" + "PolicyUpdateDevice\022\030.policy.PolicyRuleDe" + "vice\032\027.policy.PolicyRuleState\"\000\022?\n\014Polic" + "yDelete\022\024.policy.PolicyRuleId\032\027.policy.P" + "olicyRuleState\"\000\022E\n\020GetPolicyService\022\024.p" + "olicy.PolicyRuleId\032\031.policy.PolicyRuleSe" + "rvice\"\000\022C\n\017GetPolicyDevice\022\024.policy.Poli" + "cyRuleId\032\030.policy.PolicyRuleDevice\"\000\022K\n\024" + "GetPolicyByServiceId\022\022.context.ServiceId" + "\032\035.policy.PolicyRuleServiceList\"\000b\006proto" + "3" }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] { context.ContextOuterClass.getDescriptor(), policy.PolicyAction.getDescriptor() }); + internal_static_policy_PolicyRuleState_descriptor = getDescriptor().getMessageTypes().get(0); internal_static_policy_PolicyRuleState_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_policy_PolicyRuleState_descriptor, new java.lang.String[] { "PolicyRuleState", "PolicyRuleStateMessage" }); - internal_static_policy_PolicyRuleBasic_descriptor = getDescriptor().getMessageTypes().get(2); - internal_static_policy_PolicyRuleBasic_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_policy_PolicyRuleBasic_descriptor, new java.lang.String[] { "PolicyRuleId", "PolicyRuleState", "Priority", "KpiId", "ActionList" }); - internal_static_policy_PolicyRuleService_descriptor = getDescriptor().getMessageTypes().get(3); + internal_static_policy_PolicyRuleId_descriptor = getDescriptor().getMessageTypes().get(1); + internal_static_policy_PolicyRuleId_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_policy_PolicyRuleId_descriptor, new java.lang.String[] { "Uuid" }); + internal_static_policy_PolicyRuleKpiId_descriptor = getDescriptor().getMessageTypes().get(2); + internal_static_policy_PolicyRuleKpiId_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_policy_PolicyRuleKpiId_descriptor, new java.lang.String[] { "PolicyRuleKpiUuid" }); + internal_static_policy_PolicyRuleBasic_descriptor = getDescriptor().getMessageTypes().get(3); + internal_static_policy_PolicyRuleBasic_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_policy_PolicyRuleBasic_descriptor, new java.lang.String[] { "PolicyRuleId", "PolicyRuleState", "PolicyRulePriority", "ActionList", "PolicyRuleKpiList" }); + internal_static_policy_PolicyRuleService_descriptor = getDescriptor().getMessageTypes().get(4); internal_static_policy_PolicyRuleService_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_policy_PolicyRuleService_descriptor, new java.lang.String[] { "PolicyRuleBasic", "ServiceId", "DeviceList" }); - internal_static_policy_PolicyRuleDevice_descriptor = getDescriptor().getMessageTypes().get(4); + internal_static_policy_PolicyRuleDevice_descriptor = getDescriptor().getMessageTypes().get(5); internal_static_policy_PolicyRuleDevice_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_policy_PolicyRuleDevice_descriptor, new java.lang.String[] { "PolicyRuleBasic", "DeviceList" }); - internal_static_policy_PolicyRule_descriptor = getDescriptor().getMessageTypes().get(5); + internal_static_policy_PolicyRule_descriptor = getDescriptor().getMessageTypes().get(6); internal_static_policy_PolicyRule_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_policy_PolicyRule_descriptor, new java.lang.String[] { "Service", "Device", "PolicyRule" }); - internal_static_policy_PolicyRuleIdList_descriptor = getDescriptor().getMessageTypes().get(6); + internal_static_policy_PolicyRuleIdList_descriptor = getDescriptor().getMessageTypes().get(7); internal_static_policy_PolicyRuleIdList_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_policy_PolicyRuleIdList_descriptor, new java.lang.String[] { "PolicyRuleIdList" }); - internal_static_policy_PolicyRuleServiceList_descriptor = getDescriptor().getMessageTypes().get(7); + internal_static_policy_PolicyRuleServiceList_descriptor = getDescriptor().getMessageTypes().get(8); internal_static_policy_PolicyRuleServiceList_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_policy_PolicyRuleServiceList_descriptor, new java.lang.String[] { "PolicyRuleServiceList" }); - internal_static_policy_PolicyRuleDeviceList_descriptor = getDescriptor().getMessageTypes().get(8); + internal_static_policy_PolicyRuleDeviceList_descriptor = getDescriptor().getMessageTypes().get(9); internal_static_policy_PolicyRuleDeviceList_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_policy_PolicyRuleDeviceList_descriptor, new java.lang.String[] { "PolicyRuleDeviceList" }); - internal_static_policy_PolicyRuleList_descriptor = getDescriptor().getMessageTypes().get(9); + internal_static_policy_PolicyRuleList_descriptor = getDescriptor().getMessageTypes().get(10); internal_static_policy_PolicyRuleList_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_policy_PolicyRuleList_descriptor, new java.lang.String[] { "PolicyRules" }); context.ContextOuterClass.getDescriptor(); - policy.PolicyCondition.getDescriptor(); policy.PolicyAction.getDescriptor(); - monitoring.Monitoring.getDescriptor(); } // @@protoc_insertion_point(outer_class_scope) } diff --git a/src/policy/target/generated-sources/grpc/policy/PolicyCondition.java b/src/policy/target/generated-sources/grpc/policy/PolicyCondition.java deleted file mode 100644 index f5b5fd96737cf062443282e6bcd50053a5fc7097..0000000000000000000000000000000000000000 --- a/src/policy/target/generated-sources/grpc/policy/PolicyCondition.java +++ /dev/null @@ -1,1318 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: policy_condition.proto -package policy; - -public final class PolicyCondition { - - private PolicyCondition() { - } - - public static void registerAllExtensions(com.google.protobuf.ExtensionRegistryLite registry) { - } - - public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) { - registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry); - } - - /** - *
-     * Operator to be used when comparing Kpis with condition values
-     * 
- * - * Protobuf enum {@code policy.NumericalOperator} - */ - public enum NumericalOperator implements com.google.protobuf.ProtocolMessageEnum { - - /** - *
-         * Kpi numerical operator undefined
-         * 
- * - * POLICYRULE_CONDITION_NUMERICAL_UNDEFINED = 0; - */ - POLICYRULE_CONDITION_NUMERICAL_UNDEFINED(0), - /** - *
-         * Kpi is equal with value
-         * 
- * - * POLICYRULE_CONDITION_NUMERICAL_EQUAL = 1; - */ - POLICYRULE_CONDITION_NUMERICAL_EQUAL(1), - /** - *
-         * Kpi is not equal with value
-         * 
- * - * POLICYRULE_CONDITION_NUMERICAL_NOT_EQUAL = 2; - */ - POLICYRULE_CONDITION_NUMERICAL_NOT_EQUAL(2), - /** - *
-         * Kpi is less than value
-         * 
- * - * POLICYRULE_CONDITION_NUMERICAL_LESS_THAN = 3; - */ - POLICYRULE_CONDITION_NUMERICAL_LESS_THAN(3), - /** - *
-         * Kpi is less than or equal with value
-         * 
- * - * POLICYRULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL = 4; - */ - POLICYRULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL(4), - /** - *
-         * Kpi is greater than value
-         * 
- * - * POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN = 5; - */ - POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN(5), - /** - *
-         * Kpi is less than or equal with value
-         * 
- * - * POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL = 6; - */ - POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL(6), - UNRECOGNIZED(-1); - - /** - *
-         * Kpi numerical operator undefined
-         * 
- * - * POLICYRULE_CONDITION_NUMERICAL_UNDEFINED = 0; - */ - public static final int POLICYRULE_CONDITION_NUMERICAL_UNDEFINED_VALUE = 0; - - /** - *
-         * Kpi is equal with value
-         * 
- * - * POLICYRULE_CONDITION_NUMERICAL_EQUAL = 1; - */ - public static final int POLICYRULE_CONDITION_NUMERICAL_EQUAL_VALUE = 1; - - /** - *
-         * Kpi is not equal with value
-         * 
- * - * POLICYRULE_CONDITION_NUMERICAL_NOT_EQUAL = 2; - */ - public static final int POLICYRULE_CONDITION_NUMERICAL_NOT_EQUAL_VALUE = 2; - - /** - *
-         * Kpi is less than value
-         * 
- * - * POLICYRULE_CONDITION_NUMERICAL_LESS_THAN = 3; - */ - public static final int POLICYRULE_CONDITION_NUMERICAL_LESS_THAN_VALUE = 3; - - /** - *
-         * Kpi is less than or equal with value
-         * 
- * - * POLICYRULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL = 4; - */ - public static final int POLICYRULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL_VALUE = 4; - - /** - *
-         * Kpi is greater than value
-         * 
- * - * POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN = 5; - */ - public static final int POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN_VALUE = 5; - - /** - *
-         * Kpi is less than or equal with value
-         * 
- * - * POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL = 6; - */ - public static final int POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL_VALUE = 6; - - 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 NumericalOperator 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 NumericalOperator forNumber(int value) { - switch(value) { - case 0: - return POLICYRULE_CONDITION_NUMERICAL_UNDEFINED; - case 1: - return POLICYRULE_CONDITION_NUMERICAL_EQUAL; - case 2: - return POLICYRULE_CONDITION_NUMERICAL_NOT_EQUAL; - case 3: - return POLICYRULE_CONDITION_NUMERICAL_LESS_THAN; - case 4: - return POLICYRULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL; - case 5: - return POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN; - case 6: - return POLICYRULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL; - 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 NumericalOperator findValueByNumber(int number) { - return NumericalOperator.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 policy.PolicyCondition.getDescriptor().getEnumTypes().get(0); - } - - private static final NumericalOperator[] VALUES = values(); - - public static NumericalOperator 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 NumericalOperator(int value) { - this.value = value; - } - } - - /** - *
-     * Operator to be used when evaluating each condition
-     * 
- * - * Protobuf enum {@code policy.BooleanOperator} - */ - public enum BooleanOperator implements com.google.protobuf.ProtocolMessageEnum { - - /** - *
-         * Boolean operator undefined
-         * 
- * - * POLICYRULE_CONDITION_BOOLEAN_UNDEFINED = 0; - */ - POLICYRULE_CONDITION_BOOLEAN_UNDEFINED(0), - /** - *
-         * Boolean AND operator
-         * 
- * - * POLICYRULE_CONDITION_BOOLEAN_AND = 1; - */ - POLICYRULE_CONDITION_BOOLEAN_AND(1), - /** - *
-         * Boolean OR operator
-         * 
- * - * POLICYRULE_CONDITION_BOOLEAN_OR = 2; - */ - POLICYRULE_CONDITION_BOOLEAN_OR(2), - UNRECOGNIZED(-1); - - /** - *
-         * Boolean operator undefined
-         * 
- * - * POLICYRULE_CONDITION_BOOLEAN_UNDEFINED = 0; - */ - public static final int POLICYRULE_CONDITION_BOOLEAN_UNDEFINED_VALUE = 0; - - /** - *
-         * Boolean AND operator
-         * 
- * - * POLICYRULE_CONDITION_BOOLEAN_AND = 1; - */ - public static final int POLICYRULE_CONDITION_BOOLEAN_AND_VALUE = 1; - - /** - *
-         * Boolean OR operator
-         * 
- * - * POLICYRULE_CONDITION_BOOLEAN_OR = 2; - */ - public static final int POLICYRULE_CONDITION_BOOLEAN_OR_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 BooleanOperator 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 BooleanOperator forNumber(int value) { - switch(value) { - case 0: - return POLICYRULE_CONDITION_BOOLEAN_UNDEFINED; - case 1: - return POLICYRULE_CONDITION_BOOLEAN_AND; - case 2: - return POLICYRULE_CONDITION_BOOLEAN_OR; - 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 BooleanOperator findValueByNumber(int number) { - return BooleanOperator.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 policy.PolicyCondition.getDescriptor().getEnumTypes().get(1); - } - - private static final BooleanOperator[] VALUES = values(); - - public static BooleanOperator 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 BooleanOperator(int value) { - this.value = value; - } - } - - public interface PolicyRuleConditionOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleCondition) - com.google.protobuf.MessageOrBuilder { - - /** - *
-         * to be migrated to: "kpi_manager.KpiId"
-         * 
- * - * .monitoring.KpiId kpiId = 1; - * @return Whether the kpiId field is set. - */ - boolean hasKpiId(); - - /** - *
-         * to be migrated to: "kpi_manager.KpiId"
-         * 
- * - * .monitoring.KpiId kpiId = 1; - * @return The kpiId. - */ - monitoring.Monitoring.KpiId getKpiId(); - - /** - *
-         * to be migrated to: "kpi_manager.KpiId"
-         * 
- * - * .monitoring.KpiId kpiId = 1; - */ - monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder(); - - /** - * .policy.NumericalOperator numericalOperator = 2; - * @return The enum numeric value on the wire for numericalOperator. - */ - int getNumericalOperatorValue(); - - /** - * .policy.NumericalOperator numericalOperator = 2; - * @return The numericalOperator. - */ - policy.PolicyCondition.NumericalOperator getNumericalOperator(); - - /** - * .monitoring.KpiValue kpiValue = 3; - * @return Whether the kpiValue field is set. - */ - boolean hasKpiValue(); - - /** - * .monitoring.KpiValue kpiValue = 3; - * @return The kpiValue. - */ - monitoring.Monitoring.KpiValue getKpiValue(); - - /** - * .monitoring.KpiValue kpiValue = 3; - */ - monitoring.Monitoring.KpiValueOrBuilder getKpiValueOrBuilder(); - } - - /** - *
-     * Condition
-     * 
- * - * Protobuf type {@code policy.PolicyRuleCondition} - */ - 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; - - // Use PolicyRuleCondition.newBuilder() to construct. - private PolicyRuleCondition(com.google.protobuf.GeneratedMessageV3.Builder builder) { - super(builder); - } - - private PolicyRuleCondition() { - numericalOperator_ = 0; - } - - @java.lang.Override - @SuppressWarnings({ "unused" }) - protected java.lang.Object newInstance(UnusedPrivateParameter unused) { - return new PolicyRuleCondition(); - } - - public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return policy.PolicyCondition.internal_static_policy_PolicyRuleCondition_descriptor; - } - - @java.lang.Override - protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { - return policy.PolicyCondition.internal_static_policy_PolicyRuleCondition_fieldAccessorTable.ensureFieldAccessorsInitialized(policy.PolicyCondition.PolicyRuleCondition.class, policy.PolicyCondition.PolicyRuleCondition.Builder.class); - } - - public static final int KPIID_FIELD_NUMBER = 1; - - private monitoring.Monitoring.KpiId kpiId_; - - /** - *
-         * to be migrated to: "kpi_manager.KpiId"
-         * 
- * - * .monitoring.KpiId kpiId = 1; - * @return Whether the kpiId field is set. - */ - @java.lang.Override - public boolean hasKpiId() { - return kpiId_ != null; - } - - /** - *
-         * to be migrated to: "kpi_manager.KpiId"
-         * 
- * - * .monitoring.KpiId kpiId = 1; - * @return The kpiId. - */ - @java.lang.Override - public monitoring.Monitoring.KpiId getKpiId() { - return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_; - } - - /** - *
-         * to be migrated to: "kpi_manager.KpiId"
-         * 
- * - * .monitoring.KpiId kpiId = 1; - */ - @java.lang.Override - public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() { - return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_; - } - - public static final int NUMERICALOPERATOR_FIELD_NUMBER = 2; - - private int numericalOperator_ = 0; - - /** - * .policy.NumericalOperator numericalOperator = 2; - * @return The enum numeric value on the wire for numericalOperator. - */ - @java.lang.Override - public int getNumericalOperatorValue() { - return numericalOperator_; - } - - /** - * .policy.NumericalOperator numericalOperator = 2; - * @return The numericalOperator. - */ - @java.lang.Override - public policy.PolicyCondition.NumericalOperator getNumericalOperator() { - policy.PolicyCondition.NumericalOperator result = policy.PolicyCondition.NumericalOperator.forNumber(numericalOperator_); - return result == null ? policy.PolicyCondition.NumericalOperator.UNRECOGNIZED : result; - } - - public static final int KPIVALUE_FIELD_NUMBER = 3; - - private monitoring.Monitoring.KpiValue kpiValue_; - - /** - * .monitoring.KpiValue kpiValue = 3; - * @return Whether the kpiValue field is set. - */ - @java.lang.Override - public boolean hasKpiValue() { - return kpiValue_ != null; - } - - /** - * .monitoring.KpiValue kpiValue = 3; - * @return The kpiValue. - */ - @java.lang.Override - public monitoring.Monitoring.KpiValue getKpiValue() { - return kpiValue_ == null ? monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiValue_; - } - - /** - * .monitoring.KpiValue kpiValue = 3; - */ - @java.lang.Override - public monitoring.Monitoring.KpiValueOrBuilder getKpiValueOrBuilder() { - return kpiValue_ == null ? monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiValue_; - } - - 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 (kpiId_ != null) { - output.writeMessage(1, getKpiId()); - } - if (numericalOperator_ != policy.PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_UNDEFINED.getNumber()) { - output.writeEnum(2, numericalOperator_); - } - if (kpiValue_ != null) { - output.writeMessage(3, getKpiValue()); - } - getUnknownFields().writeTo(output); - } - - @java.lang.Override - public int getSerializedSize() { - int size = memoizedSize; - if (size != -1) - return size; - size = 0; - if (kpiId_ != null) { - size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getKpiId()); - } - if (numericalOperator_ != policy.PolicyCondition.NumericalOperator.POLICYRULE_CONDITION_NUMERICAL_UNDEFINED.getNumber()) { - size += com.google.protobuf.CodedOutputStream.computeEnumSize(2, numericalOperator_); - } - if (kpiValue_ != null) { - size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, getKpiValue()); - } - 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 policy.PolicyCondition.PolicyRuleCondition)) { - return super.equals(obj); - } - policy.PolicyCondition.PolicyRuleCondition other = (policy.PolicyCondition.PolicyRuleCondition) obj; - if (hasKpiId() != other.hasKpiId()) - return false; - if (hasKpiId()) { - if (!getKpiId().equals(other.getKpiId())) - return false; - } - if (numericalOperator_ != other.numericalOperator_) - return false; - if (hasKpiValue() != other.hasKpiValue()) - return false; - if (hasKpiValue()) { - if (!getKpiValue().equals(other.getKpiValue())) - 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 (hasKpiId()) { - hash = (37 * hash) + KPIID_FIELD_NUMBER; - hash = (53 * hash) + getKpiId().hashCode(); - } - hash = (37 * hash) + NUMERICALOPERATOR_FIELD_NUMBER; - hash = (53 * hash) + numericalOperator_; - if (hasKpiValue()) { - hash = (37 * hash) + KPIVALUE_FIELD_NUMBER; - hash = (53 * hash) + getKpiValue().hashCode(); - } - hash = (29 * hash) + getUnknownFields().hashCode(); - memoizedHashCode = hash; - return hash; - } - - public static policy.PolicyCondition.PolicyRuleCondition parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - - public static policy.PolicyCondition.PolicyRuleCondition parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - - public static policy.PolicyCondition.PolicyRuleCondition parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - - public static policy.PolicyCondition.PolicyRuleCondition parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - - public static policy.PolicyCondition.PolicyRuleCondition parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - - public static policy.PolicyCondition.PolicyRuleCondition parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - - public static policy.PolicyCondition.PolicyRuleCondition parseFrom(java.io.InputStream input) throws java.io.IOException { - return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); - } - - public static policy.PolicyCondition.PolicyRuleCondition 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 policy.PolicyCondition.PolicyRuleCondition parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { - return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); - } - - public static policy.PolicyCondition.PolicyRuleCondition 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 policy.PolicyCondition.PolicyRuleCondition parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { - return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); - } - - public static policy.PolicyCondition.PolicyRuleCondition 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(policy.PolicyCondition.PolicyRuleCondition 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; - } - - /** - *
-         * Condition
-         * 
- * - * 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 com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return policy.PolicyCondition.internal_static_policy_PolicyRuleCondition_descriptor; - } - - @java.lang.Override - protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { - return policy.PolicyCondition.internal_static_policy_PolicyRuleCondition_fieldAccessorTable.ensureFieldAccessorsInitialized(policy.PolicyCondition.PolicyRuleCondition.class, policy.PolicyCondition.PolicyRuleCondition.Builder.class); - } - - // Construct using policy.PolicyCondition.PolicyRuleCondition.newBuilder() - private Builder() { - } - - private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { - super(parent); - } - - @java.lang.Override - public Builder clear() { - super.clear(); - bitField0_ = 0; - kpiId_ = null; - if (kpiIdBuilder_ != null) { - kpiIdBuilder_.dispose(); - kpiIdBuilder_ = null; - } - numericalOperator_ = 0; - kpiValue_ = null; - if (kpiValueBuilder_ != null) { - kpiValueBuilder_.dispose(); - kpiValueBuilder_ = null; - } - return this; - } - - @java.lang.Override - public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { - return policy.PolicyCondition.internal_static_policy_PolicyRuleCondition_descriptor; - } - - @java.lang.Override - public policy.PolicyCondition.PolicyRuleCondition getDefaultInstanceForType() { - return policy.PolicyCondition.PolicyRuleCondition.getDefaultInstance(); - } - - @java.lang.Override - public policy.PolicyCondition.PolicyRuleCondition build() { - policy.PolicyCondition.PolicyRuleCondition result = buildPartial(); - if (!result.isInitialized()) { - throw newUninitializedMessageException(result); - } - return result; - } - - @java.lang.Override - public policy.PolicyCondition.PolicyRuleCondition buildPartial() { - policy.PolicyCondition.PolicyRuleCondition result = new policy.PolicyCondition.PolicyRuleCondition(this); - if (bitField0_ != 0) { - buildPartial0(result); - } - onBuilt(); - return result; - } - - private void buildPartial0(policy.PolicyCondition.PolicyRuleCondition result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.kpiId_ = kpiIdBuilder_ == null ? kpiId_ : kpiIdBuilder_.build(); - } - if (((from_bitField0_ & 0x00000002) != 0)) { - result.numericalOperator_ = numericalOperator_; - } - if (((from_bitField0_ & 0x00000004) != 0)) { - result.kpiValue_ = kpiValueBuilder_ == null ? kpiValue_ : kpiValueBuilder_.build(); - } - } - - @java.lang.Override - public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof policy.PolicyCondition.PolicyRuleCondition) { - return mergeFrom((policy.PolicyCondition.PolicyRuleCondition) other); - } else { - super.mergeFrom(other); - return this; - } - } - - public Builder mergeFrom(policy.PolicyCondition.PolicyRuleCondition other) { - if (other == policy.PolicyCondition.PolicyRuleCondition.getDefaultInstance()) - return this; - if (other.hasKpiId()) { - mergeKpiId(other.getKpiId()); - } - if (other.numericalOperator_ != 0) { - setNumericalOperatorValue(other.getNumericalOperatorValue()); - } - if (other.hasKpiValue()) { - mergeKpiValue(other.getKpiValue()); - } - 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(getKpiIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000001; - break; - } - // case 10 - case 16: - { - numericalOperator_ = input.readEnum(); - bitField0_ |= 0x00000002; - break; - } - // case 16 - case 26: - { - input.readMessage(getKpiValueFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000004; - break; - } - // case 26 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.unwrapIOException(); - } finally { - onChanged(); - } - // finally - return this; - } - - private int bitField0_; - - private monitoring.Monitoring.KpiId kpiId_; - - private com.google.protobuf.SingleFieldBuilderV3 kpiIdBuilder_; - - /** - *
-             * to be migrated to: "kpi_manager.KpiId"
-             * 
- * - * .monitoring.KpiId kpiId = 1; - * @return Whether the kpiId field is set. - */ - public boolean hasKpiId() { - return ((bitField0_ & 0x00000001) != 0); - } - - /** - *
-             * to be migrated to: "kpi_manager.KpiId"
-             * 
- * - * .monitoring.KpiId kpiId = 1; - * @return The kpiId. - */ - public monitoring.Monitoring.KpiId getKpiId() { - if (kpiIdBuilder_ == null) { - return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_; - } else { - return kpiIdBuilder_.getMessage(); - } - } - - /** - *
-             * to be migrated to: "kpi_manager.KpiId"
-             * 
- * - * .monitoring.KpiId kpiId = 1; - */ - public Builder setKpiId(monitoring.Monitoring.KpiId value) { - if (kpiIdBuilder_ == null) { - if (value == null) { - throw new NullPointerException(); - } - kpiId_ = value; - } else { - kpiIdBuilder_.setMessage(value); - } - bitField0_ |= 0x00000001; - onChanged(); - return this; - } - - /** - *
-             * to be migrated to: "kpi_manager.KpiId"
-             * 
- * - * .monitoring.KpiId kpiId = 1; - */ - public Builder setKpiId(monitoring.Monitoring.KpiId.Builder builderForValue) { - if (kpiIdBuilder_ == null) { - kpiId_ = builderForValue.build(); - } else { - kpiIdBuilder_.setMessage(builderForValue.build()); - } - bitField0_ |= 0x00000001; - onChanged(); - return this; - } - - /** - *
-             * to be migrated to: "kpi_manager.KpiId"
-             * 
- * - * .monitoring.KpiId kpiId = 1; - */ - public Builder mergeKpiId(monitoring.Monitoring.KpiId value) { - if (kpiIdBuilder_ == null) { - if (((bitField0_ & 0x00000001) != 0) && kpiId_ != null && kpiId_ != monitoring.Monitoring.KpiId.getDefaultInstance()) { - getKpiIdBuilder().mergeFrom(value); - } else { - kpiId_ = value; - } - } else { - kpiIdBuilder_.mergeFrom(value); - } - bitField0_ |= 0x00000001; - onChanged(); - return this; - } - - /** - *
-             * to be migrated to: "kpi_manager.KpiId"
-             * 
- * - * .monitoring.KpiId kpiId = 1; - */ - public Builder clearKpiId() { - bitField0_ = (bitField0_ & ~0x00000001); - kpiId_ = null; - if (kpiIdBuilder_ != null) { - kpiIdBuilder_.dispose(); - kpiIdBuilder_ = null; - } - onChanged(); - return this; - } - - /** - *
-             * to be migrated to: "kpi_manager.KpiId"
-             * 
- * - * .monitoring.KpiId kpiId = 1; - */ - public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() { - bitField0_ |= 0x00000001; - onChanged(); - return getKpiIdFieldBuilder().getBuilder(); - } - - /** - *
-             * to be migrated to: "kpi_manager.KpiId"
-             * 
- * - * .monitoring.KpiId kpiId = 1; - */ - public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() { - if (kpiIdBuilder_ != null) { - return kpiIdBuilder_.getMessageOrBuilder(); - } else { - return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_; - } - } - - /** - *
-             * to be migrated to: "kpi_manager.KpiId"
-             * 
- * - * .monitoring.KpiId kpiId = 1; - */ - private com.google.protobuf.SingleFieldBuilderV3 getKpiIdFieldBuilder() { - if (kpiIdBuilder_ == null) { - kpiIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getKpiId(), getParentForChildren(), isClean()); - kpiId_ = null; - } - return kpiIdBuilder_; - } - - private int numericalOperator_ = 0; - - /** - * .policy.NumericalOperator numericalOperator = 2; - * @return The enum numeric value on the wire for numericalOperator. - */ - @java.lang.Override - public int getNumericalOperatorValue() { - return numericalOperator_; - } - - /** - * .policy.NumericalOperator numericalOperator = 2; - * @param value The enum numeric value on the wire for numericalOperator to set. - * @return This builder for chaining. - */ - public Builder setNumericalOperatorValue(int value) { - numericalOperator_ = value; - bitField0_ |= 0x00000002; - onChanged(); - return this; - } - - /** - * .policy.NumericalOperator numericalOperator = 2; - * @return The numericalOperator. - */ - @java.lang.Override - public policy.PolicyCondition.NumericalOperator getNumericalOperator() { - policy.PolicyCondition.NumericalOperator result = policy.PolicyCondition.NumericalOperator.forNumber(numericalOperator_); - return result == null ? policy.PolicyCondition.NumericalOperator.UNRECOGNIZED : result; - } - - /** - * .policy.NumericalOperator numericalOperator = 2; - * @param value The numericalOperator to set. - * @return This builder for chaining. - */ - public Builder setNumericalOperator(policy.PolicyCondition.NumericalOperator value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000002; - numericalOperator_ = value.getNumber(); - onChanged(); - return this; - } - - /** - * .policy.NumericalOperator numericalOperator = 2; - * @return This builder for chaining. - */ - public Builder clearNumericalOperator() { - bitField0_ = (bitField0_ & ~0x00000002); - numericalOperator_ = 0; - onChanged(); - return this; - } - - private monitoring.Monitoring.KpiValue kpiValue_; - - private com.google.protobuf.SingleFieldBuilderV3 kpiValueBuilder_; - - /** - * .monitoring.KpiValue kpiValue = 3; - * @return Whether the kpiValue field is set. - */ - public boolean hasKpiValue() { - return ((bitField0_ & 0x00000004) != 0); - } - - /** - * .monitoring.KpiValue kpiValue = 3; - * @return The kpiValue. - */ - public monitoring.Monitoring.KpiValue getKpiValue() { - if (kpiValueBuilder_ == null) { - return kpiValue_ == null ? monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiValue_; - } else { - return kpiValueBuilder_.getMessage(); - } - } - - /** - * .monitoring.KpiValue kpiValue = 3; - */ - public Builder setKpiValue(monitoring.Monitoring.KpiValue value) { - if (kpiValueBuilder_ == null) { - if (value == null) { - throw new NullPointerException(); - } - kpiValue_ = value; - } else { - kpiValueBuilder_.setMessage(value); - } - bitField0_ |= 0x00000004; - onChanged(); - return this; - } - - /** - * .monitoring.KpiValue kpiValue = 3; - */ - public Builder setKpiValue(monitoring.Monitoring.KpiValue.Builder builderForValue) { - if (kpiValueBuilder_ == null) { - kpiValue_ = builderForValue.build(); - } else { - kpiValueBuilder_.setMessage(builderForValue.build()); - } - bitField0_ |= 0x00000004; - onChanged(); - return this; - } - - /** - * .monitoring.KpiValue kpiValue = 3; - */ - public Builder mergeKpiValue(monitoring.Monitoring.KpiValue value) { - if (kpiValueBuilder_ == null) { - if (((bitField0_ & 0x00000004) != 0) && kpiValue_ != null && kpiValue_ != monitoring.Monitoring.KpiValue.getDefaultInstance()) { - getKpiValueBuilder().mergeFrom(value); - } else { - kpiValue_ = value; - } - } else { - kpiValueBuilder_.mergeFrom(value); - } - bitField0_ |= 0x00000004; - onChanged(); - return this; - } - - /** - * .monitoring.KpiValue kpiValue = 3; - */ - public Builder clearKpiValue() { - bitField0_ = (bitField0_ & ~0x00000004); - kpiValue_ = null; - if (kpiValueBuilder_ != null) { - kpiValueBuilder_.dispose(); - kpiValueBuilder_ = null; - } - onChanged(); - return this; - } - - /** - * .monitoring.KpiValue kpiValue = 3; - */ - public monitoring.Monitoring.KpiValue.Builder getKpiValueBuilder() { - bitField0_ |= 0x00000004; - onChanged(); - return getKpiValueFieldBuilder().getBuilder(); - } - - /** - * .monitoring.KpiValue kpiValue = 3; - */ - public monitoring.Monitoring.KpiValueOrBuilder getKpiValueOrBuilder() { - if (kpiValueBuilder_ != null) { - return kpiValueBuilder_.getMessageOrBuilder(); - } else { - return kpiValue_ == null ? monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiValue_; - } - } - - /** - * .monitoring.KpiValue kpiValue = 3; - */ - private com.google.protobuf.SingleFieldBuilderV3 getKpiValueFieldBuilder() { - if (kpiValueBuilder_ == null) { - kpiValueBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getKpiValue(), getParentForChildren(), isClean()); - kpiValue_ = null; - } - return kpiValueBuilder_; - } - - @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:policy.PolicyRuleCondition) - } - - // @@protoc_insertion_point(class_scope:policy.PolicyRuleCondition) - private static final policy.PolicyCondition.PolicyRuleCondition DEFAULT_INSTANCE; - - static { - DEFAULT_INSTANCE = new policy.PolicyCondition.PolicyRuleCondition(); - } - - public static policy.PolicyCondition.PolicyRuleCondition getDefaultInstance() { - return DEFAULT_INSTANCE; - } - - private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { - - @java.lang.Override - public PolicyRuleCondition parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); - } - }; - - public static com.google.protobuf.Parser parser() { - return PARSER; - } - - @java.lang.Override - public com.google.protobuf.Parser getParserForType() { - return PARSER; - } - - @java.lang.Override - public policy.PolicyCondition.PolicyRuleCondition getDefaultInstanceForType() { - return DEFAULT_INSTANCE; - } - } - - private static final com.google.protobuf.Descriptors.Descriptor internal_static_policy_PolicyRuleCondition_descriptor; - - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_policy_PolicyRuleCondition_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\026policy_condition.proto\022\006policy\032\020monito" + "ring.proto\"\225\001\n\023PolicyRuleCondition\022 \n\005kp" + "iId\030\001 \001(\0132\021.monitoring.KpiId\0224\n\021numerica" + "lOperator\030\002 \001(\0162\031.policy.NumericalOperat" + "or\022&\n\010kpiValue\030\003 \001(\0132\024.monitoring.KpiVal" + "ue*\343\002\n\021NumericalOperator\022,\n(POLICYRULE_C" + "ONDITION_NUMERICAL_UNDEFINED\020\000\022(\n$POLICY" + "RULE_CONDITION_NUMERICAL_EQUAL\020\001\022,\n(POLI" + "CYRULE_CONDITION_NUMERICAL_NOT_EQUAL\020\002\022," + "\n(POLICYRULE_CONDITION_NUMERICAL_LESS_TH" + "AN\020\003\0222\n.POLICYRULE_CONDITION_NUMERICAL_L" + "ESS_THAN_EQUAL\020\004\022/\n+POLICYRULE_CONDITION" + "_NUMERICAL_GREATER_THAN\020\005\0225\n1POLICYRULE_" + "CONDITION_NUMERICAL_GREATER_THAN_EQUAL\020\006" + "*\210\001\n\017BooleanOperator\022*\n&POLICYRULE_CONDI" + "TION_BOOLEAN_UNDEFINED\020\000\022$\n POLICYRULE_C" + "ONDITION_BOOLEAN_AND\020\001\022#\n\037POLICYRULE_CON" + "DITION_BOOLEAN_OR\020\002b\006proto3" }; - descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] { monitoring.Monitoring.getDescriptor() }); - internal_static_policy_PolicyRuleCondition_descriptor = getDescriptor().getMessageTypes().get(0); - internal_static_policy_PolicyRuleCondition_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_policy_PolicyRuleCondition_descriptor, new java.lang.String[] { "KpiId", "NumericalOperator", "KpiValue" }); - monitoring.Monitoring.getDescriptor(); - } - // @@protoc_insertion_point(outer_class_scope) -} diff --git a/src/policy/target/kubernetes/kubernetes.yml b/src/policy/target/kubernetes/kubernetes.yml index cab8865e081bed2991ff9df730d5efe97c0b9e9e..2af0c358781197d297972a75e2570d263e15c406 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: 81b25ce03beb7463bc8bb5fcecf6a2cf4f64ddc4 + app.quarkus.io/build-timestamp: 2026-03-30 - 08:42:32 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -17,10 +17,6 @@ metadata: name: policyservice spec: ports: - - name: http - port: 9192 - protocol: TCP - targetPort: 8080 - name: grpc port: 6060 protocol: TCP @@ -29,6 +25,10 @@ spec: port: 443 protocol: TCP targetPort: 8443 + - name: http + port: 9192 + protocol: TCP + targetPort: 8080 selector: app.kubernetes.io/name: policyservice type: ClusterIP @@ -37,8 +37,8 @@ apiVersion: apps/v1 kind: Deployment metadata: annotations: - app.quarkus.io/commit-id: 0539e363a3349889ebd7d3d7b0509744e2a4d0aa - app.quarkus.io/build-timestamp: 2025-10-28 - 10:10:47 +0000 + app.quarkus.io/commit-id: 81b25ce03beb7463bc8bb5fcecf6a2cf4f64ddc4 + app.quarkus.io/build-timestamp: 2026-03-30 - 08:42:32 +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: 81b25ce03beb7463bc8bb5fcecf6a2cf4f64ddc4 + app.quarkus.io/build-timestamp: 2026-03-30 - 08:42:32 +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: 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 + - name: CONTEXT_SERVICE_HOST + value: contextservice image: labs.etsi.org:5050/tfs/controller/policy:0.1.0 imagePullPolicy: Always livenessProbe: @@ -97,15 +97,15 @@ spec: timeoutSeconds: 10 name: policyservice ports: - - containerPort: 8080 - name: http - protocol: TCP - containerPort: 6060 name: grpc protocol: TCP - containerPort: 8443 name: https protocol: TCP + - containerPort: 8080 + name: http + protocol: TCP readinessProbe: failureThreshold: 3 httpGet: diff --git a/src/service/service/ServiceServiceServicerImpl.py b/src/service/service/ServiceServiceServicerImpl.py index 98b0a267000cf9e21cbebb1c0257542a2cc8efd4..272174d9924baad575493b9617a7acfd2035dc2f 100644 --- a/src/service/service/ServiceServiceServicerImpl.py +++ b/src/service/service/ServiceServiceServicerImpl.py @@ -343,9 +343,7 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): reply_txt = add_lightpath(src, dst, bitrate, bidir) else: reply_txt = add_flex_lightpath(src, dst, bitrate, bidir, preferred, ob_band, dj_optical_band_id) - #logging.info(f"TEEEEEEEEEEEEEEST {oc_type}") - #logging.info(f"POLIMI {reply_txt}") - if reply_txt == None: + if reply_txt is None: return service_with_uuids.service_id reply_json = json.loads(reply_txt) LOGGER.debug('[optical] reply_json[{:s}]={:s}'.format(str(type(reply_json)), str(reply_json))) @@ -542,6 +540,7 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def RecomputeConnections(self, request : Service, context : grpc.ServicerContext) -> Empty: + if len(request.service_endpoint_ids) > 0: raise NotImplementedException('update-endpoints') @@ -549,7 +548,9 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): raise NotImplementedException('update-constraints') if len(request.service_config.config_rules) > 0: - raise NotImplementedException('update-config-rules') + del request.service_config.config_rules[:] + # raise NotImplementedException('update-config-rules') + LOGGER.error('update-config-rules not implemented') context_client = ContextClient() @@ -593,11 +594,9 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): updated_service_with_uuids = get_service_by_id( context_client, updated_service_id_with_uuids, rw_copy=True, include_config_rules=True, include_constraints=True, include_endpoint_ids=True) - LOGGER.info('WYY:{}'.format(updated_service_with_uuids)) # Get active connection connections = context_client.ListConnections(updated_service_id_with_uuids) - LOGGER.info('WWWW:{}'.format(connections)) if len(connections.connections) == 0: MSG = 'Service({:s}) has no connections' str_service_id = grpc_message_to_json_string(updated_service_id_with_uuids) @@ -621,7 +620,6 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): raise NotImplementedException('service-connection-with-subservices', extra_details=str_extra_details) if updated_service.service_type == ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY: - LOGGER.info('WWWW:{}'.format("is optical")) context_id_x = json_context_id(DEFAULT_CONTEXT_NAME) topology_id_x = json_topology_id( DEFAULT_TOPOLOGY_NAME, context_id_x) @@ -629,8 +627,6 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): TopologyId(**topology_id_x)) str_old_connection = connection_to_string(old_connection) - LOGGER.info('WWW old_connection={}'.format(grpc_message_to_json_string(old_connection))) - LOGGER.info('WWW0={}'.format(updated_service_with_uuids.service_config.config_rules)) if len(updated_service_with_uuids.service_config.config_rules)> 0: #if len(updated_service.service_config.config_rules) > 0: c_rules_dict = json.loads( @@ -638,7 +634,6 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): #c_rules_dict = json.loads( # updated_service.service_config.config_rules[0].custom.resource_value) - LOGGER.info('WWW1:{}'.format(c_rules_dict)) flow_id=None #if "ob_id" in c_rules_dict: # ob_id = c_rules_dict["ob_id"] @@ -660,20 +655,17 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): device_uuid = device.device_id.device_uuid.uuid device_names[device_uuid] = device.name - if reply_txt is not "": + if reply_txt != '': optical_reply = adapt_reply(devices, updated_service, reply_json, context_uuid_x, topology_uuid_x, "") new_connection = optical_reply.connections[0] #for candidate_new_connection in pathcomp_reply.connections: str_candidate_new_connection = connection_to_string(new_connection) - LOGGER.info('QQQQ_old:{}'.format(str_old_connection)) - LOGGER.info('QQQQ_new:{}'.format(str_candidate_new_connection)) # Change UUID of new connection to prevent collisions tmp_connection = Connection() tmp_connection.CopyFrom(new_connection) tmp_connection.connection_id.connection_uuid.uuid = str(uuid.uuid4()) new_connection = tmp_connection service_new = optical_reply.services[0] - LOGGER.info('QQQQ:{}'.format(service_new)) # Feed TaskScheduler with the service to update, the old connection to # deconfigure and the new connection to configure. It will produce a # schedule of tasks (an ordered list of tasks to be executed) to @@ -686,7 +678,6 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): tasks_scheduler.execute_all() else: if ("ob_id" in c_rules_dict) and ("low-freq" in c_rules_dict): - LOGGER.info('PDP: it is an optical band') ob_id = c_rules_dict["ob_id"] band_txt = get_optical_band(ob_id) optical_band = json.loads(band_txt) @@ -694,14 +685,12 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): optical_band = None obs = context_client.GetOpticalBand() for obz in obs: - LOGGER.info(f"PDP: {obz.opticalband_id}") if obz.opticalband_id == ob_id: optical_band = obz if optical_band is not None: ''' #optical_band = context_client.SelectOpticalBand(ob_id) served_flows = optical_band.get('served_lightpaths') - LOGGER.info(f'PDP: served flows {served_flows}') #context_id_x = json_context_id(DEFAULT_CONTEXT_NAME) response = context_client.ListServices(ContextId(**json_context_id(DEFAULT_CONTEXT_NAME))) #response = context_client.ListServices(context_id_x) @@ -717,7 +706,7 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): ) if ("flow_id" in c_rules_dict): flow_id = c_rules_dict["flow_id"] - LOGGER.info(f"PDP checking {flow_id} and {served_flows}") + LOGGER.info(f"Checking {flow_id} and {served_flows}") if flow_id in served_flows: ########## updated_service : Optional[Service] = get_service_by_id( @@ -730,27 +719,17 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): updated_service_with_uuids = get_service_by_id( context_client, updated_service_id_with_uuids, rw_copy=True, include_config_rules=True, include_constraints=True, include_endpoint_ids=True) - LOGGER.info('WYY:{}'.format(updated_service_with_uuids)) # Get active connection connections = context_client.ListConnections(updated_service_id_with_uuids) - LOGGER.info('WWWW:{}'.format(connections)) old_connection = connections.connections[0] - ''' - for service_idc in service_ids: - service_d = context_client.GetService(service_idc) - c_rules_dict = json.loads( - service_d.service_config.config_rules[0].custom.resource_value) - ''' - LOGGER.info('PDP:{}'.format(c_rules_dict)) flow_id = c_rules_dict["flow_id"] reply_txt = "" # to get the reply form the optical module #multi-granular reply_txt = reconfig_flex_lightpath(flow_id) reply_json = json.loads(reply_txt) - LOGGER.info('[PDP] reply_json[{:s}]={:s}'.format(str(type(reply_json)), str(reply_json))) devices = topology_details.devices context_uuid_x = topology_details.topology_id.context_id.context_uuid.uuid topology_uuid_x = topology_details.topology_id.topology_uuid.uuid @@ -760,20 +739,17 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): device_uuid = device.device_id.device_uuid.uuid device_names[device_uuid] = device.name - if reply_txt is not "": + if reply_txt != '': optical_reply = adapt_reply(devices, updated_service, reply_json, context_uuid_x, topology_uuid_x, "") new_connection = optical_reply.connections[0] #for candidate_new_connection in pathcomp_reply.connections: str_candidate_new_connection = connection_to_string(new_connection) - LOGGER.info('QQQQ_old:{}'.format(str_old_connection)) - LOGGER.info('QQQQ_new:{}'.format(str_candidate_new_connection)) # Change UUID of new connection to prevent collisions tmp_connection = Connection() tmp_connection.CopyFrom(new_connection) tmp_connection.connection_id.connection_uuid.uuid = str(uuid.uuid4()) new_connection = tmp_connection service_new = optical_reply.services[0] - LOGGER.info('QQQQ:{}'.format(service_new)) # Feed TaskScheduler with the service to update, the old connection to diff --git a/src/service/service/monitoring.py b/src/service/service/monitoring.py deleted file mode 100644 index dad72f00a837ccc0251a4dc5983bf8b38628750d..0000000000000000000000000000000000000000 --- a/src/service/service/monitoring.py +++ /dev/null @@ -1,148 +0,0 @@ -import uuid -from common.proto import kpi_manager_pb2 -from common.proto.kpi_sample_types_pb2 import KpiSampleType -from kpi_manager.client.KpiManagerClient import KpiManagerClient -import logging -import pytest -from common.proto.kpi_manager_pb2 import KpiId, KpiDescriptor, KpiDescriptorFilter, KpiDescriptorList - -import uuid -from common.proto import kpi_manager_pb2 -from common.proto.kpi_sample_types_pb2 import KpiSampleType -from src.telemetry.backend.service.collectors.gnmi_oc.KPI import KPI - -from telemetry.backend.service.collectors.gnmi_oc.GnmiOpenConfigCollector import GNMIOpenConfigCollector - - -LOGGER = logging.getLogger(__name__) -LOGGER.setLevel(logging.DEBUG) - - -@pytest.fixture(scope='session') -def kpi_manager_client(): - LOGGER.info('Starting KpiManagerClient...') - _client = KpiManagerClient(host="10.152.183.91") - _client.connect() - LOGGER.info('Yielding Connected KpiManagerClient...') - yield _client - LOGGER.info('Closed KpiManagerClient...') - _client.close() - - - -def create_kpi_descriptor_request(descriptor_name: str = "optical_monitoring"): - _create_kpi_request = kpi_manager_pb2.KpiDescriptor() - #_create_kpi_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) - _create_kpi_request.kpi_id.kpi_id.uuid = "6e22f180-ba28-4641-b190-2287bf448888" - # _create_kpi_request.kpi_id.kpi_id.uuid = "f974b6cc-095f-4767-b8c1-3457b383fb99" - _create_kpi_request.kpi_description = descriptor_name - _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT - #_create_kpi_request.device_id.device_uuid.uuid = str(uuid.uuid4()) - _create_kpi_request.device_id.device_uuid.uuid = "5dc3f5d7-d3a9-5057-a9a0-8af943a5461c" - _create_kpi_request.service_id.service_uuid.uuid = 'SERV2' - _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC1' - #_create_kpi_request.endpoint_id.endpoint_uuid.uuid = str(uuid.uuid4()) - _create_kpi_request.endpoint_id.endpoint_uuid.uuid = "decb9c95-7298-5ec8-a4b6-7f276f595106" - _create_kpi_request.connection_id.connection_uuid.uuid = 'CON1' - _create_kpi_request.link_id.link_uuid.uuid = 'LNK1' - return _create_kpi_request - - -''' -def test_SetKpiDescriptor(kpi_manager_client): - LOGGER.info(" >>> test_SetKpiDescriptor: START <<< ") - response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) - LOGGER.info("Response gRPC message object: {:}".format(response)) - assert isinstance(response, KpiId) -''' - -''' -def test_GetKpiDescriptor(kpi_manager_client): - LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ") - # adding KPI - response_id = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) - # get KPI - response = kpi_manager_client.GetKpiDescriptor(response_id) - LOGGER.info("Response gRPC message object: {:}".format(response)) - assert isinstance(response, KpiDescriptor) -''' - -# Test device connection parameters -devices = { - 'device1': { - 'host': '172.17.254.22', - 'port': '50061', - 'username': 'admin', - 'password': 'admin', - 'insecure': True, - } -} - -def create_basic_sub_request_parameters( - resource: str = 'components', - endpoint: str = 'port-1-in', # 'Ethernet1', - kpi: KPI = KPI.KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT, # It should be KPI Id not name? Need to be replaced with KPI id. -) -> dict: - - device = devices['device1'] - return { - 'target' : (device['host'], device['port']), - 'username' : device['username'], - 'password' : device['password'], - 'connect_timeout' : 15, - 'insecure' : device['insecure'], - 'mode' : 'sample', # Subscription internal mode posibly: on_change, poll, sample - 'sample_interval_ns': '3s', - 'sample_interval' : '10s', - 'kpi' : kpi, - 'resource' : resource, - 'endpoint' : endpoint, - } - - -@pytest.fixture -def sub_parameters(): - """Fixture to provide subscription parameters.""" - return create_basic_sub_request_parameters() - - -@pytest.fixture -def collector(sub_parameters): - """Fixture to create and connect GNMI collector.""" - collector = GNMIOpenConfigCollector( - username = sub_parameters['username'], - password = sub_parameters['password'], - insecure = sub_parameters['insecure'], - address = sub_parameters['target'][0], - port = sub_parameters['target'][1], - ) - collector.Connect() - yield collector - collector.Disconnect() - - -@pytest.fixture -def subscription_data(sub_parameters): - """Fixture to provide subscription data.""" - # It should return a list of tuples with subscription parameters. - return [ - ( - "sub_id_123", - { - "kpi" : sub_parameters['kpi'], - "endpoint" : sub_parameters['endpoint'], - "resource" : sub_parameters['resource'], - }, - float(10.0), - float(5.0), - ), - ] - - -def test_collector_connection(collector): - """Test collector connection.""" - LOGGER.info("----- Testing GNMI OpenConfig Collector Connection -----") - assert collector.connected is True - LOGGER.debug("Collector connected: %s", collector.connected) - - diff --git a/src/service/service/service_handler_api/Exceptions.py b/src/service/service/service_handler_api/Exceptions.py index 7a10ff3343770329f1f983b739078b9cffe724aa..bc6ac4c8fcc05e79fdd1bacf638738736460b16d 100644 --- a/src/service/service/service_handler_api/Exceptions.py +++ b/src/service/service/service_handler_api/Exceptions.py @@ -13,17 +13,32 @@ # limitations under the License. class UnsatisfiedFilterException(Exception): - def __init__(self, filter_fields): + def __init__(self, filter_fields) -> None: msg = 'No ServiceHandler satisfies FilterFields({:s})' super().__init__(msg.format(str(filter_fields))) +class AmbiguousFilterException(Exception): + def __init__(self, filter_fields, compatible_service_handlers) -> None: + msg = 'Multiple Service Handlers satisfy FilterFields({:s}): {:s}' + super().__init__(msg.format(str(filter_fields), str(compatible_service_handlers))) + class UnsupportedServiceHandlerClassException(Exception): - def __init__(self, service_handler_class_name): + def __init__(self, service_handler_class_name) -> None: msg = 'Class({:s}) is not a subclass of _ServiceHandler' super().__init__(msg.format(str(service_handler_class_name))) +class EmptyFilterFieldException(Exception): + def __init__(self, filter_fields, service_handler_class_name=None) -> None: + if service_handler_class_name: + msg = 'Empty FilterField({:s}) specified by ServiceHandler({:s}) is not supported' + msg = msg.format(str(filter_fields), str(service_handler_class_name)) + else: + msg = 'Empty FilterField({:s}) is not supported' + msg = msg.format(str(filter_fields)) + super().__init__(msg) + class UnsupportedFilterFieldException(Exception): - def __init__(self, unsupported_filter_fields, service_handler_class_name=None): + def __init__(self, unsupported_filter_fields, service_handler_class_name=None) -> None: if service_handler_class_name: msg = 'FilterFields({:s}) specified by ServiceHandler({:s}) are not supported' msg = msg.format(str(unsupported_filter_fields), str(service_handler_class_name)) @@ -34,8 +49,8 @@ class UnsupportedFilterFieldException(Exception): class UnsupportedFilterFieldValueException(Exception): def __init__( - self, filter_field_name, filter_field_value, allowed_filter_field_values, service_handler_class_name=None): - + self, filter_field_name, filter_field_value, allowed_filter_field_values, service_handler_class_name=None + ) -> None: if service_handler_class_name: msg = 'FilterField({:s}={:s}) specified by ServiceHandler({:s}) is not supported. Allowed values are {:s}' msg = msg.format( @@ -47,20 +62,19 @@ class UnsupportedFilterFieldValueException(Exception): super().__init__(msg) #class UnsupportedResourceKeyException(Exception): -# def __init__(self, resource_key): +# def __init__(self, resource_key) -> None: # msg = 'ResourceKey({:s}) not supported' # msg = msg.format(str(resource_key)) # super().__init__(msg) -# + #class ConfigFieldNotFoundException(Exception): -# def __init__(self, config_field_name): +# def __init__(self, config_field_name) -> None: # msg = 'ConfigField({:s}) not specified in resource' # msg = msg.format(str(config_field_name)) # super().__init__(msg) -# + #class ConfigFieldsNotSupportedException(Exception): -# def __init__(self, config_fields): +# def __init__(self, config_fields) -> None: # msg = 'ConfigFields({:s}) not supported in resource' # msg = msg.format(str(config_fields)) # super().__init__(msg) -# \ No newline at end of file diff --git a/src/service/service/service_handler_api/FilterFields.py b/src/service/service/service_handler_api/FilterFields.py index 6da1d6f55c587322d71f4a3a2f28055d260ee5ed..2ce77608ab3d4c22f1fd9120d12b1bfb5940e463 100644 --- a/src/service/service/service_handler_api/FilterFields.py +++ b/src/service/service/service_handler_api/FilterFields.py @@ -13,7 +13,8 @@ # limitations under the License. from enum import Enum -from common.proto.context_pb2 import DeviceDriverEnum, ServiceTypeEnum +from typing import Any, Dict, Optional +from common.proto.context_pb2 import Device, DeviceDriverEnum, Service, ServiceTypeEnum class FilterFieldEnum(Enum): SERVICE_TYPE = 'service_type' @@ -34,6 +35,7 @@ SERVICE_TYPE_VALUES = { ServiceTypeEnum.SERVICETYPE_IP_LINK, ServiceTypeEnum.SERVICETYPE_IPOWDM, ServiceTypeEnum.SERVICETYPE_TAPI_LSP, + ServiceTypeEnum.SERVICETYPE_UPF, } DEVICE_DRIVER_VALUES = { @@ -58,10 +60,21 @@ 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 FILTER_FIELD_ALLOWED_VALUES = { - FilterFieldEnum.SERVICE_TYPE.value : SERVICE_TYPE_VALUES, - FilterFieldEnum.DEVICE_DRIVER.value : DEVICE_DRIVER_VALUES, + FilterFieldEnum.SERVICE_TYPE.value : set(ServiceTypeEnum.values()), + FilterFieldEnum.DEVICE_DRIVER.value : set(DeviceDriverEnum.values()), } + +def get_service_handler_filter_fields( + service : Optional[Service], device : Optional[Device] +) -> Dict[FilterFieldEnum, Any]: + if service is None: return {} + if device is None: return {} + return { + FilterFieldEnum.SERVICE_TYPE : service.service_type, + FilterFieldEnum.DEVICE_DRIVER : [driver for driver in device.device_drivers], + } diff --git a/src/service/service/service_handler_api/ServiceHandlerFactory.py b/src/service/service/service_handler_api/ServiceHandlerFactory.py index f998fe07246be834ac154105e836713fb4ef29ae..efd636ddd0d39c10b9e3e0995d4b721aeac81639 100644 --- a/src/service/service/service_handler_api/ServiceHandlerFactory.py +++ b/src/service/service/service_handler_api/ServiceHandlerFactory.py @@ -12,93 +12,122 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, operator +import logging from enum import Enum -from typing import TYPE_CHECKING, Any, Dict, Iterable, List, Optional, Set, Tuple +from typing import TYPE_CHECKING, Any, Dict, Iterable, List, Optional, Set, Tuple, Type 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, - UnsupportedFilterFieldValueException) + AmbiguousFilterException, EmptyFilterFieldException, + UnsatisfiedFilterException, UnsupportedServiceHandlerClassException, + UnsupportedFilterFieldException, UnsupportedFilterFieldValueException +) from .FilterFields import FILTER_FIELD_ALLOWED_VALUES, FilterFieldEnum if TYPE_CHECKING: - from service.service.service_handler_api._ServiceHandler import _ServiceHandler + from ._ServiceHandler import _ServiceHandler + LOGGER = logging.getLogger(__name__) +SUPPORTED_FILTER_FIELDS = set(FILTER_FIELD_ALLOWED_VALUES.keys()) + + +def check_is_class_valid(service_handler_class : Type['_ServiceHandler']) -> None: + from ._ServiceHandler import _ServiceHandler + if not issubclass(service_handler_class, _ServiceHandler): + raise UnsupportedServiceHandlerClassException(str(service_handler_class)) + +def sanitize_filter_fields( + filter_fields : Dict[FilterFieldEnum, Any], service_handler_name : Optional[str] = None +) -> Dict[FilterFieldEnum, Any]: + if len(filter_fields) == 0: + raise EmptyFilterFieldException( + filter_fields, service_handler_class_name=service_handler_name + ) + + unsupported_filter_fields = set(filter_fields.keys()).difference(SUPPORTED_FILTER_FIELDS) + if len(unsupported_filter_fields) > 0: + raise UnsupportedFilterFieldException( + unsupported_filter_fields, service_handler_class_name=service_handler_name + ) + + sanitized_filter_fields : Dict[FilterFieldEnum, Set[Any]] = dict() + for field_name, field_values in filter_fields.items(): + field_enum_values = FILTER_FIELD_ALLOWED_VALUES.get(field_name) + if not isinstance(field_values, Iterable) or isinstance(field_values, str): + field_values = [field_values] + + sanitized_field_values : Set[Any] = set() + for field_value in field_values: + if isinstance(field_value, Enum): field_value = field_value.value + if field_enum_values is not None and field_value not in field_enum_values: + raise UnsupportedFilterFieldValueException( + field_name, field_value, field_enum_values, + service_handler_class_name=service_handler_name + ) + sanitized_field_values.add(field_value) + + if len(sanitized_field_values) == 0: continue # do not add empty filters + sanitized_filter_fields[field_name] = sanitized_field_values + + return sanitized_filter_fields + + class ServiceHandlerFactory: - def __init__(self, service_handlers : List[Tuple[type, List[Dict[FilterFieldEnum, Any]]]]) -> None: - # Dict{field_name => Dict{field_value => Set{ServiceHandler}}} - self.__indices : Dict[str, Dict[str, Set['_ServiceHandler']]] = {} + def __init__( + self, service_handlers : List[Tuple[Type['_ServiceHandler'], List[Dict[FilterFieldEnum, Any]]]] + ) -> None: + self.__service_handlers : List[Tuple[Type['_ServiceHandler'], Dict[FilterFieldEnum, Any]]] = list() for service_handler_class,filter_field_sets in service_handlers: + check_is_class_valid(service_handler_class) + service_handler_name = service_handler_class.__name__ + for filter_fields in filter_field_sets: filter_fields = {k.value:v for k,v in filter_fields.items()} - self.register_service_handler_class(service_handler_class, **filter_fields) - - def register_service_handler_class(self, service_handler_class, **filter_fields): - from service.service.service_handler_api._ServiceHandler import _ServiceHandler - if not issubclass(service_handler_class, _ServiceHandler): - raise UnsupportedServiceHandlerClassException(str(service_handler_class)) - - service_handler_name = service_handler_class.__name__ - supported_filter_fields = set(FILTER_FIELD_ALLOWED_VALUES.keys()) - unsupported_filter_fields = set(filter_fields.keys()).difference(supported_filter_fields) - if len(unsupported_filter_fields) > 0: - raise UnsupportedFilterFieldException( - unsupported_filter_fields, service_handler_class_name=service_handler_name) - - for field_name, field_values in filter_fields.items(): - field_indice = self.__indices.setdefault(field_name, dict()) - field_enum_values = FILTER_FIELD_ALLOWED_VALUES.get(field_name) - if not isinstance(field_values, Iterable) or isinstance(field_values, str): - field_values = [field_values] - for field_value in field_values: - if isinstance(field_value, Enum): field_value = field_value.value - if field_enum_values is not None and field_value not in field_enum_values: - raise UnsupportedFilterFieldValueException( - field_name, field_value, field_enum_values, service_handler_class_name=service_handler_name) - field_indice_service_handlers = field_indice.setdefault(field_value, set()) - field_indice_service_handlers.add(service_handler_class) - - def get_service_handler_class(self, **filter_fields) -> '_ServiceHandler': - supported_filter_fields = set(FILTER_FIELD_ALLOWED_VALUES.keys()) - unsupported_filter_fields = set(filter_fields.keys()).difference(supported_filter_fields) - if len(unsupported_filter_fields) > 0: raise UnsupportedFilterFieldException(unsupported_filter_fields) - - candidate_service_handler_classes : Dict['_ServiceHandler', int] = None # num. filter hits per service_handler - for field_name, field_values in filter_fields.items(): - field_indice = self.__indices.get(field_name) - if field_indice is None: continue - if not isinstance(field_values, Iterable) or isinstance(field_values, str): - field_values = [field_values] - if len(field_values) == 0: - # do not allow empty fields; might cause wrong selection - raise UnsatisfiedFilterException(filter_fields) - - field_enum_values = FILTER_FIELD_ALLOWED_VALUES.get(field_name) - - field_candidate_service_handler_classes = set() - for field_value in field_values: - if field_enum_values is not None and field_value not in field_enum_values: - raise UnsupportedFilterFieldValueException(field_name, field_value, field_enum_values) - field_indice_service_handlers = field_indice.get(field_value) - if field_indice_service_handlers is None: continue - field_candidate_service_handler_classes = field_candidate_service_handler_classes.union( - field_indice_service_handlers) - - if candidate_service_handler_classes is None: - candidate_service_handler_classes = {k:1 for k in field_candidate_service_handler_classes} - else: - for candidate_service_handler_class in candidate_service_handler_classes: - if candidate_service_handler_class not in field_candidate_service_handler_classes: continue - candidate_service_handler_classes[candidate_service_handler_class] += 1 - - if len(candidate_service_handler_classes) == 0: raise UnsatisfiedFilterException(filter_fields) - candidate_service_handler_classes = sorted( - candidate_service_handler_classes.items(), key=operator.itemgetter(1), reverse=True) - return candidate_service_handler_classes[0][0] + filter_fields = sanitize_filter_fields( + filter_fields, service_handler_name=service_handler_name + ) + self.__service_handlers.append((service_handler_class, filter_fields)) + + + def is_service_handler_compatible( + self, service_handler_filter_fields : Dict[FilterFieldEnum, Any], + selection_filter_fields : Dict[FilterFieldEnum, Any] + ) -> bool: + # by construction empty service_handler_filter_fields are not allowed + # by construction empty selection_filter_fields are not allowed + for filter_field in SUPPORTED_FILTER_FIELDS: + service_handler_values = set(service_handler_filter_fields.get(filter_field, set())) + if service_handler_values is None : continue # means service_handler does not restrict + if len(service_handler_values) == 0: continue # means service_handler does not restrict + + selection_values = set(selection_filter_fields.get(filter_field, set())) + is_field_compatible = selection_values.issubset(service_handler_values) + if not is_field_compatible: return False + + return True + + + def get_service_handler_class(self, **selection_filter_fields) -> '_ServiceHandler': + sanitized_filter_fields = sanitize_filter_fields(selection_filter_fields) + + compatible_service_handlers : List[Tuple[Type[_ServiceHandler], Dict[FilterFieldEnum, Any]]] = [ + service_handler_class + for service_handler_class,service_handler_filter_fields in self.__service_handlers + if self.is_service_handler_compatible(service_handler_filter_fields, sanitized_filter_fields) + ] + + MSG = '[get_service_handler_class] compatible_service_handlers={:s}' + LOGGER.debug(MSG.format(str(compatible_service_handlers))) + + num_compatible = len(compatible_service_handlers) + if num_compatible == 0: + raise UnsatisfiedFilterException(selection_filter_fields) + if num_compatible > 1: + raise AmbiguousFilterException(selection_filter_fields, compatible_service_handlers) + return compatible_service_handlers[0] def get_common_device_drivers(drivers_per_device : List[Set[int]]) -> Set[int]: common_device_drivers = None diff --git a/src/service/service/service_handler_api/Tools.py b/src/service/service/service_handler_api/Tools.py index c86fbd842c03f0d6876a031df7fcbcb56ee03893..a88dcbfb923eff9070112c916b96c82a049ff5f4 100644 --- a/src/service/service/service_handler_api/Tools.py +++ b/src/service/service/service_handler_api/Tools.py @@ -17,7 +17,6 @@ from typing import Any, List, Optional, Tuple, Union from common.method_wrappers.ServiceExceptions import NotFoundException from common.proto.context_pb2 import Device, EndPoint from common.type_checkers.Checkers import chk_length, chk_type -from common.tools.grpc.Tools import grpc_message_to_json ACTION_MSG_SET_ENDPOINT = 'Set EndPoint(device_uuid={:s}, endpoint_uuid={:s}, topology_uuid={:s})' ACTION_MSG_DELETE_ENDPOINT = 'Delete EndPoint(device_uuid={:s}, endpoint_uuid={:s}, topology_uuid={:s})' @@ -57,7 +56,7 @@ def get_endpoint_matching(device : Device, endpoint_uuid_or_name : str) -> EndPo def get_device_endpoint_uuids(endpoint : Tuple[str, str, Optional[str]]) -> Tuple[str, str]: chk_type('endpoint', endpoint, (tuple, list)) chk_length('endpoint', endpoint, min_length=2, max_length=3) - device_uuid, endpoint_uuid = endpoint[0:2] # ignore topology_uuid by now + device_uuid, endpoint_uuid = endpoint[0:2] # ignore topology_uuid for now return device_uuid, endpoint_uuid def extract_endpoint_index(endpoint_name : str, default_index=0) -> Tuple[str, int]: diff --git a/src/service/service/service_handlers/__init__.py b/src/service/service/service_handlers/__init__.py index 1d274490fd54403587f9a83c00d0688eca1b1744..7a607acddff625b4413e8f3ae172523a8853fdd3 100644 --- a/src/service/service/service_handlers/__init__.py +++ b/src/service/service/service_handlers/__init__.py @@ -16,6 +16,7 @@ from common.proto.context_pb2 import DeviceDriverEnum, ServiceTypeEnum from ..service_handler_api.FilterFields import FilterFieldEnum from .ipowdm.IpowdmServiceHandler import IpowdmServiceHandler from .l2nm_emulated.L2NMEmulatedServiceHandler import L2NMEmulatedServiceHandler +from .l2nm_gnmi_openconfig.L2NMGnmiOpenConfigServiceHandler import L2NMGnmiOpenConfigServiceHandler from .l2nm_ietfl2vpn.L2NM_IETFL2VPN_ServiceHandler import L2NM_IETFL2VPN_ServiceHandler from .l2nm_openconfig.L2NMOpenConfigServiceHandler import L2NMOpenConfigServiceHandler from .l3nm_emulated.L3NMEmulatedServiceHandler import L3NMEmulatedServiceHandler @@ -31,6 +32,7 @@ from .p4_fabric_tna_int.p4_fabric_tna_int_service_handler import P4FabricINTServ from .p4_fabric_tna_l2_simple.p4_fabric_tna_l2_simple_service_handler import P4FabricL2SimpleServiceHandler from .p4_fabric_tna_l3.p4_fabric_tna_l3_service_handler import P4FabricL3ServiceHandler from .p4_fabric_tna_acl.p4_fabric_tna_acl_service_handler import P4FabricACLServiceHandler +from .p4_fabric_tna_upf.p4_fabric_tna_upf_service_handler import P4FabricUPFServiceHandler from .tapi_lsp.Tapi_LSPServiceHandler import Tapi_LSPServiceHandler from .tapi_tapi.TapiServiceHandler import TapiServiceHandler from .tapi_xr.TapiXrServiceHandler import TapiXrServiceHandler @@ -53,6 +55,12 @@ SERVICE_HANDLERS = [ FilterFieldEnum.DEVICE_DRIVER : DeviceDriverEnum.DEVICEDRIVER_OPENCONFIG, } ]), + (L2NMGnmiOpenConfigServiceHandler, [ + { + FilterFieldEnum.SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_L2NM, + FilterFieldEnum.DEVICE_DRIVER : DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG, + } + ]), (L3NMEmulatedServiceHandler, [ { FilterFieldEnum.SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_L3NM, @@ -146,6 +154,12 @@ SERVICE_HANDLERS = [ FilterFieldEnum.DEVICE_DRIVER: DeviceDriverEnum.DEVICEDRIVER_P4, } ]), + (P4FabricUPFServiceHandler, [ + { + FilterFieldEnum.SERVICE_TYPE: ServiceTypeEnum.SERVICETYPE_UPF, + FilterFieldEnum.DEVICE_DRIVER: DeviceDriverEnum.DEVICEDRIVER_P4, + } + ]), (L2NM_IETFL2VPN_ServiceHandler, [ { FilterFieldEnum.SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_L2NM, diff --git a/src/service/service/service_handlers/ipowdm/ConfigRules.py b/src/service/service/service_handlers/ipowdm/ConfigRules.py index e36dd7babaae96b0b0fd8060a08e504fc8195e55..7f48c6071e12f20a5d43f644c9209e003f86e6fa 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 e22c5d28f519734daf79077b231556faa7272509..db4a41e435aa00e32b85d996bda8eadcc7cea169 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 6242c89c7fa17bc5b6cc44328d8ce58438721d45..7363515f07a52d996229bcbd72932ce1423258d7 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/l2nm_gnmi_openconfig/ConfigRuleComposer.py b/src/service/service/service_handlers/l2nm_gnmi_openconfig/ConfigRuleComposer.py new file mode 100644 index 0000000000000000000000000000000000000000..7495917095fdb6cd18760f36863fede776d2e207 --- /dev/null +++ b/src/service/service/service_handlers/l2nm_gnmi_openconfig/ConfigRuleComposer.py @@ -0,0 +1,292 @@ +# 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 +from typing import Dict, List, Optional, Set, Tuple +from common.DeviceTypes import DeviceTypeEnum +from common.proto.context_pb2 import Device, EndPoint, Service +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.object_factory.ConfigRule import json_config_rule_delete, json_config_rule_set +from service.service.service_handler_api.AnyTreeTools import TreeNode + +LOGGER = logging.getLogger(__name__) + +#NETWORK_INSTANCE = 'teraflowsdn' # TODO: investigate; sometimes it does not create/delete static rules properly +NETWORK_INSTANCE = 'default' +DEFAULT_NETWORK_INSTANCE = 'default' + +def _safe_int(value: Optional[object]) -> Optional[int]: + try: + return int(value) if value is not None else None + except (TypeError, ValueError): + return None + +def _safe_bool(value: Optional[object]) -> Optional[bool]: + if value is None: + return None + if isinstance(value, bool): + return value + if isinstance(value, (int, float)): + return bool(value) + if isinstance(value, str): + lowered = value.strip().lower() + if lowered in {'true', '1', 'yes', 'y', 'on', 'tagged'}: + return True + if lowered in {'false', '0', 'no', 'n', 'off', 'untagged'}: + return False + return None + +def _interface_switched_vlan( + interface : str, interface_mode : str, access_vlan_id : Optional[int] = None, + trunk_vlan_id : Optional[int] = None, native_vlan : int = 1 +) -> Tuple[str, Dict]: + path = '/interface[{:s}]/ethernet/switched-vlan'.format(interface) + config : Dict[str, object] = {'interface-mode': interface_mode} + if interface_mode == 'ACCESS': + if access_vlan_id is not None: + config['access-vlan'] = access_vlan_id + elif interface_mode == 'TRUNK': + config['native-vlan'] = native_vlan + if trunk_vlan_id is not None: + config['trunk-vlans'] = [trunk_vlan_id] + return path, {'config': config} + +def _network_instance(ni_name : str, ni_type : str) -> Tuple[str, Dict]: + path = '/network_instance[{:s}]'.format(ni_name) + data = {'name': ni_name, 'type': ni_type} + return path, data + +def _network_instance_vlan(ni_name : str, vlan_id : int, vlan_name : str = None) -> Tuple[str, Dict]: + path = '/network_instance[{:s}]/vlan[{:s}]'.format(ni_name, str(vlan_id)) + data = {'name': ni_name, 'vlan_id': vlan_id, 'vlan_name': vlan_name} + return path, data + + +class EndpointComposer: + def __init__(self, endpoint_uuid : str) -> None: + self.uuid = endpoint_uuid + self.objekt : Optional[EndPoint] = None + self.explicit_vlan_ids : Set[int] = set() + self.force_trunk = False + + def _add_vlan_id(self, vlan_id : Optional[int]) -> None: + if vlan_id is not None: + self.explicit_vlan_ids.add(vlan_id) + + def _configure_from_settings(self, json_settings : Dict) -> None: + if not isinstance(json_settings, dict): + return + vlan_id = _safe_int(json_settings.get('vlan_id', json_settings.get('vlan-id'))) + self._add_vlan_id(vlan_id) + + def configure(self, endpoint_obj : Optional[EndPoint], settings : Optional[TreeNode]) -> None: + if endpoint_obj is not None: + self.objekt = endpoint_obj + if settings is None: return + + json_settings : Dict = settings.value or dict() + self._configure_from_settings(json_settings) + for child in settings.children: + if isinstance(child.value, dict): + self._configure_from_settings(child.value) + + def set_force_trunk(self, enable : bool = True) -> None: + self.force_trunk = enable + + def _select_trunk_vlan_id(self, service_vlan_id : int) -> int: + if service_vlan_id in self.explicit_vlan_ids: + return service_vlan_id + if len(self.explicit_vlan_ids) > 0: + return sorted(self.explicit_vlan_ids)[0] + return service_vlan_id + + def get_vlan_ids(self) -> Set[int]: + return set(self.explicit_vlan_ids) + + def has_vlan(self, vlan_id : int) -> bool: + return vlan_id in self.get_vlan_ids() + + def get_config_rules( + self, service_vlan_id : int, access_vlan_tagged : bool = False, delete : bool = False + ) -> List[Dict]: + if self.objekt is None: + MSG = 'Endpoint object not defined for uuid={:s}' + LOGGER.warning(MSG.format(self.uuid)) + return [] + config_rules : List[Dict] = list() + json_config_rule = json_config_rule_delete if delete else json_config_rule_set + if self.force_trunk or access_vlan_tagged or len(self.explicit_vlan_ids) > 0: + trunk_vlan_id = self._select_trunk_vlan_id(service_vlan_id) + config_rules.append(json_config_rule(*_interface_switched_vlan( + self.objekt.name, 'TRUNK', trunk_vlan_id=trunk_vlan_id + ))) + else: + config_rules.append(json_config_rule(*_interface_switched_vlan( + self.objekt.name, 'ACCESS', access_vlan_id=service_vlan_id + ))) + return config_rules + + def dump(self) -> Dict: + return { + 'explicit_vlan_ids' : list(self.explicit_vlan_ids), + 'force_trunk' : self.force_trunk, + } + + def __str__(self): + data = {'uuid': self.uuid} + if self.objekt is not None: data['name'] = self.objekt.name + data.update(self.dump()) + return json.dumps(data) + +class DeviceComposer: + def __init__(self, device_uuid : str) -> None: + self.uuid = device_uuid + self.objekt : Optional[Device] = None + self.aliases : Dict[str, str] = dict() # endpoint_name => endpoint_uuid + self.endpoints : Dict[str, EndpointComposer] = dict() # endpoint_uuid => EndpointComposer + self.vlan_ids : Set[int] = set() + + def set_endpoint_alias(self, endpoint_name : str, endpoint_uuid : str) -> None: + self.aliases[endpoint_name] = endpoint_uuid + + def get_endpoint(self, endpoint_uuid : str) -> EndpointComposer: + endpoint_uuid = self.aliases.get(endpoint_uuid, endpoint_uuid) + if endpoint_uuid not in self.endpoints: + self.endpoints[endpoint_uuid] = EndpointComposer(endpoint_uuid) + return self.endpoints[endpoint_uuid] + + def _refresh_vlan_ids(self, service_vlan_id : int) -> None: + # Only keep the service VLAN; others are ignored for composition + self.vlan_ids = {service_vlan_id} + + def configure(self, device_obj : Device, settings : Optional[TreeNode]) -> None: + self.objekt = device_obj + for endpoint_obj in device_obj.device_endpoints: + endpoint_uuid = endpoint_obj.endpoint_id.endpoint_uuid.uuid + self.set_endpoint_alias(endpoint_obj.name, endpoint_uuid) + self.get_endpoint(endpoint_obj.name).configure(endpoint_obj, None) + + def get_config_rules( + self, network_instance_name : str, service_vlan_id : int, + access_vlan_tagged : bool = False, delete : bool = False + ) -> List[Dict]: + SELECTED_DEVICES = { + DeviceTypeEnum.PACKET_POP.value, + DeviceTypeEnum.PACKET_ROUTER.value, + DeviceTypeEnum.EMULATED_PACKET_ROUTER.value + } + if self.objekt.device_type not in SELECTED_DEVICES: return [] + + json_config_rule = json_config_rule_delete if delete else json_config_rule_set + config_rules : List[Dict] = list() + self._refresh_vlan_ids(service_vlan_id) + if network_instance_name != DEFAULT_NETWORK_INSTANCE: + json_config_rule(*_network_instance(network_instance_name, 'L3VRF')) + for endpoint in self.endpoints.values(): + config_rules.extend(endpoint.get_config_rules( + service_vlan_id, access_vlan_tagged=access_vlan_tagged, delete=delete + )) + for vlan_id in sorted(self.vlan_ids): + vlan_name = 'tfs-vlan-{:s}'.format(str(vlan_id)) + config_rules.append(json_config_rule(*_network_instance_vlan( + network_instance_name, vlan_id, vlan_name=vlan_name + ))) + if delete: config_rules = list(reversed(config_rules)) + return config_rules + + def dump(self) -> Dict: + return { + 'endpoints' : { + endpoint_uuid : endpoint.dump() + for endpoint_uuid, endpoint in self.endpoints.items() + }, + 'vlan_ids' : list(self.vlan_ids) + } + + def __str__(self): + data = {'uuid': self.uuid} + if self.objekt is not None: data['name'] = self.objekt.name + data.update(self.dump()) + return json.dumps(data) + +class ConfigRuleComposer: + def __init__(self) -> None: + self.objekt : Optional[Service] = None + self.aliases : Dict[str, str] = dict() # device_name => device_uuid + self.devices : Dict[str, DeviceComposer] = dict() # device_uuid => DeviceComposer + self.vlan_id = None + self.access_vlan_tagged = False + + def set_device_alias(self, device_name : str, device_uuid : str) -> None: + self.aliases[device_name] = device_uuid + + def get_device(self, device_uuid : str) -> DeviceComposer: + device_uuid = self.aliases.get(device_uuid, device_uuid) + if device_uuid not in self.devices: + self.devices[device_uuid] = DeviceComposer(device_uuid) + return self.devices[device_uuid] + + def configure(self, service_obj : Service, settings : Optional[TreeNode]) -> None: + self.objekt = service_obj + if settings is None: + raise Exception('Service settings are required to extract vlan_id') + json_settings : Dict = settings.value or dict() + + if 'vlan_id' in json_settings: + self.vlan_id = _safe_int(json_settings['vlan_id']) + elif 'vlan-id' in json_settings: + self.vlan_id = _safe_int(json_settings['vlan-id']) + else: + MSG = 'VLAN ID not found. Tried: vlan_id and vlan-id. service_obj={:s} settings={:s}' + raise Exception(MSG.format(grpc_message_to_json_string(service_obj), str(settings))) + + if self.vlan_id is None: + MSG = 'Invalid VLAN ID value in service settings: {:s}' + raise Exception(MSG.format(str(json_settings))) + + access_vlan_tagged = json_settings.get('access_vlan_tagged', json_settings.get('access-vlan-tagged')) + if access_vlan_tagged is None: + self.access_vlan_tagged = False + else: + parsed = _safe_bool(access_vlan_tagged) + if parsed is None: + MSG = 'Invalid access_vlan_tagged value in service settings: {:s}' + LOGGER.warning(MSG.format(str(access_vlan_tagged))) + self.access_vlan_tagged = False + else: + self.access_vlan_tagged = parsed + + def get_config_rules( + self, network_instance_name : str = NETWORK_INSTANCE, delete : bool = False + ) -> Dict[str, List[Dict]]: + if self.vlan_id is None: + raise Exception('VLAN ID must be configured at service level before composing rules') + + return { + device_uuid : device.get_config_rules( + network_instance_name, self.vlan_id, + access_vlan_tagged=self.access_vlan_tagged, delete=delete + ) + for device_uuid, device in self.devices.items() + } + + def dump(self) -> Dict: + return { + 'devices' : { + device_uuid : device.dump() + for device_uuid, device in self.devices.items() + }, + 'vlan_id': self.vlan_id, + 'access_vlan_tagged': self.access_vlan_tagged, + } diff --git a/src/service/service/service_handlers/l2nm_gnmi_openconfig/L2NMGnmiOpenConfigServiceHandler.py b/src/service/service/service_handlers/l2nm_gnmi_openconfig/L2NMGnmiOpenConfigServiceHandler.py new file mode 100644 index 0000000000000000000000000000000000000000..baa164afa9baaa9ae5be3626a2c7fd6aaf9c086f --- /dev/null +++ b/src/service/service/service_handlers/l2nm_gnmi_openconfig/L2NMGnmiOpenConfigServiceHandler.py @@ -0,0 +1,189 @@ +# 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 +from typing import Any, Dict, List, Optional, Tuple, Union +from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method +from common.proto.context_pb2 import ConfigRule, ConnectionId, DeviceId, Service +from common.tools.object_factory.Connection import json_connection_id +from common.tools.object_factory.Device import json_device_id +from common.type_checkers.Checkers import chk_type +from service.service.service_handler_api._ServiceHandler import _ServiceHandler +from service.service.service_handler_api.SettingsHandler import SettingsHandler +from service.service.service_handler_api.Tools import get_device_endpoint_uuids, get_endpoint_matching +from service.service.task_scheduler.TaskExecutor import TaskExecutor +from service.service.tools.EndpointIdFormatters import endpointids_to_raw +from .ConfigRuleComposer import ConfigRuleComposer +from .VlanIdPropagator import VlanIdPropagator + +LOGGER = logging.getLogger(__name__) + +METRICS_POOL = MetricsPool('Service', 'Handler', labels={'handler': 'l2nm_gnmi_openconfig'}) + +class L2NMGnmiOpenConfigServiceHandler(_ServiceHandler): + def __init__( # pylint: disable=super-init-not-called + self, service : Service, task_executor : TaskExecutor, **settings + ) -> None: + self.__service = service + self.__task_executor = task_executor + self.__settings_handler = SettingsHandler(service.service_config, **settings) + self.__config_rule_composer = ConfigRuleComposer() + self.__vlan_id_propagator = VlanIdPropagator(self.__config_rule_composer) + self.__endpoint_map : Dict[Tuple[str, str], Tuple[str, str]] = dict() + + def _compose_config_rules(self, endpoints : List[Tuple[str, str, Optional[str]]]) -> None: + if len(endpoints) % 2 != 0: raise Exception('Number of endpoints should be even') + + service_settings = self.__settings_handler.get_service_settings() + self.__config_rule_composer.configure(self.__service, service_settings) + + for endpoint in endpoints: + device_uuid, endpoint_uuid = get_device_endpoint_uuids(endpoint) + + device_obj = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid))) + device_settings = self.__settings_handler.get_device_settings(device_obj) + self.__config_rule_composer.set_device_alias(device_obj.name, device_uuid) + _device = self.__config_rule_composer.get_device(device_obj.name) + _device.configure(device_obj, device_settings) + + endpoint_obj = get_endpoint_matching(device_obj, endpoint_uuid) + endpoint_settings = self.__settings_handler.get_endpoint_settings(device_obj, endpoint_obj) + _device.set_endpoint_alias(endpoint_obj.name, endpoint_uuid) + _endpoint = _device.get_endpoint(endpoint_obj.name) + _endpoint.configure(endpoint_obj, endpoint_settings) + + self.__endpoint_map[(device_uuid, endpoint_uuid)] = (device_obj.name, endpoint_obj.name) + + MSG = '[pre] config_rule_composer = {:s}' + LOGGER.debug(MSG.format(json.dumps(self.__config_rule_composer.dump()))) + + self.__vlan_id_propagator.compose(endpoints) + + MSG = '[post] config_rule_composer = {:s}' + LOGGER.debug(MSG.format(json.dumps(self.__config_rule_composer.dump()))) + + def _do_configurations( + self, config_rules_per_device : Dict[str, List[Dict]], endpoints : List[Tuple[str, str, Optional[str]]], + delete : bool = False + ) -> List[Union[bool, Exception]]: + # Configuration is done atomically on each device, all OK / all KO per device + results_per_device = dict() + for device_name,json_config_rules in config_rules_per_device.items(): + try: + device_obj = self.__config_rule_composer.get_device(device_name).objekt + if len(json_config_rules) == 0: continue + del device_obj.device_config.config_rules[:] + for json_config_rule in json_config_rules: + device_obj.device_config.config_rules.append(ConfigRule(**json_config_rule)) + self.__task_executor.configure_device(device_obj) + results_per_device[device_name] = True + except Exception as e: # pylint: disable=broad-exception-caught + verb = 'deconfigure' if delete else 'configure' + MSG = 'Unable to {:s} Device({:s}) : ConfigRules({:s})' + LOGGER.exception(MSG.format(verb, str(device_name), str(json_config_rules))) + results_per_device[device_name] = e + + results = [] + for endpoint in endpoints: + device_uuid, endpoint_uuid = get_device_endpoint_uuids(endpoint) + device_name, _ = self.__endpoint_map[(device_uuid, endpoint_uuid)] + if device_name not in results_per_device: continue + results.append(results_per_device[device_name]) + return results + + @metered_subclass_method(METRICS_POOL) + def SetEndpoint( + self, endpoints : List[Tuple[str, str, Optional[str]]], connection_uuid : Optional[str] = None + ) -> List[Union[bool, Exception]]: + chk_type('endpoints', endpoints, list) + if len(endpoints) == 0: return [] + #service_uuid = self.__service.service_id.service_uuid.uuid + connection = self.__task_executor.get_connection(ConnectionId(**json_connection_id(connection_uuid))) + connection_endpoint_ids = endpointids_to_raw(connection.path_hops_endpoint_ids) + self._compose_config_rules(connection_endpoint_ids) + #network_instance_name = service_uuid.split('-')[0] + #config_rules_per_device = self.__config_rule_composer.get_config_rules(network_instance_name, delete=False) + config_rules_per_device = self.__config_rule_composer.get_config_rules(delete=False) + LOGGER.debug('config_rules_per_device={:s}'.format(json.dumps(config_rules_per_device))) + results = self._do_configurations(config_rules_per_device, endpoints, delete=False) + LOGGER.debug('results={:s}'.format(str(results))) + return results + + @metered_subclass_method(METRICS_POOL) + def DeleteEndpoint( + self, endpoints : List[Tuple[str, str, Optional[str]]], connection_uuid : Optional[str] = None + ) -> List[Union[bool, Exception]]: + chk_type('endpoints', endpoints, list) + if len(endpoints) == 0: return [] + #service_uuid = self.__service.service_id.service_uuid.uuid + connection = self.__task_executor.get_connection(ConnectionId(**json_connection_id(connection_uuid))) + connection_endpoint_ids = endpointids_to_raw(connection.path_hops_endpoint_ids) + self._compose_config_rules(connection_endpoint_ids) + #network_instance_name = service_uuid.split('-')[0] + #config_rules_per_device = self.__config_rule_composer.get_config_rules(network_instance_name, delete=True) + config_rules_per_device = self.__config_rule_composer.get_config_rules(delete=True) + LOGGER.debug('config_rules_per_device={:s}'.format(json.dumps(config_rules_per_device))) + results = self._do_configurations(config_rules_per_device, endpoints, delete=True) + LOGGER.debug('results={:s}'.format(str(results))) + return results + + @metered_subclass_method(METRICS_POOL) + def SetConstraint(self, constraints : List[Tuple[str, Any]]) -> List[Union[bool, Exception]]: + chk_type('constraints', constraints, list) + if len(constraints) == 0: return [] + + msg = '[SetConstraint] Method not implemented. Constraints({:s}) are being ignored.' + LOGGER.warning(msg.format(str(constraints))) + return [True for _ in range(len(constraints))] + + @metered_subclass_method(METRICS_POOL) + def DeleteConstraint(self, constraints : List[Tuple[str, Any]]) -> List[Union[bool, Exception]]: + chk_type('constraints', constraints, list) + if len(constraints) == 0: return [] + + msg = '[DeleteConstraint] Method not implemented. Constraints({:s}) are being ignored.' + LOGGER.warning(msg.format(str(constraints))) + return [True for _ in range(len(constraints))] + + @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 = [] + for resource in resources: + try: + resource_value = json.loads(resource[1]) + self.__settings_handler.set(resource[0], resource_value) + results.append(True) + except Exception as e: # pylint: disable=broad-except + LOGGER.exception('Unable to SetConfig({:s})'.format(str(resource))) + 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 = [] + for resource in resources: + try: + self.__settings_handler.delete(resource[0]) + except Exception as e: # pylint: disable=broad-except + LOGGER.exception('Unable to DeleteConfig({:s})'.format(str(resource))) + results.append(e) + + return results diff --git a/src/service/service/service_handlers/l2nm_gnmi_openconfig/VlanIdPropagator.py b/src/service/service/service_handlers/l2nm_gnmi_openconfig/VlanIdPropagator.py new file mode 100644 index 0000000000000000000000000000000000000000..69e2afb62a6f4a4543269cba59e03ebc1fdd3cb1 --- /dev/null +++ b/src/service/service/service_handlers/l2nm_gnmi_openconfig/VlanIdPropagator.py @@ -0,0 +1,87 @@ +# 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 +from typing import List, Optional, Tuple +from common.DeviceTypes import DeviceTypeEnum +from .ConfigRuleComposer import ConfigRuleComposer + +LOGGER = logging.getLogger(__name__) + +class VlanIdPropagator: + def __init__(self, config_rule_composer : ConfigRuleComposer) -> None: + self._config_rule_composer = config_rule_composer + self._router_types = { + DeviceTypeEnum.PACKET_ROUTER.value, + DeviceTypeEnum.EMULATED_PACKET_ROUTER.value, + DeviceTypeEnum.PACKET_POP.value, + DeviceTypeEnum.PACKET_RADIO_ROUTER.value, + DeviceTypeEnum.EMULATED_PACKET_RADIO_ROUTER.value, + } + + def _is_router_device(self, device) -> bool: + return device.objekt is not None and device.objekt.device_type in self._router_types + + def compose(self, connection_hop_list : List[Tuple[str, str, Optional[str]]]) -> None: + link_endpoints = self._compute_link_endpoints(connection_hop_list) + LOGGER.debug('link_endpoints = {:s}'.format(str(link_endpoints))) + + self._propagate_vlan_id(link_endpoints) + LOGGER.debug('config_rule_composer = {:s}'.format(json.dumps(self._config_rule_composer.dump()))) + + def _compute_link_endpoints( + self, connection_hop_list : List[Tuple[str, str, Optional[str]]] + ) -> List[Tuple[Tuple[str, str, Optional[str]], Tuple[str, str, Optional[str]]]]: + # In some cases connection_hop_list might contain repeated endpoints, remove them here. + added_connection_hops = set() + filtered_connection_hop_list = list() + for connection_hop in connection_hop_list: + if connection_hop in added_connection_hops: continue + filtered_connection_hop_list.append(connection_hop) + added_connection_hops.add(connection_hop) + connection_hop_list = filtered_connection_hop_list + + # In some cases connection_hop_list first and last items might be internal endpoints of + # devices instead of link endpoints. Filter those endpoints not reaching a new device. + if len(connection_hop_list) > 2 and connection_hop_list[0][0] == connection_hop_list[1][0]: + # same device on first 2 endpoints + connection_hop_list = connection_hop_list[1:] + if len(connection_hop_list) > 2 and connection_hop_list[-1][0] == connection_hop_list[-2][0]: + # same device on last 2 endpoints + connection_hop_list = connection_hop_list[:-1] + + num_connection_hops = len(connection_hop_list) + if num_connection_hops % 2 != 0: raise Exception('Number of connection hops must be even') + if num_connection_hops < 4: raise Exception('Number of connection hops must be >= 4') + + it_connection_hops = iter(connection_hop_list) + return list(zip(it_connection_hops, it_connection_hops)) + + def _propagate_vlan_id( + self, link_endpoints_list : List[Tuple[Tuple[str, str, Optional[str]], Tuple[str, str, Optional[str]]]] + ) -> None: + for link_endpoints in link_endpoints_list: + device_endpoint_a, device_endpoint_b = link_endpoints + + device_uuid_a, endpoint_uuid_a = device_endpoint_a[0:2] + device_a = self._config_rule_composer.get_device(device_uuid_a) + endpoint_a = device_a.get_endpoint(endpoint_uuid_a) + + device_uuid_b, endpoint_uuid_b = device_endpoint_b[0:2] + device_b = self._config_rule_composer.get_device(device_uuid_b) + endpoint_b = device_b.get_endpoint(endpoint_uuid_b) + + if self._is_router_device(device_a) and self._is_router_device(device_b): + endpoint_a.set_force_trunk() + endpoint_b.set_force_trunk() diff --git a/src/service/service/service_handlers/l2nm_gnmi_openconfig/__init__.py b/src/service/service/service_handlers/l2nm_gnmi_openconfig/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..3ccc21c7db78aac26daa1f8c5ff8e1ffd3f35460 --- /dev/null +++ b/src/service/service/service_handlers/l2nm_gnmi_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/service/service/service_handlers/l3nm_gnmi_openconfig/ConfigRuleComposer.py b/src/service/service/service_handlers/l3nm_gnmi_openconfig/ConfigRuleComposer.py index cf0eacab515d86e9ec9bc418adeb91f720d0b376..6857bce610ce63248e3f9c25d4bc4c1c853ca358 100644 --- a/src/service/service/service_handlers/l3nm_gnmi_openconfig/ConfigRuleComposer.py +++ b/src/service/service/service_handlers/l3nm_gnmi_openconfig/ConfigRuleComposer.py @@ -16,6 +16,7 @@ import json, logging, netaddr, re from typing import Dict, List, Optional, Set, Tuple from common.DeviceTypes import DeviceTypeEnum from common.proto.context_pb2 import ConfigActionEnum, Device, EndPoint, Service +from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.ConfigRule import json_config_rule_delete, json_config_rule_set from service.service.service_handler_api.AnyTreeTools import TreeNode @@ -94,7 +95,7 @@ class EndpointComposer: self.ipv4_address = json_settings['ip_address'] else: MSG = 'IP Address not found. Tried: address_ip and ip_address. endpoint_obj={:s} settings={:s}' - LOGGER.warning(MSG.format(str(endpoint_obj), str(settings))) + LOGGER.warning(MSG.format(grpc_message_to_json_string(endpoint_obj), str(settings))) if 'address_prefix' in json_settings: self.ipv4_prefix_len = json_settings['address_prefix'] @@ -102,7 +103,7 @@ class EndpointComposer: self.ipv4_prefix_len = json_settings['prefix_length'] else: MSG = 'IP Address Prefix not found. Tried: address_prefix and prefix_length. endpoint_obj={:s} settings={:s}' - LOGGER.warning(MSG.format(str(endpoint_obj), str(settings))) + LOGGER.warning(MSG.format(grpc_message_to_json_string(endpoint_obj), str(settings))) self.sub_interface_index = json_settings.get('index', 0) diff --git a/src/service/service/service_handlers/l3nm_ryu/L3NMRyuServiceHandler.py b/src/service/service/service_handlers/l3nm_ryu/L3NMRyuServiceHandler.py index 4a7ad333b3ee9113c191596b1929e1e920f38448..2d32989b27a198b123ec396b8ddb6542c91c31b6 100644 --- a/src/service/service/service_handlers/l3nm_ryu/L3NMRyuServiceHandler.py +++ b/src/service/service/service_handlers/l3nm_ryu/L3NMRyuServiceHandler.py @@ -13,22 +13,132 @@ # limitations under the License. import json, logging, re -from typing import List, Optional, Tuple, Union +from dataclasses import dataclass +from typing import Any, Dict, List, Optional, Tuple, Union from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method -from common.proto.context_pb2 import ConfigRule, Device, DeviceId, EndPoint, Service +from common.proto.context_pb2 import ConfigRule, Device, DeviceId, EndPoint, EndPointId, Service +from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.ConfigRule import json_config_rule_delete, json_config_rule_set from common.tools.object_factory.Device import json_device_id from common.type_checkers.Checkers import chk_type -from service.service.service_handler_api.Tools import get_device_endpoint_uuids, get_endpoint_matching from service.service.service_handler_api._ServiceHandler import _ServiceHandler from service.service.service_handler_api.SettingsHandler import SettingsHandler +from service.service.service_handler_api.Tools import get_device_endpoint_uuids, get_endpoint_matching from service.service.task_scheduler.TaskExecutor import TaskExecutor -logging.basicConfig(level=logging.DEBUG) + LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('Service', 'Handler', labels={'handler': 'l3nm_ryu'}) +RE_DEV_EP_SETTINGS = re.compile(r'/device\[(.*?)\]/endpoint\[(.*?)\]/settings') + + +def get_ip_from_endpoint_settings( + device_obj : Device, endpoint_obj : EndPoint, settings_handler : SettingsHandler +) -> Optional[str]: + device_uuid = device_obj.device_id.device_uuid.uuid + ep_device_uuid = endpoint_obj.endpoint_id.device_id.device_uuid.uuid + if device_uuid != ep_device_uuid: + MSG = 'Malformed endpoint: device_uuid({:s}) != endpoint.device_uuid({:s})' + raise Exception(MSG.format(str(device_uuid), str(ep_device_uuid))) + + endpoint_settings = settings_handler.get_endpoint_settings(device_obj, endpoint_obj) + if endpoint_settings is None: return None + + json_settings : Dict = endpoint_settings.value + if 'address_ip' in json_settings: return json_settings['address_ip'] + if 'ip_address' in json_settings: return json_settings['ip_address'] + + MSG = 'IP Address not found. Tried: address_ip and ip_address. endpoint_obj={:s} settings={:s}' + LOGGER.warning(MSG.format(str(endpoint_obj), str(json_settings))) + return None + + +@dataclass +class ServiceData: + src_device_uuid : str + src_device_name : str + src_endpoint_uuid : str + src_endpoint_name : str + src_ipv4_address : str + + dst_device_uuid : str + dst_device_name : str + dst_endpoint_uuid : str + dst_endpoint_name : str + dst_ipv4_address : str + + @classmethod + def create( + cls, src_device_obj : Device, src_endpoint_obj : EndPoint, + dst_device_obj : Device, dst_endpoint_obj : EndPoint, + settings_handler : SettingsHandler + ) -> 'ServiceData': + src_device_uuid = src_device_obj.device_id.device_uuid.uuid + src_ep_device_uuid = src_endpoint_obj.endpoint_id.device_id.device_uuid.uuid + if src_device_uuid != src_ep_device_uuid: + MSG = 'Malformed endpoint: src_device_uuid({:s}) != src_endpoint.device_uuid({:s})' + raise Exception(MSG.format(str(src_device_uuid), str(src_ep_device_uuid))) + + dst_device_uuid = dst_device_obj.device_id.device_uuid.uuid + dst_ep_device_uuid = dst_endpoint_obj.endpoint_id.device_id.device_uuid.uuid + if dst_device_uuid != dst_ep_device_uuid: + MSG = 'Malformed endpoint: dst_device_uuid({:s}) != dst_endpoint.device_uuid({:s})' + raise Exception(MSG.format(str(dst_device_uuid), str(dst_ep_device_uuid))) + + src_ipv4_address = get_ip_from_endpoint_settings(src_device_obj, src_endpoint_obj, settings_handler) + dst_ipv4_address = get_ip_from_endpoint_settings(dst_device_obj, dst_endpoint_obj, settings_handler) + + return cls( + src_device_uuid = src_device_obj.device_id.device_uuid.uuid, + src_device_name = src_device_obj.name, + src_endpoint_uuid = src_endpoint_obj.endpoint_id.endpoint_uuid.uuid, + src_endpoint_name = src_endpoint_obj.name, + src_ipv4_address = src_ipv4_address, + dst_device_uuid = dst_device_obj.device_id.device_uuid.uuid, + dst_device_name = dst_device_obj.name, + dst_endpoint_uuid = dst_endpoint_obj.endpoint_id.endpoint_uuid.uuid, + dst_endpoint_name = dst_endpoint_obj.name, + dst_ipv4_address = dst_ipv4_address, + ) + + def get_flow_rule_name(self, reverse : bool = False) -> str: + device_names = [self.src_device_name, self.dst_device_name] + if reverse: device_names = list(reversed(device_names)) + return '-'.join(device_names) + + def get_ip_addresses(self, reverse : bool = False) -> Tuple[str, str]: + ipv4_addresses = [self.src_ipv4_address, self.dst_ipv4_address] + if reverse: ipv4_addresses = list(reversed(ipv4_addresses)) + return ipv4_addresses + + +def compose_flow_rule( + device_name : str, dpid : str, in_port : str, out_port : str, + service_data : ServiceData, reverse : bool, is_delete : bool +) -> ConfigRule: + ports = [in_port, out_port] + if reverse: ports = list(reversed(ports)) + in_port, out_port = ports + + flow_rule_name = service_data.get_flow_rule_name(reverse=reverse) + ipv4_addresses = service_data.get_ip_addresses(reverse=reverse) + + RSRC_KEY_TMPL = '/device[{:s}]/flow[{:s}]' + resource_key = RSRC_KEY_TMPL.format(device_name, flow_rule_name) + resource_value = { + 'dpid' : dpid, + 'in-port' : in_port, + 'out-port' : out_port, + 'src-ip-addr' : ipv4_addresses[ 0], + 'dst-ip-addr' : ipv4_addresses[-1], + } + json_config_rule_method = json_config_rule_delete if is_delete else json_config_rule_set + flow_rule = json_config_rule_method(resource_key, resource_value) + return ConfigRule(**flow_rule) + + class L3NMRyuServiceHandler(_ServiceHandler): def __init__( # pylint: disable=super-init-not-called self, service : Service, task_executor : TaskExecutor, **settings @@ -37,236 +147,170 @@ class L3NMRyuServiceHandler(_ServiceHandler): self.__task_executor = task_executor self.__settings_handler = SettingsHandler(service.service_config, **settings) - def _get_endpoint_details( - self, endpoint : Tuple[str, str, Optional[str]] - ) -> Tuple[Device, EndPoint]: #Dict]: - device_uuid, endpoint_uuid = get_device_endpoint_uuids(endpoint) - device_obj = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid))) + def _get_device_endpoint_obj_from_id( + self, endpoint_id : EndPointId + ) -> Tuple[Device, EndPoint]: + device_uuid = endpoint_id.device_id.device_uuid.uuid + endpoint_uuid = endpoint_id.endpoint_uuid.uuid + device_obj = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid))) + endpoint_obj = get_endpoint_matching(device_obj, endpoint_uuid) + return device_obj, endpoint_obj + + def _get_device_endpoint_obj_from_key( + self, endpoint_key : Tuple[str, str, Optional[str]] + ) -> Tuple[Device, EndPoint]: + device_uuid, endpoint_uuid = get_device_endpoint_uuids(endpoint_key) + device_obj = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid))) endpoint_obj = get_endpoint_matching(device_obj, endpoint_uuid) - device_name = device_obj.name - endpoint_name = endpoint_obj.name - return device_obj, endpoint_obj + return device_obj, endpoint_obj + + def _configure_hop_flow_rules( + self, src_ep_key : Tuple[str, str, Optional[str]], dst_ep_key : Tuple[str, str, Optional[str]], + service_data : ServiceData, is_delete : bool = False + ) -> None: + src_dev, src_ep = self._get_device_endpoint_obj_from_key(src_ep_key) + dst_dev, dst_ep = self._get_device_endpoint_obj_from_key(dst_ep_key) + if src_dev.device_id.device_uuid.uuid != dst_dev.device_id.device_uuid.uuid: + MSG = 'Mismatching device for endpoints: {:s}-{:s}' + raise Exception(MSG.format(str(src_ep_key), str(dst_ep_key))) + + src_ctrl = self.__task_executor.get_device_controller(src_dev) + dst_ctrl = self.__task_executor.get_device_controller(dst_dev) + if src_ctrl != dst_ctrl: + MSG = 'Mismatching controller for endpoints: {:s}-{:s}' + raise Exception(MSG.format(str(src_ep_key), str(dst_ep_key))) + + device_name = src_ep.name.split('-')[0] + device_dpid = src_dev.name + + ctrl = src_ctrl + LOGGER.debug('Ctrl: {:s}'.format(str(ctrl.name))) + + del ctrl.device_config.config_rules[:] + del ctrl.device_endpoints[:] + + forward_flow_rule = compose_flow_rule( + device_name, device_dpid, src_ep.name, dst_ep.name, service_data, + reverse=False, is_delete=is_delete + ) + MSG = 'Forward Config Rule: {:s}' + LOGGER.debug(MSG.format(grpc_message_to_json_string(forward_flow_rule))) + ctrl.device_config.config_rules.append(forward_flow_rule) + + reverse_flow_rule = compose_flow_rule( + device_name, device_dpid, src_ep.name, dst_ep.name, service_data, + reverse=True, is_delete=is_delete + ) + MSG = 'Reverse Config Rule: {:s}' + LOGGER.debug(MSG.format(grpc_message_to_json_string(reverse_flow_rule))) + ctrl.device_config.config_rules.append(reverse_flow_rule) + + self.__task_executor.configure_device(ctrl) @metered_subclass_method(METRICS_POOL) def SetEndpoint( self, endpoints : List[Tuple[str, str, Optional[str]]], connection_uuid : Optional[str] = None ) -> List[Union[bool, Exception]]: - LOGGER.debug('endpoints = {:s}'.format(str(endpoints))) + LOGGER.debug('[SetEndpoint] endpoints = {:s}'.format(str(endpoints))) chk_type('endpoints', endpoints, list) if len(endpoints) < 2: LOGGER.warning('nothing done: not enough endpoints') return [] - - service_uuid = self.__service.service_id.service_uuid.uuid - service_name= self.__service.name - service_configuration_rules=self.__service.service_config.config_rules - LOGGER.debug('service_configuration_rules = {:s}'.format(str(service_configuration_rules))) - ip_addresses = [] - flow_rules = [] - - for rule in service_configuration_rules: - try: - custom_field = rule.custom - resource_value_str = custom_field.resource_value - resource_value = json.loads(resource_value_str) - resource_key_str = custom_field.resource_key - LOGGER.debug(f"resource_key_str = {resource_key_str}") - match = re.search(r"/device\[(.*?)\]/", resource_key_str) - if match: - device_name = match.group(1) - flow_rules.append(device_name) - ip_address = resource_value.get("ip_address") - ip_addresses.append(ip_address) - - except Exception as e: - LOGGER.exception("Error in Rules") - - LOGGER.debug('ip_address = {:s}'.format(str(ip_addresses))) - LOGGER.debug('flow_rules = {:s}'.format(str(flow_rules))) - if len(flow_rules) < 2: - LOGGER.warning('Not enough devices to construct flow rules') - return [] - if len(ip_addresses) < 2: - LOGGER.warning('Not enough IP addresses found') - return [] - + + service_endpoint_ids = list(self.__service.service_endpoint_ids) + src_device_obj, src_endpoint_obj = self._get_device_endpoint_obj_from_id(service_endpoint_ids[ 0]) + dst_device_obj, dst_endpoint_obj = self._get_device_endpoint_obj_from_id(service_endpoint_ids[-1]) + service_data = ServiceData.create( + src_device_obj, src_endpoint_obj, dst_device_obj, dst_endpoint_obj, self.__settings_handler + ) + results = [] try: - src_device, src_endpoint, = self._get_endpoint_details(endpoints[0]) - dst_device, dst_endpoint, = self._get_endpoint_details(endpoints[-1]) - src_controller = self.__task_executor.get_device_controller(src_device) - del src_controller.device_config.config_rules[:] - - for index in range(len(endpoints) - 1): - current_device, current_endpoint = self._get_endpoint_details(endpoints[index]) - next_device, next_endpoint = self._get_endpoint_details(endpoints[index + 1]) - if current_device.name == next_device.name: - in_port_forward = current_endpoint.name - out_port_forward = next_endpoint.name - dpid_src = int(current_device.name) - LOGGER.debug(f"DPID source: {dpid_src}") - dpid_dst = int(next_device.name) - LOGGER.debug(f"DPID destination: {dpid_dst}") - flow_rule_forward = f"{flow_rules[0]}-{flow_rules[1]}" - flow_rule_reverse = f"{flow_rules[1]}-{flow_rules[0]}" - ip_address_source = ip_addresses[0] - ip_address_destination = ip_addresses[1] - forward_resource_value = ({"dpid": current_device.name, - "in-port": in_port_forward, - "out-port": out_port_forward, - "ip_address_source": ip_address_source, - "ip_address_destination": ip_address_destination, - }) - forward_rule = json_config_rule_set ( - resource_key=f"/device[{current_endpoint.name.split('-')[0]}]/flow[{flow_rule_forward}]", - resource_value=forward_resource_value - ) - LOGGER.debug(f"Forward configuration rule: {forward_rule}") - src_controller.device_config.config_rules.append(ConfigRule(**forward_rule)) - in_port_reverse = next_endpoint.name - out_port_reverse = current_endpoint.name - reverse_resource_value = { - "dpid": current_device.name, - "in-port": in_port_reverse, - "out-port": out_port_reverse, - "ip_address_source": ip_address_destination, - "ip_address_destination": ip_address_source, - } - reverse_rule = json_config_rule_set( - resource_key=f"/device[{current_endpoint.name.split('-')[0]}]/flow[{flow_rule_reverse}]", - resource_value=reverse_resource_value - ) - LOGGER.debug(f"Reverse configuration rule: {reverse_rule}") - src_controller.device_config.config_rules.append(ConfigRule(**reverse_rule)) - self.__task_executor.configure_device(src_controller) - results.append(True) - - def get_config_rules(controller): - try: - config_rules = controller.device_config.config_rules - for rule in config_rules: - if rule.HasField("custom"): - resource_key = rule.custom.resource_key - resource_value = rule.custom.resource_value - LOGGER.debug(f"Resource key in config: {resource_key}, Resource value in config: {resource_value}") - except Exception as e: - LOGGER.exception("Error in Configuration Rules") - get_config_rules(src_controller) - LOGGER.debug(f"Configuration rules: {src_controller.device_config.config_rules}") + it_endpoints = iter(endpoints) + for src_ep_key, dst_ep_key in zip(it_endpoints, it_endpoints): + self._configure_hop_flow_rules(src_ep_key, dst_ep_key, service_data, is_delete=False) + results.append(True) return results - except Exception as e: LOGGER.exception("Error in SetEndpoint") return [e] - + @metered_subclass_method(METRICS_POOL) def DeleteEndpoint( self, endpoints : List[Tuple[str, str, Optional[str]]], connection_uuid : Optional[str] = None ) -> List[Union[bool, Exception]]: - LOGGER.debug('endpoints_delete = {:s}'.format(str(endpoints))) + LOGGER.debug('[DeleteEndpoint] endpoints = {:s}'.format(str(endpoints))) chk_type('endpoints', endpoints, list) + if len(endpoints) < 2: LOGGER.warning('nothing done: not enough endpoints') return [] - service_uuid = self.__service.service_id.service_uuid.uuid - service_name= self.__service.name - service_configuration_rules=self.__service.service_config.config_rules - LOGGER.debug('service_configuration_rules = {:s}'.format(str(service_configuration_rules))) - ip_addresses = [] - flow_rules = [] - for rule in service_configuration_rules: - try: - custom_field = rule.custom - resource_value_str = custom_field.resource_value - resource_value = json.loads(resource_value_str) - resource_key_str = custom_field.resource_key - LOGGER.debug(f"resource_key_str = {resource_key_str}") - match = re.search(r"/device\[(.*?)\]/", resource_key_str) - if match: - device_name = match.group(1) - else: - device_name = None - flow_rules.append(device_name) - ip_address = resource_value.get("ip_address") - ip_addresses.append(ip_address) - - except Exception as e: - LOGGER.exception("Error in Rules") - LOGGER.debug('ip_address = {:s}'.format(str(ip_addresses))) - LOGGER.debug('flow_rules = {:s}'.format(str(flow_rules))) + + service_endpoint_ids = list(self.__service.service_endpoint_ids) + src_device_obj, src_endpoint_obj = self._get_device_endpoint_obj_from_id(service_endpoint_ids[ 0]) + dst_device_obj, dst_endpoint_obj = self._get_device_endpoint_obj_from_id(service_endpoint_ids[-1]) + service_data = ServiceData.create( + src_device_obj, src_endpoint_obj, dst_device_obj, dst_endpoint_obj, self.__settings_handler + ) + results = [] try: - src_device, src_endpoint, = self._get_endpoint_details(endpoints[0]) - dst_device, dst_endpoint, = self._get_endpoint_details(endpoints[-1]) - src_controller = self.__task_executor.get_device_controller(src_device) - del src_controller.device_config.config_rules[:] - for index in range(len(endpoints) - 1): - current_device, current_endpoint = self._get_endpoint_details(endpoints[index]) - next_device, next_endpoint = self._get_endpoint_details(endpoints[index + 1]) - if current_device.name == next_device.name: - in_port_forward = current_endpoint.name - out_port_forward = next_endpoint.name - dpid_src = int(current_device.name) - LOGGER.debug(f"DPID source: {dpid_src}") - dpid_dst = int(next_device.name) - LOGGER.debug(f"DPID destination: {dpid_dst}") - flow_rule_forward = f"{flow_rules[0]}-{flow_rules[1]}" - flow_rule_reverse = f"{flow_rules[1]}-{flow_rules[0]}" - ip_address_source = ip_addresses[0] - ip_address_destination = ip_addresses[1] - - forward_resource_value = ({"dpid": current_device.name, - "in-port": in_port_forward, - "out-port": out_port_forward, - "ip_address_source": ip_address_source, - "ip_address_destination": ip_address_destination, - }) - forward_rule = json_config_rule_delete ( - resource_key=f"/device[{current_endpoint.name.split('-')[0]}]/flow[{flow_rule_forward}]", - resource_value=forward_resource_value - ) - - LOGGER.debug(f"Forward configuration rule: {forward_rule}") - in_port_reverse = next_endpoint.name - out_port_reverse = current_endpoint.name - reverse_resource_value = { - "dpid": current_device.name, - "in-port": in_port_reverse, - "out-port": out_port_reverse, - "ip_address_source": ip_address_destination, - "ip_address_destination": ip_address_source, - } - reverse_rule = json_config_rule_delete( - resource_key=f"/device[{current_endpoint.name.split('-')[0]}]/flow[{flow_rule_reverse}]", - resource_value=reverse_resource_value - ) - LOGGER.debug(f"Reverse configuration rule: {reverse_rule}") - src_controller.device_config.config_rules.append(ConfigRule(**reverse_rule)) - src_controller.device_config.config_rules.append(ConfigRule(**forward_rule)) - - json_config_rule_delete_1 = json_config_rule_delete('/services/service[{:s}]'.format(service_uuid), { - 'uuid': service_uuid - }) - src_controller.device_config.config_rules.append(ConfigRule(**json_config_rule_delete_1)) - self.__task_executor.configure_device(src_controller) - results.append(True) - - def get_config_rules(controller): - try: - config_rules = controller.device_config.config_rules - for rule in config_rules: - if rule.HasField("custom"): - resource_key = rule.custom.resource_key - resource_value = rule.custom.resource_value - LOGGER.debug(f"Resource key in config: {resource_key}, Resource value in config: {resource_value}") - except Exception as e: - print(f"Error accessing config rules: {e}") - - get_config_rules(src_controller) - LOGGER.debug(f"Configuration rules: {src_controller.device_config.config_rules}") + it_endpoints = iter(endpoints) + for src_ep_key, dst_ep_key in zip(it_endpoints, it_endpoints): + self._configure_hop_flow_rules(src_ep_key, dst_ep_key, service_data, is_delete=True) + results.append(True) return results - except Exception as e: - LOGGER.exception(f"Error in DeleteEndpoint") - return [e] \ No newline at end of file + LOGGER.exception("Error in SetEndpoint") + return [e] + + @metered_subclass_method(METRICS_POOL) + def SetConstraint(self, constraints : List[Tuple[str, Any]]) -> List[Union[bool, Exception]]: + chk_type('constraints', constraints, list) + if len(constraints) == 0: return [] + + msg = '[SetConstraint] Method not implemented. Constraints({:s}) are being ignored.' + LOGGER.warning(msg.format(str(constraints))) + return [True for _ in range(len(constraints))] + + @metered_subclass_method(METRICS_POOL) + def DeleteConstraint(self, constraints : List[Tuple[str, Any]]) -> List[Union[bool, Exception]]: + chk_type('constraints', constraints, list) + if len(constraints) == 0: return [] + + msg = '[DeleteConstraint] Method not implemented. Constraints({:s}) are being ignored.' + LOGGER.warning(msg.format(str(constraints))) + return [True for _ in range(len(constraints))] + + @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 = [] + for resource in resources: + try: + resource_value = json.loads(resource[1]) + self.__settings_handler.set(resource[0], resource_value) + results.append(True) + except Exception as e: # pylint: disable=broad-except + LOGGER.exception('Unable to SetConfig({:s})'.format(str(resource))) + 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 = [] + for resource in resources: + try: + self.__settings_handler.delete(resource[0]) + except Exception as e: # pylint: disable=broad-except + LOGGER.exception('Unable to DeleteConfig({:s})'.format(str(resource))) + results.append(e) + + return results diff --git a/src/service/service/service_handlers/p4_fabric_tna_acl/p4_fabric_tna_acl_config.py b/src/service/service/service_handlers/p4_fabric_tna_acl/p4_fabric_tna_acl_config.py index 5ec1bc489478749267f773e4950748879f88ba74..e251c8a9e6ae54d30715a284a93a0e00ac312d9e 100644 --- a/src/service/service/service_handlers/p4_fabric_tna_acl/p4_fabric_tna_acl_config.py +++ b/src/service/service/service_handlers/p4_fabric_tna_acl/p4_fabric_tna_acl_config.py @@ -22,12 +22,8 @@ SD-Fabric repo: https://github.com/stratum/fabric-tna SD-Fabric docs: https://docs.sd-fabric.org/master/index.html """ -import logging - from service.service.service_handlers.p4_fabric_tna_commons.p4_fabric_tna_commons import * -LOGGER = logging.getLogger(__name__) - # ACL service handler settings ACL = "acl" ACTION = "action" diff --git a/src/service/service/service_handlers/p4_fabric_tna_acl/p4_fabric_tna_acl_service_handler.py b/src/service/service/service_handlers/p4_fabric_tna_acl/p4_fabric_tna_acl_service_handler.py index ae22bed057e3a5808e937ac8b4285a4e0aea42d8..466f37601a3c97d1a2095e12833229bf74453f1a 100644 --- a/src/service/service/service_handlers/p4_fabric_tna_acl/p4_fabric_tna_acl_service_handler.py +++ b/src/service/service/service_handlers/p4_fabric_tna_acl/p4_fabric_tna_acl_service_handler.py @@ -84,8 +84,7 @@ class P4FabricACLServiceHandler(_ServiceHandler): chk_type('endpoints', endpoints, list) if len(endpoints) == 0: return [] - LOGGER.info("{} - Provision service configuration".format( - self.__service_label)) + LOGGER.info(f"{self.__service_label} - Provision service configuration") visited = set() results = [] @@ -94,17 +93,17 @@ class P4FabricACLServiceHandler(_ServiceHandler): device = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid))) device_name = device.name - LOGGER.info("Device {}".format(device_name)) - LOGGER.info("\t | Service endpoint UUID: {}".format(endpoint_uuid)) + LOGGER.info(f"Device {device_name}") + LOGGER.info(f"\t | Service endpoint UUID: {endpoint_uuid}") port_id = find_port_id_in_endpoint_list(device.device_endpoints, endpoint_uuid) - LOGGER.info("\t | Service port ID: {}".format(port_id)) + LOGGER.info(f"\t | Service port ID: {port_id}") try: # Check if this port is part of the ACL configuration _ = self._get_switch_port_in_port_map(device_name, port_id) except Exception: - LOGGER.warning("Switch {} endpoint {} is not part of the ACL configuration".format(device_name, port_id)) + LOGGER.warning(f"Switch {device_name} endpoint {port_id} is not part of the ACL configuration") results.append(False) continue @@ -129,15 +128,14 @@ class P4FabricACLServiceHandler(_ServiceHandler): json_config_rules=rules ) except Exception as ex: - LOGGER.error("Failed to insert ACL rules on device {} due to {}".format(device.name, ex)) + LOGGER.error(f"Failed to insert ACL rules on device {device.name} due to {ex}") results.append(ex) finally: rules.clear() # Ensure correct status if (failed_rules == 0) and (applied_rules == actual_rules): - LOGGER.info("Installed {}/{} ACL rules on device {} and port {}".format( - applied_rules, actual_rules, device_name, port_id)) + LOGGER.info(f"Installed {applied_rules}/{actual_rules} ACL rules on device {device_name} and port {port_id}") results.append(True) # You should no longer visit this device port again @@ -169,8 +167,7 @@ class P4FabricACLServiceHandler(_ServiceHandler): chk_type('endpoints', endpoints, list) if len(endpoints) == 0: return [] - LOGGER.info("{} - Deprovision service configuration".format( - self.__service_label)) + LOGGER.info(f"{self.__service_label} - Deprovision service configuration") visited = set() results = [] @@ -179,17 +176,17 @@ class P4FabricACLServiceHandler(_ServiceHandler): device = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid))) device_name = device.name - LOGGER.info("Device {}".format(device_name)) - LOGGER.info("\t | Service endpoint UUID: {}".format(endpoint_uuid)) + LOGGER.info(f"Device {device_name}") + LOGGER.info(f"\t | Service endpoint UUID: {endpoint_uuid}") port_id = find_port_id_in_endpoint_list(device.device_endpoints, endpoint_uuid) - LOGGER.info("\t | Service port ID: {}".format(port_id)) + LOGGER.info(f"\t | Service port ID: {port_id}") try: # Check if this port is part of the ACL configuration _ = self._get_switch_port_in_port_map(device_name, port_id) except Exception as ex: - LOGGER.warning("Switch {} endpoint {} is not part of the ACL configuration".format(device_name, port_id)) + LOGGER.warning(f"Switch {device_name} endpoint {port_id} is not part of the ACL configuration") results.append(False) continue @@ -214,15 +211,14 @@ class P4FabricACLServiceHandler(_ServiceHandler): json_config_rules=rules ) except Exception as ex: - LOGGER.error("Failed to delete ACL rules from device {} due to {}".format(device.name, ex)) + LOGGER.error(f"Failed to delete ACL rules from device {device.name} due to {ex}") results.append(ex) finally: rules.clear() # Ensure correct status if (failed_rules == 0) and (applied_rules == actual_rules): - LOGGER.info("Deleted {}/{} ACL rules from device {} and port {}".format( - applied_rules, actual_rules, device_name, port_id)) + LOGGER.info(f"Deleted {applied_rules}/{actual_rules} ACL rules from device {device_name} and port {port_id}") results.append(True) # You should no longer visit this device port again @@ -333,37 +329,36 @@ class P4FabricACLServiceHandler(_ServiceHandler): try: self.__settings = self.__settings_handler.get('/settings') - LOGGER.info("{} with settings: {}".format(self.__service_label, self.__settings)) + LOGGER.info(f"{self.__service_label} with settings: {self.__settings}") except Exception as ex: - LOGGER.error("Failed to retrieve service settings: {}".format(ex)) + LOGGER.error(f"Failed to retrieve service settings: {ex}") raise Exception(ex) def _parse_settings(self): try: switch_info = self.__settings.value[SWITCH_INFO] except Exception as ex: - LOGGER.error("Failed to parse service settings: {}".format(ex)) + LOGGER.error(f"Failed to parse service settings: {ex}") raise Exception(ex) assert isinstance(switch_info, list), "Switch info object must be a list" for switch in switch_info: for switch_name, sw_info in switch.items(): assert switch_name, "Invalid P4 switch name" - assert isinstance(sw_info, dict), "Switch {} info must be a map with arch, dpid, and fwd_list items)" + assert isinstance(sw_info, dict), f"Switch {switch_name} info must be a map with arch, dpid, and fwd_list items)" assert sw_info[ARCH] in SUPPORTED_TARGET_ARCH_LIST, \ - "Switch {} - Supported P4 architectures are: {}".format(switch_name, ','.join(SUPPORTED_TARGET_ARCH_LIST)) + f"Switch {switch_name} - Supported P4 architectures are: {','.join(SUPPORTED_TARGET_ARCH_LIST)}" switch_dpid = sw_info[DPID] - assert switch_dpid > 0, "Switch {} - P4 switch dataplane ID must be a positive integer".format(switch_name, sw_info[DPID]) + assert switch_dpid > 0, f"Switch {switch_name} - P4 switch dataplane ID {sw_info[DPID]} must be a positive integer" # Access Control list acl = sw_info[ACL] assert isinstance(acl, list),\ - "Switch {} access control list must be a list with port_id, [ipv4_dst/src, trn_post_dst/src], and action items)".\ - format(switch_name) + f"Switch {switch_name} access control list must be a list with port_id, [ipv4_dst/src, trn_post_dst/src], and action items)" for acl_entry in acl: - LOGGER.info("ACL entry: {}".format(acl_entry)) + LOGGER.info(f"ACL entry: {acl_entry}") port_id = acl_entry[PORT_ID] - assert port_id >= 0, "Switch {} - Invalid P4 switch port ID".format(switch_name) + assert port_id >= 0, f"Switch {switch_name} - Invalid P4 switch port ID" # Prepare the port map if switch_name not in self.__port_map: @@ -380,35 +375,35 @@ class P4FabricACLServiceHandler(_ServiceHandler): ipv4_src = "" if IPV4_SRC in acl_entry: ipv4_src = acl_entry[IPV4_SRC] - assert chk_address_ipv4(ipv4_src), "Invalid source IPv4 address {}".format(ipv4_dst) + assert chk_address_ipv4(ipv4_src), f"Invalid source IPv4 address {ipv4_src}" map_entry[IPV4_SRC] = ipv4_src ipv4_dst = "" if IPV4_DST in acl_entry: ipv4_dst = acl_entry[IPV4_DST] - assert chk_address_ipv4(ipv4_dst), "Invalid destination IPv4 address {}".format(ipv4_dst) + assert chk_address_ipv4(ipv4_dst), f"Invalid destination IPv4 address {ipv4_dst}" map_entry[IPV4_DST] = ipv4_dst ipv4_prefix_len = -1 if ipv4_src or ipv4_dst: ipv4_prefix_len = acl_entry[IPV4_PREFIX_LEN] - assert chk_prefix_len_ipv4(ipv4_prefix_len), "Invalid IPv4 address prefix length {}".format(ipv4_prefix_len) + assert chk_prefix_len_ipv4(ipv4_prefix_len), f"Invalid IPv4 address prefix length {ipv4_prefix_len}" map_entry[IPV4_PREFIX_LEN] = ipv4_prefix_len trn_port_src = -1 if TRN_PORT_SRC in acl_entry: trn_port_src = acl_entry[TRN_PORT_SRC] - assert chk_transport_port(trn_port_src), "Invalid source transport port {}".format(trn_port_src) + assert chk_transport_port(trn_port_src), f"Invalid source transport port {trn_port_src}" map_entry[TRN_PORT_SRC] = trn_port_src trn_port_dst = -1 if TRN_PORT_DST in acl_entry: trn_port_dst = acl_entry[TRN_PORT_DST] - assert chk_transport_port(trn_port_dst), "Invalid destination transport port {}".format(trn_port_dst) + assert chk_transport_port(trn_port_dst), f"Invalid destination transport port {trn_port_dst}" map_entry[TRN_PORT_DST] = trn_port_dst action = acl_entry[ACTION] - assert is_valid_acl_action(action), "Valid actions are: {}".format(','.join(ACTION_LIST)) + assert is_valid_acl_action(action), f"Valid actions are: {','.join(ACTION_LIST)}" # Retrieve entry from the port map switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) @@ -419,22 +414,22 @@ class P4FabricACLServiceHandler(_ServiceHandler): self.__switch_info[switch_name] = sw_info def _print_settings(self): - LOGGER.info("--------------- {} settings ---------------".format(self.__service.name)) + LOGGER.info(f"--------------- {self.__service.name} settings ---------------") LOGGER.info("--- Topology info") for switch_name, switch_info in self.__switch_info.items(): - LOGGER.info("\t Device {}".format(switch_name)) - LOGGER.info("\t\t| Target P4 architecture: {}".format(switch_info[ARCH])) - LOGGER.info("\t\t| Data plane ID: {}".format(switch_info[DPID])) - LOGGER.info("\t\t| Port map: {}".format(self.__port_map[switch_name])) + LOGGER.info(f"\t Device {switch_name}") + LOGGER.info(f"\t\t| Target P4 architecture: {switch_info[ARCH]}") + LOGGER.info(f"\t\t| Data plane ID: {switch_info[DPID]}") + LOGGER.info(f"\t\t| Port map: {self.__port_map[switch_name]}") LOGGER.info("-------------------------------------------------------") def _get_switch_port_in_port_map(self, switch_name : str, port_id : int) -> Dict: assert switch_name, "A valid switch name must be used as a key to the port map" assert port_id > 0, "A valid switch port ID must be used as a key to a switch's port map" switch_entry = self.__port_map[switch_name] - assert switch_entry, "Switch {} does not exist in the port map".format(switch_name) + assert switch_entry, f"Switch {switch_name} does not exist in the port map" port_key = PORT_PREFIX + str(port_id) - assert switch_entry[port_key], "Port with ID {} does not exist in the switch map".format(port_id) + assert switch_entry[port_key], f"Port with ID {port_id} does not exist in the switch map" return switch_entry[port_key] @@ -453,7 +448,7 @@ class P4FabricACLServiceHandler(_ServiceHandler): if IPV4_SRC in acl_entry: try: rules += rules_set_up_acl_filter_host( - ingress_port=port_id, + port_id=port_id, ip_address=acl_entry[IPV4_SRC], prefix_len=acl_entry[IPV4_PREFIX_LEN], ip_direction="src", @@ -466,7 +461,7 @@ class P4FabricACLServiceHandler(_ServiceHandler): if IPV4_DST in acl_entry: try: rules += rules_set_up_acl_filter_host( - ingress_port=port_id, + port_id=port_id, ip_address=acl_entry[IPV4_DST], prefix_len=acl_entry[IPV4_PREFIX_LEN], ip_direction="dst", @@ -479,7 +474,7 @@ class P4FabricACLServiceHandler(_ServiceHandler): if TRN_PORT_SRC in acl_entry: try: rules += rules_set_up_acl_filter_port( - ingress_port=port_id, + port_id=port_id, transport_port=acl_entry[TRN_PORT_SRC], transport_direction="src", action=action @@ -491,7 +486,7 @@ class P4FabricACLServiceHandler(_ServiceHandler): if TRN_PORT_DST in acl_entry: try: rules += rules_set_up_acl_filter_port( - ingress_port=port_id, + port_id=port_id, transport_port=acl_entry[TRN_PORT_DST], transport_direction="dst", action=action diff --git a/src/service/service/service_handlers/p4_fabric_tna_commons/p4_fabric_tna_commons.py b/src/service/service/service_handlers/p4_fabric_tna_commons/p4_fabric_tna_commons.py index ab3bc28582ef340bc57f6842ba2ea6b6209a11ba..b03cfc908690de537dca1e451ab5c4baaafbbc52 100644 --- a/src/service/service/service_handlers/p4_fabric_tna_commons/p4_fabric_tna_commons.py +++ b/src/service/service/service_handlers/p4_fabric_tna_commons/p4_fabric_tna_commons.py @@ -48,7 +48,11 @@ VLAN_ID = "vlan_id" RECIRCULATION_PORT_LIST = "recirculation_port_list" PORT_LIST = "port_list" PORT_PREFIX = "port-" +FORWARDING_LIST = "fwd_list" ROUTING_LIST = "routing_list" +HOST_LIST = "host_list" +HOST_MAC = "host_mac" +HOST_LABEL = "host_label" MAC_SRC = "mac_src" MAC_DST = "mac_dst" IPV4_SRC = "ipv4_src" @@ -72,6 +76,7 @@ TABLE_EGRESS_VLAN = "FabricEgress.egress_next.egress_vlan" TABLE_FWD_CLASSIFIER = "FabricIngress.filtering.fwd_classifier" TABLE_BRIDGING = "FabricIngress.forwarding.bridging" TABLE_ROUTING_V4 = "FabricIngress.forwarding.routing_v4" +TABLE_PRE_NEXT_VLAN = "FabricIngress.pre_next.next_vlan" TABLE_NEXT_SIMPLE = "FabricIngress.next.simple" TABLE_NEXT_HASHED = "FabricIngress.next.hashed" TABLE_ACL = "FabricIngress.acl.acl" @@ -136,9 +141,6 @@ DEF_VLAN = 4094 ETHER_TYPE_IPV4 = "0x0800" ETHER_TYPE_IPV6 = "0x86DD" -# Member ID -NEXT_MEMBER_ID = 1 - # Time interval in seconds for consecutive rule management (insert/delete) operations RULE_CONF_INTERVAL_SEC = 0.1 @@ -208,11 +210,11 @@ def find_port_id_in_endpoint_list(endpoint_list : List, target_endpoint_uuid : s ################################### def rules_set_up_port_ingress( - ingress_port : int, + port_id : int, port_type : str, vlan_id: int, action : ConfigActionEnum) -> List [Tuple]: # type: ignore - assert ingress_port >= 0, "Invalid ingress port to configure ingress port" + assert port_id >= 0, "Invalid port ID to configure ingress port" assert port_type.lower() in PORT_TYPES_STR_VALID, "Invalid port type to configure ingress port" assert chk_vlan_id(vlan_id), "Invalid VLAN ID to configure ingress port" @@ -224,6 +226,12 @@ def rules_set_up_port_ingress( port_type_int = PORT_TYPE_MAP[port_type.lower()] assert port_type_int in PORT_TYPES_INT_VALID, "Invalid port type to configure ingress filtering" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure ingress port") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== VLAN is valid {vlan_is_valid}") + LOGGER.info(f"================== Port type {port_type_int}") + rules_filtering_vlan_ingress = [] rules_filtering_vlan_ingress.append( json_config_rule( @@ -234,7 +242,7 @@ def rules_set_up_port_ingress( 'match-fields': [ { 'match-field': 'ig_port', - 'match-value': str(ingress_port) + 'match-value': str(port_id) }, { 'match-field': 'vlan_is_valid', @@ -266,6 +274,11 @@ def rules_set_up_port_egress( assert egress_port >= 0, "Invalid egress port to configure egress vlan" assert chk_vlan_id(vlan_id), "Invalid VLAN ID to configure egress vlan" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure egress port") + LOGGER.info(f"================== Port ID {egress_port}") + LOGGER.info(f"================== VLAN ID {vlan_id}") + rule_no = cache_rule(TABLE_EGRESS_VLAN, action) rules_vlan_egress = [] @@ -294,13 +307,19 @@ def rules_set_up_port_egress( return rules_vlan_egress def rules_set_up_fwd_classifier( - ingress_port : int, + port_id : int, fwd_type : int, eth_type: str, action : ConfigActionEnum) -> List [Tuple]: # type: ignore - assert ingress_port >= 0, "Invalid ingress port to configure forwarding classifier" + assert port_id >= 0, "Invalid port ID to configure forwarding classifier" assert fwd_type in FORWARDING_TYPES_VALID, "Invalid forwarding type to configure forwarding classifier" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure FWD classifier") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== Ethernet type {eth_type}") + LOGGER.info(f"================== FWD type {fwd_type}") + rule_no = cache_rule(TABLE_FWD_CLASSIFIER, action) rules_filtering_fwd_classifier = [] @@ -313,7 +332,7 @@ def rules_set_up_fwd_classifier( 'match-fields': [ { 'match-field': 'ig_port', - 'match-value': str(ingress_port) + 'match-value': str(port_id) }, { 'match-field': 'ip_eth_type', @@ -335,7 +354,7 @@ def rules_set_up_fwd_classifier( return rules_filtering_fwd_classifier def rules_set_up_port( - port : int, + port_id : int, port_type : str, fwd_type : int, vlan_id : int, @@ -345,7 +364,7 @@ def rules_set_up_port( rules_list.extend( rules_set_up_port_ingress( - ingress_port=port, + port_id=port_id, port_type=port_type, vlan_id=vlan_id, action=action @@ -353,7 +372,7 @@ def rules_set_up_port( ) rules_list.extend( rules_set_up_fwd_classifier( - ingress_port=port, + port_id=port_id, fwd_type=fwd_type, eth_type=eth_type, action=action @@ -361,15 +380,51 @@ def rules_set_up_port( ) rules_list.extend( rules_set_up_port_egress( - egress_port=port, + egress_port=port_id, vlan_id=vlan_id, action=action ) ) - LOGGER.debug("Port configured:{}".format(port)) + LOGGER.debug(f"Port configured:{port_id}") return rules_list +def rules_set_up_port_host( + port : int, + vlan_id : int, + action : ConfigActionEnum, # type: ignore + fwd_type=FORWARDING_TYPE_BRIDGING, + eth_type=ETHER_TYPE_IPV4): + # This is a host facing port + port_type = PORT_TYPE_HOST + + return rules_set_up_port( + port_id=port, + port_type=port_type, + fwd_type=fwd_type, + vlan_id=vlan_id, + action=action, + eth_type=eth_type + ) + +def rules_set_up_port_switch( + port : int, + vlan_id : int, + action : ConfigActionEnum, # type: ignore + fwd_type=FORWARDING_TYPE_BRIDGING, + eth_type=ETHER_TYPE_IPV4): + # This is a switch facing port + port_type = PORT_TYPE_SWITCH + + return rules_set_up_port( + port_id=port, + port_type=port_type, + fwd_type=fwd_type, + vlan_id=vlan_id, + action=action, + eth_type=eth_type + ) + ################################### ### A. End of port setup ################################### @@ -380,13 +435,22 @@ def rules_set_up_port( ################################### def rules_set_up_fwd_bridging( + port_id : int, vlan_id: int, eth_dst : str, - egress_port : int, + next_id : int, action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert port_id >= 0, "Invalid port ID to configure bridging" assert chk_vlan_id(vlan_id), "Invalid VLAN ID to configure bridging" assert chk_address_mac(eth_dst), "Invalid destination Ethernet address to configure bridging" - assert egress_port >= 0, "Invalid outport to configure bridging" + assert next_id >= 0, "Invalid next ID to configure bridging" + + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure bridging") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== VLAN ID {vlan_id}") + LOGGER.info(f"================== Ethernet Dst {eth_dst}") + LOGGER.info(f"================== Next ID {next_id}") rule_no = cache_rule(TABLE_BRIDGING, action) @@ -411,7 +475,7 @@ def rules_set_up_fwd_bridging( 'action-params': [ { 'action-param': 'next_id', - 'action-value': str(egress_port) + 'action-value': str(next_id) } ], 'priority': 1 @@ -421,80 +485,147 @@ def rules_set_up_fwd_bridging( return rules_fwd_bridging -def rules_set_up_next_output_simple( - egress_port : int, - action : ConfigActionEnum) -> List [Tuple]: # type: ignore - assert egress_port >= 0, "Invalid outport to configure next output simple" +def rules_set_up_pre_next_vlan( + port_id : int, + next_id : int, + vlan_id : int, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert port_id >= 0, "Invalid port ID to configure pre-next VLAN" + assert next_id >= 0, "Invalid next ID to configure pre-next VLAN" + assert chk_vlan_id(vlan_id), "Invalid VLAN ID to configure pre-next VLAN" - rule_no = cache_rule(TABLE_NEXT_SIMPLE, action) + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure pre-next VLAN") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== Next ID {next_id}") + LOGGER.info(f"================== VLAN ID {vlan_id}") - rules_next_output_simple = [] - rules_next_output_simple.append( + rule_no = cache_rule(TABLE_PRE_NEXT_VLAN, action) + + rules_pre_next_vlan = [] + rules_pre_next_vlan.append( json_config_rule( action, - '/tables/table/'+TABLE_NEXT_SIMPLE+'['+str(rule_no)+']', + '/tables/table/'+TABLE_PRE_NEXT_VLAN+'['+str(rule_no)+']', { - 'table-name': TABLE_NEXT_SIMPLE, + 'table-name': TABLE_PRE_NEXT_VLAN, 'match-fields': [ { 'match-field': 'next_id', - 'match-value': str(egress_port) + 'match-value': str(next_id) } ], - 'action-name': 'FabricIngress.next.output_simple', + 'action-name': 'FabricIngress.pre_next.set_vlan', 'action-params': [ { - 'action-param': 'port_num', - 'action-value': str(egress_port) + 'action-param': 'vlan_id', + 'action-value': str(vlan_id) } - ] + ], + 'priority': 0 } ) ) - return rules_next_output_simple - -def rules_set_up_next_output_hashed( - egress_port : int, - action : ConfigActionEnum, # type: ignore - next_id = None) -> List [Tuple]: - assert egress_port >= 0, "Invalid outport to configure next output hashed" + return rules_pre_next_vlan - if next_id is None: - next_id = egress_port +def rules_set_up_next_profile_hashed_output( + port_id : int, + next_id : int, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert port_id >= 0, "Invalid port ID to configure next profile for hashed output" + assert next_id >=0, "Invalid next ID to configure next profile for hashed output" - global NEXT_MEMBER_ID + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure next hashed profile for output") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== Next ID {next_id}") rule_no = cache_rule(ACTION_PROFILE_NEXT_HASHED, action) - rules_next_output_hashed = [] - rules_next_output_hashed.append( + rules_next_profile_hashed_out = [] + rules_next_profile_hashed_out.append( json_config_rule( action, '/action_profiles/action_profile/'+ACTION_PROFILE_NEXT_HASHED+'['+str(rule_no)+']', { 'action-profile-name': ACTION_PROFILE_NEXT_HASHED, - 'member-id': NEXT_MEMBER_ID, + 'member-id': next_id, 'action-name': 'FabricIngress.next.output_hashed', 'action-params': [ { 'action-param': 'port_num', - 'action-value': str(egress_port) + 'action-value': str(next_id) } ] } ) ) + return rules_next_profile_hashed_out + +def rules_set_up_next_output_simple( + port_id : int, + next_id : int, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert port_id >= 0, "Invalid port ID to configure next output simple" + assert next_id >=0, "Invalid next ID to configure next output simple" + + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure next output - simple") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== Next ID {next_id}") + + rule_no = cache_rule(TABLE_NEXT_SIMPLE, action) + + rules_next_output_simple = [] + rules_next_output_simple.append( + json_config_rule( + action, + '/tables/table/'+TABLE_NEXT_SIMPLE+'['+str(rule_no)+']', + { + 'table-name': TABLE_NEXT_SIMPLE, + 'match-fields': [ + { + 'match-field': 'next_id', + 'match-value': str(next_id) + } + ], + 'action-name': 'FabricIngress.next.output_simple', + 'action-params': [ + { + 'action-param': 'port_num', + 'action-value': str(next_id) + } + ] + } + ) + ) + + return rules_next_output_simple + +def rules_set_up_next_hashed( + port_id : int, + next_id : int, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert port_id >= 0, "Invalid port ID to configure next routing hashed" + assert next_id >=0, "Invalid next ID to configure next routing hashed" + + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure next output - hashed routing") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== Next ID {next_id}") + rule_no = cache_rule(TABLE_NEXT_HASHED, action) - rules_next_output_hashed.append( + rules_next_hashed = [] + rules_next_hashed.append( json_config_rule( action, '/tables/table/'+TABLE_NEXT_HASHED+'['+str(rule_no)+']', { 'table-name': TABLE_NEXT_HASHED, - 'member-id': NEXT_MEMBER_ID, + 'member-id': next_id, 'match-fields': [ { 'match-field': 'next_id', @@ -505,9 +636,7 @@ def rules_set_up_next_output_hashed( ) ) - NEXT_MEMBER_ID += 1 - - return rules_next_output_hashed + return rules_next_hashed ################################### ### B. End of L2 setup @@ -518,14 +647,71 @@ def rules_set_up_next_output_hashed( ### C. L3 setup ################################### +def rules_set_up_next_profile_hashed_routing( + port_id : int, + next_id : int, + eth_src : str, + eth_dst : str, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert port_id >= 0, "Invalid port ID to configure next profile for hashed routing" + assert next_id >=0, "Invalid next ID to configure next profile for hashed routing" + assert chk_address_mac(eth_src), "Invalid source Ethernet address to configure next profile for hashed routing" + assert chk_address_mac(eth_dst), "Invalid destination Ethernet address to configure next profile for hashed routing" + + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure next hashed profile for routing") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== Next ID {next_id}") + LOGGER.info(f"================== Ethernet Src {eth_src}") + LOGGER.info(f"================== Ethernet Dst {eth_dst}") + + rule_no = cache_rule(ACTION_PROFILE_NEXT_HASHED, action) + + rules_next_profile_hashed_rt = [] + rules_next_profile_hashed_rt.append( + json_config_rule( + action, + '/action_profiles/action_profile/'+ACTION_PROFILE_NEXT_HASHED+'['+str(rule_no)+']', + { + 'action-profile-name': ACTION_PROFILE_NEXT_HASHED, + 'member-id': next_id, + 'action-name': 'FabricIngress.next.routing_hashed', + 'action-params': [ + { + 'action-param': 'port_num', + 'action-value': str(next_id) + }, + { + 'action-param': 'smac', + 'action-value': eth_src + }, + { + 'action-param': 'dmac', + 'action-value': eth_dst + } + ] + } + ) + ) + + return rules_next_profile_hashed_rt + def rules_set_up_routing( + port_id : int, ipv4_dst : str, ipv4_prefix_len : int, - egress_port : int, + next_id : int, action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert port_id >= 0, "Invalid port ID to configure routing" assert chk_address_ipv4(ipv4_dst), "Invalid destination IPv4 address to configure routing" - assert chk_prefix_len_ipv4(ipv4_prefix_len), "Invalid IPv4 prefix length" - assert egress_port >= 0, "Invalid outport to configure routing" + assert chk_prefix_len_ipv4(ipv4_prefix_len), "Invalid IPv4 prefix length to configure routing" + assert next_id >= 0, "Invalid next ID to configure routing" + + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure routing") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== IPv4 dst {ipv4_dst}/{ipv4_prefix_len}") + LOGGER.info(f"================== Next ID {next_id}") rule_no = cache_rule(TABLE_ROUTING_V4, action) @@ -546,7 +732,7 @@ def rules_set_up_routing( 'action-params': [ { 'action-param': 'next_id', - 'action-value': str(egress_port) + 'action-value': str(next_id) } ] } @@ -556,14 +742,23 @@ def rules_set_up_routing( return rules_routing def rules_set_up_next_routing_simple( - egress_port : int, + port_id : int, + next_id : int, eth_src : str, eth_dst : str, action : ConfigActionEnum) -> List [Tuple]: # type: ignore - assert egress_port >= 0, "Invalid outport to configure next routing simple" + assert port_id >= 0, "Invalid port ID to configure next routing simple" + assert next_id >=0, "Invalid next ID to configure next routing simple" assert chk_address_mac(eth_src), "Invalid source Ethernet address to configure next routing simple" assert chk_address_mac(eth_dst), "Invalid destination Ethernet address to configure next routing simple" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure next routing - simple") + LOGGER.info(f"================== Port {port_id}") + LOGGER.info(f"================== Next ID {next_id}") + LOGGER.info(f"================== MAC src {eth_src}") + LOGGER.info(f"================== MAC dst {eth_dst}") + rule_no = cache_rule(TABLE_NEXT_SIMPLE, action) rules_next_routing_simple = [] @@ -576,14 +771,14 @@ def rules_set_up_next_routing_simple( 'match-fields': [ { 'match-field': 'next_id', - 'match-value': str(egress_port) + 'match-value': str(next_id) } ], 'action-name': 'FabricIngress.next.routing_simple', 'action-params': [ { 'action-param': 'port_num', - 'action-value': str(egress_port) + 'action-value': str(next_id) }, { 'action-param': 'smac', @@ -600,68 +795,6 @@ def rules_set_up_next_routing_simple( return rules_next_routing_simple -def rules_set_up_next_routing_hashed( - egress_port : int, - action : ConfigActionEnum, # type: ignore - next_id = None) -> List [Tuple]: - assert egress_port >= 0, "Invalid outport to configure next routing hashed" - random_mac_src = generate_random_mac() - random_mac_dst = generate_random_mac() - if next_id is None: - next_id = egress_port - - global NEXT_MEMBER_ID - - rule_no = cache_rule(ACTION_PROFILE_NEXT_HASHED, action) - - rules_next_routing_hashed = [] - rules_next_routing_hashed.append( - json_config_rule( - action, - '/action_profiles/action_profile/'+ACTION_PROFILE_NEXT_HASHED+'['+str(rule_no)+']', - { - 'action-profile-name': ACTION_PROFILE_NEXT_HASHED, - 'member-id': NEXT_MEMBER_ID, - 'action-name': 'FabricIngress.next.routing_hashed', - 'action-params': [ - { - 'action-param': 'port_num', - 'action-value': str(egress_port) - }, - { - 'action-param': 'smac', - 'action-value': random_mac_src - }, - { - 'action-param': 'dmac', - 'action-value': random_mac_dst - } - ] - } - ) - ) - - rule_no = cache_rule(TABLE_NEXT_HASHED, action) - - rules_next_routing_hashed.append( - json_config_rule( - action, - '/tables/table/'+TABLE_NEXT_HASHED+'['+str(rule_no)+']', - { - 'table-name': TABLE_NEXT_HASHED, - 'member-id': NEXT_MEMBER_ID, - 'match-fields': [ - { - 'match-field': 'next_id', - 'match-value': str(next_id) - } - ] - } - ) - ) - - return rules_next_routing_hashed - ################################### ### C. End of L3 setup ################################### @@ -678,8 +811,7 @@ def rules_set_up_report_mirror_flow( rules_list = [] for i, mirror_id in enumerate(report_mirror_id_list): - LOGGER.debug("Mirror ID:{} - Recirculation port: {}".format( - mirror_id, recirculation_port_list[i])) + LOGGER.debug(f"Mirror ID:{mirror_id} - Recirculation port: {recirculation_port_list[i]}") rules_list.extend( rules_set_up_clone_session( session_id=mirror_id, @@ -700,6 +832,12 @@ def rules_set_up_clone_session( assert egress_port >= 0, "Invalid egress port number to configure clone session" assert instance >= 0, "Invalid instance number to configure clone session" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure clone session") + LOGGER.info(f"================== Session ID {session_id}") + LOGGER.info(f"================== Egress port {egress_port}") + LOGGER.info(f"================== Instance {instance}") + rule_no = cache_rule(CLONE_SESSION, action) #TODO: For TNA pass also: packet_length_bytes = 128 @@ -735,21 +873,27 @@ def rules_set_up_clone_session( ################################### def rules_set_up_acl_filter_host( - ingress_port : int, + port_id : int, ip_address : str, prefix_len : int, ip_direction : str, action : ConfigActionEnum) -> List [Tuple]: # type: ignore - assert ingress_port >= 0, "Invalid ingress port to configure ACL" + assert port_id >= 0, "Invalid port ID to configure ACL" assert chk_address_ipv4(ip_address), "Invalid IP address to configure ACL" assert 0 < prefix_len <= 32, "Invalid IP address prefix length to configure ACL" ip_match = "ipv4_src" if ip_direction == "src" else "ipv4_dst" - prefix_len_hex = prefix_to_hex_mask(prefix_len) rule_no = cache_rule(TABLE_ACL, action) + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure host ACL rule") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== IP address {ip_address}") + LOGGER.info(f"================== IP address type {ip_match}") + LOGGER.info(f"================== IP prefix length {prefix_len}") + rules_acl = [] rules_acl.append( json_config_rule( @@ -760,7 +904,7 @@ def rules_set_up_acl_filter_host( 'match-fields': [ { 'match-field': 'ig_port', - 'match-value': str(ingress_port) + 'match-value': str(port_id) }, { 'match-field': ip_match, @@ -777,17 +921,23 @@ def rules_set_up_acl_filter_host( return rules_acl def rules_set_up_acl_filter_port( - ingress_port : int, + port_id : int, transport_port : int, transport_direction : str, action : ConfigActionEnum) -> List [Tuple]: # type: ignore - assert ingress_port >= 0, "Invalid ingress port to configure ACL" + assert port_id >= 0, "Invalid port ID to configure ACL" assert chk_transport_port(transport_port), "Invalid transport port to configure ACL" trn_match = "l4_sport" if transport_direction == "src" else "l4_dport" rule_no = cache_rule(TABLE_ACL, action) + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure port ACL rule") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== Transport port {transport_port}") + LOGGER.info(f"================== Transport port type {transport_direction}") + rules_acl = [] rules_acl.append( json_config_rule( @@ -798,7 +948,7 @@ def rules_set_up_acl_filter_port( 'match-fields': [ { 'match-field': 'ig_port', - 'match-value': str(ingress_port) + 'match-value': str(port_id) }, { 'match-field': trn_match, @@ -836,7 +986,7 @@ def apply_rules( # Provision rules one-by-one for i, json_config_rule in enumerate(json_config_rules): - LOGGER.debug("Applying rule #{}: {}".format(i, json_config_rule)) + LOGGER.debug(f"Applying rule #{i}: {json_config_rule}") try: # Cleanup the rules of this particular object del device_obj.device_config.config_rules[:] @@ -853,11 +1003,11 @@ def apply_rules( applied_rules += 1 except Exception as ex: - LOGGER.error("Error while applying rule #{}: {}".format(i, ex)) + LOGGER.error(f"Error while applying rule #{i}: {ex}") failed_rules += 1 raise Exception(ex) - LOGGER.debug("Batch rules: {}/{} applied".format(applied_rules, total_rules)) + LOGGER.debug(f"Batch rules: {applied_rules}/{total_rules} applied") return applied_rules, failed_rules @@ -876,7 +1026,7 @@ def cache_rule( else: assert True, "Invalid rule configuration action" - assert rule_no > 0, "Invalid rule identifier to configure table {}".format(table_name) + assert rule_no > 0, f"Invalid rule identifier to configure table {table_name}" return rule_no @@ -889,8 +1039,8 @@ def add_rule_to_map(table_name : str) -> int: # Get a new valid rule index new_index = find_minimum_available_rule_index(RULE_ENTRY_MAP[table_name]) - LOGGER.debug("Minimum available rule index for table {} is: {}".format(table_name, new_index)) - assert new_index > 0, "Invalid rule index for table {}".format(table_name) + LOGGER.debug(f"Minimum available rule index for table {table_name} is: {new_index}") + assert new_index > 0, f"Invalid rule index for table {table_name}" # New entry new_rule_entry = table_name+"["+str(new_index)+"]" @@ -903,7 +1053,7 @@ def add_rule_to_map(table_name : str) -> int: def delete_rule_from_map(table_name : str) -> int: if table_name not in RULE_ENTRY_MAP: - LOGGER.error("Table {} has no entries".format(table_name)) + LOGGER.error(f"Table {table_name} has no entries") return -1 # Current number of rules @@ -958,4 +1108,4 @@ def find_minimum_available_rule_index(rule_entry_list : List) -> int: def print_rule_map() -> None: for k in RULE_ENTRY_MAP.keys(): - LOGGER.info("Table {} entries: {}".format(k, RULE_ENTRY_MAP[k])) + LOGGER.info(f"Table {k} entries: {RULE_ENTRY_MAP[k]}") diff --git a/src/service/service/service_handlers/p4_fabric_tna_int/p4_fabric_tna_int_config.py b/src/service/service/service_handlers/p4_fabric_tna_int/p4_fabric_tna_int_config.py index c7d84889f55d630b6daa9247e9fad336ee1ca63a..dc7b6e6bad00c7ddb65efe84f171037ba345a384 100644 --- a/src/service/service/service_handlers/p4_fabric_tna_int/p4_fabric_tna_int_config.py +++ b/src/service/service/service_handlers/p4_fabric_tna_int/p4_fabric_tna_int_config.py @@ -22,7 +22,6 @@ SD-Fabric repo: https://github.com/stratum/fabric-tna SD-Fabric docs: https://docs.sd-fabric.org/master/index.html """ -import logging from typing import List, Tuple from common.proto.context_pb2 import ConfigActionEnum from common.tools.object_factory.ConfigRule import json_config_rule @@ -30,8 +29,6 @@ from common.type_checkers.Checkers import chk_address_ipv4, chk_transport_port from service.service.service_handlers.p4_fabric_tna_commons.p4_fabric_tna_commons import * -LOGGER = logging.getLogger(__name__) - # INT service handler settings INT_COLLECTOR_INFO = "int_collector_info" INT_REPORT_MIRROR_ID_LIST = "int_report_mirror_id_list" @@ -127,7 +124,7 @@ def rules_set_up_int_recirculation_ports( for port in recirculation_port_list: rules_list.extend( rules_set_up_port( - port=port, + port_id=port, port_type=port_type, fwd_type=fwd_type, vlan_id=vlan_id, @@ -135,8 +132,6 @@ def rules_set_up_int_recirculation_ports( ) ) - LOGGER.debug("INT recirculation ports configured:{}".format(recirculation_port_list)) - return rules_list def rules_set_up_int_report_flow( diff --git a/src/service/service/service_handlers/p4_fabric_tna_int/p4_fabric_tna_int_service_handler.py b/src/service/service/service_handlers/p4_fabric_tna_int/p4_fabric_tna_int_service_handler.py index 6c27a47dedbd70916a1cb93d253a579748ae809a..f3d38d593579e943a5b02af7e135c2a81283df32 100644 --- a/src/service/service/service_handlers/p4_fabric_tna_int/p4_fabric_tna_int_service_handler.py +++ b/src/service/service/service_handlers/p4_fabric_tna_int/p4_fabric_tna_int_service_handler.py @@ -97,8 +97,7 @@ class P4FabricINTServiceHandler(_ServiceHandler): chk_type('endpoints', endpoints, list) if len(endpoints) == 0: return [] - LOGGER.info("{} - Provision service configuration".format( - self.__service_label)) + LOGGER.info(f"{self.__service_label} - Provision service configuration") visited = set() results = [] @@ -109,8 +108,7 @@ class P4FabricINTServiceHandler(_ServiceHandler): # Skip already visited devices if device.name in visited: continue - LOGGER.info("Device {} - Setting up In-band Network Telemetry (INT) configuration".format( - device.name)) + LOGGER.info(f"Device {device.name} - Setting up In-band Network Telemetry (INT) configuration") rules = [] actual_rules = -1 @@ -126,15 +124,14 @@ class P4FabricINTServiceHandler(_ServiceHandler): json_config_rules=rules ) except Exception as ex: - LOGGER.error("Failed to insert INT rules on device {} due to {}".format(device.name, ex)) + LOGGER.error(f"Failed to insert INT rules on device {device.name} due to {ex}") results.append(ex) finally: rules.clear() # Ensure correct status if (failed_rules == 0) and (applied_rules == actual_rules): - LOGGER.info("Installed {}/{} INT rules on device {}".format( - applied_rules, actual_rules, device.name)) + LOGGER.info(f"Installed {applied_rules}/{actual_rules} INT rules on device {device.name}") results.append(True) # You should no longer visit this device again @@ -165,8 +162,7 @@ class P4FabricINTServiceHandler(_ServiceHandler): chk_type('endpoints', endpoints, list) if len(endpoints) == 0: return [] - LOGGER.info("{} - Deprovision service configuration".format( - self.__service_label)) + LOGGER.info(f"{self.__service_label} - Deprovision service configuration") visited = set() results = [] @@ -177,8 +173,7 @@ class P4FabricINTServiceHandler(_ServiceHandler): # Skip already visited devices if device.name in visited: continue - LOGGER.info("Device {} - Removing In-band Network Telemetry (INT) configuration".format( - device.name)) + LOGGER.info(f"Device {device.name} - Removing In-band Network Telemetry (INT) configuration") rules = [] actual_rules = -1 @@ -191,15 +186,14 @@ class P4FabricINTServiceHandler(_ServiceHandler): applied_rules, failed_rules = apply_rules( task_executor=self.__task_executor, device_obj=device, json_config_rules=rules) except Exception as ex: - LOGGER.error("Failed to delete INT rules from device {} due to {}".format(device.name, ex)) + LOGGER.error(f"Failed to delete INT rules from device {device.name} due to {ex}") results.append(ex) finally: rules.clear() # Ensure correct status if (failed_rules == 0) and (applied_rules == actual_rules): - LOGGER.info("Deleted {}/{} INT rules from device {}".format( - applied_rules, actual_rules, device.name)) + LOGGER.info(f"Deleted {applied_rules}/{actual_rules} INT rules from device {device.name}") results.append(True) # You should no longer visit this device again @@ -317,9 +311,9 @@ class P4FabricINTServiceHandler(_ServiceHandler): try: self.__settings = self.__settings_handler.get('/settings') - LOGGER.info("{} with settings: {}".format(self.__service_label, self.__settings)) + LOGGER.info(f"{self.__service_label} with settings: {self.__settings}") except Exception as ex: - LOGGER.error("Failed to retrieve service settings: {}".format(ex)) + LOGGER.error(f"Failed to retrieve service settings: {ex}") raise Exception(ex) def _parse_settings(self): @@ -327,32 +321,31 @@ class P4FabricINTServiceHandler(_ServiceHandler): switch_info = self.__settings.value[SWITCH_INFO] assert isinstance(switch_info, list), "Switch info object must be a list" except Exception as ex: - LOGGER.error("Failed to parse service settings: {}".format(ex)) + LOGGER.error(f"Failed to parse service settings: {ex}") raise Exception(ex) for switch in switch_info: for switch_name, sw_info in switch.items(): try: assert switch_name, "Invalid P4 switch name" - assert isinstance(sw_info, dict), "Switch {} info must be a map with arch, dpid, mac, ip, and int_port items)" + assert isinstance(sw_info, dict), f"Switch {switch_name} info must be a map with arch, dpid, mac, ip, and int_port items)" assert sw_info[ARCH] in SUPPORTED_TARGET_ARCH_LIST, \ - "Switch {} - Supported P4 architectures are: {}".format(switch_name, ','.join(SUPPORTED_TARGET_ARCH_LIST)) - assert sw_info[DPID] > 0, "Switch {} - P4 switch dataplane ID must be a positive integer".format(switch_name, sw_info[DPID]) - assert chk_address_mac(sw_info[MAC]), "Switch {} - Invalid source Ethernet address".format(switch_name) - assert chk_address_ipv4(sw_info[IP]), "Switch {} - Invalid source IP address".format(switch_name) - assert isinstance(sw_info[PORT_INT], dict), "Switch {} - INT port object must be a map with port_id and port_type items".format(switch_name) - assert sw_info[PORT_INT][PORT_ID] >= 0, "Switch {} - Invalid P4 switch port ID".format(switch_name) - assert sw_info[PORT_INT][PORT_TYPE] in PORT_TYPES_STR_VALID, "Switch {} - Valid P4 switch port types are: {}".format( - switch_name, ','.join(PORT_TYPES_STR_VALID)) + f"Switch {switch_name} - Supported P4 architectures are: {','.join(SUPPORTED_TARGET_ARCH_LIST)}" + assert sw_info[DPID] > 0, f"Switch {switch_name} - P4 switch dataplane ID {sw_info[DPID]} must be a positive integer" + assert chk_address_mac(sw_info[MAC]), f"Switch {switch_name} - Invalid source Ethernet address" + assert chk_address_ipv4(sw_info[IP]), f"Switch {switch_name} - Invalid source IP address" + assert isinstance(sw_info[PORT_INT], dict), f"Switch {switch_name} - INT port object must be a map with port_id and port_type items" + assert sw_info[PORT_INT][PORT_ID] >= 0, f"Switch {switch_name} - Invalid P4 switch port ID" + assert sw_info[PORT_INT][PORT_TYPE] in PORT_TYPES_STR_VALID, f"Switch {switch_name} - Valid P4 switch port types are: {','.join(PORT_TYPES_STR_VALID)}" if arch_tna(sw_info[ARCH]): sw_info[RECIRCULATION_PORT_LIST] = RECIRCULATION_PORTS_TNA sw_info[INT_REPORT_MIRROR_ID_LIST] = INT_REPORT_MIRROR_ID_LIST_TNA else: sw_info[RECIRCULATION_PORT_LIST] = RECIRCULATION_PORTS_V1MODEL sw_info[INT_REPORT_MIRROR_ID_LIST] = INT_REPORT_MIRROR_ID_LIST_V1MODEL - assert isinstance(sw_info[RECIRCULATION_PORT_LIST], list), "Switch {} - Recirculation ports must be described as a list".format(switch_name) + assert isinstance(sw_info[RECIRCULATION_PORT_LIST], list), f"Switch {switch_name} - Recirculation ports must be described as a list" except Exception as ex: - LOGGER.error("Failed to parse switch {} information".format(switch_name)) + LOGGER.error(f"Failed to parse switch {switch_name} information") return self.__switch_info[switch_name] = sw_info @@ -376,50 +369,54 @@ class P4FabricINTServiceHandler(_ServiceHandler): self.__int_vlan_id = self.__int_collector_info[VLAN_ID] assert chk_vlan_id(self.__int_vlan_id), "Invalid VLAN ID for INT" else: - LOGGER.warning("No or invalid INT VLAN ID is provided. Default VLAN ID is set to {} (No VLAN)".\ - format(self.__int_vlan_id)) + LOGGER.warning(f"No or invalid INT VLAN ID is provided. Default VLAN ID is set to {self.__int_vlan_id} (No VLAN)") if self.__int_collector_info[DURATION_SEC] > 0: self.__int_collector_duration_s = self.__int_collector_info[DURATION_SEC] else: - LOGGER.warning("No or invalid INT collection duration is provided. Default duration is set to {} seconds".\ - format(self.__int_collector_duration_s)) + LOGGER.warning(f"No or invalid INT collection duration is provided. Default duration is set to {self.__int_collector_duration_s} seconds") if self.__int_collector_info[INTERVAL_SEC] > 0: self.__int_collector_interval_s = self.__int_collector_info[INTERVAL_SEC] else: - LOGGER.warning("No or invalid INT collection interval is provided. Default interval is set to {} seconds".\ - format(self.__int_collector_interval_s)) + LOGGER.warning(f"No or invalid INT collection interval is provided. Default interval is set to {self.__int_collector_interval_s} seconds") except Exception as ex: LOGGER.error("Failed to parse INT collector information") return def _print_settings(self): - LOGGER.info("-------------------- {} settings --------------------".format(self.__service.name)) + LOGGER.info(f"-------------------- {self.__service.name} settings --------------------") LOGGER.info("--- Topology info") for switch_name, switch_info in self.__switch_info.items(): - LOGGER.info("\t Device {}".format(switch_name)) - LOGGER.info("\t\t| Target P4 architecture: {}".format(switch_info[ARCH])) - LOGGER.info("\t\t| Data plane ID: {}".format(switch_info[DPID])) - LOGGER.info("\t\t| Source MAC address: {}".format(switch_info[MAC])) - LOGGER.info("\t\t| Source IP address: {}".format(switch_info[IP])) - LOGGER.info("\t\t| INT port ID: {}".format(switch_info[PORT_INT][PORT_ID])) - LOGGER.info("\t\t| INT port type: {}".format(switch_info[PORT_INT][PORT_TYPE])) - LOGGER.info("\t\t| Recirculation port list: {}".format(switch_info[RECIRCULATION_PORT_LIST])) - LOGGER.info("\t\t| Report mirror ID list: {}".format(switch_info[INT_REPORT_MIRROR_ID_LIST])) - LOGGER.info("--- INT collector interface: {}".format(self.__int_collector_iface)) - LOGGER.info("--- INT collector MAC: {}".format(self.__int_collector_mac)) - LOGGER.info("--- INT collector IP: {}".format(self.__int_collector_ip)) - LOGGER.info("--- INT collector port: {}".format(self.__int_collector_port)) - LOGGER.info("--- INT VLAN ID: {}".format(self.__int_vlan_id)) - LOGGER.info("--- INT collector duration: {} sec".format(self.__int_collector_duration_s)) - LOGGER.info("--- INT collector interval: {} sec".format(self.__int_collector_interval_s)) + LOGGER.info(f"\t Device {switch_name}") + LOGGER.info(f"\t\t| Target P4 architecture: {switch_info[ARCH]}") + LOGGER.info(f"\t\t| Data plane ID: {switch_info[DPID]}") + LOGGER.info(f"\t\t| Source MAC address: {switch_info[MAC]}") + LOGGER.info(f"\t\t| Source IP address: {switch_info[IP]}") + LOGGER.info(f"\t\t| INT port ID: {switch_info[PORT_INT][PORT_ID]}") + LOGGER.info(f"\t\t| INT port type: {switch_info[PORT_INT][PORT_TYPE]}") + LOGGER.info(f"\t\t| Recirculation port list: {switch_info[RECIRCULATION_PORT_LIST]}") + LOGGER.info(f"\t\t| Report mirror ID list: {switch_info[INT_REPORT_MIRROR_ID_LIST]}") + LOGGER.info(f"--- INT collector interface: {self.__int_collector_iface}") + LOGGER.info(f"--- INT collector MAC: {self.__int_collector_mac}") + LOGGER.info(f"--- INT collector IP: {self.__int_collector_ip}") + LOGGER.info(f"--- INT collector port: {self.__int_collector_port}") + LOGGER.info(f"--- INT VLAN ID: {self.__int_vlan_id}") + LOGGER.info(f"--- INT collector duration: {self.__int_collector_duration_s} sec") + LOGGER.info(f"--- INT collector interval: {self.__int_collector_interval_s} sec") LOGGER.info("-----------------------------------------------------------------") def _create_rules(self, device_obj : Device, action : ConfigActionEnum): # type: ignore dev_name = device_obj.name rules = [] + port_id = self.__switch_info[dev_name][PORT_INT][PORT_ID] + next_id = port_id + mac_src = self.__switch_info[dev_name][MAC] + collector_mac_dst = self.__int_collector_mac + collector_ip_dst = self.__int_collector_ip + vlan_id = self.__int_vlan_id + ### INT reporting rules try: rules += rules_set_up_int_watchlist(action=action) @@ -432,7 +429,7 @@ class P4FabricINTServiceHandler(_ServiceHandler): recirculation_port_list=self.__switch_info[dev_name][RECIRCULATION_PORT_LIST], port_type=PORT_TYPE_INT, fwd_type=FORWARDING_TYPE_UNICAST_IPV4, - vlan_id=self.__int_vlan_id, + vlan_id=vlan_id, action=action ) except Exception as ex: @@ -473,10 +470,10 @@ class P4FabricINTServiceHandler(_ServiceHandler): ### INT port setup rules try: rules += rules_set_up_port( - port=self.__switch_info[dev_name][PORT_INT][PORT_ID], + port_id=port_id, port_type=PORT_TYPE_HOST, fwd_type=FORWARDING_TYPE_BRIDGING, - vlan_id=self.__int_vlan_id, + vlan_id=vlan_id, action=action ) except Exception as ex: @@ -486,13 +483,17 @@ class P4FabricINTServiceHandler(_ServiceHandler): ### INT port forwarding rules try: rules += rules_set_up_fwd_bridging( - vlan_id=self.__int_vlan_id, - eth_dst=self.__int_collector_mac, - egress_port=self.__switch_info[dev_name][PORT_INT][PORT_ID], + port_id=port_id, + vlan_id=vlan_id, + eth_dst=collector_mac_dst, + next_id=next_id, action=action ) - rules += rules_set_up_next_output_simple( - egress_port=self.__switch_info[dev_name][PORT_INT][PORT_ID], + rules += rules_set_up_next_profile_hashed_routing( + port_id=port_id, + next_id=next_id, + eth_src=mac_src, + eth_dst=collector_mac_dst, action=action ) except Exception as ex: @@ -501,16 +502,16 @@ class P4FabricINTServiceHandler(_ServiceHandler): ### INT packet routing rules try: - rules += rules_set_up_next_routing_simple( - egress_port=self.__switch_info[dev_name][PORT_INT][PORT_ID], - eth_src=self.__switch_info[dev_name][MAC], - eth_dst=self.__int_collector_mac, + rules += rules_set_up_next_hashed( + port_id=port_id, + next_id=next_id, action=action ) rules += rules_set_up_routing( - ipv4_dst=self.__int_collector_ip, + port_id=port_id, + ipv4_dst=collector_ip_dst, ipv4_prefix_len=32, - egress_port=self.__switch_info[dev_name][PORT_INT][PORT_ID], + next_id=next_id, action=action ) except Exception as ex: @@ -529,11 +530,11 @@ class P4FabricINTServiceHandler(_ServiceHandler): # Get the context ctx_id = response.context_ids[0].context_uuid.uuid assert ctx_id, "Cannot create INT collector with invalid context ID" - LOGGER.debug("Context ID: {}".format(ctx_id)) + LOGGER.debug(f"Context ID: {ctx_id}") service_id = self.__service.service_id.service_uuid.uuid assert service_id, "Cannot create INT collector with invalid service ID" - LOGGER.debug("Service ID: {}".format(service_id)) + LOGGER.debug(f"Service ID: {service_id}") # Get a service endpoint svc_endpoints = self.__service.service_endpoint_ids[0] @@ -542,14 +543,14 @@ class P4FabricINTServiceHandler(_ServiceHandler): # Get a P4 device associated with this endpoint dev_id = svc_endpoints.device_id.device_uuid.uuid assert dev_id, "Cannot create INT collector with invalid device ID" - LOGGER.debug("Device ID: {}".format(dev_id)) + LOGGER.debug(f"Device ID: {dev_id}") # Get the endpoint ID ep_id = svc_endpoints.endpoint_uuid.uuid assert ep_id, "Cannot create INT collector with invalid endpoint ID" - LOGGER.debug("Endpoint ID: {}".format(ep_id)) + LOGGER.debug(f"Endpoint ID: {ep_id}") except Exception as ex: - LOGGER.error("Failed to retrieve context for starting the INT collector: {}".format(ex)) + LOGGER.error(f"Failed to retrieve context for starting the INT collector: {ex}") raise ex return ctx_id, service_id, dev_id, ep_id @@ -558,8 +559,8 @@ class P4FabricINTServiceHandler(_ServiceHandler): ctx_id = service_id = dev_id = ep_id = None try: ctx_id, service_id, dev_id, ep_id = self._retrieve_context_for_int_collector() - except Exception: - LOGGER.error("INT collector cannot be initialized due to missing information") + except Exception as ex: + LOGGER.error(f"INT collector cannot be initialized: Failed to retrieve context {ex}") return # Create a "virtual" INT KPI associated with this context and P4 dataplane @@ -575,9 +576,9 @@ class P4FabricINTServiceHandler(_ServiceHandler): # Set this new KPI kpi_manager_client = KpiManagerClient() kpi_id_int: KpiId = kpi_manager_client.SetKpiDescriptor(kpi_descriptor_int) # type: ignore - LOGGER.debug("INT KPI ID: {}".format(kpi_id_int)) + LOGGER.debug(f"INT KPI ID: {kpi_id_int}") except Exception: - LOGGER.error("INT collector cannot be initialized due to failed KPI initialization") + LOGGER.error(f"INT collector cannot be initialized: Failed to initialize KPI {ex}") return # Initialize an INT collector object @@ -591,13 +592,20 @@ class P4FabricINTServiceHandler(_ServiceHandler): collect_int.int_collector.transport_port = self.__int_collector_port collect_int.int_collector.service_id = service_id collect_int.int_collector.context_id = ctx_id - LOGGER.info("INT Collector: {}".format(str(collect_int))) + LOGGER.info(f"INT Collector: {str(collect_int)}") + except Exception as ex: + LOGGER.error(f"INT collector cannot be initialized: Failed to create collector object {ex}") + return + # Start the INT collector + c_uuid = None + try: telemetry_frontend_client = TelemetryFrontendClient() - collect_id: CollectorId = telemetry_frontend_client.StartCollector(collect_int) # type: ignore - assert collect_id.uuid, "INT collector failed to start" - except Exception: - LOGGER.error("INT collector cannot be initialized") + c_id: CollectorId = telemetry_frontend_client.StartCollector(collect_int) # type: ignore + c_uuid = c_id.collector_id.uuid + assert c_uuid, "INT collector failed to start" + except Exception as ex: + LOGGER.error(f"INT collector cannot be initialized: Failed to start the collector {ex}") return - LOGGER.info("INT collector with ID {} is successfully invoked".format(collect_id)) + LOGGER.info(f"INT collector with ID {c_uuid} is successfully invoked") diff --git a/src/service/service/service_handlers/p4_fabric_tna_l2_simple/p4_fabric_tna_l2_simple_config.py b/src/service/service/service_handlers/p4_fabric_tna_l2_simple/p4_fabric_tna_l2_simple_config.py deleted file mode 100644 index 4ed29ff0c4318e822e581ed7a4e742ee95ab6d02..0000000000000000000000000000000000000000 --- a/src/service/service/service_handlers/p4_fabric_tna_l2_simple/p4_fabric_tna_l2_simple_config.py +++ /dev/null @@ -1,69 +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. - -""" -Common objects and methods for L2 forwarding based on the SD-Fabric dataplane model. -This dataplane covers both software based and hardware-based Stratum-enabled P4 switches, -such as the BMv2 software switch and Intel's Tofino/Tofino-2 switches. - -SD-Fabric repo: https://github.com/stratum/fabric-tna -SD-Fabric docs: https://docs.sd-fabric.org/master/index.html -""" - -import logging -from common.proto.context_pb2 import ConfigActionEnum - -from service.service.service_handlers.p4_fabric_tna_commons.p4_fabric_tna_commons import * - -LOGGER = logging.getLogger(__name__) - -# L2 simple service handler settings -FORWARDING_LIST = "fwd_list" -HOST_MAC = "host_mac" - -def rules_set_up_port_host( - port : int, - vlan_id : int, - action : ConfigActionEnum, # type: ignore - fwd_type=FORWARDING_TYPE_BRIDGING, - eth_type=ETHER_TYPE_IPV4): - # This is a host facing port - port_type = PORT_TYPE_HOST - - return rules_set_up_port( - port=port, - port_type=port_type, - fwd_type=fwd_type, - vlan_id=vlan_id, - action=action, - eth_type=eth_type - ) - -def rules_set_up_port_switch( - port : int, - vlan_id : int, - action : ConfigActionEnum, # type: ignore - fwd_type=FORWARDING_TYPE_BRIDGING, - eth_type=ETHER_TYPE_IPV4): - # This is a switch facing port - port_type = PORT_TYPE_SWITCH - - return rules_set_up_port( - port=port, - port_type=port_type, - fwd_type=fwd_type, - vlan_id=vlan_id, - action=action, - eth_type=eth_type - ) diff --git a/src/service/service/service_handlers/p4_fabric_tna_l2_simple/p4_fabric_tna_l2_simple_service_handler.py b/src/service/service/service_handlers/p4_fabric_tna_l2_simple/p4_fabric_tna_l2_simple_service_handler.py index c89af771db4c7cdc15495f1c08f035350f965296..1c1818e56462715c2faeac588d308df97dae41ce 100644 --- a/src/service/service/service_handlers/p4_fabric_tna_l2_simple/p4_fabric_tna_l2_simple_service_handler.py +++ b/src/service/service/service_handlers/p4_fabric_tna_l2_simple/p4_fabric_tna_l2_simple_service_handler.py @@ -28,8 +28,6 @@ from service.service.service_handler_api.SettingsHandler import SettingsHandler from service.service.service_handlers.p4_fabric_tna_commons.p4_fabric_tna_commons import * from service.service.task_scheduler.TaskExecutor import TaskExecutor -from .p4_fabric_tna_l2_simple_config import * - LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('Service', 'Handler', labels={'handler': 'p4_fabric_tna_l2_simple'}) @@ -83,8 +81,7 @@ class P4FabricL2SimpleServiceHandler(_ServiceHandler): chk_type('endpoints', endpoints, list) if len(endpoints) == 0: return [] - LOGGER.info("{} - Provision service configuration".format( - self.__service_label)) + LOGGER.info(f"{self.__service_label} - Provision service configuration") visited = set() results = [] @@ -93,11 +90,11 @@ class P4FabricL2SimpleServiceHandler(_ServiceHandler): device = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid))) device_name = device.name - LOGGER.info("Device {}".format(device_name)) - LOGGER.info("\t | Service endpoint UUID: {}".format(endpoint_uuid)) + LOGGER.info(f"Device {device_name}") + LOGGER.info(f"\t | Service endpoint UUID: {endpoint_uuid}") port_id = find_port_id_in_endpoint_list(device.device_endpoints, endpoint_uuid) - LOGGER.info("\t | Service port ID: {}".format(port_id)) + LOGGER.info(f"\t | Service port ID: {port_id}") dev_port_key = device_name + "-" + PORT_PREFIX + str(port_id) @@ -120,15 +117,14 @@ class P4FabricL2SimpleServiceHandler(_ServiceHandler): json_config_rules=rules ) except Exception as ex: - LOGGER.error("Failed to insert L2 rules on device {} due to {}".format(device.name, ex)) + LOGGER.error(f"Failed to insert L2 rules on device {device.name} due to {ex}") results.append(ex) finally: rules.clear() # Ensure correct status if (failed_rules == 0) and (applied_rules == actual_rules): - LOGGER.info("Installed {}/{} L2 rules on device {} and port {}".format( - applied_rules, actual_rules, device_name, port_id)) + LOGGER.info(f"Installed {applied_rules}/{actual_rules} L2 rules on device {device_name} and port {port_id}") results.append(True) # You should no longer visit this device port again @@ -160,8 +156,7 @@ class P4FabricL2SimpleServiceHandler(_ServiceHandler): chk_type('endpoints', endpoints, list) if len(endpoints) == 0: return [] - LOGGER.info("{} - Deprovision service configuration".format( - self.__service_label)) + LOGGER.info(f"{self.__service_label} - Deprovision service configuration") visited = set() results = [] @@ -170,11 +165,11 @@ class P4FabricL2SimpleServiceHandler(_ServiceHandler): device = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid))) device_name = device.name - LOGGER.info("Device {}".format(device_name)) - LOGGER.info("\t | Service endpoint UUID: {}".format(endpoint_uuid)) + LOGGER.info(f"Device {device_name}") + LOGGER.info(f"\t | Service endpoint UUID: {endpoint_uuid}") port_id = find_port_id_in_endpoint_list(device.device_endpoints, endpoint_uuid) - LOGGER.info("\t | Service port ID: {}".format(port_id)) + LOGGER.info(f"\t | Service port ID: {port_id}") dev_port_key = device_name + "-" + PORT_PREFIX + str(port_id) @@ -197,15 +192,14 @@ class P4FabricL2SimpleServiceHandler(_ServiceHandler): json_config_rules=rules ) except Exception as ex: - LOGGER.error("Failed to delete L2 rules from device {} due to {}".format(device.name, ex)) + LOGGER.error(f"Failed to delete L2 rules from device {device.name} due to {ex}") results.append(ex) finally: rules.clear() # Ensure correct status if (failed_rules == 0) and (applied_rules == actual_rules): - LOGGER.info("Deleted {}/{} L2 rules from device {} and port {}".format( - applied_rules, actual_rules, device_name, port_id)) + LOGGER.info(f"Deleted {applied_rules}/{actual_rules} L2 rules from device {device_name} and port {port_id}") results.append(True) # You should no longer visit this device port again @@ -316,40 +310,39 @@ class P4FabricL2SimpleServiceHandler(_ServiceHandler): try: self.__settings = self.__settings_handler.get('/settings') - LOGGER.info("{} with settings: {}".format(self.__service_label, self.__settings)) + LOGGER.info(f"{self.__service_label} with settings: {self.__settings}") except Exception as ex: - LOGGER.error("Failed to retrieve service settings: {}".format(ex)) + LOGGER.error(f"Failed to retrieve service settings: {ex}") raise Exception(ex) def _parse_settings(self): try: switch_info = self.__settings.value[SWITCH_INFO] except Exception as ex: - LOGGER.error("Failed to parse service settings: {}".format(ex)) + LOGGER.error(f"Failed to parse service settings: {ex}") raise Exception(ex) assert isinstance(switch_info, list), "Switch info object must be a list" for switch in switch_info: for switch_name, sw_info in switch.items(): assert switch_name, "Invalid P4 switch name" - assert isinstance(sw_info, dict), "Switch {} info must be a map with arch, dpid, and fwd_list items)" + assert isinstance(sw_info, dict), f"Switch {switch_name} info must be a map with arch, dpid, and fwd_list items)" assert sw_info[ARCH] in SUPPORTED_TARGET_ARCH_LIST, \ - "Switch {} - Supported P4 architectures are: {}".format(switch_name, ','.join(SUPPORTED_TARGET_ARCH_LIST)) + f"Switch {switch_name} - Supported P4 architectures are: {','.join(SUPPORTED_TARGET_ARCH_LIST)}" switch_dpid = sw_info[DPID] - assert switch_dpid > 0, "Switch {} - P4 switch dataplane ID must be a positive integer".format(switch_name, sw_info[DPID]) + assert switch_dpid > 0, f"Switch {switch_name} - P4 switch dataplane ID {sw_info[DPID]} must be a positive integer" # Port list port_list = sw_info[PORT_LIST] assert isinstance(port_list, list), \ - "Switch {} port list must be a list with port_id, port_type, and vlan_id items".format(switch_name) + f"Switch {switch_name} port list must be a list with port_id, port_type, and vlan_id items" for port in port_list: port_id = port[PORT_ID] - assert port_id >= 0, "Switch {} - Invalid P4 switch port ID".format(switch_name) + assert port_id >= 0, f"Switch {switch_name} - Invalid P4 switch port ID" port_type = port[PORT_TYPE] - assert port_type in PORT_TYPES_STR_VALID, "Switch {} - Valid P4 switch port types are: {}".format( - switch_name, ','.join(PORT_TYPES_STR_VALID)) + assert port_type in PORT_TYPES_STR_VALID, f"Switch {switch_name} - Valid P4 switch port types are: {','.join(PORT_TYPES_STR_VALID)}" vlan_id = port[VLAN_ID] - assert chk_vlan_id(vlan_id), "Switch {} - Invalid VLAN ID for port {}".format(switch_name, port_id) + assert chk_vlan_id(vlan_id), f"Switch {switch_name} - Invalid VLAN ID for port {port_id}" if switch_name not in self.__port_map: self.__port_map[switch_name] = {} @@ -363,38 +356,38 @@ class P4FabricL2SimpleServiceHandler(_ServiceHandler): # Forwarding list fwd_list = sw_info[FORWARDING_LIST] - assert isinstance(fwd_list, list), "Switch {} forwarding list must be a list".format(switch_name) + assert isinstance(fwd_list, list), f"Switch {switch_name} forwarding list must be a list" for fwd_entry in fwd_list: port_id = fwd_entry[PORT_ID] - assert port_id >= 0, "Invalid port ID: {}".format(port_id) + assert port_id >= 0, f"Invalid port ID: {port_id}" host_mac = fwd_entry[HOST_MAC] - assert chk_address_mac(host_mac), "Invalid host MAC address {}".format(host_mac) + assert chk_address_mac(host_mac), f"Invalid host MAC address {host_mac}" # Retrieve entry from the port map switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) host_facing_port = self._is_host_facing_port(switch_name, port_id) - LOGGER.info("Switch {} - Port {}: Is host facing: {}".format(switch_name, port_id, "True" if host_facing_port else "False")) + LOGGER.info(f"Switch {switch_name} - Port {port_id}: Is host facing: {"True" if host_facing_port else "False"}") switch_port_entry[FORWARDING_LIST].append(host_mac) self.__switch_info[switch_name] = sw_info def _print_settings(self): - LOGGER.info("--------------- {} settings ---------------".format(self.__service.name)) + LOGGER.info(f"--------------- {self.__service.name} settings ---------------") LOGGER.info("--- Topology info") for switch_name, switch_info in self.__switch_info.items(): - LOGGER.info("\t Device {}".format(switch_name)) - LOGGER.info("\t\t| Target P4 architecture: {}".format(switch_info[ARCH])) - LOGGER.info("\t\t| Data plane ID: {}".format(switch_info[DPID])) - LOGGER.info("\t\t| Port map: {}".format(self.__port_map[switch_name])) + LOGGER.info(f"\t Device {switch_name}") + LOGGER.info(f"\t\t| Target P4 architecture: {switch_info[ARCH]}") + LOGGER.info(f"\t\t| Data plane ID: {switch_info[DPID]}") + LOGGER.info(f"\t\t| Port map: {self.__port_map[switch_name]}") LOGGER.info("-------------------------------------------------------") def _get_switch_port_in_port_map(self, switch_name : str, port_id : int) -> Dict: assert switch_name, "A valid switch name must be used as a key to the port map" assert port_id > 0, "A valid switch port ID must be used as a key to a switch's port map" switch_entry = self.__port_map[switch_name] - assert switch_entry, "Switch {} does not exist in the port map".format(switch_name) + assert switch_entry, f"Switch {switch_name} does not exist in the port map" port_key = PORT_PREFIX + str(port_id) - assert switch_entry[port_key], "Port with ID {} does not exist in the switch map".format(port_id) + assert switch_entry[port_key], f"Port with ID {port_id} does not exist in the switch map" return switch_entry[port_key] @@ -416,8 +409,11 @@ class P4FabricL2SimpleServiceHandler(_ServiceHandler): def _create_rules(self, device_obj : Device, port_id : int, action : ConfigActionEnum): # type: ignore dev_name = device_obj.name + # TODO: Fix + next_id = 2 if port_id == 1 else 1 + host_facing_port = self._is_host_facing_port(dev_name, port_id) - LOGGER.info("\t | Service endpoint is host facing: {}".format("True" if host_facing_port else "False")) + LOGGER.info(f"\t | Service endpoint is host facing: {"True" if host_facing_port else "False"}") rules = [] @@ -439,29 +435,46 @@ class P4FabricL2SimpleServiceHandler(_ServiceHandler): LOGGER.error("Error while creating port setup rules") raise Exception(ex) - fwd_list = self._get_fwd_list_of_switch_port(switch_name=dev_name, port_id=port_id) - for mac in fwd_list: - LOGGER.info("Switch {} - Port {} - Creating rule for host MAC: {}".format(dev_name, port_id, mac)) + fwd_list = self._get_fwd_list_of_switch_port(switch_name=dev_name, port_id=next_id) + for mac_dst in fwd_list: + LOGGER.info(f"Switch {dev_name} - Port {port_id} - Creating rule for destination MAC: {mac_dst}") try: ### Bridging rules rules += rules_set_up_fwd_bridging( + port_id=port_id, vlan_id=self._get_vlan_id_of_switch_port(switch_name=dev_name, port_id=port_id), - eth_dst=mac, - egress_port=port_id, + eth_dst=mac_dst, + next_id=next_id, action=action ) except Exception as ex: - LOGGER.error("Error while creating bridging rules") + LOGGER.error("Error while creating rule for bridging") raise Exception(ex) - try: - ### Next output rule - rules += rules_set_up_next_output_simple( - egress_port=port_id, - action=action - ) - except Exception as ex: - LOGGER.error("Error while creating next output L2 rules") - raise Exception(ex) + src_list = self._get_fwd_list_of_switch_port(switch_name=dev_name, port_id=port_id) + for mac_src in src_list: + try: + ### Next profile for hashed routing + rules += rules_set_up_next_profile_hashed_routing( + port_id=port_id, + next_id=next_id, + eth_src=mac_src, + eth_dst=mac_dst, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating rule for next hashed profile") + raise Exception(ex) + + try: + ### Next hashed port + rules += rules_set_up_next_hashed( + port_id=port_id, + next_id=next_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating rule for next hashed port") + raise Exception(ex) return rules diff --git a/src/service/service/service_handlers/p4_fabric_tna_l3/p4_fabric_tna_l3_service_handler.py b/src/service/service/service_handlers/p4_fabric_tna_l3/p4_fabric_tna_l3_service_handler.py index a9225d58156243b7700da6e186dcebd7d541f384..730c7c79058c6b50f95a609fde8a12d451cf0004 100644 --- a/src/service/service/service_handlers/p4_fabric_tna_l3/p4_fabric_tna_l3_service_handler.py +++ b/src/service/service/service_handlers/p4_fabric_tna_l3/p4_fabric_tna_l3_service_handler.py @@ -81,8 +81,7 @@ class P4FabricL3ServiceHandler(_ServiceHandler): chk_type('endpoints', endpoints, list) if len(endpoints) == 0: return [] - LOGGER.info("{} - Provision service configuration".format( - self.__service_label)) + LOGGER.info(f"{self.__service_label} - Provision service configuration") visited = set() results = [] @@ -91,11 +90,11 @@ class P4FabricL3ServiceHandler(_ServiceHandler): device = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid))) device_name = device.name - LOGGER.info("Device {}".format(device_name)) - LOGGER.info("\t | Service endpoint UUID: {}".format(endpoint_uuid)) + LOGGER.info(f"Device {device_name}") + LOGGER.info(f"\t | Service endpoint UUID: {endpoint_uuid}") port_id = find_port_id_in_endpoint_list(device.device_endpoints, endpoint_uuid) - LOGGER.info("\t | Service port ID: {}".format(port_id)) + LOGGER.info(f"\t | Service port ID: {port_id}") dev_port_key = device_name + "-" + PORT_PREFIX + str(port_id) @@ -118,15 +117,14 @@ class P4FabricL3ServiceHandler(_ServiceHandler): json_config_rules=rules ) except Exception as ex: - LOGGER.error("Failed to insert L3 rules on device {} due to {}".format(device.name, ex)) + LOGGER.error(f"Failed to insert L3 rules on device {device.name} due to {ex}") results.append(ex) finally: rules.clear() # Ensure correct status if (failed_rules == 0) and (applied_rules == actual_rules): - LOGGER.info("Installed {}/{} ACL rules on device {} and port {}".format( - applied_rules, actual_rules, device_name, port_id)) + LOGGER.info(f"Installed {applied_rules}/{actual_rules} ACL rules on device {device_name} and port {port_id}") results.append(True) # You should no longer visit this device port again @@ -158,8 +156,7 @@ class P4FabricL3ServiceHandler(_ServiceHandler): chk_type('endpoints', endpoints, list) if len(endpoints) == 0: return [] - LOGGER.info("{} - Deprovision service configuration".format( - self.__service_label)) + LOGGER.info(f"{self.__service_label} - Deprovision service configuration") visited = set() results = [] @@ -168,11 +165,11 @@ class P4FabricL3ServiceHandler(_ServiceHandler): device = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid))) device_name = device.name - LOGGER.info("Device {}".format(device_name)) - LOGGER.info("\t | Service endpoint UUID: {}".format(endpoint_uuid)) + LOGGER.info(f"Device {device_name}") + LOGGER.info(f"\t | Service endpoint UUID: {endpoint_uuid}") port_id = find_port_id_in_endpoint_list(device.device_endpoints, endpoint_uuid) - LOGGER.info("\t | Service port ID: {}".format(port_id)) + LOGGER.info(f"\t | Service port ID: {port_id}") dev_port_key = device_name + "-" + PORT_PREFIX + str(port_id) @@ -195,15 +192,14 @@ class P4FabricL3ServiceHandler(_ServiceHandler): json_config_rules=rules ) except Exception as ex: - LOGGER.error("Failed to delete L3 rules from device {} due to {}".format(device.name, ex)) + LOGGER.error(f"Failed to delete L3 rules from device {device.name} due to {ex}") results.append(ex) finally: rules.clear() # Ensure correct status if (failed_rules == 0) and (applied_rules == actual_rules): - LOGGER.info("Deleted {}/{} L3 rules from device {} and port {}".format( - applied_rules, actual_rules, device_name, port_id)) + LOGGER.info(f"Deleted {applied_rules}/{actual_rules} L3 rules from device {device_name} and port {port_id}") results.append(True) # You should no longer visit this device port again @@ -314,38 +310,39 @@ class P4FabricL3ServiceHandler(_ServiceHandler): try: self.__settings = self.__settings_handler.get('/settings') - LOGGER.info("{} with settings: {}".format(self.__service_label, self.__settings)) + LOGGER.info(f"{self.__service_label} with settings: {self.__settings}") except Exception as ex: - LOGGER.error("Failed to retrieve service settings: {}".format(ex)) + LOGGER.error(f"Failed to retrieve service settings: {ex}") raise Exception(ex) def _parse_settings(self): try: switch_info = self.__settings.value[SWITCH_INFO] except Exception as ex: - LOGGER.error("Failed to parse service settings: {}".format(ex)) + LOGGER.error(f"Failed to parse service settings: {ex}") raise Exception(ex) assert isinstance(switch_info, list), "Switch info object must be a list" for switch in switch_info: for switch_name, sw_info in switch.items(): assert switch_name, "Invalid P4 switch name" - assert isinstance(sw_info, dict), "Switch {} info must be a map with arch, dpid, and fwd_list items)" + assert isinstance(sw_info, dict), f"Switch {switch_name} info must be a map with arch, dpid, and fwd_list items)" assert sw_info[ARCH] in SUPPORTED_TARGET_ARCH_LIST, \ - "Switch {} - Supported P4 architectures are: {}".format(switch_name, ','.join(SUPPORTED_TARGET_ARCH_LIST)) + f"Switch {switch_name} - Supported P4 architectures are: {','.join(SUPPORTED_TARGET_ARCH_LIST)}" switch_dpid = sw_info[DPID] - assert switch_dpid > 0, "Switch {} - P4 switch dataplane ID must be a positive integer".format(switch_name, sw_info[DPID]) + assert switch_dpid > 0, f"Switch {switch_name} - P4 switch dataplane ID {sw_info[DPID]} must be a positive integer" # Port list port_list = sw_info[PORT_LIST] assert isinstance(port_list, list),\ - "Switch {} port list must be a list with port_id and port_type items".format(switch_name) + f"Switch {switch_name} port list must be a list with port_id and port_type items" for port in port_list: port_id = port[PORT_ID] - assert port_id >= 0, "Switch {} - Invalid P4 switch port ID".format(switch_name) + assert port_id >= 0, f"Switch {switch_name} - Invalid P4 switch port ID" port_type = port[PORT_TYPE] - assert port_type in PORT_TYPES_STR_VALID, "Switch {} - Valid P4 switch port types are: {}".format( - switch_name, ','.join(PORT_TYPES_STR_VALID)) + assert port_type in PORT_TYPES_STR_VALID, f"Switch {switch_name} - Valid P4 switch port types are: {','.join(PORT_TYPES_STR_VALID)}" + vlan_id = port[VLAN_ID] + assert chk_vlan_id(vlan_id), f"Switch {switch_name} - Invalid VLAN ID for port {port_id}" if switch_name not in self.__port_map: self.__port_map[switch_name] = {} @@ -354,22 +351,23 @@ class P4FabricL3ServiceHandler(_ServiceHandler): self.__port_map[switch_name][port_key] = {} self.__port_map[switch_name][port_key][PORT_ID] = port_id self.__port_map[switch_name][port_key][PORT_TYPE] = port_type + self.__port_map[switch_name][port_key][VLAN_ID] = vlan_id self.__port_map[switch_name][port_key][ROUTING_LIST] = [] # Routing list routing_list = sw_info[ROUTING_LIST] - assert isinstance(routing_list, list), "Switch {} routing list must be a list".format(switch_name) + assert isinstance(routing_list, list), f"Switch {switch_name} routing list must be a list" for rt_entry in routing_list: port_id = rt_entry[PORT_ID] - assert port_id >= 0, "Invalid port ID: {}".format(port_id) + assert port_id >= 0, f"Invalid port ID: {port_id}" ipv4_dst = rt_entry[IPV4_DST] - assert chk_address_ipv4(ipv4_dst), "Invalid destination IPv4 address {}".format(ipv4_dst) + assert chk_address_ipv4(ipv4_dst), f"Invalid destination IPv4 address {ipv4_dst}" ipv4_prefix_len = rt_entry[IPV4_PREFIX_LEN] - assert chk_prefix_len_ipv4(ipv4_prefix_len), "Invalid IPv4 address prefix length {}".format(ipv4_prefix_len) + assert chk_prefix_len_ipv4(ipv4_prefix_len), f"Invalid IPv4 address prefix length {ipv4_prefix_len}" mac_src = rt_entry[MAC_SRC] - assert chk_address_mac(mac_src), "Invalid source MAC address {}".format(mac_src) + assert chk_address_mac(mac_src), f"Invalid source MAC address {mac_src}" mac_dst = rt_entry[MAC_DST] - assert chk_address_mac(mac_dst), "Invalid destination MAC address {}".format(mac_dst) + assert chk_address_mac(mac_dst), f"Invalid destination MAC address {mac_dst}" # Retrieve entry from the port map switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) @@ -387,48 +385,116 @@ class P4FabricL3ServiceHandler(_ServiceHandler): self.__switch_info[switch_name] = sw_info def _print_settings(self): - LOGGER.info("--------------- {} settings ---------------".format(self.__service.name)) + LOGGER.info(f"--------------- {self.__service.name} settings ---------------") LOGGER.info("--- Topology info") for switch_name, switch_info in self.__switch_info.items(): - LOGGER.info("\t Device {}".format(switch_name)) - LOGGER.info("\t\t| Target P4 architecture: {}".format(switch_info[ARCH])) - LOGGER.info("\t\t| Data plane ID: {}".format(switch_info[DPID])) - LOGGER.info("\t\t| Port map: {}".format(self.__port_map[switch_name])) + LOGGER.info(f"\t Device {switch_name}") + LOGGER.info(f"\t\t| Target P4 architecture: {switch_info[ARCH]}") + LOGGER.info(f"\t\t| Data plane ID: {switch_info[DPID]}") + LOGGER.info(f"\t\t| Port map: {self.__port_map[switch_name]}") LOGGER.info("-------------------------------------------------------") def _get_switch_port_in_port_map(self, switch_name : str, port_id : int) -> Dict: assert switch_name, "A valid switch name must be used as a key to the port map" assert port_id > 0, "A valid switch port ID must be used as a key to a switch's port map" switch_entry = self.__port_map[switch_name] - assert switch_entry, "Switch {} does not exist in the port map".format(switch_name) + assert switch_entry, f"Switch {switch_name} does not exist in the port map" port_key = PORT_PREFIX + str(port_id) - assert switch_entry[port_key], "Port with ID {} does not exist in the switch map".format(port_id) + assert switch_entry[port_key], f"Port with ID {port_id} does not exist in the switch map" return switch_entry[port_key] + def _get_port_type_of_switch_port(self, switch_name : str, port_id : int) -> str: + switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) + return switch_port_entry[PORT_TYPE] + + def _get_vlan_id_of_switch_port(self, switch_name : str, port_id : int) -> int: + switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) + return switch_port_entry[VLAN_ID] + def _get_routing_list_of_switch_port(self, switch_name : str, port_id : int) -> List [Tuple]: switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) return switch_port_entry[ROUTING_LIST] + def _is_host_facing_port(self, switch_name : str, port_id : int) -> bool: + return self._get_port_type_of_switch_port(switch_name, port_id) == PORT_TYPE_HOST + def _create_rules(self, device_obj : Device, port_id : int, action : ConfigActionEnum): # type: ignore dev_name = device_obj.name + # TODO: Fix + next_id = 2 if port_id ==1 else 1 + + host_facing_port = self._is_host_facing_port(dev_name, port_id) + LOGGER.info(f"\t | Service endpoint is host facing: {"True" if host_facing_port else "False"}") + rules = [] + try: + ### Port setup rules + if host_facing_port: + rules += rules_set_up_port_host( + port=port_id, + vlan_id=self._get_vlan_id_of_switch_port(switch_name=dev_name, port_id=port_id), + action=action + ) + else: + rules += rules_set_up_port_switch( + port=port_id, + vlan_id=self._get_vlan_id_of_switch_port(switch_name=dev_name, port_id=port_id), + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating port setup rules") + raise Exception(ex) + ### Static routing rules - routing_list = self._get_routing_list_of_switch_port(switch_name=dev_name, port_id=port_id) + routing_list = self._get_routing_list_of_switch_port(switch_name=dev_name, port_id=next_id) for rt_entry in routing_list: try: - rules += rules_set_up_next_routing_simple( - egress_port=port_id, + ### Bridging rules + rules += rules_set_up_fwd_bridging( + port_id=port_id, + vlan_id=self._get_vlan_id_of_switch_port(switch_name=dev_name, port_id=port_id), + eth_dst=rt_entry[MAC_DST], + next_id=next_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating rule for bridging") + raise Exception(ex) + + try: + ### Next profile for hashed routing + rules += rules_set_up_next_profile_hashed_routing( + port_id=port_id, + next_id=next_id, eth_src=rt_entry[MAC_SRC], eth_dst=rt_entry[MAC_DST], action=action ) + except Exception as ex: + LOGGER.error("Error while creating rule for next hashed profile") + raise Exception(ex) + + try: + ### Next hashed port + rules += rules_set_up_next_hashed( + port_id=port_id, + next_id=next_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating rule for next hashed port") + raise Exception(ex) + + try: + # Routing destination rules += rules_set_up_routing( + port_id=port_id, ipv4_dst=rt_entry[IPV4_DST], ipv4_prefix_len=rt_entry[IPV4_PREFIX_LEN], - egress_port=port_id, + next_id=next_id, action=action ) except Exception as ex: diff --git a/src/service/service/service_handlers/p4_fabric_tna_upf/__init__.py b/src/service/service/service_handlers/p4_fabric_tna_upf/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..023830645e0fcb60e3f8583674a954810af222f2 --- /dev/null +++ b/src/service/service/service_handlers/p4_fabric_tna_upf/__init__.py @@ -0,0 +1,13 @@ +# 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. diff --git a/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_config.py b/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_config.py new file mode 100644 index 0000000000000000000000000000000000000000..faea1d3d692a86fd31b726ee96c3d929ef5c2b71 --- /dev/null +++ b/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_config.py @@ -0,0 +1,540 @@ +# 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. + +""" +Common objects and methods for 5G User Plane Function (UPF) offloading in P4 +based on the SD-Fabric dataplane model. +This dataplane covers both software based and hardware-based Stratum-enabled P4 switches, +such as the BMv2 software switch and Intel's Tofino/Tofino-2 switches. + +SD-Fabric repo: https://github.com/stratum/fabric-tna +SD-Fabric docs: https://docs.sd-fabric.org/master/index.html +""" + +from typing import List, Tuple +from common.proto.context_pb2 import ConfigActionEnum +from common.tools.object_factory.ConfigRule import json_config_rule +from common.type_checkers.Checkers import chk_address_ipv4, chk_prefix_len_ipv4, chk_transport_port + +from service.service.service_handlers.p4_fabric_tna_commons.p4_fabric_tna_commons import * + +# UPF service handler settings +UPF = "upf" +UPLINK_PORT = "uplink_port" +DOWNLINK_PORT = "downlink_port" +UPLINK_IP = "uplink_ip" +DOWNLINK_IP = "downlink_ip" +UPLINK_MAC = "uplink_mac" +DOWNLINK_MAC = "downlink_mac" +TEID = "teid" +SLICE_ID = "slice_id" +APP_ID = "app_id" +APP_METER_ID = "app_meter_id" +CTR_ID = "ctr_id" +TC_ID = "tc_id" +TUNNEL_PEER_ID = "tunnel_peer_id" +GNB = "gnb" +DATA_NETWORK = "data_network" +UE_LIST = "ue_list" +UE_ID = "ue_id" +UE_IP = "ue_ip" +PDU_LIST = "pdu_sessions" +QOS_FLOWS = "qos_flows" +PDU_SESSION_ID = "pdu_session_id" +DNN = "dnn" +PDU_SESSION_TYPE = "pdu_session_type" +GTPU_TUNNEL = "gtpu_tunnel" +UPLINK = "uplink" +DOWNLINK = "downlink" +SRC = "src" +DST = "dst" +QFI = "qfi" +FIVEQI = "5qi" +QOS_TYPE = "qos_type" +QOS_DESC = "qos_desc" + +# Tables +TABLE_UPF_INTERFACES = "FabricIngress.upf.interfaces" +TABLE_UPF_UL_SESSIONS = "FabricIngress.upf.uplink_sessions" +TABLE_UPF_UL_TERM = "FabricIngress.upf.uplink_terminations" +TABLE_UPF_UL_RECIRC_RULES = "FabricIngress.upf.uplink_recirc_rules" # No need for recirculation +TABLE_UPF_DL_SESSIONS = "FabricIngress.upf.downlink_sessions" +TABLE_UPF_DL_TERM = "FabricIngress.upf.downlink_terminations" +TABLE_UPF_DL_IG_TUN_PEERS = "FabricIngress.upf.ig_tunnel_peers" +TABLE_UPF_DL_EG_TUN_PEERS = "FabricEgress.upf.eg_tunnel_peers" +TABLE_UPF_DL_GTPU_ENCAP = "FabricEgress.upf.gtpu_encap" # This table has no key, thus auto-applies actions + +TABLE_QOS_SLICE_TC = "FabricIngress.qos.set_slice_tc" # This table is accessed automatically (no rule applied) +TABLE_QOS_DEF_TC = "FabricIngress.qos.default_tc" # Miss. No QoS applied so far +TABLE_QOS_QUEUES = "FabricIngress.qos.queues" # Miss. No QoS applied so far + +# UPF settings +GTP_PORT = 2152 + +GTPU_VALID = 1 +GTPU_INVALID = 0 + +## Default values +DEF_APP_ID = 0 +DEF_APP_METER_ID = 0 +DEF_CTR_ID = 401 +DEF_SLICE_ID = 0 +DEF_TC_ID = 3 +DEF_TEID = 1 +DEF_TUN_PEER_ID = 1 +DEF_SESSION_METER_ID = 0 +DEF_QFI = 0 + +# 5QI +FIVEQI_NON_GBR = 9 +FIVEQI_GBR = 1 +FIVEQI_DELAY_CRITICAL_GBR = 82 + +# QoS +QOS_TYPE_NON_GBR = "Non-GBR" +QOS_TYPE_GBR = "GBR" +QOS_TYPE_DELAY_CRITICAL_GBR = "Delay-Critical GBR" +QOS_TYPES_STR_VALID = [QOS_TYPE_NON_GBR, QOS_TYPE_GBR, QOS_TYPE_DELAY_CRITICAL_GBR] + +QOS_TYPE_TO_5QI_MAP = { + QOS_TYPE_NON_GBR: FIVEQI_NON_GBR, + QOS_TYPE_GBR: FIVEQI_GBR, + QOS_TYPE_DELAY_CRITICAL_GBR: FIVEQI_DELAY_CRITICAL_GBR +} + +QOS_TYPE_TO_DESC_MAP = { + QOS_TYPE_NON_GBR: "Best effort", + QOS_TYPE_GBR: "Low latency", + QOS_TYPE_DELAY_CRITICAL_GBR: "Ultra-low latency" +} + + +def rules_set_up_upf_interface( + port_id : int, + ipv4_dst : str, + ipv4_prefix_len : int, + gtpu_value : int, + slice_id : int, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert chk_address_ipv4(ipv4_dst), "Invalid destination IPv4 address to configure UPF interface" + assert chk_prefix_len_ipv4(ipv4_prefix_len), "Invalid destination IPv4 address prefix length to configure UPF interface" + assert gtpu_value >= 0, "Invalid slice identifier to configure UPF interface" + assert slice_id >= 0, "Invalid slice identifier to configure UPF interface" + + action_name = None + + if gtpu_value == GTPU_VALID: # Packet carries a GTP header (UL packet) + action_name = "FabricIngress.upf.iface_access" + else: # Packet does not carry a GTP header (DL packet) + action_name = "FabricIngress.upf.iface_core" + + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure UPF interface") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== IPv4 dst {ipv4_dst}") + LOGGER.info(f"================== IPv4 prefix {ipv4_prefix_len}") + LOGGER.info(f"================== GTP-U value {gtpu_value}") + LOGGER.info(f"================== Slice ID {slice_id}") + LOGGER.info(f"================== Action {action_name}") + + rule_no = cache_rule(TABLE_UPF_INTERFACES, action) + + rules_upf_interfaces = [] + rules_upf_interfaces.append( + json_config_rule( + action, + '/tables/table/'+TABLE_UPF_INTERFACES+'['+str(rule_no)+']', + { + 'table-name': TABLE_UPF_INTERFACES, + 'match-fields': [ + { + 'match-field': 'ipv4_dst_addr', + 'match-value': ipv4_dst + "/" + str(ipv4_prefix_len) + }, + { + 'match-field': 'gtpu_is_valid', + 'match-value': str(gtpu_value) + } + ], + 'action-name': action_name, + 'action-params': [ + { + 'action-param': 'slice_id', + 'action-value': str(slice_id) + } + ], + 'priority': 0 + } + ) + ) + + return rules_upf_interfaces + +################################### +### A. Uplink (UL) setup +################################### + +def rules_set_up_upf_uplink_sessions( + port_id : int, + tun_ip_address : str, + teid : int, + session_meter_id : int, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert chk_address_ipv4(tun_ip_address), "Invalid tunnel IPv4 address to configure UPF uplink session" + assert teid >= 0, "Invalid tunnel endpoint identifier (TEID) to configure UPF uplink session" + assert session_meter_id >= 0, "Invalid session meter identifier to configure UPF uplink session" + + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure UL session") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== Tunnel IP {tun_ip_address}") + LOGGER.info(f"================== TEID {teid}") + LOGGER.info(f"================== Session meter ID {session_meter_id}") + + rule_no = cache_rule(TABLE_UPF_UL_SESSIONS, action) + + rules_upf_ul_session = [] + rules_upf_ul_session.append( + json_config_rule( + action, + '/tables/table/'+TABLE_UPF_UL_SESSIONS+'['+str(rule_no)+']', + { + 'table-name': TABLE_UPF_UL_SESSIONS, + 'match-fields': [ + { + 'match-field': 'tunnel_ipv4_dst', + 'match-value': tun_ip_address + }, + { + 'match-field': 'teid', + 'match-value': str(teid) + } + ], + 'action-name': "FabricIngress.upf.set_uplink_session", + 'action-params': [ + { + 'action-param': 'session_meter_idx', + 'action-value': str(session_meter_id) + } + ], + 'priority': 0 + } + ) + ) + + return rules_upf_ul_session + +def rules_set_up_upf_uplink_terminations( + port_id : int, + ue_session_id : str, + app_id : int, + ctr_id : int, + app_meter_id : int, + tc_id : int, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert chk_address_ipv4(ue_session_id), "Invalid UE IPv4 address (UE session ID) to configure UPF uplink termination" + assert app_id >= 0, "Invalid application identifier to configure UPF uplink termination" + assert ctr_id >= 0, "Invalid ctr identifier to configure UPF uplink termination" + assert app_meter_id >= 0, "Invalid app meter identifier to configure UPF uplink termination" + assert tc_id >= 0, "Invalid tc identifier to configure UPF uplink termination" + + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure UL termination") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== UE session ID {ue_session_id}") + LOGGER.info(f"================== App ID {app_id}") + LOGGER.info(f"================== Ctr ID {ctr_id}") + LOGGER.info(f"================== App meter ID {app_meter_id}") + LOGGER.info(f"================== TC ID {tc_id}") + + rule_no = cache_rule(TABLE_UPF_UL_TERM, action) + + rules_upf_ul_termination = [] + rules_upf_ul_termination.append( + json_config_rule( + action, + '/tables/table/'+TABLE_UPF_UL_TERM+'['+str(rule_no)+']', + { + 'table-name': TABLE_UPF_UL_TERM, + 'match-fields': [ + { + 'match-field': 'ue_session_id', + 'match-value': ue_session_id + }, + { + 'match-field': 'app_id', + 'match-value': str(app_id) + } + ], + 'action-name': "FabricIngress.upf.app_fwd", + 'action-params': [ + { + 'action-param': 'ctr_id', + 'action-value': str(ctr_id) + }, + { + 'action-param': 'app_meter_idx', + 'action-value': str(app_meter_id) + }, + { + 'action-param': 'tc', + 'action-value': str(tc_id) + } + ], + 'priority': 0 + } + ) + ) + + return rules_upf_ul_termination + +################################### +### A. End of Uplink (UL) setup +################################### + +################################### +### B. Downlink (DL) setup +################################### + +def rules_set_up_upf_downlink_sessions( + port_id : int, + ipv4_dst : str, + session_meter_id : int, + tun_peer_id : int, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert chk_address_ipv4(ipv4_dst), "Invalid destination IPv4 address to configure UPF downlink session" + assert session_meter_id >= 0, "Invalid session meter identifier to configure UPF downlink session" + assert tun_peer_id >= 0, "Invalid tunnel peer identifier to configure UPF downlink session" + + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure DL session") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== IP dst {ipv4_dst}") + LOGGER.info(f"================== Session meter ID {session_meter_id}") + LOGGER.info(f"================== Tunnel peer ID {tun_peer_id}") + + rule_no = cache_rule(TABLE_UPF_DL_SESSIONS, action) + + rules_upf_dl_session = [] + rules_upf_dl_session.append( + json_config_rule( + action, + '/tables/table/'+TABLE_UPF_DL_SESSIONS+'['+str(rule_no)+']', + { + 'table-name': TABLE_UPF_DL_SESSIONS, + 'match-fields': [ + { + 'match-field': 'ue_addr', + 'match-value': ipv4_dst + } + ], + 'action-name': "FabricIngress.upf.set_downlink_session", + 'action-params': [ + { + 'action-param': 'session_meter_idx', + 'action-value': str(session_meter_id) + }, + { + 'action-param': 'tun_peer_id', + 'action-value': str(tun_peer_id) + } + ], + 'priority': 0 + } + ) + ) + + return rules_upf_dl_session + +def rules_set_up_upf_downlink_terminations( + port_id : int, + ue_session_id : str, + app_id : int, + ctr_id : int, + app_meter_id : int, + tc_id : int, + teid : int, + qfi : int, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert chk_address_ipv4(ue_session_id), "Invalid UE IPv4 address (UE session ID) to configure UPF downlink termination" + assert app_id >= 0, "Invalid application identifier to configure downlink termination" + assert ctr_id >= 0, "Invalid ctr identifier to configure UPF downlink termination" + assert app_meter_id >= 0, "Invalid app meter identifier to configure UPF downlink termination" + assert tc_id >= 0, "Invalid tc identifier to configure UPF downlink termination" + assert teid >= 0, "Invalid tunnel endpoint identifier (TEID) to configure UPF downlink termination" + assert qfi >= 0, "Invalid QoS flow identifier (QFI) to configure UPF downlink termination" + + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure DL termination") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== UE session ID {ue_session_id}") + LOGGER.info(f"================== App ID {app_id}") + LOGGER.info(f"================== Ctr ID {ctr_id}") + LOGGER.info(f"================== App meter ID {app_meter_id}") + LOGGER.info(f"================== TC ID {tc_id}") + LOGGER.info(f"================== TEID {teid}") + LOGGER.info(f"================== QFI {qfi}") + + rule_no = cache_rule(TABLE_UPF_DL_TERM, action) + + rules_upf_dl_termination = [] + rules_upf_dl_termination.append( + json_config_rule( + action, + '/tables/table/'+TABLE_UPF_DL_TERM+'['+str(rule_no)+']', + { + 'table-name': TABLE_UPF_DL_TERM, + 'match-fields': [ + { + 'match-field': 'ue_session_id', + 'match-value': ue_session_id + }, + { + 'match-field': 'app_id', + 'match-value': str(app_id) + } + ], + 'action-name': "FabricIngress.upf.downlink_fwd_encap", + 'action-params': [ + { + 'action-param': 'ctr_id', + 'action-value': str(ctr_id) + }, + { + 'action-param': 'app_meter_idx', + 'action-value': str(app_meter_id) + }, + { + 'action-param': 'tc', + 'action-value': str(tc_id) + }, + { + 'action-param': 'teid', + 'action-value': str(teid) + }, + { + 'action-param': 'qfi', + 'action-value': str(qfi) + } + ], + 'priority': 0 + } + ) + ) + + return rules_upf_dl_termination + +def rules_set_up_upf_downlink_ig_tunnel_peers( + port_id : int, + tun_peer_id : int, + tun_dst_addr : str, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert tun_peer_id >= 0, "Invalid tunnel peer identifier to configure UPF downlink ingress tunnel peers" + assert chk_address_ipv4(tun_dst_addr), "Invalid tunnel destination IPv4 address to configure UPF downlink ingress tunnel peers" + + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure IG tunnel peer") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== Tunnel peer ID {tun_peer_id}") + LOGGER.info(f"================== Tunnel IP dst {tun_dst_addr}") + + rule_no = cache_rule(TABLE_UPF_DL_IG_TUN_PEERS, action) + + rules_upf_dl_ig_tun_peers = [] + rules_upf_dl_ig_tun_peers.append( + json_config_rule( + action, + '/tables/table/'+TABLE_UPF_DL_IG_TUN_PEERS+'['+str(rule_no)+']', + { + 'table-name': TABLE_UPF_DL_IG_TUN_PEERS, + 'match-fields': [ + { + 'match-field': 'tun_peer_id', + 'match-value': str(tun_peer_id) + } + ], + 'action-name': "FabricIngress.upf.set_routing_ipv4_dst", + 'action-params': [ + { + 'action-param': 'tun_dst_addr', + 'action-value': tun_dst_addr + } + ], + 'priority': 0 + } + ) + ) + + return rules_upf_dl_ig_tun_peers + +def rules_set_up_upf_downlink_eg_tunnel_peers( + port_id : int, + tun_peer_id : int, + tun_src_addr : str, + tun_dst_addr : str, + tun_src_port : int, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert tun_peer_id >= 0, "Invalid tunnel peer identifier to configure UPF downlink egress tunnel peers" + assert chk_address_ipv4(tun_src_addr), "Invalid tunnel source IPv4 address to configure UPF downlink egress tunnel peers" + assert chk_address_ipv4(tun_dst_addr), "Invalid tunnel destination IPv4 address to configure UPF downlink egress tunnel peers" + assert chk_transport_port(tun_src_port), "Invalid tunnel source transport port to configure UPF downlink egress tunnel peers" + + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure EG tunnel peer") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== Tunnel peer ID {tun_peer_id}") + LOGGER.info(f"================== Tunnel IP src {tun_src_addr}") + LOGGER.info(f"================== Tunnel IP dst {tun_dst_addr}") + LOGGER.info(f"================== Tunnel Port src {tun_src_port}") + + rule_no = cache_rule(TABLE_UPF_DL_EG_TUN_PEERS, action) + + rules_upf_dl_eg_tun_peers = [] + rules_upf_dl_eg_tun_peers.append( + json_config_rule( + action, + '/tables/table/'+TABLE_UPF_DL_EG_TUN_PEERS+'['+str(rule_no)+']', + { + 'table-name': TABLE_UPF_DL_EG_TUN_PEERS, + 'match-fields': [ + { + 'match-field': 'tun_peer_id', + 'match-value': str(tun_peer_id) + } + ], + 'action-name': "FabricEgress.upf.load_tunnel_params", + 'action-params': [ + { + 'action-param': 'tunnel_src_addr', + 'action-value': tun_src_addr + }, + { + 'action-param': 'tunnel_dst_addr', + 'action-value': tun_dst_addr + }, + { + 'action-param': 'tunnel_src_port', + 'action-value': str(tun_src_port) + } + ], + 'priority': 0 + } + ) + ) + + return rules_upf_dl_eg_tun_peers + +################################### +### B. End of Downlink (DL) setup +################################### diff --git a/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_service_handler.py b/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_service_handler.py new file mode 100644 index 0000000000000000000000000000000000000000..f9d4ca20fb81235f728e21aec017ba95119884e0 --- /dev/null +++ b/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_service_handler.py @@ -0,0 +1,946 @@ +# 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. + +""" +Service handler for P4-based UPF offloading using the SD-Fabric P4 dataplane +for BMv2 and Intel Tofino switches. +""" + +import logging +from typing import Any, List, Dict, Optional, Tuple, Union +from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method +from common.proto.context_pb2 import ConfigActionEnum, DeviceId, Service, Device +from common.tools.object_factory.Device import json_device_id +from common.type_checkers.Checkers import chk_type, chk_address_mac, chk_address_ipv4, chk_prefix_len_ipv4 +from service.service.service_handler_api._ServiceHandler import _ServiceHandler +from service.service.service_handler_api.SettingsHandler import SettingsHandler +from service.service.service_handlers.p4_fabric_tna_commons.p4_fabric_tna_commons import * +from service.service.task_scheduler.TaskExecutor import TaskExecutor + +from .p4_fabric_tna_upf_config import * + +LOGGER = logging.getLogger(__name__) + +METRICS_POOL = MetricsPool('Service', 'Handler', labels={'handler': 'p4_fabric_tna_upf'}) + +class P4FabricUPFServiceHandler(_ServiceHandler): + def __init__( # pylint: disable=super-init-not-called + self, service : Service, task_executor : TaskExecutor, **settings # type: ignore + ) -> None: + """ Initialize Driver. + Parameters: + service + The service instance (gRPC message) to be managed. + task_executor + An instance of Task Executor providing access to the + service handlers factory, the context and device clients, + and an internal cache of already-loaded gRPC entities. + **settings + Extra settings required by the service handler. + + """ + self.__service_label = "P4 UPF offloading service" + self.__service = service + self.__task_executor = task_executor + self.__settings_handler = SettingsHandler(self.__service.service_config, **settings) + + self._init_settings() + self._parse_settings() + self._print_settings() + + @metered_subclass_method(METRICS_POOL) + def SetEndpoint( + self, endpoints : List[Tuple[str, str, Optional[str]]], + connection_uuid : Optional[str] = None + ) -> List[Union[bool, Exception]]: + """ Create/Update service endpoints from a list. + Parameters: + endpoints: List[Tuple[str, str, Optional[str]]] + List of tuples, each containing a device_uuid, + endpoint_uuid and, optionally, the topology_uuid + of the endpoint to be added. + connection_uuid : Optional[str] + If specified, is the UUID of the connection this endpoint is associated to. + Returns: + results: List[Union[bool, Exception]] + List of results for endpoint changes requested. + Return values must be in the same order as the requested + endpoints. If an endpoint is properly added, True must be + returned; otherwise, the Exception that is raised during + the processing must be returned. + """ + chk_type('endpoints', endpoints, list) + if len(endpoints) == 0: return [] + + LOGGER.info(f"{self.__service_label} - Provision service configuration") + + visited = set() + results = [] + for endpoint in endpoints: + device_uuid, endpoint_uuid = endpoint[0:2] + device = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid))) + device_name = device.name + + LOGGER.info(f"Device {device_name}") + LOGGER.info(f"\t | Service endpoint UUID: {endpoint_uuid}") + + port_id = find_port_id_in_endpoint_list(device.device_endpoints, endpoint_uuid) + LOGGER.info(f"\t | Service port ID: {port_id}") + + dev_port_key = device_name + "-" + PORT_PREFIX + str(port_id) + + # Skip already visited device ports + if dev_port_key in visited: + continue + + # Skip non-dataplane ports + if port_id not in [self.__upf[UPLINK_PORT], self.__upf[DOWNLINK_PORT]]: + LOGGER.info(f"\t | Port ID {port_id} is not an UL or DP port; skipping...") + continue + + rules = [] + actual_rules = -1 + applied_rules, failed_rules = 0, -1 + label = "" + + # Create and apply rules + try: + # Uplink (UL) rules + if port_id == self.__upf[UPLINK_PORT]: + rules = self._create_rules_uplink( + device_obj=device, + port_id=port_id, + next_id=self.__upf[DOWNLINK_PORT], + action=ConfigActionEnum.CONFIGACTION_SET) + label = "uplink (UL)" + # Downlink (DL) rules + elif port_id == self.__upf[DOWNLINK_PORT]: + rules = self._create_rules_downlink( + device_obj=device, + port_id=port_id, + next_id=self.__upf[UPLINK_PORT], + action=ConfigActionEnum.CONFIGACTION_SET) + label = "downlink (DL)" + actual_rules = len(rules) + applied_rules, failed_rules = apply_rules( + task_executor=self.__task_executor, + device_obj=device, + json_config_rules=rules + ) + except Exception as ex: + LOGGER.error(f"Failed to insert {label} UPF rules on device {device.name} due to {ex}") + results.append(ex) + finally: + rules.clear() + + # Ensure correct status + if (failed_rules == 0) and (applied_rules == actual_rules): + LOGGER.info(f"Installed {applied_rules}/{actual_rules} {label} UPF rules on device {device_name} and port {port_id}") + results.append(True) + + # You should no longer visit this device port again + visited.add(dev_port_key) + + return results + + @metered_subclass_method(METRICS_POOL) + def DeleteEndpoint( + self, endpoints : List[Tuple[str, str, Optional[str]]], + connection_uuid : Optional[str] = None + ) -> List[Union[bool, Exception]]: + """ Delete service endpoints from a list. + Parameters: + endpoints: List[Tuple[str, str, Optional[str]]] + List of tuples, each containing a device_uuid, + endpoint_uuid, and the topology_uuid of the endpoint + to be removed. + connection_uuid : Optional[str] + If specified, is the UUID of the connection this endpoint is associated to. + Returns: + results: List[Union[bool, Exception]] + List of results for endpoint deletions requested. + Return values must be in the same order as the requested + endpoints. If an endpoint is properly deleted, True must be + returned; otherwise, the Exception that is raised during + the processing must be returned. + """ + chk_type('endpoints', endpoints, list) + if len(endpoints) == 0: return [] + + LOGGER.info(f"{self.__service_label} - Deprovision service configuration") + + visited = set() + results = [] + for endpoint in endpoints: + device_uuid, endpoint_uuid = endpoint[0:2] + device = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid))) + device_name = device.name + + LOGGER.info(f"Device {device_name}") + LOGGER.info(f"\t | Service endpoint UUID: {endpoint_uuid}") + + port_id = find_port_id_in_endpoint_list(device.device_endpoints, endpoint_uuid) + LOGGER.info(f"\t | Service port ID: {port_id}") + + dev_port_key = device_name + "-" + PORT_PREFIX + str(port_id) + + # Skip already visited device ports + if dev_port_key in visited: + continue + + # Skip non-dataplane ports + if port_id not in [self.__upf[UPLINK_PORT], self.__upf[DOWNLINK_PORT]]: + LOGGER.info(f"\t | Port ID {port_id} is not an UL or DP port; skipping...") + continue + + rules = [] + actual_rules = -1 + applied_rules, failed_rules = 0, -1 + label = "" + + # Create and apply rules + try: + # Uplink (UL) rules + if port_id == self.__upf[UPLINK_PORT]: + rules = self._create_rules_uplink( + device_obj=device, + port_id=port_id, + next_id=self.__upf[DOWNLINK_PORT], + action=ConfigActionEnum.CONFIGACTION_DELETE) + label = "uplink (UL)" + # Downlink (DL) rules + elif port_id == self.__upf[DOWNLINK_PORT]: + rules = self._create_rules_downlink( + device_obj=device, + port_id=port_id, + next_id=self.__upf[UPLINK_PORT], + action=ConfigActionEnum.CONFIGACTION_DELETE) + label = "downlink (DL)" + actual_rules = len(rules) + applied_rules, failed_rules = apply_rules( + task_executor=self.__task_executor, + device_obj=device, + json_config_rules=rules + ) + except Exception as ex: + LOGGER.error(f"Failed to delete {label} UPF rules from device {device.name} due to {ex}") + results.append(ex) + finally: + rules.clear() + + # Ensure correct status + if (failed_rules == 0) and (applied_rules == actual_rules): + LOGGER.info(f"Deleted {applied_rules}/{actual_rules} {label} UPF rules from device {device_name} and port {port_id}") + results.append(True) + + # You should no longer visit this device port again + visited.add(dev_port_key) + + return results + + @metered_subclass_method(METRICS_POOL) + def SetConstraint(self, constraints: List[Tuple[str, Any]]) \ + -> List[Union[bool, Exception]]: + """ Create/Update service constraints. + Parameters: + constraints: List[Tuple[str, Any]] + List of tuples, each containing a constraint_type and the + new constraint_value to be set. + Returns: + results: List[Union[bool, Exception]] + List of results for constraint changes requested. + Return values must be in the same order as the requested + constraints. If a constraint is properly set, True must be + returned; otherwise, the Exception that is raised during + the processing must be returned. + """ + chk_type('constraints', constraints, list) + if len(constraints) == 0: return [] + + msg = '[SetConstraint] Method not implemented. Constraints({:s}) are being ignored.' + LOGGER.warning(msg.format(str(constraints))) + return [True for _ in range(len(constraints))] + + @metered_subclass_method(METRICS_POOL) + def DeleteConstraint(self, constraints: List[Tuple[str, Any]]) \ + -> List[Union[bool, Exception]]: + """ Delete service constraints. + Parameters: + constraints: List[Tuple[str, Any]] + List of tuples, each containing a constraint_type pointing + to the constraint to be deleted, and a constraint_value + containing possible additionally required values to locate + the constraint to be removed. + Returns: + results: List[Union[bool, Exception]] + List of results for constraint deletions requested. + Return values must be in the same order as the requested + constraints. If a constraint is properly deleted, True must + be returned; otherwise, the Exception that is raised during + the processing must be returned. + """ + chk_type('constraints', constraints, list) + if len(constraints) == 0: return [] + + msg = '[DeleteConstraint] Method not implemented. Constraints({:s}) are being ignored.' + LOGGER.warning(msg.format(str(constraints))) + return [True for _ in range(len(constraints))] + + @metered_subclass_method(METRICS_POOL) + def SetConfig(self, resources: List[Tuple[str, Any]]) \ + -> List[Union[bool, Exception]]: + """ Create/Update configuration for a list of service resources. + Parameters: + resources: List[Tuple[str, Any]] + List of tuples, each containing a resource_key pointing to + the resource to be modified, and a resource_value + containing the new value to be set. + Returns: + results: List[Union[bool, Exception]] + List of results for resource key changes requested. + Return values must be in the same order as the requested + resource keys. If a resource is properly set, True must be + returned; otherwise, the Exception that is raised during + the processing must be returned. + """ + chk_type('resources', resources, list) + if len(resources) == 0: return [] + + msg = '[SetConfig] Method not implemented. Resources({:s}) are being ignored.' + LOGGER.warning(msg.format(str(resources))) + return [True for _ in range(len(resources))] + + @metered_subclass_method(METRICS_POOL) + def DeleteConfig(self, resources: List[Tuple[str, Any]]) \ + -> List[Union[bool, Exception]]: + """ Delete configuration for a list of service resources. + Parameters: + resources: List[Tuple[str, Any]] + List of tuples, each containing a resource_key pointing to + the resource to be modified, and a resource_value containing + possible additionally required values to locate the value + to be removed. + Returns: + results: List[Union[bool, Exception]] + List of results for resource key deletions requested. + Return values must be in the same order as the requested + resource keys. If a resource is properly deleted, True must + be returned; otherwise, the Exception that is raised during + the processing must be returned. + """ + chk_type('resources', resources, list) + if len(resources) == 0: return [] + + msg = '[DeleteConfig] Method not implemented. Resources({:s}) are being ignored.' + LOGGER.warning(msg.format(str(resources))) + return [True for _ in range(len(resources))] + + def _init_settings(self): + self.__switch_info = {} + self.__port_map = {} + self.__upf = {} + self.__gnb = {} + self.__ue_map = {} + + try: + self.__settings = self.__settings_handler.get('/settings') + LOGGER.info(f"{self.__service_label} with settings: {self.__settings}") + except Exception as ex: + LOGGER.error(f"Failed to retrieve service settings: {ex}") + raise Exception(ex) + + def _parse_settings(self): + try: + switch_info = self.__settings.value[SWITCH_INFO] + except Exception as ex: + LOGGER.error(f"Failed to parse service settings: {ex}") + raise Exception(ex) + assert isinstance(switch_info, list), "Switch info object must be a list" + + for switch in switch_info: + for switch_name, sw_info in switch.items(): + assert switch_name, "Invalid P4 switch name" + assert isinstance(sw_info, dict), \ + "Switch {} info must be a map with arch, dpid, port_list, fwd_list, routing_list, upf, gnb, and ue_list items)" + assert sw_info[ARCH] in SUPPORTED_TARGET_ARCH_LIST, \ + f"Switch {switch_name} - Supported P4 architectures are: {','.join(SUPPORTED_TARGET_ARCH_LIST)}" + switch_dpid = sw_info[DPID] + assert switch_dpid > 0, f"Switch {switch_name} - P4 switch dataplane ID {sw_info[DPID]} must be a positive integer" + + # Port list + port_list = sw_info[PORT_LIST] + assert isinstance(port_list, list),\ + f"Switch {switch_name} port list must be a list with port_id, port_type, and vlan_id items" + for port in port_list: + port_id = port[PORT_ID] + assert port_id >= 0, f"Switch {switch_name} - Invalid P4 switch port ID" + port_type = port[PORT_TYPE] + assert port_type in PORT_TYPES_STR_VALID, f"Switch {switch_name} - Valid P4 switch port types are: {','.join(PORT_TYPES_STR_VALID)}" + vlan_id = port[VLAN_ID] + assert chk_vlan_id(vlan_id), f"Switch {switch_name} - Invalid VLAN ID for port {port_id}" + + if switch_name not in self.__port_map: + self.__port_map[switch_name] = {} + port_key = PORT_PREFIX + str(port_id) + if port_key not in self.__port_map[switch_name]: + self.__port_map[switch_name][port_key] = {} + self.__port_map[switch_name][port_key][PORT_ID] = port_id + self.__port_map[switch_name][port_key][PORT_TYPE] = port_type + self.__port_map[switch_name][port_key][VLAN_ID] = vlan_id + self.__port_map[switch_name][port_key][FORWARDING_LIST] = [] + self.__port_map[switch_name][port_key][ROUTING_LIST] = [] + + # Forwarding list + fwd_list = sw_info[FORWARDING_LIST] + assert isinstance(fwd_list, list), f"Switch {switch_name} forwarding list must be a list" + for fwd_entry in fwd_list: + port_id = fwd_entry[PORT_ID] + assert port_id >= 0, f"Invalid port ID: {port_id}" + host_mac = fwd_entry[HOST_MAC] + assert chk_address_mac(host_mac), f"Invalid host MAC address {host_mac}" + host_label = "" + if HOST_LABEL in fwd_entry: + host_label = fwd_entry[HOST_LABEL] + + # Retrieve entry from the port map + switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) + + host_facing_port = self._is_host_facing_port(switch_name, port_id) + LOGGER.info(f"Switch {switch_name} - Port {port_id}: Is host facing: {"True" if host_facing_port else "False"}") + switch_port_entry[FORWARDING_LIST].append( + { + HOST_MAC: host_mac, + HOST_LABEL: host_label + } + ) + + # Routing list + routing_list = sw_info[ROUTING_LIST] + assert isinstance(routing_list, list), f"Switch {switch_name} routing list must be a list" + for rt_entry in routing_list: + port_id = rt_entry[PORT_ID] + assert port_id >= 0, f"Invalid port ID: {port_id}" + ipv4_dst = rt_entry[IPV4_DST] + assert chk_address_ipv4(ipv4_dst), f"Invalid destination IPv4 address {ipv4_dst}" + ipv4_prefix_len = rt_entry[IPV4_PREFIX_LEN] + assert chk_prefix_len_ipv4(ipv4_prefix_len), f"Invalid IPv4 address prefix length {ipv4_prefix_len}" + mac_src = rt_entry[MAC_SRC] + assert chk_address_mac(mac_src), f"Invalid source MAC address {mac_src}" + mac_dst = rt_entry[MAC_DST] + assert chk_address_mac(mac_dst), f"Invalid destination MAC address {mac_dst}" + + # Retrieve entry from the port map + switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) + + # Add routing entry + switch_port_entry[ROUTING_LIST].append( + { + PORT_ID: port_id, + IPV4_DST: ipv4_dst, + IPV4_PREFIX_LEN: ipv4_prefix_len, + MAC_SRC: mac_src, + MAC_DST: mac_dst + } + ) + + # UPF + upf = sw_info[UPF] + + self.__upf[UPLINK_PORT] = upf[UPLINK_PORT] + assert self.__upf[UPLINK_PORT] >= 0, f"Invalid uplink UPF port: {self.__upf[UPLINK_PORT]}" + + self.__upf[UPLINK_IP] = upf[UPLINK_IP] + assert chk_address_ipv4(self.__upf[UPLINK_IP]), f"Invalid uplink UPF IPv4 address {self.__upf[UPLINK_IP]}" + + self.__upf[UPLINK_MAC] = upf[UPLINK_MAC] + assert chk_address_mac(self.__upf[UPLINK_MAC]), f"Invalid uplink UPF MAC address {self.__upf[UPLINK_MAC]}" + + self.__upf[DOWNLINK_PORT] = upf[DOWNLINK_PORT] + assert self.__upf[DOWNLINK_PORT] >= 0, f"Invalid downlink UPF port: {self.__upf[DOWNLINK_PORT]}" + + self.__upf[DOWNLINK_IP] = upf[DOWNLINK_IP] + assert chk_address_ipv4(self.__upf[DOWNLINK_IP]), f"Invalid downlink UPF IPv4 address {self.__upf[DOWNLINK_IP]}" + + self.__upf[DOWNLINK_MAC] = upf[DOWNLINK_MAC] + assert chk_address_mac(self.__upf[DOWNLINK_MAC]), f"Invalid downlink UPF MAC address {self.__upf[DOWNLINK_MAC]}" + + slice_id = upf[SLICE_ID] + assert slice_id >= 0, "Slice ID must be a non-negative integer" + self.__upf[SLICE_ID] = slice_id + + teid = upf[TEID] + assert teid >= 0, "TEID must be a non-negative integer" + self.__upf[TEID] = teid + + app_id = upf[APP_ID] + assert app_id >= 0, "App ID must be a non-negative integer" + self.__upf[APP_ID] = app_id + + app_meter_id = upf[APP_METER_ID] + assert app_meter_id >= 0, "App meter ID must be a non-negative integer" + self.__upf[APP_METER_ID] = app_meter_id + + ctr_id = upf[CTR_ID] + assert ctr_id >= 0, "Ctr ID must be a non-negative integer" + self.__upf[CTR_ID] = ctr_id + + tc_id = upf[TC_ID] + assert tc_id >= 0, "TC ID must be a non-negative integer" + self.__upf[TC_ID] = tc_id + + tunnel_peer_id = upf[TUNNEL_PEER_ID] + assert tunnel_peer_id >= 0, "Tunnel peer ID must be a non-negative integer" + self.__upf[TUNNEL_PEER_ID] = tunnel_peer_id + + # gNB configuration + gnb = sw_info[GNB] + self.__gnb[IP] = gnb[IP] + assert chk_address_ipv4(self.__gnb[IP]), f"Invalid 5G gNB IPv4 address {self.__gnb[IP]}" + + self.__gnb[MAC] = gnb[MAC] + assert chk_address_mac(self.__gnb[MAC]), f"Invalid 5G gNB MAC address {self.__gnb[MAC]}" + + # UE list + ue_list = sw_info[UE_LIST] + assert isinstance(ue_list, list), f"Switch {switch_name} UE list must be a list" + for ue in ue_list: + ue_id = ue[UE_ID] + assert ue_id, f"Empty UE ID: {UE_ID}" + ue_ip = ue[UE_IP] + assert chk_address_ipv4(ue_ip), "Invalid UE IPv4 address" + self.__ue_map[ue_ip] = {} + self.__ue_map[ue_ip][UE_ID] = ue_id + self.__ue_map[ue_ip][UE_IP] = ue_ip + + # PDU list per UE + self.__ue_map[ue_ip][PDU_LIST] = [] + pdu_session_list = ue[PDU_LIST] + assert isinstance(pdu_session_list, list), f"UE {ue_id} PDU session list must be a list" + for pdu in pdu_session_list: + pdu_id = pdu[PDU_SESSION_ID] + assert pdu_id >= 0, "PDU ID must be a non-negative integer" + assert pdu_id == DEF_SESSION_METER_ID, "Better use PDU session ID = 0, as only this is supported for now" + dnn = pdu[DNN] + assert dnn, "Data network name is invalid" + session_type_str = pdu[PDU_SESSION_TYPE] + assert session_type_str == ETHER_TYPE_IPV4, f"Only supported PDU session type for now is {ETHER_TYPE_IPV4}" + gtpu_tunnel = pdu[GTPU_TUNNEL] + assert isinstance(gtpu_tunnel, dict), "GTP-U tunnel info must be a map with uplink and downlink items)" + + gtpu_ul = gtpu_tunnel[UPLINK] + assert isinstance(gtpu_ul, dict), "GTP-U tunnel UL info must be a map with src and dst IP items)" + assert chk_address_ipv4(gtpu_ul[SRC]), f"Invalid GTP-U UL src IPv4 address {gtpu_ul[SRC]}" + assert chk_address_ipv4(gtpu_ul[DST]), f"Invalid GTP-U UL dst IPv4 address {gtpu_ul[DST]}" + + gtpu_dl = gtpu_tunnel[DOWNLINK] + assert isinstance(gtpu_dl, dict), "GTP-U tunnel DL info must be a map with src and dst IP items)" + assert chk_address_ipv4(gtpu_dl[SRC]), f"Invalid GTP-U DL src IPv4 address {gtpu_dl[SRC]}" + assert chk_address_ipv4(gtpu_dl[DST]), f"Invalid GTP-U DL dst IPv4 address {gtpu_dl[DST]}" + + self.__ue_map[ue_ip][PDU_LIST].append(pdu) + + # QoS flows per UE + self.__ue_map[ue_ip][QOS_FLOWS] = [] + qos_flows_list = ue[QOS_FLOWS] + assert isinstance(qos_flows_list, list), f"UE {ue_id} QoS flows' list must be a list" + for flow in qos_flows_list: + qfi = flow[QFI] + assert qfi >= 0, "QFI must be a non-negative integer" + fiveqi = flow[FIVEQI] + assert fiveqi >= 0, "5QI must be a non-negative integer" + qos_type = flow[QOS_TYPE] + assert qos_type.casefold() in (s.casefold() for s in QOS_TYPES_STR_VALID), \ + f"UE {ue_id} - Valid QoS types are: {','.join(QOS_TYPES_STR_VALID)}" + self.__ue_map[ue_ip][QOS_FLOWS].append(flow) + + self.__switch_info[switch_name] = sw_info + + def _print_settings(self): + LOGGER.info(f"--------------- {self.__service.name} settings ---------------") + LOGGER.info("--- Topology info") + for switch_name, switch_info in self.__switch_info.items(): + LOGGER.info(f"\t Device {switch_name}") + LOGGER.info(f"\t\t| Target P4 architecture: {switch_info[ARCH]}") + LOGGER.info(f"\t\t| Data plane ID: {switch_info[DPID]}") + LOGGER.info("\t\t| 5G UPF Configuration:") + LOGGER.info(f"\t\t\t| Uplink Port: {self.__upf[UPLINK_PORT]}") + LOGGER.info(f"\t\t\t| Uplink IP: {self.__upf[UPLINK_IP]}") + LOGGER.info(f"\t\t\t| Uplink MAC: {self.__upf[UPLINK_MAC]}") + LOGGER.info(f"\t\t\t| Downlink Port: {self.__upf[DOWNLINK_PORT]}") + LOGGER.info(f"\t\t\t| Downlink IP: {self.__upf[DOWNLINK_IP]}") + LOGGER.info(f"\t\t\t| Downlink MAC: {self.__upf[DOWNLINK_MAC]}") + LOGGER.info(f"\t\t\t| Slice ID: {self.__upf[SLICE_ID]}") + LOGGER.info(f"\t\t\t| Tunnel Endpoint ID: {self.__upf[TEID]}") + LOGGER.info(f"\t\t\t| App ID: {self.__upf[APP_ID]}") + LOGGER.info(f"\t\t\t| App Meter ID: {self.__upf[APP_METER_ID]}") + LOGGER.info(f"\t\t\t| Ctr ID: {self.__upf[CTR_ID]}") + LOGGER.info(f"\t\t\t| TC ID: {self.__upf[TC_ID]}") + LOGGER.info(f"\t\t\t| Tunnel Peer ID: {self.__upf[TUNNEL_PEER_ID]}\n") + # LOGGER.info("\n") + LOGGER.info("\t\t| 5G gNB Configuration:") + LOGGER.info(f"\t\t\t| 5G gNB IP: {self.__gnb[IP]}") + LOGGER.info(f"\t\t\t| 5G gNB MAC: {self.__gnb[MAC]}\n") + LOGGER.info("\t\t| Port Map:") + for _, port_map in self.__port_map[switch_name].items(): + LOGGER.info(f"\t\t\t| Port ID: {port_map[PORT_ID]}") + LOGGER.info(f"\t\t\t| Port type: {port_map[PORT_TYPE]}") + LOGGER.info(f"\t\t\t| Port VLAN ID: {port_map[VLAN_ID]}") + LOGGER.info(f"\t\t\t| FWD list: {port_map[FORWARDING_LIST]}") + LOGGER.info(f"\t\t\t| Routing list: {port_map[ROUTING_LIST]}\n") + LOGGER.info("\t\t| UE List:") + for ue_key, ue_info in self.__ue_map.items(): + assert ue_key == ue_info[UE_IP], "UE key is not the UE IPv4 address" + ue_ip = ue_info[UE_IP] + LOGGER.info(f"\t\t\t| UE ID: {ue_info[UE_ID]}") + LOGGER.info(f"\t\t\t| UE IP: {ue_info[UE_IP]}") + for pdu in self.__ue_map[ue_ip][PDU_LIST]: + LOGGER.info(f"\t\t\t\t| PDU session ID: {pdu[PDU_SESSION_ID]}") + LOGGER.info(f"\t\t\t\t| DNN: {pdu[DNN]}") + LOGGER.info(f"\t\t\t\t| PDU session type: {pdu[PDU_SESSION_TYPE]}") + LOGGER.info(f"\t\t\t\t| GTP-U tunnel UL Src. IP: {pdu[GTPU_TUNNEL][UPLINK][SRC]}") + LOGGER.info(f"\t\t\t\t| GTP-U tunnel UL Dst. IP: {pdu[GTPU_TUNNEL][UPLINK][DST]}") + LOGGER.info(f"\t\t\t\t| GTP-U tunnel DL Src. IP: {pdu[GTPU_TUNNEL][DOWNLINK][SRC]}") + LOGGER.info(f"\t\t\t\t| GTP-U tunnel DL Dst. IP: {pdu[GTPU_TUNNEL][DOWNLINK][DST]}\n") + for flow in self.__ue_map[ue_ip][QOS_FLOWS]: + LOGGER.info(f"\t\t\t\t| QoS QFI: {flow[QFI]}") + LOGGER.info(f"\t\t\t\t| QoS 5QI: {flow[FIVEQI]}") + LOGGER.info(f"\t\t\t\t| QoS Type: {flow[QOS_TYPE]}\n") + LOGGER.info("-------------------------------------------------------") + + def _get_switch_port_in_port_map(self, switch_name : str, port_id : int) -> Dict: + assert switch_name, "A valid switch name must be used as a key to the port map" + assert port_id > 0, "A valid switch port ID must be used as a key to a switch's port map" + switch_entry = self.__port_map[switch_name] + assert switch_entry, f"Switch {switch_name} does not exist in the port map" + port_key = PORT_PREFIX + str(port_id) + assert switch_entry[port_key], f"Port with ID {port_id} does not exist in the switch map" + + return switch_entry[port_key] + + def _get_port_type_of_switch_port(self, switch_name : str, port_id : int) -> str: + switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) + return switch_port_entry[PORT_TYPE] + + def _get_vlan_id_of_switch_port(self, switch_name : str, port_id : int) -> int: + switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) + return switch_port_entry[VLAN_ID] + + def _get_fwd_list_of_switch_port(self, switch_name : str, port_id : int) -> List [Tuple]: + switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) + return switch_port_entry[FORWARDING_LIST] + + def _get_routing_list_of_switch_port(self, switch_name : str, port_id : int) -> List [Tuple]: + switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) + return switch_port_entry[ROUTING_LIST] + + def _is_host_facing_port(self, switch_name : str, port_id : int) -> bool: + return self._get_port_type_of_switch_port(switch_name, port_id) == PORT_TYPE_HOST + + def _create_rules_uplink( + self, + device_obj : Device, # type: ignore + port_id : int, + next_id : int, + action : ConfigActionEnum): # type: ignore + dev_name = device_obj.name + vlan_id = self._get_vlan_id_of_switch_port(switch_name=dev_name, port_id=port_id) + + rules = [] + + # Port setup rules + try: + rules += rules_set_up_port( + port_id=port_id, + port_type=PORT_TYPE_HOST, + fwd_type=FORWARDING_TYPE_BRIDGING, + vlan_id=vlan_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating port setup rules") + raise Exception(ex) + + ### UPF rules + try: + rules += rules_set_up_upf_interface( + port_id=port_id, + ipv4_dst=self.__upf[UPLINK_IP], # UPF's N3 interface + ipv4_prefix_len=32, + gtpu_value=GTPU_VALID, + slice_id=self.__upf[SLICE_ID], + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating UPF interface rule") + raise Exception(ex) + + try: + rules += rules_set_up_upf_uplink_sessions( + port_id=port_id, + tun_ip_address=self.__upf[UPLINK_IP], # UPF's N3 interface + teid=self.__upf[TEID], + session_meter_id=DEF_SESSION_METER_ID, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating UPF UL session rule") + raise Exception(ex) + + # UE-specific rules + for _, ue_info in self.__ue_map.items(): + try: + rules += rules_set_up_upf_uplink_terminations( + port_id=port_id, + ue_session_id=ue_info[UE_IP], # UE's IPv4 address + app_id=self.__upf[APP_ID], + ctr_id=self.__upf[CTR_ID], + app_meter_id=self.__upf[APP_METER_ID], + tc_id=self.__upf[TC_ID], + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating UPF termination rule") + raise Exception(ex) + + # L2 Forwarding rules + fwd_list = self._get_fwd_list_of_switch_port(switch_name=dev_name, port_id=next_id) + for host_map in fwd_list: + mac_dst = host_map[HOST_MAC] + label = host_map[HOST_LABEL] + LOGGER.info(f"\t | Switch {dev_name} - Port {port_id} - Creating rule for host MAC: {mac_dst} - label: {label}") + try: + ### Bridging rules + rules += rules_set_up_fwd_bridging( + port_id=port_id, + vlan_id=vlan_id, + eth_dst=mac_dst, + next_id=next_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating bridging rule") + raise Exception(ex) + + try: + ### Pre-next VLAN rule + rules += rules_set_up_pre_next_vlan( + port_id=port_id, + next_id=next_id, + vlan_id=vlan_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating pre-next VLAN rule") + raise Exception(ex) + + ### Static routing rules + routing_list = self._get_routing_list_of_switch_port(switch_name=dev_name, port_id=port_id) + for rt_entry in routing_list: + LOGGER.info(f"\t | Switch {dev_name} - Port {port_id} - Route to dst {rt_entry[IPV4_DST]}/{rt_entry[IPV4_PREFIX_LEN]}, with MAC src {rt_entry[MAC_SRC]} and dst {rt_entry[MAC_DST]}") + + try: + ### Next profile for hashed routing + rules += rules_set_up_next_profile_hashed_routing( + port_id=port_id, + next_id=next_id, + eth_src=rt_entry[MAC_SRC], # UPF's N6 interface (self.__upf[DOWNLINK_MAC]) + eth_dst=rt_entry[MAC_DST], # Data network's N6 interface + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating next profile for hashed routing") + raise Exception(ex) + + try: + ### Next hashed for routing + rules += rules_set_up_next_hashed( + port_id=port_id, + next_id=next_id, + action=action + ) + ### Route towards destination + rules += rules_set_up_routing( + port_id=port_id, + ipv4_dst=rt_entry[IPV4_DST], + ipv4_prefix_len=rt_entry[IPV4_PREFIX_LEN], + next_id=next_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating static L3 routing rules") + raise Exception(ex) + + return rules + + def _create_rules_downlink( + self, + device_obj : Device, # type: ignore + port_id : int, + next_id : int, + action : ConfigActionEnum): # type: ignore + dev_name = device_obj.name + vlan_id = self._get_vlan_id_of_switch_port(switch_name=dev_name, port_id=port_id) + + rules = [] + + # Port setup + try: + rules += rules_set_up_port( + port_id=port_id, + port_type=PORT_TYPE_HOST, + fwd_type=FORWARDING_TYPE_BRIDGING, + vlan_id=vlan_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating port setup rules") + raise Exception(ex) + + ### UPF + for _, ue_info in self.__ue_map.items(): + try: + rules += rules_set_up_upf_interface( + port_id=port_id, + ipv4_dst=ue_info[UE_IP], + ipv4_prefix_len=32, + gtpu_value=GTPU_INVALID, + slice_id=self.__upf[SLICE_ID], + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating UPF interface rule") + raise Exception(ex) + + try: + rules += rules_set_up_upf_downlink_sessions( + port_id=port_id, + ipv4_dst=ue_info[UE_IP], + session_meter_id=ue_info[PDU_LIST][0][PDU_SESSION_ID], # Should match DEF_SESSION_METER_ID + tun_peer_id=self.__upf[TUNNEL_PEER_ID], + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating UPF DL session rule") + raise Exception(ex) + + try: + rules += rules_set_up_upf_downlink_terminations( + port_id=port_id, + ue_session_id=ue_info[UE_IP], # UE's IPv4 address + app_id=self.__upf[APP_ID], + ctr_id=self.__upf[CTR_ID], + app_meter_id=self.__upf[APP_METER_ID], + tc_id=self.__upf[TC_ID], + teid=self.__upf[TEID], + qfi=ue_info[QOS_FLOWS][0][QFI], + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating UPF DL termination rule") + raise Exception(ex) + + try: + rules += rules_set_up_upf_downlink_ig_tunnel_peers( + port_id=port_id, + tun_peer_id=self.__upf[TUNNEL_PEER_ID], + tun_dst_addr=self.__upf[UPLINK_IP], # UPF's N3 interface + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating UPF DL ingress tunnel peers rule") + raise Exception(ex) + + try: + rules += rules_set_up_upf_downlink_eg_tunnel_peers( + port_id=port_id, + tun_peer_id=self.__upf[TUNNEL_PEER_ID], + tun_src_addr=self.__upf[UPLINK_IP], # UPF's N3 interface + tun_dst_addr=self.__gnb[IP], # gNB's N3 interface + tun_src_port=GTP_PORT, # GTP-U port + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating UPF DL egress tunnel peers rule") + raise Exception(ex) + + # L2 Forwarding + fwd_list = self._get_fwd_list_of_switch_port(switch_name=dev_name, port_id=next_id) + for host_map in fwd_list: + mac_dst = host_map[HOST_MAC] + label = host_map[HOST_LABEL] + LOGGER.info(f"\t | Switch {dev_name} - Port {port_id} - Creating rule for host MAC: {mac_dst} - label: {label}") + try: + ### Bridging + rules += rules_set_up_fwd_bridging( + port_id=port_id, + vlan_id=vlan_id, + eth_dst=mac_dst, + next_id=next_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating bridging rule") + raise Exception(ex) + + try: + ### Pre-next VLAN + rules += rules_set_up_pre_next_vlan( + port_id=port_id, + next_id=next_id, + vlan_id=vlan_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating pre-next VLAN rule") + raise Exception(ex) + + ### Static routing + routing_list = self._get_routing_list_of_switch_port(switch_name=dev_name, port_id=port_id) + for rt_entry in routing_list: + LOGGER.info(f"\t | Switch {dev_name} - Port {port_id} - Route to dst {rt_entry[IPV4_DST]}/{rt_entry[IPV4_PREFIX_LEN]}, with MAC src {rt_entry[MAC_SRC]} and dst {rt_entry[MAC_DST]}") + + try: + ### Next profile for hashed routing + rules += rules_set_up_next_profile_hashed_routing( + port_id=port_id, + next_id=next_id, + eth_src=rt_entry[MAC_SRC], # UPF's N3 interface (self.__upf[UPLINK_MAC]) + eth_dst=rt_entry[MAC_DST], # gNB's N3 interface (self.__gnb[MAC]) + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating next profile for hashed routing") + raise Exception(ex) + + try: + ### Next hashed for routing + rules += rules_set_up_next_hashed( + port_id=port_id, + next_id=next_id, + action=action + ) + ### Route towards destination + rules += rules_set_up_routing( + port_id=port_id, + ipv4_dst=rt_entry[IPV4_DST], + ipv4_prefix_len=rt_entry[IPV4_PREFIX_LEN], + next_id=next_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating static L3 routing rules") + raise Exception(ex) + + return rules + diff --git a/src/service/service/service_handlers/tapi_lsp/ConfigRules.py b/src/service/service/service_handlers/tapi_lsp/ConfigRules.py index e78379834672456c4fc9c992f4b41c793a3ca05e..d5b4431f9853423a2aad247b91d3f3baac3e7871 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 f2e1b1de1b690fc4a80f835e4ab79a3cbbc2a3e5..31a526fb62af726daea2ec7cea667ac4b9118ea7 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 6242c89c7fa17bc5b6cc44328d8ce58438721d45..7363515f07a52d996229bcbd72932ce1423258d7 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/service/task_scheduler/TaskExecutor.py b/src/service/service/task_scheduler/TaskExecutor.py index 2855a9170627765234755596c6c30553ee6fef3f..a46be6414396bc8b997a93d01926d49fb6707bb7 100644 --- a/src/service/service/task_scheduler/TaskExecutor.py +++ b/src/service/service/task_scheduler/TaskExecutor.py @@ -67,7 +67,7 @@ CONTROLLER_DEVICE_TYPES = { EXPANSION_CONTROLLER_DEVICE_TYPES = { DeviceTypeEnum.IETF_SLICE, DeviceTypeEnum.NCE, - DeviceTypeEnum.OPENFLOW_RYU_CONTROLLER, + #DeviceTypeEnum.OPENFLOW_RYU_CONTROLLER, } class TaskExecutor: @@ -334,7 +334,14 @@ class TaskExecutor: #controllers.setdefault(device_type, dict())[controller.device_id.device_uuid.uuid] = controller devices.setdefault(device_type, dict())[controller.device_id.device_uuid.uuid] = controller - LOGGER.debug('[get_devices_from_connection] devices = {:s}'.format(str(devices))) + plain_devices = { + device_type : { + device_uuid : grpc_message_to_json_string(device_grpc) + for device_uuid, device_grpc in device_dict.items() + } + for device_type, device_dict in devices.items() + } + LOGGER.debug('[get_devices_from_connection] devices = {:s}'.format(str(plain_devices))) #LOGGER.debug('[get_devices_from_connection] controllers = {:s}'.format(str(controllers))) #if len(devices) == 0 and len(controllers) > 0: # return controllers @@ -376,7 +383,17 @@ class TaskExecutor: controller_uuid = controller.device_id.device_uuid.uuid devices.setdefault(device_type, dict())[controller_uuid] = (controller, controller_drivers) - LOGGER.debug('[get_devices_from_connection] devices = {:s}'.format(str(devices))) + plain_devices = { + device_type : { + device_uuid : { + 'grpc_object' : grpc_message_to_json_string(device_grpc), + 'device_drivers' : list(device_drivers) + } + for device_uuid, (device_grpc, device_drivers) in device_dict.items() + } + for device_type, device_dict in devices.items() + } + LOGGER.debug('[get_device_type_drivers_for_connection] devices = {:s}'.format(str(plain_devices))) return devices diff --git a/src/service/service/task_scheduler/TaskScheduler.py b/src/service/service/task_scheduler/TaskScheduler.py index c9eaff31c886dcd3f1678096df15f21dcd77bb29..a9a1a20e7a99c4850bcb4a828e2869f363c7a0ff 100644 --- a/src/service/service/task_scheduler/TaskScheduler.py +++ b/src/service/service/task_scheduler/TaskScheduler.py @@ -307,9 +307,8 @@ class TasksScheduler: else : has_optical_band = True return (has_media_channel, has_optical_band) - - - + + def compose_from_opticalcontroller_reply( self, pathcomp_reply : PathCompReply, is_delete : bool = False ) -> None: @@ -322,50 +321,48 @@ class TasksScheduler: has_optical_band = None for service in pathcomp_reply.services: + connections = self._context_client.ListConnections(service.service_id) + has_media_channel, has_optical_band = self.check_service_for_media_channel( + connections=connections, item=service.service_id + ) + + include_service( + service.service_id, has_media_channel=has_media_channel, + has_optical_band=has_optical_band + ) + self._add_service_to_executor_cache(service) - connections = self._context_client.ListConnections(service.service_id) - has_media_channel, has_optical_band = self.check_service_for_media_channel( - connections=connections, item=service.service_id - ) - - - include_service(service.service_id , has_media_channel=has_media_channel, has_optical_band=has_optical_band) - self._add_service_to_executor_cache(service) - - for connection in connections.connections: - self._add_connection_to_executor_cache(connection) - - + for connection in connections.connections: + self._add_connection_to_executor_cache(connection) for connection in pathcomp_reply.connections: - - connection_key = include_connection( - connection.connection_id, connection.service_id, has_media_channel=has_media_channel, - has_optical_band=has_optical_band - ) - self._add_connection_to_executor_cache(connection) + connection_key = include_connection( + connection.connection_id, connection.service_id, + has_media_channel=has_media_channel, + has_optical_band=has_optical_band + ) + self._add_connection_to_executor_cache(connection) - self._executor.get_service(connection.service_id) - for sub_service_id in connection.sub_service_ids: - _,service_key_done = include_service( - sub_service_id, has_media_channel=has_media_channel, - has_optical_band=has_optical_band - ) - self._executor.get_service(sub_service_id) - self._dag.add(connection_key, service_key_done) + self._executor.get_service(connection.service_id) + for sub_service_id in connection.sub_service_ids: + _,service_key_done = include_service( + sub_service_id, has_media_channel=has_media_channel, + has_optical_band=has_optical_band + ) + self._executor.get_service(sub_service_id) + self._dag.add(connection_key, service_key_done) t1 = time.time() LOGGER.debug('[compose_from_service] elapsed_time: {:f} sec'.format(t1-t0)) - - - + + def compose_from_service_expansion( self, service :Service, ) -> None: t0 = time.time() include_service = self._optical_service_create include_connection = self._optical_connection_configure - + logging.debug(f"after setting the config {service}") #pending_items_to_explore.put(service) has_media_channel = None @@ -373,17 +370,16 @@ class TasksScheduler: if service is None : raise NotFoundException('Service', service, extra_details=[ 'service not found ' ]) - - - + connections = self._context_client.ListConnections(service.service_id) has_media_channel, has_optical_band = self.check_service_for_media_channel( connections=connections, item=service.service_id ) - - _,service_key_done= include_service(service.service_id , - has_media_channel=has_media_channel, - has_optical_band=has_optical_band) + + _,service_key_done= include_service( + service.service_id, has_media_channel=has_media_channel, + has_optical_band=has_optical_band + ) # self._add_service_to_executor_cache(service) service_updating_key = self._add_task_if_not_exists(Task_ServiceSetStatus( self._executor, service.service_id, ServiceStatusEnum.SERVICESTATUS_UPDATING @@ -391,7 +387,8 @@ class TasksScheduler: self._add_service_to_executor_cache(service) for connection in connections.connections: connection_key = include_connection( - connection.connection_id, connection.service_id, has_media_channel=has_media_channel, + connection.connection_id, connection.service_id, + has_media_channel=has_media_channel, has_optical_band=has_optical_band ) self._add_connection_to_executor_cache(connection) @@ -399,7 +396,9 @@ class TasksScheduler: t1 = time.time() LOGGER.debug('[compose_from_service] elapsed_time: {:f} sec'.format(t1-t0)) - def compose_from_optical_service(self, service : Service, params:dict, is_delete : bool = False) -> None: + def compose_from_optical_service( + self, service : Service, params:dict, is_delete : bool = False + ) -> None: t0 = time.time() include_service = self._optical_service_remove if is_delete else self._service_create include_connection = self._optical_connection_deconfigure if is_delete else self._connection_configure @@ -408,127 +407,118 @@ class TasksScheduler: explored_items = set() pending_items_to_explore = queue.Queue() pending_items_to_explore.put(service) - has_media_channel=None - has_optical_band=None - reply=None - code=0 - reply_not_allowed="DELETE_NOT_ALLOWED" + has_media_channel = None + has_optical_band = None + reply = None + code = 0 + reply_not_allowed = "DELETE_NOT_ALLOWED" while not pending_items_to_explore.empty(): try: item = pending_items_to_explore.get(block=False) - except queue.Empty: break - + if isinstance(item, Service): - str_item_key = grpc_message_to_json_string(item.service_id) if str_item_key in explored_items: continue connections = self._context_client.ListConnections(item.service_id) - has_media_channel,has_optical_band=self.check_service_for_media_channel(connections=connections,item=item.service_id) - oc_type = 1 + has_media_channel, has_optical_band = self.check_service_for_media_channel( + connections=connections, item=item.service_id + ) + oc_type = 1 if len(service.service_config.config_rules) > 0: for constraint in service.service_constraints: if "type" in constraint.custom.constraint_type: oc_type = OpticalServiceType(str(constraint.custom.constraint_value)) - if oc_type == 2 : - reply,code = delete_lightpath( - params['src'] - , params ['dst'] - , params['bitrate'] - , flow_id= params['flow_id'] - ) - else : - reply,code = DelFlexLightpath( - params['src'] - , params ['dst'] - , params['bitrate'] - , params['ob_id'] - , flow_id=params['flow_id'] - ) + if oc_type == 2: + reply, code = delete_lightpath( + params['src'], params ['dst'], params['bitrate'], + flow_id= params['flow_id'] + ) + else: + reply, code = DelFlexLightpath( + params['src'], params ['dst'], params['bitrate'], + params['ob_id'], flow_id=params['flow_id'] + ) if code == 400 and reply_not_allowed in reply : MSG = 'Deleteion for the service is not Allowed , Served Lightpaths is not empty' raise Exception(MSG) - include_service(item.service_id,has_media_channel=has_media_channel,has_optical_band=has_optical_band) + include_service( + item.service_id, has_media_channel=has_media_channel, + has_optical_band=has_optical_band + ) self._add_service_to_executor_cache(item) - - + for connection in connections.connections: - self._add_connection_to_executor_cache(connection) - pending_items_to_explore.put(connection) + self._add_connection_to_executor_cache(connection) + pending_items_to_explore.put(connection) explored_items.add(str_item_key) - elif isinstance(item, ServiceId): - - if code == 400 and reply_not_allowed in reply:break - + if code == 400 and reply_not_allowed in reply: break + str_item_key = grpc_message_to_json_string(item) if str_item_key in explored_items: continue connections = self._context_client.ListConnections(item) - has_media_channel,has_optical_band=self.check_service_for_media_channel(connections=connections,item=item) + has_media_channel, has_optical_band = self.check_service_for_media_channel( + connections=connections, item=item + ) + + include_service( + item, has_media_channel=has_media_channel, + has_optical_band=has_optical_band + ) - - include_service(item,has_media_channel=has_media_channel,has_optical_band=has_optical_band) - - self._executor.get_service(item) - + for connection in connections.connections: - self._add_connection_to_executor_cache(connection) pending_items_to_explore.put(connection) - + explored_items.add(str_item_key) elif isinstance(item, Connection): if code == 400 and reply_not_allowed in reply:break str_item_key = grpc_message_to_json_string(item.connection_id) if str_item_key in explored_items: continue - - - connection_key = include_connection( item.connection_id - , item.service_id - , has_media_channel=has_media_channel - , has_optical_band=has_optical_band ) + + connection_key = include_connection( + item.connection_id, item.service_id, has_media_channel=has_media_channel, + has_optical_band=has_optical_band + ) self._add_connection_to_executor_cache(connection) - + if include_service_config is not None : - connections_list = ConnectionList() - connections_list.connections.append(item) - - is_media_channel,_=self.check_service_for_media_channel(connections=connections_list,item=service) - - if has_optical_band and is_media_channel: - include_service_config(item.connection_id - , item.service_id ) - + connections_list = ConnectionList() + connections_list.connections.append(item) + + is_media_channel,_=self.check_service_for_media_channel( + connections=connections_list,item=service + ) + + if has_optical_band and is_media_channel: + include_service_config(item.connection_id, item.service_id) self._executor.get_service(item.service_id) pending_items_to_explore.put(item.service_id) - - + for sub_service_id in item.sub_service_ids: - _,service_key_done = include_service(sub_service_id - ,has_media_channel=has_media_channel - ,has_optical_band=has_optical_band) + _,service_key_done = include_service( + sub_service_id, has_media_channel=has_media_channel, + has_optical_band=has_optical_band + ) self._executor.get_service(sub_service_id) self._dag.add(service_key_done, connection_key) pending_items_to_explore.put(sub_service_id) - - explored_items.add(str_item_key) - - else: MSG = 'Unsupported item {:s}({:s})' raise Exception(MSG.format(type(item).__name__, grpc_message_to_json_string(item))) - - t1 = time.time() - LOGGER.debug('[compose_from_service] elapsed_time: {:f} sec'.format(t1-t0)) + t1 = time.time() + LOGGER.debug('[compose_from_optical_service] elapsed_time: {:f} sec'.format(t1-t0)) def compose_from_service(self, service : Service, is_delete : bool = False) -> None: @@ -641,13 +631,12 @@ class TasksScheduler: self._dag.add(service_active_key, new_connection_configure_key) t1 = time.time() - LOGGER.debug('[RRERRSF] elapsed_time: {:f} sec'.format(t1-t0)) + LOGGER.debug('[compose_optical_service_update] elapsed_time: {:f} sec'.format(t1-t0)) def compose_optical_service_update1( self, service : Service, old_connection : Connection, new_connection : Connection ) -> None: - LOGGER.debug('[ttttttttttt] elapsed_time inside update1') t0 = time.time() self._add_service_to_executor_cache(service) @@ -686,7 +675,7 @@ class TasksScheduler: self._dag.add(service_active_key, new_connection_configure_key) t1 = time.time() - LOGGER.debug('[RRERRSF] elapsed_time: {:f} sec'.format(t1-t0)) + LOGGER.debug('[compose_optical_service_update1] elapsed_time: {:f} sec'.format(t1-t0)) def compose_service_connection_update( @@ -743,7 +732,7 @@ class TasksScheduler: task = self._tasks.get(task_key) succeeded = True if dry_run else task.execute() results.append(succeeded) - LOGGER.debug('[execute_allRRRR] finished task {:s} ; succeeded={:s}'.format(str_task_name, str(succeeded))) + LOGGER.debug('[execute_all] finished task {:s} ; succeeded={:s}'.format(str_task_name, str(succeeded))) LOGGER.debug('[execute_all] results={:s}'.format(str(results))) return zip(ordered_task_keys, results) diff --git a/src/service/tests/qkd/Fixtures.py b/src/service/tests/qkd/Fixtures.py new file mode 100644 index 0000000000000000000000000000000000000000..507c13b484e2951da1a4483a37e1b638b3e12cf6 --- /dev/null +++ b/src/service/tests/qkd/Fixtures.py @@ -0,0 +1,31 @@ +# Copyright 2022-2026 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 context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient + + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() diff --git a/src/service/tests/qkd/__init__.py b/src/service/tests/qkd/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..b53987a4eae1aed245eba5c7ddd8cd10e35919c2 --- /dev/null +++ b/src/service/tests/qkd/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2026 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/service/tests/qkd/test_functional_bootstrap.py b/src/service/tests/qkd/test_functional_bootstrap.py index daf35f0de5c56697f0380d1f32056a918bcba691..e82e0d79a94884ee1d2b1b1e3f24f1ce45970809 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. @@ -12,14 +12,22 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, os, time, json, socket, re +import json, logging, os, re, socket, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -149,4 +157,4 @@ def test_qkd_devices_enabled( # Final check to ensure all devices are enabled print(f"Final device status: {num_devices_enabled}/{num_devices} devices enabled.") assert num_devices_enabled == num_devices - print("QKD devices enabled test completed.") \ No newline at end of file + print("QKD devices enabled test completed.") diff --git a/src/telemetry/backend/Config.py b/src/telemetry/backend/Config.py index 73c37610dcc7ba6e76760b567f699a8be575b3e3..02f864a105348b5132f2203a898fe2cdeb08e9b8 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 1b047834cbe7a9586dc1c6f1c4b181db4a06b9c0..b4f8523e6fd0b7f05c6b97f0f3822bf7a98d3f7e 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 317de8cf600b387340dfe72788c63334b5c2ba50..2a15a75de6594db3cd602d738973fd77ef7ff527 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/HelperMethods.py b/src/telemetry/backend/service/HelperMethods.py index 5ba57dc7b8e1c92b3613af30ab9f439e65b10e62..313dbba86eb5e2742039374aa8957808b20267d2 100644 --- a/src/telemetry/backend/service/HelperMethods.py +++ b/src/telemetry/backend/service/HelperMethods.py @@ -17,15 +17,20 @@ import logging from typing import Optional from .collector_api._Collector import _Collector from .collector_api.DriverInstanceCache import get_driver +from .collectors.int_collector.INTCollector import INTCollector 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 +from telemetry.backend.service.collectors.gnmi_oc.KPI import KPI + +from .collectors.gnmi_oc.GnmiOpenConfigCollector import GNMIOpenConfigCollector LOGGER = logging.getLogger(__name__) def get_subscription_parameters( - kpi_id : str, kpi_manager_client, context_client, duration, interval - ) -> Optional[list[tuple]]: + kpi_id : str, kpi_manager_client, context_client, resource, duration, interval + ) -> Optional[List[Tuple]]: """ Method to get subscription parameters based on KPI ID. Returns a list of tuples with subscription parameters. @@ -42,9 +47,9 @@ def get_subscription_parameters( - A KPI Descriptor must be added in KPI DB with correct device_id. - The device must be available in the context. """ - kpi_id_obj = KpiId() + kpi_id_obj = KpiId() kpi_id_obj.kpi_id.uuid = kpi_id # pyright: ignore[reportAttributeAccessIssue] - kpi_descriptor = kpi_manager_client.GetKpiDescriptor(kpi_id_obj) + kpi_descriptor = kpi_manager_client.GetKpiDescriptor(kpi_id_obj) if not kpi_descriptor: LOGGER.warning(f"KPI ID: {kpi_id} - Descriptor not found. Skipping...") return None @@ -61,19 +66,18 @@ def get_subscription_parameters( raise Exception(f"KPI ID: {kpi_id} - Device not found for KPI descriptor.") #TODO: Change to TFS NotFoundException endpoints = device.device_endpoints - # LOGGER.info(f"Device for KPI ID: {kpi_id} - {endpoints}") - # LOGGER.info(f"--------------------") + LOGGER.debug(f"Device for KPI ID: {kpi_id} - {endpoints}") endpointsIds = [endpoint_id.endpoint_id for endpoint_id in endpoints] - # for endpoint_id in endpoints: - # LOGGER.info(f"Endpoint UUID: {endpoint_id.endpoint_id}") + for endpoint_id in endpoints: + LOGGER.debug(f"Endpoint UUID: {endpoint_id.endpoint_id}") # Getting endpoint names device_names, endpoint_data = get_endpoint_names( context_client = context_client, endpoint_ids = endpointsIds ) - # LOGGER.info(f"Device names: {device_names}") - # LOGGER.info(f"Endpoint data: {endpoint_data}") + LOGGER.debug(f"Device names: {device_names}") + LOGGER.debug(f"Endpoint data: {endpoint_data}") subscriptions = [] sub_id = None @@ -86,7 +90,7 @@ def get_subscription_parameters( { "kpi" : kpi_sample_type, # As request is based on the single KPI so it should have only one endpoint "endpoint" : endpoint_data[endpoint.endpoint_uuid.uuid][0], # Endpoint name - "resource" : 'interface', # Example resource type + "resource" : resource, # Example resource type is 'interface' or 'wavelength-router' for MG-ON, this should be defined in the KPI Descriptor or as part of the request }, float(duration), float(interval), @@ -94,7 +98,6 @@ def get_subscription_parameters( ) return subscriptions - def get_collector_by_kpi_id(kpi_id: str, kpi_manager_client, context_client, driver_instance_cache ) -> Optional[_Collector]: """ @@ -109,17 +112,17 @@ def get_collector_by_kpi_id(kpi_id: str, kpi_manager_client, context_client, dri LOGGER.info(f"Getting collector for KPI ID: {kpi_id}") kpi_id_obj = KpiId() kpi_id_obj.kpi_id.uuid = kpi_id # pyright: ignore[reportAttributeAccessIssue] - kpi_descriptor = kpi_manager_client.GetKpiDescriptor(kpi_id_obj) - # LOGGER.info(f"KPI Descriptor: {kpi_descriptor}") + kpi_descriptor = kpi_manager_client.GetKpiDescriptor(kpi_id_obj) if not kpi_descriptor: - raise Exception(f"KPI ID: {kpi_id} - Descriptor not found.") #TODO: Change to TFS NotFoundException + raise Exception(f"KPI ID: {kpi_id} - Descriptor not found.") - # device_uuid = kpi_descriptor.device_id.device_uuid.uuid - device = get_device( context_client = context_client, - device_uuid = kpi_descriptor.device_id.device_uuid.uuid, - include_config_rules = True, - include_components = False, - ) + device_uuid = kpi_descriptor.device_id.device_uuid.uuid + device = get_device( + context_client = context_client, + device_uuid = device_uuid, + include_config_rules = True, + include_components = False, + ) # Getting device collector (testing) collector : _Collector = get_driver(driver_instance_cache, device) # NOTE: driver_instance_cache is define in collector_api.DriverInstanceCache @@ -127,3 +130,87 @@ def get_collector_by_kpi_id(kpi_id: str, kpi_manager_client, context_client, dri raise Exception(f"KPI ID: {kpi_id} - Collector not found for device {device.device_uuid.uuid}.") #TODO: Change to TFS NotFoundException # LOGGER.info(f"Collector for KPI ID: {kpi_id} - {collector.__class__.__name__}") return collector + +def get_node_level_int_collector(collector_id: str, kpi_id: str, address: str, interface: str, port: int, + service_id: str, context_id: str) -> Optional[_Collector]: + """ + Method to instantiate an in-band network telemetry collector at a node level. + Such a collector binds to a physical/virtual interface of a node, expecting + packets from one or more switches. + Every packet contains multiple KPIs, therefore this collector is not bound to + a single KPI. + Returns: + - Collector instance if found, otherwise None. + Raises: + - Exception if the KPI ID is not found or the collector cannot be created. + """ + + LOGGER.debug(f"INT collector ID: {collector_id}") + LOGGER.debug(f"INT collector address: {address}") + LOGGER.debug(f"INT collector port: {port}") + LOGGER.debug(f"INT collector interface: {interface}") + LOGGER.debug(f"INT collector kpi_id: {kpi_id}") + LOGGER.debug(f"INT collector service_id: {service_id}") + LOGGER.debug(f"INT collector context_id: {context_id}") + # Initialize an INT collector + try: + collector : _Collector = INTCollector( + address=address, + port=port, + collector_id=collector_id, + interface=interface, + kpi_id=kpi_id, + service_id=service_id, + context_id=context_id + ) + except Exception as ex: + LOGGER.exception(f"Failed to create INT Collector object on node {address}, {interface}:{port}") + + connected = False + if not collector: + return None + LOGGER.info(f"Collector for KPI ID: {kpi_id} - {collector.__class__.__name__}") + + try: + connected = collector.Connect() + except Exception as ex: + LOGGER.exception(f"Failed to connect INT Collector on node {address}, {interface}:{port}") + + return collector if connected else None + + +def get_mgon_subscription_parameters(resource: str, endpoint: str, kpi: str, duration: int, interval: int) -> Optional[List[Tuple]]: + return [( + str(uuid.uuid4()), # "x123", + { + "kpi" : kpi, # sub_parameters['kpi'], + "endpoint" : endpoint, # sub_parameters['endpoint'], + "resource" : resource, #sub_parameters['resource'], + }, + duration, + interval, + ),] + + +def get_mgon_collector( + address: str, port: int, username: Optional[str], password: Optional[str], insecure: Optional[bool], + skip_verify: Optional[bool] + ) -> Optional[_Collector]: + + _collector = GNMIOpenConfigCollector( + address = address, + port = port, + username = username, + password = password, + insecure = insecure, + skip_verify = skip_verify, + ) + try: + connected = _collector.Connect() + if not connected: + LOGGER.error(f"Failed to connect to MG-ON collector at {address}:{port}") + return None + return _collector + except Exception as ex: + LOGGER.exception(f"Exception while connecting to MG-ON collector at {address}:{port}") + return None diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index 13badc3231fb1df3111d3089d07137164442e637..a7cd05e45c2eb8e6d26988d8535994490d149500 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -17,7 +17,7 @@ import time import logging import threading -from .HelperMethods import get_collector_by_kpi_id, get_subscription_parameters +from .HelperMethods import get_collector_by_kpi_id, get_subscription_parameters, get_node_level_int_collector, get_mgon_subscription_parameters, get_mgon_collector from common.Constants import ServiceNameEnum from common.Settings import get_service_port_grpc from confluent_kafka import Consumer as KafkaConsumer @@ -26,12 +26,8 @@ from confluent_kafka import Producer as KafkaProducer from datetime import datetime, timezone from typing import Any, Dict -from .collector_api._Collector import _Collector -from .collector_api.DriverInstanceCache import DriverInstanceCache, get_driver -from .collectors.emulated.EmulatedCollector import EmulatedCollector +from .collector_api.DriverInstanceCache import DriverInstanceCache from common.method_wrappers.Decorator import MetricsPool -from common.proto.kpi_manager_pb2 import KpiId -from common.tools.context_queries.Device import get_device from common.tools.kafka.Variables import KafkaConfig, KafkaTopic from common.tools.service.GenericGrpcService import GenericGrpcService from context.client.ContextClient import ContextClient @@ -56,7 +52,6 @@ class TelemetryBackendService(GenericGrpcService): 'auto.offset.reset' : 'latest'}) self.driver_instance_cache = driver_instance_cache self.device_collector = None - self.collector = None # This should be replaced with device_collector (later to be removed) self.context_client = ContextClient() self.kpi_manager_client = KpiManagerClient() self.active_jobs = {} @@ -84,40 +79,44 @@ class TelemetryBackendService(GenericGrpcService): f"Subscribed topic {receive_msg.topic()} does not exist or topic does not have any messages.") continue else: - LOGGER.error("Consumer error: {}".format(receive_msg.error())) + LOGGER.error(f"Consumer error: {receive_msg.error()}") break try: - collector = json.loads(receive_msg.value().decode('utf-8')) + collector = json.loads(receive_msg.value().decode('utf-8')) collector_id = receive_msg.key().decode('utf-8') - LOGGER.debug('Recevied Collector: {:} - {:}'.format(collector_id, collector)) + LOGGER.debug(f"Received Collector: {collector_id} - {collector}") duration = collector.get('duration', 0) if duration == -1 and collector['interval'] == -1: self.TerminateCollector(collector_id) else: - LOGGER.info("Received Collector ID: {:} - Scheduling...".format(collector_id)) + LOGGER.info(f"Received Collector ID: {collector_id} - Scheduling...") if collector_id not in self.active_jobs: stop_event = threading.Event() self.active_jobs[collector_id] = stop_event threading.Thread(target=self.GenericCollectorHandler, - args=( - collector_id, - collector['kpi_id'], - duration, - collector['interval'], - collector['interface'], # for INT collector - collector['transport_port'], # for INT collector - collector['service_id'], # for INT collector - collector['context_id'], # for INT collector - stop_event - )).start() + args=( + collector_id, + collector, # TODO: later all other collector[''] should be removed. + # For now, to avoid multiple changes in the code, + # I am passing the whole collector dict and accessing the required parameters in the GenericCollectorHandler method. + # This will be changed after confirming the current implementation is working fine. + collector['kpi_id'], + duration, + collector['interval'], + collector['interface'], # for INT collector + collector['transport_port'], # for INT collector + collector['service_id'], # for INT collector + collector['context_id'], # for INT collector + stop_event + )).start() # Stop the Collector after the given duration if duration > 0: def stop_after_duration(completion_time, stop_event): time.sleep(completion_time) if not stop_event.is_set(): LOGGER.warning( - f"Execution duration ({completion_time}) completed of Collector: {collector_id}") + f"Execution duration ({completion_time}) completed for Collector: {collector_id}") self.TerminateCollector(collector_id) duration_thread = threading.Thread( @@ -126,66 +125,95 @@ class TelemetryBackendService(GenericGrpcService): ) duration_thread.start() else: - LOGGER.warning("Collector ID: {:} - Already scheduled or running".format(collector_id)) + LOGGER.warning(f"Collector ID: {collector_id} - Already scheduled or running") except Exception as e: LOGGER.warning( - "Unable to consume message from topic: {:}. ERROR: {:}".format(KafkaTopic.TELEMETRY_REQUEST.value, e)) + f"Unable to consume message from topic: {KafkaTopic.TELEMETRY_REQUEST.value}. ERROR: {e}") - def GenericCollectorHandler(self, collector_id, kpi_id, duration, interval, interface , port , service_id , context_id , stop_event ): + def GenericCollectorHandler(self, + collector_id, collector, kpi_id, duration, interval, interface, port, + service_id, context_id, stop_event): """ Method to handle collector request. """ - # CONFIRMED: The method (get_collector_by_kpi_id) is working correctly. testcase in integration tests. - self.device_collector = get_collector_by_kpi_id( - kpi_id, self.kpi_manager_client, self.context_client, self.driver_instance_cache) + LOGGER.info(f"Starting Collector Handler for Collector ID: {collector_id} - KPI ID: {kpi_id}") + # INT collector invocation + if interface: + self.device_collector = get_node_level_int_collector( + collector_id=collector_id, + kpi_id=kpi_id, + address="127.0.0.1", + interface=interface, + port=port, + service_id=service_id, + context_id=context_id + ) + return + # Rest of the collectors + elif context_id == "43813baf-195e-5da6-af20-b3d0922e71a7": + self.device_collector = get_mgon_collector( + address = collector['host'], # "172.17.254.24", + port = collector['port'], # 50061, + username = collector['username'], # "admin", + password = collector['password'], # "admin", + insecure = collector.get('insecure', True), + skip_verify = collector.get('skip_verify', True) + ) + else: + self.device_collector = get_collector_by_kpi_id( + kpi_id, self.kpi_manager_client, self.context_client, self.driver_instance_cache) if not self.device_collector: LOGGER.warning(f"KPI ID: {kpi_id} - Collector not found. Skipping...") raise Exception(f"KPI ID: {kpi_id} - Collector not found.") - LOGGER.info(("----- Number done -----")) - # CONFIRMED: The method (get_subscription_parameters) is working correctly. testcase in telemetery backend tests. - resource_to_subscribe = get_subscription_parameters( - kpi_id, self.kpi_manager_client, self.context_client, duration, interval - ) + # CONFIRM: The method (get_subscription_parameters) is working correctly. testcase in telemetry backend tests + # resource_to_subscribe = get_subscription_parameters( + # kpi_id, self.kpi_manager_client, self.context_client, resource, duration, interval + # ) + # TODO: Remove after confirming get_subscription_parameters generic is working correctly + resource_to_subscribe = get_mgon_subscription_parameters( + collector['resource'], collector['endpoint'], collector['kpi'], + collector['duration'], collector['sample_interval'] + ) + if not resource_to_subscribe: LOGGER.warning(f"KPI ID: {kpi_id} - Resource to subscribe not found. Skipping...") raise Exception(f"KPI ID: {kpi_id} - Resource to subscribe not found.") - LOGGER.info("------ Number done 2 -----") responses = self.device_collector.SubscribeState(resource_to_subscribe) - for status in responses: if isinstance(status, Exception): LOGGER.error(f"Subscription failed for KPI ID: {kpi_id} - Error: {status}") raise status else: LOGGER.info(f"Subscription successful for KPI ID: {kpi_id} - Status: {status}") - LOGGER.info("------ Number done 3 -----") - + + sample_value = None for samples in self.device_collector.GetState(duration=duration, blocking=True): LOGGER.info(f"KPI ID: {kpi_id} - Samples: {samples}") - self.GenerateKpiValue(collector_id, kpi_id, samples) - - LOGGER.info("------ Number done 4 -----") - self.device_collector.Disconnect() - # TODO: Stop_event should be managed here is this method because there will be no more specific collector. - -# --- START: Kept for INT compatibility, to be removed later --- - def INTCollectorHandler(self, subscription, duration, collector_id, kpi_id, interface, port, service_id, context_id , stop_event): - self.collector = INTCollector( - collector_id=collector_id , - address="127.0.0.1", - interface=interface, - port=port, - kpi_id=kpi_id, - service_id=service_id, - context_id=context_id - ) - self.collector.Connect() - if stop_event.is_set(): - self.collector.Disconnect() -# --- END: Kept for INT compatibility, to be removed later --- + if isinstance(samples, dict): + inn_dict = samples.get('update', {}) + LOGGER.info(f"KPI ID: {kpi_id} - Inner Dictionary: {inn_dict}") + list_update = inn_dict.get('update', []) + LOGGER.info(f"KPI ID: {kpi_id} - List Update: {list_update}") + if len(list_update) > 0: + sample_value = list_update[0].get('val') + self.GenerateKpiValue(collector_id, kpi_id, sample_value) + ''' +{ + 'update': { + 'timestamp': 1772103489806507669, + 'update': + [ + {'path': 'openconfig-wavelength-router:wavelength-router/flex-scale-mg-on:optical-bands/optical-band[index=2]/state/optical-power-total-input/instant', 'val': -2.51} + ] + } + } + ''' + # TODO: Stop_event should be managed in this method because there will be no more specific collector + if stop_event.is_set(): + self.device_collector.Disconnect() def GenerateKpiValue(self, collector_id: str, kpi_id: str, measured_kpi_value: Any): """ @@ -197,35 +225,35 @@ class TelemetryBackendService(GenericGrpcService): "kpi_id": kpi_id, "kpi_value": measured_kpi_value } + LOGGER.info(f"Producing KPI Value for Collector ID: {collector_id} - KPI ID: {kpi_id} - Value: {kpi_value}") producer.produce( - KafkaTopic.VALUE.value, - key=collector_id, - value=json.dumps(kpi_value), - callback=self.delivery_callback + "topic_value", #KafkaTopic.VALUE.value, + key = collector_id, + value = json.dumps(kpi_value), + callback = self.delivery_callback ) producer.flush() def delivery_callback(self, err, msg): if err: - LOGGER.error('Message delivery failed: {:s}'.format(str(err))) + LOGGER.error(f"Message delivery failed: {str(err)}") def TerminateCollector(self, job_id): LOGGER.debug("Terminating collector backend...") try: if job_id not in self.active_jobs: - self.logger.warning(f"No active jobs found for {job_id}. It might have already terminated.") + self.logger.warning(f"No active jobs found for {job_id}. It might have already been terminated.") else: LOGGER.info(f"Terminating job: {job_id}") stop_event = self.active_jobs.pop(job_id, None) if stop_event: stop_event.set() LOGGER.info(f"Job {job_id} terminated.") - if self.collector.UnsubscribeState(job_id): + if self.device_collector.UnsubscribeState(job_id): LOGGER.info(f"Unsubscribed from collector: {job_id}") else: LOGGER.warning(f"Failed to unsubscribe from collector: {job_id}") else: LOGGER.warning(f"Job {job_id} not found in active jobs.") except: - LOGGER.exception("Error terminating job: {:}".format(job_id)) - + LOGGER.exception(f"Error terminating job: {job_id}") diff --git a/src/telemetry/backend/service/collector_api/DriverFactory.py b/src/telemetry/backend/service/collector_api/DriverFactory.py index fd11ca125fd4198ed3cf2643b42e44fac5fea0aa..23d4c86bd563f838b34919388cd98ed2be999fff 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 13d43db131e1ca27e5dc28453cdd434886d47f69..7500bc688f96573fa02772e3da8275b9be76443c 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 8bc607d955c1b60576f28ad743e47a754eba3acd..1871fc2e0fbc0ff930b3d65003ffcbfc2c21cb25 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 b1d2cb3144f85f9e8db35c39808accc0d3c386a5..103a77105c5915e2ee4de5a3b4c1818916104bff 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 1e07dc43fab0d52b3c6584eb168d0f7e3f991b29..6b45dcd41c19bb64d4ff4b26ba1ca5972d5b26f6 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. @@ -34,8 +34,6 @@ COLLECTORS.append( }, ])) -# TODO: Import for gNMI OpenConfig Collector ... - if LOAD_ALL_DEVICE_DRIVERS: from .gnmi_oc.GnmiOpenConfigCollector import GNMIOpenConfigCollector # pylint: disable=wrong-import-position COLLECTORS.append( @@ -49,7 +47,7 @@ if LOAD_ALL_DEVICE_DRIVERS: ) if LOAD_ALL_DEVICE_DRIVERS: - from ...collectors.intcollector.INTCollector import INTCollector # pylint: disable=wrong-import-position + from .int_collector.INTCollector import INTCollector # pylint: disable=wrong-import-position COLLECTORS.append( (INTCollector, [ { @@ -58,4 +56,3 @@ if LOAD_ALL_DEVICE_DRIVERS: } ]) ) - diff --git a/src/telemetry/backend/service/collectors/gnmi_oc/GnmiOpenConfigCollector.py b/src/telemetry/backend/service/collectors/gnmi_oc/GnmiOpenConfigCollector.py index 96a334b741b29fe55efd336321ac5b6ee6d98637..1b7067b03958dcee66e14ce767525e31488e318b 100644 --- a/src/telemetry/backend/service/collectors/gnmi_oc/GnmiOpenConfigCollector.py +++ b/src/telemetry/backend/service/collectors/gnmi_oc/GnmiOpenConfigCollector.py @@ -14,15 +14,16 @@ import logging, pytz, queue +from common.Settings import get_log_level from datetime import datetime from typing import Dict, Optional, Tuple, List, Union, Any, Iterator from pygnmi.client import gNMIclient from telemetry.backend.service.collector_api._Collector import _Collector from .PathMapper import PathMapper -from .SubscriptionNew import LOGGER, Subscription +from .SubscriptionNew import Subscription logging.basicConfig( - level=logging.DEBUG, + level=get_log_level(), format="%(asctime)s %(levelname)8s [%(name)s - %(funcName)s()]: %(message)s", ) @@ -32,7 +33,7 @@ class GNMIOpenConfigCollector(_Collector): ========================= Lightweight wrapper around *pygnmi* with subscribe / get / unsubscribe helpers. """ - def __init__(self, address: str = '', port: int = -1, **setting ) -> None: + def __init__(self, address: str = "", port: int = -1, **setting) -> None: super().__init__('gNMI_openconfig_collector', address, port, **setting) self._subscriptions : Dict[str, Subscription] = {} @@ -50,13 +51,15 @@ class GNMIOpenConfigCollector(_Collector): self._output_queue = queue.Queue() # Queue for telemetry updates self.logger = logging.getLogger(__name__) - self.logger.debug("GNMICollector instantiated.") + self.logger.info("GNMICollector instantiated.") def Connect(self) -> bool: """ Connect to the gNMI target device. """ + self.logger.info("Connecting to gNMI target %s:%s with username '%s'", + self.address, self.port, self.username) if not self.connected: self.client = gNMIclient( target = (self.address, self.port), @@ -130,7 +133,7 @@ class GNMIOpenConfigCollector(_Collector): kpi = sub_endpoint['kpi' ], resource = sub_endpoint['resource'], ) - LOGGER.debug("Built %d candidate path(s) for endpoint '%s'", len(paths), sub_endpoint['endpoint']) + self.logger.debug("Built %d candidate path(s) for endpoint '%s'", len(paths), paths) self._subscriptions[sub_id] = Subscription( sub_id = sub_id, gnmi_client = self.client, # type: ignore diff --git a/src/telemetry/backend/service/collectors/gnmi_oc/SubscriptionNew.py b/src/telemetry/backend/service/collectors/gnmi_oc/SubscriptionNew.py index 8d20aca0bc264750c4a956503768efe70cdeb413..c48ba505c7dd3f89f5abfe72aeb81a7f5add3bc5 100644 --- a/src/telemetry/backend/service/collectors/gnmi_oc/SubscriptionNew.py +++ b/src/telemetry/backend/service/collectors/gnmi_oc/SubscriptionNew.py @@ -42,8 +42,8 @@ class Subscription: metric_queue: Queue, mode: str = "stream", sample_interval_ns: int = 10_000_000_000, - heartbeat_interval_ns: Optional[int] = 10_000_000_000, - total_duration: Optional[float] = 60.0, # in seconds + heartbeat_interval_ns: Optional[int] = None, + total_duration: Optional[float] = None, # in seconds encoding: str = "json_ietf", on_update: Optional[Callable[[dict], None]] = None, ) -> None: @@ -229,7 +229,7 @@ class Subscription: LOGGER.debug("Sub %s stop requested, breaking stream loop", self.sub_id) break - LOGGER.debug("Sub %s received stream message: %s", self.sub_id, stream) + LOGGER.info("Sub %s received stream message: %s", self.sub_id, stream) # DEBUG: Check if update has actual update messages if stream.HasField("update"): @@ -269,12 +269,10 @@ class Subscription: LOGGER.debug("Sub %s cancelled (channel closed) - graceful shutdown", self.sub_id) break elif err.code() == grpc.StatusCode.INVALID_ARGUMENT: - LOGGER.warning("Path '%s' rejected (%s) -- trying next", - path, err.details()) + LOGGER.warning("Path '%s' rejected (%s) -- trying next", path, err.details()) continue else: - LOGGER.exception("Subscription %s hit gRPC error: %s", # Change with TFS Exception - self.sub_id, err) + LOGGER.exception("Subscription %s hit gRPC error: %s", self.sub_id, err) # Change with TFS Exception break except Exception as exc: # pylint: disable=broad-except diff --git a/src/telemetry/backend/collectors/intcollector/INTCollector.py b/src/telemetry/backend/service/collectors/int_collector/INTCollector.py similarity index 56% rename from src/telemetry/backend/collectors/intcollector/INTCollector.py rename to src/telemetry/backend/service/collectors/int_collector/INTCollector.py index 5931f33f34b1d097c435c0a8483379026e819213..84352f417e9bea4765ff80f62cbe9cd5488f3389 100644 --- a/src/telemetry/backend/collectors/intcollector/INTCollector.py +++ b/src/telemetry/backend/service/collectors/int_collector/INTCollector.py @@ -23,21 +23,18 @@ from datetime import datetime from telemetry.backend.service.collector_api._Collector import _Collector from scapy.all import * -import struct -import socket import ipaddress -from .INTCollectorCommon import IntDropReport, IntLocalReport, IntFixedReport, FlowInfo +from .INTCollectorCommon import IntDropReport, IntLocalReport, IntFixedReport, FlowInfo, IPPacket, UDPPacket from common.proto.kpi_manager_pb2 import KpiId, KpiDescriptor from confluent_kafka import Producer as KafkaProducer from common.tools.kafka.Variables import KafkaConfig, KafkaTopic from uuid import uuid4 -from typing import Dict +from typing import Dict, List, Tuple from datetime import datetime, timezone import json from kpi_manager.client.KpiManagerClient import KpiManagerClient -from common.proto.analytics_frontend_pb2 import Analyzer, AnalyzerId from context.client.ContextClient import ContextClient from analytics.frontend.client.AnalyticsFrontendClient import AnalyticsFrontendClient from common.proto.kpi_sample_types_pb2 import KpiSampleType @@ -46,50 +43,68 @@ import logging LOGGER = logging.getLogger(__name__) -class INTCollector(_Collector): +DEF_SW_NUM = 10 - last_packet_time = time.time() # Track last packet time +class INTCollector(_Collector): - max_idle_time = 5 # for how long we tolerate inactivity - sniff_timeout = 3 # how often we stop sniffing to check for inactivity + last_packet_time = 0.0 # Track the timestamp of the last packet + max_idle_time = 5 # For how long we tolerate inactivity + sniff_timeout = 3 # How often we stop sniffing to check for inactivity """ - INTCollector is a class that simulates a network collector for testing purposes. - It provides functionalities to manage configurations, state subscriptions, and synthetic data generation. + INTCollector spawns a packet sniffer at the interface of the Telemetry service, + which is mapped to the interface of the TFS host. + INT packets arriving there are: + - picked up by the INT collector + - parsed, and + - telemetry KPI metric values are extracted and reported to Kafka as KPIDescriptors """ - def __init__(self, collector_id: str , address: str, interface: str, port: str, kpi_id: str, service_id: str, context_id: str, **settings): - super().__init__('int_collector', address, port, **settings) - self._out_samples = queue.Queue() # Queue to hold synthetic state samples - self._scheduler = BackgroundScheduler(daemon=True) + + def __init__(self, address: str, port: int, **settings) -> None: + super().__init__('INTCollector', address, port, **settings) + self.collector_id = settings.pop('collector_id', None) + self.interface = settings.pop('interface', None) + self.kpi_id = settings.pop('kpi_id', None) + self.service_id = settings.pop('service_id', None) + self.context_id = settings.pop('context_id', None) + + if any(item is None for item in [ + self.collector_id, self.interface, self.kpi_id, self.service_id, self.context_id]): + LOGGER.error("INT collector not instantiated properly: Bad input") + return + + self._out_samples = queue.Queue() + self._scheduler = BackgroundScheduler(daemon=True) self._scheduler.configure( jobstores = {'default': MemoryJobStore()}, executors = {'default': ThreadPoolExecutor(max_workers=1)}, timezone = pytz.utc ) self.kafka_producer = KafkaProducer({'bootstrap.servers': KafkaConfig.get_kafka_address()}) - self.collector_id = collector_id - self.interface = interface self.kpi_manager_client = KpiManagerClient() self.analytics_frontend_client = AnalyticsFrontendClient() self.context_client = ContextClient() - self.kpi_id = kpi_id - self.service_id = service_id - self.context_id = context_id self.table = {} - self.connected = False # To track connection state - LOGGER.info("INT Collector initialized") + self.connected = False + LOGGER.info("=== INT Collector initialized") def Connect(self) -> bool: + LOGGER.info("=== INT Collector Connect()") LOGGER.info(f"Connecting to {self.interface}:{self.port}") - self.connected = True - self._scheduler.add_job(self.sniff_with_restarts_on_idle, id=self.kpi_id ,args=[self.interface , self.port , self.service_id, self.context_id]) + self._scheduler.add_job( + self.sniff_with_restarts_on_idle, + id=self.kpi_id, + args=[self.interface, self.port, self.service_id] + ) self._scheduler.start() + self.connected = True LOGGER.info(f"Successfully connected to {self.interface}:{self.port}") return True def Disconnect(self) -> bool: + LOGGER.info("=== INT Collector Disconnect()") LOGGER.info(f"Disconnecting from {self.interface}:{self.port}") if not self.connected: LOGGER.warning("INT Collector is not connected. Nothing to disconnect.") @@ -102,14 +117,54 @@ class INTCollector(_Collector): LOGGER.info(f"Successfully disconnected from {self.interface}:{self.port}") return True + def require_connection(self): + if not self.connected: + raise RuntimeError("INT collector is not connected. Please connect before performing operations.") + + def SubscribeState(self, subscriptions: List[Tuple[str, dict, float, float, str, int, str, str]]) -> bool: + LOGGER.info("=== INT Collector SubscribeState()") + self.require_connection() + try: + _, _, _, _, interface, port, service_id, _ = subscriptions + except: + LOGGER.exception(f"Invalid subscription format: {subscriptions}") + return False + + if self.kpi_id: + self._scheduler.add_job( + self.sniff_with_restarts_on_idle, + id=self.kpi_id, + args=[interface, port, service_id] + ) + + return True + + def UnsubscribeState(self, resource_key: str) -> bool: + LOGGER.info("=== INT Collector UnsubscribeState()") + self.require_connection() + try: + # Check if job exists + job_ids = [job.id for job in self._scheduler.get_jobs() if resource_key in job.id] + if not job_ids: + LOGGER.warning(f"No active jobs found for {resource_key}. It might have already been terminated.") + return False + for job_id in job_ids: + self._scheduler.remove_job(job_id) + LOGGER.info(f"Unsubscribed from {resource_key} with job IDs: {job_ids}") + return True + except: + LOGGER.exception(f"Failed to unsubscribe from {resource_key}") + return False + def on_idle_timeout(self): - LOGGER.info(f"Sniffer idle for more than {self.max_idle_time} seconds.") - LOGGER.debug(f"last_packet_time {self.last_packet_time} seconds.") + LOGGER.info(f"=== INT Collector IDLE() - No INT packets arrived during the last {self.max_idle_time} seconds") + LOGGER.debug(f"last_packet_time {self.last_packet_time} seconds") + # Report a zero value for the P4 switch KPIs values = [0] - for sw_id in range(1, 6): + for sw_id in range(1, DEF_SW_NUM+1): sw = self.table.get(sw_id) - self.overwrite_switch_values(sw , values) + self.overwrite_switch_values(sw, values) def overwrite_switch_values(self, switch, values): if not switch: @@ -122,38 +177,52 @@ class INTCollector(_Collector): for key, value in switch.items(): self.send_message_to_kafka(key, value) - def process_packet(self , packet, port, service_id , context_id): - # global last_packet_time + def process_packet(self, packet, port, service_id): + LOGGER.debug("=== INT Collector Packet-In()") + LOGGER.debug(packet) - # Check for IP layer + # Check for IP header if IP not in packet: return None ip_layer = packet[IP] - # ip_pkt = IPPacket(ip_layer[:20]) - # ip_pkt.show() - # Check for UDP + # IP parsing + try: + ihl = ip_layer.ihl * 4 + raw_ip = bytes(ip_layer) + ip_pkt = IPPacket(raw_ip[:ihl]) # exclude options if any + src_ip_str = str(ipaddress.IPv4Address(ip_pkt.ip_src)) + dst_ip_str = str(ipaddress.IPv4Address(ip_pkt.ip_dst)) + # ip_pkt.show() + except Exception as ex: + LOGGER.exception(f"Failed to parse IP packet: {ex}") + return None + + LOGGER.debug(f"ip src: {src_ip_str}") + LOGGER.debug(f"ip dst: {dst_ip_str}") + LOGGER.debug(f"ip-proto: {ip_pkt.ip_proto}") + + # Check for UDP header if UDP not in ip_layer: return None udp_layer = ip_layer[UDP] - # Only the INT port + # We care about datagrams arriving on the INT port if udp_layer.dport != port: + LOGGER.warning(f"Expected UDP INT packet on port {udp_layer.dport}. Received packet on port {port}") return None - # udp_dgram = UDPPacket(bytes(udp_layer)) - # udp_dgram.show() - src_ip = socket.ntohl(struct.unpack(' 0, "Egress timestamp must be > ingress timestamp" + assert lat > 0, f"Egress timestamp must be > ingress timestamp. Got a diff: {lat}" # local_report.show() # Create flow info flow_info = FlowInfo( - src_ip=src_ip, - dst_ip=dst_ip, + src_ip=ip_pkt.ip_src, + dst_ip=ip_pkt.ip_dst, src_port=udp_layer.sport, dst_port=udp_layer.dport, ip_proto=ip_layer.proto, @@ -201,25 +272,26 @@ class INTCollector(_Collector): ) LOGGER.debug(f"Flow info: {flow_info}") - self.create_descriptors_and_send_to_kafka(flow_info , service_id , context_id) - + self.create_descriptors_and_send_to_kafka(flow_info, service_id) self.last_packet_time = time.time() + return flow_info - def set_kpi_descriptor(self , kpi_uuid , service_id , device_id , endpoint_id , sample_type): + def set_kpi_descriptor(self, kpi_uuid, service_id, sample_type): kpi_descriptor = KpiDescriptor() kpi_descriptor.kpi_sample_type = sample_type kpi_descriptor.service_id.service_uuid.uuid = service_id - # kpi_descriptor.device_id.device_uuid.uuid = device_id - # kpi_descriptor.endpoint_id.endpoint_uuid.uuid = endpoint_id kpi_descriptor.kpi_id.kpi_id.uuid = kpi_uuid - kpi_id: KpiId = self.kpi_manager_client.SetKpiDescriptor(kpi_descriptor) + try: + kpi_id: KpiId = self.kpi_manager_client.SetKpiDescriptor(kpi_descriptor) + except Exception as ex: + LOGGER.exception(f"Failed to set KPI descriptor {kpi_uuid}: {ex}") return kpi_id - def create_descriptors_and_send_to_kafka(self, flow_info , service_id , context_id): - LOGGER.debug(f"PACKET FROM SWITCH: {flow_info.switch_id} LATENCY: {flow_info.hop_latency}") + def create_descriptors_and_send_to_kafka(self, flow_info, service_id): + LOGGER.debug(f"Packet from switch: {flow_info.switch_id} with latency: {flow_info.hop_latency}") if(self.table.get(flow_info.switch_id) == None): seq_num_kpi_id = str(uuid4()) ingress_ts_kpi_id = str(uuid4()) @@ -241,14 +313,14 @@ class INTCollector(_Collector): LOGGER.debug(f"is_drop_kpi_id for switch {flow_info.switch_id}: {is_drop_kpi_id}") LOGGER.debug(f"sw_lat_kpi_id for switch {flow_info.switch_id}: {sw_lat_kpi_id}") - seq_num_kpi = self.set_kpi_descriptor(seq_num_kpi_id, service_id ,'', '', KpiSampleType.KPISAMPLETYPE_INT_SEQ_NUM) - ingress_timestamp_kpi = self.set_kpi_descriptor(ingress_ts_kpi_id, service_id, '', '', KpiSampleType.KPISAMPLETYPE_INT_TS_ING) - egress_timestamp_kpi = self.set_kpi_descriptor(egress_ts_kpi_id, service_id, '', '', KpiSampleType.KPISAMPLETYPE_INT_TS_EGR) - hop_latency_kpi = self.set_kpi_descriptor(hop_lat_kpi_id, service_id, '', '', KpiSampleType.KPISAMPLETYPE_INT_HOP_LAT) - ingress_port_id_kpi = self.set_kpi_descriptor(ing_port_id_kpi_id, service_id, '', '', KpiSampleType.KPISAMPLETYPE_INT_PORT_ID_ING) - egress_port_id_kpi = self.set_kpi_descriptor(egr_port_id_kpi_id, service_id, '', '', KpiSampleType.KPISAMPLETYPE_INT_PORT_ID_EGR) - queue_occup_kpi = self.set_kpi_descriptor(queue_occup_kpi_id, service_id, '', '', KpiSampleType.KPISAMPLETYPE_INT_QUEUE_OCCUP) - is_drop_kpi = self.set_kpi_descriptor(is_drop_kpi_id, service_id, '', '', KpiSampleType.KPISAMPLETYPE_INT_IS_DROP) + seq_num_kpi = self.set_kpi_descriptor(seq_num_kpi_id, service_id ,KpiSampleType.KPISAMPLETYPE_INT_SEQ_NUM) + ingress_timestamp_kpi = self.set_kpi_descriptor(ingress_ts_kpi_id, service_id, KpiSampleType.KPISAMPLETYPE_INT_TS_ING) + egress_timestamp_kpi = self.set_kpi_descriptor(egress_ts_kpi_id, service_id, KpiSampleType.KPISAMPLETYPE_INT_TS_EGR) + hop_latency_kpi = self.set_kpi_descriptor(hop_lat_kpi_id, service_id, KpiSampleType.KPISAMPLETYPE_INT_HOP_LAT) + ingress_port_id_kpi = self.set_kpi_descriptor(ing_port_id_kpi_id, service_id, KpiSampleType.KPISAMPLETYPE_INT_PORT_ID_ING) + egress_port_id_kpi = self.set_kpi_descriptor(egr_port_id_kpi_id, service_id, KpiSampleType.KPISAMPLETYPE_INT_PORT_ID_EGR) + queue_occup_kpi = self.set_kpi_descriptor(queue_occup_kpi_id, service_id, KpiSampleType.KPISAMPLETYPE_INT_QUEUE_OCCUP) + is_drop_kpi = self.set_kpi_descriptor(is_drop_kpi_id, service_id, KpiSampleType.KPISAMPLETYPE_INT_IS_DROP) # Set a dedicated KPI descriptor for every switch sw_lat_kpi = None @@ -259,10 +331,10 @@ class INTCollector(_Collector): KpiSampleType.KPISAMPLETYPE_INT_HOP_LAT_SW07, KpiSampleType.KPISAMPLETYPE_INT_HOP_LAT_SW08, KpiSampleType.KPISAMPLETYPE_INT_HOP_LAT_SW09, KpiSampleType.KPISAMPLETYPE_INT_HOP_LAT_SW10 ] - for i, sw_id in enumerate(range(1, 11)): + for i, sw_id in enumerate(range(1, DEF_SW_NUM+1)): if flow_info.switch_id == sw_id: - LOGGER.debug(f"SET KPI : seq_num_kpi_id for switch {flow_info.switch_id}: {sw_lat_kpi_id}") - sw_lat_kpi = self.set_kpi_descriptor(sw_lat_kpi_id, service_id, '', '', sw_sample_types[i]) + LOGGER.debug(f"Set latency KPI for switch {flow_info.switch_id}: {sw_lat_kpi_id}") + sw_lat_kpi = self.set_kpi_descriptor(sw_lat_kpi_id, service_id, sw_sample_types[i]) # Gather keys and values keys = [ @@ -310,48 +382,67 @@ class INTCollector(_Collector): switch = self.table.get(flow_info.switch_id) # Overwrite values using zip - self.overwrite_switch_values(switch , values) + self.overwrite_switch_values(switch, values) - def send_message_to_kafka(self , kpi_id , measured_kpi_value): + def send_message_to_kafka(self, kpi_id, measured_kpi_value): + LOGGER.debug("=== INT Collector Kafka Writer()") producer = self.kafka_producer kpi_value: Dict = { "time_stamp": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"), "kpi_id": kpi_id, "kpi_value": measured_kpi_value } - producer.produce( - KafkaTopic.VALUE.value, - key=self.collector_id, - value=json.dumps(kpi_value), - callback=self.delivery_callback - ) - producer.flush() - LOGGER.debug(f"Message with kpi_id: {kpi_id} was send to kafka!") + try: + producer.produce( + KafkaTopic.VALUE.value, + key=self.collector_id, + value=json.dumps(kpi_value), + callback=self.delivery_callback + ) + producer.flush() + except Exception as ex: + LOGGER.error(f"Message with kpi_id: {kpi_id} is NOT sent to kafka!") + LOGGER.exception(f"{ex}") + return + LOGGER.debug(f"Message with kpi_id: {kpi_id} is sent to kafka!") - def packet_callback(self, packet, port , service_id,context_id): - flow_info = self.process_packet(packet , port , service_id, context_id) + def packet_callback(self, packet, port, service_id): + flow_info = self.process_packet(packet, port, service_id) if flow_info: LOGGER.debug(f"Flow info: {flow_info}") - def sniff_with_restarts_on_idle(self, interface, port, service_id , context_id): + def sniff_with_restarts_on_idle(self, interface, port, service_id): + LOGGER.info("=== INT Collector Sniffer Start") while True: # Run sniff for a short period to periodically check for idle timeout - sniff( - iface=interface, - filter=f"udp port {port}", - prn=lambda pkt: self.packet_callback(pkt, port, service_id , context_id), - timeout=self.sniff_timeout - ) + try: + sniff( # type: ignore + iface=interface, + filter=f"udp port {port}", + prn=lambda pkt: self.packet_callback(pkt, port, service_id), + timeout=self.sniff_timeout + ) + except Exception as ex: + LOGGER.exception(ex) + self.Disconnect() if not self.connected: break # Check if idle period has been exceeded now = time.time() + LOGGER.debug(f"Time now: {self.epoch_to_day_time(now)}") + LOGGER.debug(f"Time last pkt: {self.epoch_to_day_time(self.last_packet_time)}") + diff = now - self.last_packet_time + assert diff > 0, f"Time diff: {diff} sec must be positive" if (now - self.last_packet_time) > self.max_idle_time: self.on_idle_timeout() self.last_packet_time = now # Reset timer after action + LOGGER.info("=== INT Collector Sniffer End") def delivery_callback(self, err, msg): if err: - LOGGER.error('Message delivery failed: {:s}'.format(str(err))) + LOGGER.error(f"Kafka message delivery failed: {str(err)}") + + def epoch_to_day_time(self, ep_time : float): + return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(ep_time)) diff --git a/src/telemetry/backend/collectors/intcollector/INTCollectorCommon.py b/src/telemetry/backend/service/collectors/int_collector/INTCollectorCommon.py similarity index 74% rename from src/telemetry/backend/collectors/intcollector/INTCollectorCommon.py rename to src/telemetry/backend/service/collectors/int_collector/INTCollectorCommon.py index baed12fd29f4707f187c9e3d2377fe29b4f034ad..a8ce410680aabb87192e8d907cbaf25c12436245 100644 --- a/src/telemetry/backend/collectors/intcollector/INTCollectorCommon.py +++ b/src/telemetry/backend/service/collectors/int_collector/INTCollectorCommon.py @@ -35,7 +35,7 @@ class IPPacket(Packet): ] class UDPPacket(Packet): - name = "UDPPacket" + name = "UDPDatagram" fields_desc = [ BitField("udp_port_src", 0, 16), BitField("udp_port_dst", 0, 16), @@ -43,37 +43,6 @@ class UDPPacket(Packet): BitField("udp_csum", 0, 16) ] -""" - Private source repo: https://github.com/SNVLab-WUT/int-collector/blob/main/collector/BPFCollector_v0_5.c - fabric-tna repo: https://github.com/stratum/fabric-tna/blob/main/p4src/shared/header.p4 - - Little Endian order - BitField("nproto", 0, 4), - BitField("ver", 0, 4), - BitField("rsvd1", 0, 5), - BitField("f", 0, 1), - BitField("q", 0, 1), - BitField("d", 0, 1), - BitField("hw_id", 0, 6), - BitField("rsvd2", 0, 10), - - BitField("queue_id", 0, 8), - BitField("queue_occupancy", 0, 24), - - Big Endian order - BitField("ver", 0, 4), - BitField("nproto", 0, 4), - BitField("d", 0, 1), - BitField("q", 0, 1), - BitField("f", 0, 1), - BitField("rsvd1", 0, 5), - BitField("rsvd2", 0, 10), - BitField("hw_id", 0, 6), - - BitField("queue_occupancy", 0, 24), - BitField("queue_id", 0, 8), -""" - class IntFixedReport(Packet): name = "IntFixedReport" fields_desc = [ diff --git a/src/tests/p4-fabric-tna/__init__.py b/src/telemetry/backend/service/collectors/int_collector/__init__.py similarity index 100% rename from src/tests/p4-fabric-tna/__init__.py rename to src/telemetry/backend/service/collectors/int_collector/__init__.py diff --git a/src/telemetry/backend/tests/gnmi_oc/messages.py b/src/telemetry/backend/tests/gnmi_oc/messages.py index 7a6a9baf0f8effb18adcc12ae3a201f98b37e1dd..9cad7edef3b22a0e3e47d3f44fe00fdb3438773c 100644 --- a/src/telemetry/backend/tests/gnmi_oc/messages.py +++ b/src/telemetry/backend/tests/gnmi_oc/messages.py @@ -51,14 +51,14 @@ devices = { 'endpoint': 'Management0', }, 'mgon': { - 'host' : 'localhost', - 'port' : '50061', - 'username': 'admin', - 'password': 'admin', - 'insecure': True, - 'kpi' : KPI.KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER, - 'resource': 'wavelength-router', #TODO: verify resource name form mg-on model - 'endpoint': '1', + 'host' : '172.17.254.24', + 'port' : '50061', + 'username' : 'admin', + 'password' : 'admin', + 'insecure' : True, + 'kpi' : KPI.KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER, + 'resource' : 'wavelength-router', #TODO: verify resource name form mg-on model + 'endpoint' : '1', 'skip_verify': True, }, } diff --git a/src/telemetry/backend/tests/gnmi_oc/test_integration_GnmiOCcollector.py b/src/telemetry/backend/tests/gnmi_oc/test_integration_GnmiOCcollector.py index 3efb846219a7c513d9d413b5154cd150a97e113e..d200fc0b74c7f9d1d16dfa9ce527d013beab419d 100644 --- a/src/telemetry/backend/tests/gnmi_oc/test_integration_GnmiOCcollector.py +++ b/src/telemetry/backend/tests/gnmi_oc/test_integration_GnmiOCcollector.py @@ -164,7 +164,7 @@ def telemetry_backend_service(): # + Uncomment test_add_to_topology() in helper methods section to add a device. # - A KPI Descriptor must be added in KPI DB with correct device_id. # + Uncomment test_SetKpiDescriptor() in helper methods section to add a KPI Descriptor. - # - Kafka should be exposed externally 'kubectl port-forward -n kafka service/kafka-public 9094:9094'. + # - Kafka should be exposed externally 'kubectl port-forward -n kafka service/kafka-service 9092:9092'. def test_helper_get_collector_by_kpi_id(kpi_manager_client, context_client): LOGGER.info("Testing get_collector_by_kpi_id...") diff --git a/src/telemetry/backend/tests/gnmi_oc/test_unit_GnmiOpenConfigCollector.py b/src/telemetry/backend/tests/gnmi_oc/test_unit_GnmiOpenConfigCollector.py index 920c88c910580a3995801aa4d5d1b0b29b6b5cdc..c08f196d166106ba6d30eb21e641bf294ad61e0c 100644 --- a/src/telemetry/backend/tests/gnmi_oc/test_unit_GnmiOpenConfigCollector.py +++ b/src/telemetry/backend/tests/gnmi_oc/test_unit_GnmiOpenConfigCollector.py @@ -70,7 +70,7 @@ def subscription_data(sub_parameters): "endpoint" : sub_parameters['endpoint'], "resource" : sub_parameters['resource'], }, - float(20.0), + float(60.0), float(5.0), ), ] diff --git a/src/telemetry/database/TelemetryModel.py b/src/telemetry/database/TelemetryModel.py index 8238d47c6aeff033cbd7e63b05b9cc88f1768d55..6eaf4180577d76a94a1ebde6b057fd4c0d442bf8 100644 --- a/src/telemetry/database/TelemetryModel.py +++ b/src/telemetry/database/TelemetryModel.py @@ -18,7 +18,6 @@ from sqlalchemy import Column, String, Float from sqlalchemy.orm import registry from common.proto import telemetry_frontend_pb2 -logging.basicConfig(level=logging.INFO) LOGGER = logging.getLogger(__name__) # Create a base class for declarative models diff --git a/src/tests/.gitlab-ci.yml b/src/tests/.gitlab-ci.yml index 9b256f1ae6f9a3d63996266e961f9409c8453d3b..267d7ac23af5942bdec5065292e33b0b3b537d9d 100644 --- a/src/tests/.gitlab-ci.yml +++ b/src/tests/.gitlab-ci.yml @@ -24,8 +24,10 @@ include: #- local: '/src/tests/ofc25-camara-agg-net-controller/.gitlab-ci.yml' #- local: '/src/tests/ofc25-camara-e2e-controller/.gitlab-ci.yml' #- local: '/src/tests/ofc25/.gitlab-ci.yml' - #- local: '/src/tests/ryu-openflow/.gitlab-ci.yml' + - local: '/src/tests/ryu-openflow/.gitlab-ci.yml' - local: '/src/tests/qkd_end2end/.gitlab-ci.yml' + - local: '/src/tests/acl_end2end/.gitlab-ci.yml' + - local: '/src/tests/l2_vpn_gnmi_oc/.gitlab-ci.yml' - local: '/src/tests/tools/mock_tfs_nbi_dependencies/.gitlab-ci.yml' - local: '/src/tests/tools/mock_qkd_node/.gitlab-ci.yml' diff --git a/src/tests/acl_end2end/.gitignore b/src/tests/acl_end2end/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..a47dc9eff49108f99e8869a9ea8981c1d6b321c1 --- /dev/null +++ b/src/tests/acl_end2end/.gitignore @@ -0,0 +1,19 @@ +# 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. + +clab-*/ +images/ +*.clab.yml.bak +*.tar +*.tar.gz diff --git a/src/tests/acl_end2end/.gitlab-ci.yml b/src/tests/acl_end2end/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..675dc70682ee12e3385eb5e50635d5b91ac07585 --- /dev/null +++ b/src/tests/acl_end2end/.gitlab-ci.yml @@ -0,0 +1,291 @@ +# 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. + +# Build, tag, and push the Docker image to the GitLab Docker registry +build acl_end2end: + variables: + TEST_NAME: 'acl_end2end' + 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 "${TEST_NAME}:latest" -f ./src/tests/${TEST_NAME}/Dockerfile . + - docker tag "${TEST_NAME}:latest" "$CI_REGISTRY_IMAGE/${TEST_NAME}:latest" + - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}:latest" + 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/tests/${TEST_NAME}/**/*.{py,in,sh,yml} + - src/tests/${TEST_NAME}/Dockerfile + - .gitlab-ci.yml + +# Deploy TeraFlowSDN and Execute end-2-end test +end2end_test acl_end2end: + timeout: 45m + variables: + TEST_NAME: 'acl_end2end' + stage: end2end_test + # Disable to force running it after all other tasks + #needs: + # - build acl_end2end + before_script: + # Cleanup old ContainerLab scenarios + - containerlab destroy --all --cleanup || true + + # Do Docker cleanup + - docker ps --all --quiet | xargs --no-run-if-empty docker stop + - docker container prune --force + - docker ps --all --quiet | xargs --no-run-if-empty docker rm --force + - docker image prune --force + - docker network prune --force + - docker volume prune --all --force + - docker buildx prune --force + + # Check MicroK8s is ready + - microk8s status --wait-ready + - LOOP_MAX_ATTEMPTS=10 + - LOOP_COUNTER=0 + - > + while ! kubectl get pods --all-namespaces &> /dev/null; do + printf "%c" "." + sleep 1 + LOOP_COUNTER=$((LOOP_COUNTER + 1)) + if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then + echo "Max attempts reached, exiting the loop." + exit 1 + fi + done + - kubectl get pods --all-namespaces + + # Always delete Kubernetes namespaces + - export K8S_NAMESPACES=$(kubectl get namespace -o jsonpath='{.items[*].metadata.name}') + - echo "K8S_NAMESPACES=${K8S_NAMESPACES}" + + - export OLD_NATS_NAMESPACES=$(echo "${K8S_NAMESPACES}" | tr ' ' '\n' | grep -E '^nats') + - echo "OLD_NATS_NAMESPACES=${OLD_NATS_NAMESPACES}" + - > + for ns in ${OLD_NATS_NAMESPACES}; do + if [[ "$ns" == nats* ]]; then + if helm3 status "$ns" &>/dev/null; then + helm3 uninstall "$ns" -n "$ns" + else + echo "Release '$ns' not found, skipping..." + fi + fi + done + - export OLD_NAMESPACES=$(echo "${K8S_NAMESPACES}" | tr ' ' '\n' | grep -E '^(tfs|crdb|qdb|kafka|nats)') + - echo "OLD_NAMESPACES=${OLD_NAMESPACES}" + - kubectl delete namespace ${OLD_NAMESPACES} || true + + # Clean-up Kubernetes Failed pods + - > + kubectl get pods --all-namespaces --no-headers --field-selector=status.phase=Failed + -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name | + xargs --no-run-if-empty --max-args=2 kubectl delete pod --namespace + + # Login Docker repository + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + + script: + # Download Docker image to run the test + - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}:latest" + + # Check MicroK8s is ready + - microk8s status --wait-ready + - LOOP_MAX_ATTEMPTS=10 + - LOOP_COUNTER=0 + - > + while ! kubectl get pods --all-namespaces &> /dev/null; do + printf "%c" "." + sleep 1 + LOOP_COUNTER=$((LOOP_COUNTER + 1)) + if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then + echo "Max attempts reached, exiting the loop." + exit 1 + fi + done + - kubectl get pods --all-namespaces + + # Deploy ContainerLab Scenario + - RUNNER_PATH=`pwd` + #- cd $PWD/src/tests/${TEST_NAME} + - mkdir -p /tmp/clab/${TEST_NAME} + - cp -R src/tests/${TEST_NAME}/clab/* /tmp/clab/${TEST_NAME} + - tree -la /tmp/clab/${TEST_NAME} + - cd /tmp/clab/${TEST_NAME} + - containerlab deploy --reconfigure --topo acl_end2end.clab.yml + - cd $RUNNER_PATH + + # Wait for initialization of Device NOSes + - sleep 3 + - docker ps -a + + # Dump configuration of the firewall (before any configuration) + - containerlab exec --name acl_end2end --label clab-node-name=firewall --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + + # Configure TeraFlowSDN deployment + # Uncomment if DEBUG log level is needed for the components + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/contextservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/deviceservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="frontend").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/pathcompservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/serviceservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/nbiservice.yaml + + - source src/tests/${TEST_NAME}/deploy_specs.sh + #- export TFS_REGISTRY_IMAGES="${CI_REGISTRY_IMAGE}" + #- export TFS_SKIP_BUILD="YES" + #- export TFS_IMAGE_TAG="latest" + #- echo "TFS_REGISTRY_IMAGES=${CI_REGISTRY_IMAGE}" + + # Deploy TeraFlowSDN + - ./deploy/crdb.sh + - ./deploy/nats.sh + - ./deploy/kafka.sh + #- ./deploy/qdb.sh + - ./deploy/tfs.sh + - ./deploy/show.sh + + ## Wait for Context to be subscribed to NATS + ## WARNING: this loop is infinite if there is no subscriber (such as monitoring). + ## Investigate if we can use a counter to limit the number of iterations. + ## For now, keep it commented out. + #- LOOP_MAX_ATTEMPTS=180 + #- LOOP_COUNTER=0 + #- > + # while ! kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server 2>&1 | grep -q 'Subscriber is Ready? True'; do + # echo "Attempt: $LOOP_COUNTER" + # kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server 2>&1; + # sleep 1; + # LOOP_COUNTER=$((LOOP_COUNTER + 1)) + # if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then + # echo "Max attempts reached, exiting the loop." + # break + # fi + # done + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server + + # Run end-to-end test: onboard scenario + - > + docker run -t --rm --name ${TEST_NAME} --network=host + --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-onboarding.sh + + # Run end-to-end test: test connectivity with ping before creating ACL + - export TEST_CLIENT1_FW=$(containerlab exec --name acl_end2end --label clab-node-name=client1 --cmd 'ping -n -c3 172.16.11.1' --format json) + - echo $TEST_CLIENT1_FW + - echo $TEST_CLIENT1_FW | grep -E '3 packets transmitted, 3 received, 0\% packet loss' + - export TEST_CLIENT1_DC=$(containerlab exec --name acl_end2end --label clab-node-name=client1 --cmd 'ping -n -c3 172.16.10.10' --format json) + - echo $TEST_CLIENT1_DC + - echo $TEST_CLIENT1_DC | grep -E '3 packets transmitted, 3 received, 0\% packet loss' + + - export TEST_CLIENT2_FW=$(containerlab exec --name acl_end2end --label clab-node-name=client2 --cmd 'ping -n -c3 172.16.12.1' --format json) + - echo $TEST_CLIENT2_FW + - echo $TEST_CLIENT2_FW | grep -E '3 packets transmitted, 3 received, 0\% packet loss' + - export TEST_CLIENT2_DC=$(containerlab exec --name acl_end2end --label clab-node-name=client2 --cmd 'ping -n -c3 172.16.10.10' --format json) + - echo $TEST_CLIENT2_DC + - echo $TEST_CLIENT2_DC | grep -E '3 packets transmitted, 3 received, 0\% packet loss' + + # Run end-to-end test: create ACLs + - > + docker run -t --rm --name ${TEST_NAME} --network=host + --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-acl-create.sh + + # Run end-to-end test: test connectivity with ping after creating ACL + - export TEST_CLIENT1_FW=$(containerlab exec --name acl_end2end --label clab-node-name=client1 --cmd 'ping -n -c3 172.16.11.1' --format json) + - echo $TEST_CLIENT1_FW + - echo $TEST_CLIENT1_FW | grep -E '3 packets transmitted, 3 received, 0\% packet loss' + - export TEST_CLIENT1_DC=$(containerlab exec --name acl_end2end --label clab-node-name=client1 --cmd 'ping -n -c3 172.16.10.10' --format json) + - echo $TEST_CLIENT1_DC + - echo $TEST_CLIENT1_DC | grep -E '3 packets transmitted, 0 received, 100\% packet loss' + + - export TEST_CLIENT2_FW=$(containerlab exec --name acl_end2end --label clab-node-name=client2 --cmd 'ping -n -c3 172.16.12.1' --format json) + - echo $TEST_CLIENT2_FW + - echo $TEST_CLIENT2_FW | grep -E '3 packets transmitted, 3 received, 0\% packet loss' + - export TEST_CLIENT2_DC=$(containerlab exec --name acl_end2end --label clab-node-name=client2 --cmd 'ping -n -c3 172.16.10.10' --format json) + - echo $TEST_CLIENT2_DC + - echo $TEST_CLIENT2_DC | grep -E '3 packets transmitted, 3 received, 0\% packet loss' + + # Run end-to-end test: delete ACLs + - > + docker run -t --rm --name ${TEST_NAME} --network=host + --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-acl-delete.sh + + # Run end-to-end test: test connectivity with ping after deleting ACL + - export TEST_CLIENT1_FW=$(containerlab exec --name acl_end2end --label clab-node-name=client1 --cmd 'ping -n -c3 172.16.11.1' --format json) + - echo $TEST_CLIENT1_FW + - echo $TEST_CLIENT1_FW | grep -E '3 packets transmitted, 3 received, 0\% packet loss' + - export TEST_CLIENT1_DC=$(containerlab exec --name acl_end2end --label clab-node-name=client1 --cmd 'ping -n -c3 172.16.10.10' --format json) + - echo $TEST_CLIENT1_DC + - echo $TEST_CLIENT1_DC | grep -E '3 packets transmitted, 3 received, 0\% packet loss' + + - export TEST_CLIENT2_FW=$(containerlab exec --name acl_end2end --label clab-node-name=client2 --cmd 'ping -n -c3 172.16.12.1' --format json) + - echo $TEST_CLIENT2_FW + - echo $TEST_CLIENT2_FW | grep -E '3 packets transmitted, 3 received, 0\% packet loss' + - export TEST_CLIENT2_DC=$(containerlab exec --name acl_end2end --label clab-node-name=client2 --cmd 'ping -n -c3 172.16.10.10' --format json) + - echo $TEST_CLIENT2_DC + - echo $TEST_CLIENT2_DC | grep -E '3 packets transmitted, 3 received, 0\% packet loss' + + # Run end-to-end test: cleanup scenario + - > + docker run -t --rm --name ${TEST_NAME} --network=host + --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-cleanup.sh + + after_script: + # Dump configuration of the firewall (on after_script) + - containerlab exec --name acl_end2end --label clab-node-name=firewall --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + + # Dump TeraFlowSDN component logs + - source src/tests/${TEST_NAME}/deploy_specs.sh + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/deviceservice -c server + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/pathcompservice -c frontend + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/serviceservice -c server + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/nbiservice -c server + + # Clean up + - RUNNER_PATH=`pwd` + #- cd $PWD/src/tests/${TEST_NAME} + - cd /tmp/clab/${TEST_NAME} + - containerlab destroy --topo acl_end2end.clab.yml --cleanup || true + - sudo rm -rf clab-acl_end2end/ .acl_end2end.clab.yml.bak || true + - cd $RUNNER_PATH + - kubectl delete namespaces tfs || true + - docker ps --all --quiet | xargs --no-run-if-empty docker stop + - docker container prune --force + - docker ps --all --quiet | xargs --no-run-if-empty docker rm --force + - docker network prune --force + - docker volume prune --all --force + - docker image prune --force + + #coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' + - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' + artifacts: + when: always + reports: + junit: ./src/tests/${TEST_NAME}/report_*.xml diff --git a/src/tests/acl_end2end/Dockerfile b/src/tests/acl_end2end/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..3e3828d0b5c246388bda21c1008b7dc7c5363244 --- /dev/null +++ b/src/tests/acl_end2end/Dockerfile @@ -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 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 + +# Get generic Python packages +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 +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/tests/acl_end2end +WORKDIR /var/teraflow/tests/acl_end2end +COPY src/tests/acl_end2end/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/__init__.py ./__init__.py +COPY src/common/*.py ./common/ +COPY src/common/tests/. ./common/tests/ +COPY src/common/tools/. ./common/tools/ +COPY src/context/__init__.py context/__init__.py +COPY src/context/client/. context/client/ +COPY src/device/__init__.py device/__init__.py +COPY src/device/client/. device/client/ +COPY src/monitoring/__init__.py monitoring/__init__.py +COPY src/monitoring/client/. monitoring/client/ +COPY src/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/vnt_manager/__init__.py vnt_manager/__init__.py +COPY src/vnt_manager/client/. vnt_manager/client/ +COPY src/tests/*.py ./tests/ +COPY src/tests/acl_end2end/__init__.py ./tests/acl_end2end/__init__.py +COPY src/tests/acl_end2end/data/. ./tests/acl_end2end/data/ +COPY src/tests/acl_end2end/tests/. ./tests/acl_end2end/tests/ +COPY src/tests/acl_end2end/scripts/. ./ + +RUN apt-get --yes --quiet --quiet update && \ + apt-get --yes --quiet --quiet install tree && \ + rm -rf /var/lib/apt/lists/* + +RUN tree -la /var/teraflow diff --git a/src/tests/acl_end2end/README.md b/src/tests/acl_end2end/README.md new file mode 100644 index 0000000000000000000000000000000000000000..fe3718bea09ecba01022c1f53604ece04dd2acf8 --- /dev/null +++ b/src/tests/acl_end2end/README.md @@ -0,0 +1,123 @@ +# Control an Arista Firewall through TeraFlowSDN + +## Emulated DataPlane Deployment +- ContainerLab +- Scenario +- Descriptor + +## TeraFlowSDN Deployment +```bash +cd ~/tfs-ctrl +source ~/tfs-ctrl/src/tests/acl_end2end/deploy_specs.sh +./deploy/all.sh +``` + +# ContainerLab - Arista cEOS - Commands + +## Download and install ContainerLab +```bash +sudo bash -c "$(curl -sL https://get.containerlab.dev)" -- -v 0.59.0 +``` + +## Download Arista cEOS image and create Docker image +```bash +cd ~/tfs-ctrl/src/tests/acl_end2end/ +docker import arista/cEOS64-lab-4.32.2F.tar ceos:4.32.2F +``` + +## Deploy scenario +```bash +cd ~/tfs-ctrl/src/tests/acl_end2end/ +sudo containerlab deploy --topo acl_end2end.clab.yml +``` + +## Inspect scenario +```bash +cd ~/tfs-ctrl/src/tests/acl_end2end/ +sudo containerlab inspect --topo acl_end2end.clab.yml +``` + +## Destroy scenario +```bash +cd ~/tfs-ctrl/src/tests/acl_end2end/ +sudo containerlab destroy --topo acl_end2end.clab.yml +sudo rm -rf clab-acl_end2end/ .acl_end2end.clab.yml.bak +``` + +## Access cEOS Bash/CLI +```bash +docker exec -it clab-acl_end2end-firewall bash +docker exec -it clab-acl_end2end-firewall Cli +docker exec -it clab-acl_end2end-client1 bash +docker exec -it clab-acl_end2end-client2 bash +docker exec -it clab-acl_end2end-dc bash +``` + +## Configure ContainerLab clients +```bash +docker exec -it clab-acl_end2end-dc bash + ip address add 172.16.10.10/24 dev eth1 + ip route add 172.16.11.0/24 via 172.16.10.1 + ip route add 172.16.12.0/24 via 172.16.10.1 + ping 172.16.11.10 + ping 172.16.12.10 + +docker exec -it clab-acl_end2end-client1 bash + ip address add 172.16.11.10/24 dev eth1 + ip route add 172.16.10.0/24 via 172.16.11.1 + ip route add 172.16.12.0/24 via 172.16.11.1 + ping 172.16.10.10 + + +docker exec -it clab-acl_end2end-client2 bash + ip address add 172.16.12.10/24 dev eth1 + ip route add 172.16.10.0/24 via 172.16.12.1 + ip route add 172.16.11.0/24 via 172.16.12.1 + ping 172.16.10.10 +``` + +## Install gNMIc +```bash +sudo bash -c "$(curl -sL https://get-gnmic.kmrd.dev)" +``` + +## gNMI Capabilities request +```bash +gnmic --address clab-acl_end2end-firewall --port 6030 --username admin --password admin --insecure capabilities +``` + +## gNMI Get request +```bash +gnmic --address clab-acl_end2end-firewall --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path / > firewall.json +gnmic --address clab-acl_end2end-firewall --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path /interfaces/interface > firewall-ifaces.json +``` + +## gNMI Set request +```bash +gnmic --address clab-acl_end2end-firewall --port 6030 --username admin --password admin --insecure --encoding json_ietf set --update-path /system/config/hostname --update-value srl11 +gnmic --address clab-acl_end2end-firewall --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path /system/config/hostname +``` + +## Subscribe request +```bash +gnmic --address clab-acl_end2end-firewall --port 6030 --username admin --password admin --insecure --encoding json_ietf subscribe --path /interfaces/interface[name=Management0]/state/ + +# In another terminal, you can generate traffic opening SSH connection +ssh admin@clab-acl_end2end-firewall +``` + +# Check configurations done: +```bash +gnmic --address clab-acl_end2end-firewall --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path '/network-instances' > firewall-nis.json +gnmic --address clab-acl_end2end-firewall --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path '/interfaces' > firewall-ifs.json +``` + +# ACL payload +`data/ietf-acl.json` contains an example ACL that blocks ICMP from client1 (172.16.11.10) to the DC (172.16.10.10) on the firewall ingress interface Ethernet11 while permitting other traffic. Post it to `/restconf/data/device=firewall/ietf-access-control-list:acls`. + +# Delete elements: +```bash +--address clab-acl_end2end-firewall --port 6030 --username admin --password admin --insecure --encoding json_ietf set --delete '/network-instances/network-instance[name=b19229e8]' +--address clab-acl_end2end-firewall --port 6030 --username admin --password admin --insecure --encoding json_ietf set --delete '/interfaces/interface[name=ethernet-1/1]/subinterfaces/subinterface[index=0]' +--address clab-acl_end2end-firewall --port 6030 --username admin --password admin --insecure --encoding json_ietf set --delete '/interfaces/interface[name=ethernet-1/2]/subinterfaces/subinterface[index=0]' +``` diff --git a/src/tests/acl_end2end/__init__.py b/src/tests/acl_end2end/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..3ccc21c7db78aac26daa1f8c5ff8e1ffd3f35460 --- /dev/null +++ b/src/tests/acl_end2end/__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/acl_end2end/clab/acl_end2end.clab.yml b/src/tests/acl_end2end/clab/acl_end2end.clab.yml new file mode 100644 index 0000000000000000000000000000000000000000..737dd1f9db7ca7a96ff4fde6e95dae893392f1e6 --- /dev/null +++ b/src/tests/acl_end2end/clab/acl_end2end.clab.yml @@ -0,0 +1,74 @@ +# 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. + +# TFS - Arista devices + Linux clients + +name: acl_end2end + +mgmt: + network: mgmt-net + ipv4-subnet: 172.20.20.0/24 + +topology: + kinds: + arista_ceos: + kind: arista_ceos + #image: ceos:4.30.4M + #image: ceos:4.31.2F + #image: ceos:4.31.5M # tested, works + #image: ceos:4.32.0F + image: ceos:4.32.2F # tested, works + #image: ceos:4.32.2.1F + #image: ceos:4.33.1F # does not work, libyang.util.LibyangError: failed to parse data tree: No module named "openconfig-platform-healthz" in the context. + linux: + kind: linux + image: ghcr.io/hellt/network-multitool:latest + + nodes: + firewall: + kind: arista_ceos + mgmt-ipv4: 172.20.20.101 + startup-config: firewall-startup.cfg + + dc: + kind: linux + mgmt-ipv4: 172.20.20.200 + exec: + - ip link set address 00:c1:ab:00:0a:0a dev eth1 + - ip address add 172.16.10.10/24 dev eth1 + - ip route add 172.16.11.0/24 via 172.16.10.1 + - ip route add 172.16.12.0/24 via 172.16.10.1 + + client1: + kind: linux + mgmt-ipv4: 172.20.20.201 + exec: + - ip link set address 00:c1:ab:00:0b:0a dev eth1 + - ip address add 172.16.11.10/24 dev eth1 + - ip route add 172.16.10.0/24 via 172.16.11.1 + - ip route add 172.16.12.0/24 via 172.16.11.1 + + client2: + kind: linux + mgmt-ipv4: 172.20.20.202 + exec: + - ip link set address 00:c1:ab:00:0c:0a dev eth1 + - ip address add 172.16.12.10/24 dev eth1 + - ip route add 172.16.10.0/24 via 172.16.12.1 + - ip route add 172.16.11.0/24 via 172.16.12.1 + + links: + - endpoints: ["firewall:eth10", "dc:eth1" ] + - endpoints: ["firewall:eth11", "client1:eth1"] + - endpoints: ["firewall:eth12", "client2:eth1"] diff --git a/src/tests/acl_end2end/clab/firewall-startup.cfg b/src/tests/acl_end2end/clab/firewall-startup.cfg new file mode 100644 index 0000000000000000000000000000000000000000..274ecc71e2d4c463d17c6154481e713c341cfdef --- /dev/null +++ b/src/tests/acl_end2end/clab/firewall-startup.cfg @@ -0,0 +1,59 @@ +! device: firewall (cEOSLab, EOS-4.32.2F-38195967.4322F (engineering build)) +! +no aaa root +! +username admin privilege 15 role network-admin secret sha512 $6$OmfaAwJRg/r44r5U$9Fca1O1G6Bgsd4NKwSyvdRJcHHk71jHAR3apDWAgSTN/t/j1iroEhz5J36HjWjOF/jEVC/R8Wa60VmbX6.cr70 +! +management api http-commands + no shutdown +! +no service interface inactive port-id allocation disabled +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname firewall +! +spanning-tree mode mstp +! +system l1 + unsupported speed action error + unsupported error-correction action error +! +management api gnmi + transport grpc default +! +management api netconf + transport ssh default +! +interface Ethernet10 + no switchport + ip address 172.16.10.1/24 + no shutdown +! +interface Ethernet11 + no switchport + ip address 172.16.11.1/24 + no shutdown +! +interface Ethernet12 + no switchport + ip address 172.16.12.1/24 + no shutdown +! +interface Management0 + ip address 172.20.20.101/24 +! +ip routing +! +ip route 0.0.0.0/0 172.20.20.1 +! +router multicast + ipv4 + software-forwarding kernel + ! + ipv6 + software-forwarding kernel +! +end diff --git a/src/tests/acl_end2end/data/ietf-acl.json b/src/tests/acl_end2end/data/ietf-acl.json new file mode 100644 index 0000000000000000000000000000000000000000..39ea4ab85da701255a260df40bf8cd0d1471f05b --- /dev/null +++ b/src/tests/acl_end2end/data/ietf-acl.json @@ -0,0 +1,86 @@ +{ + "ietf-access-control-list:acls": { + "acl": [ + { + "name": "eth10-permit-other", + "type": "ipv4-acl-type", + "aces": { + "ace": [{ + "name": "eth10-permit-other", + "matches": { + "ingress-interface": "Ethernet10" + }, + "actions": {"forwarding": "accept"} + }] + } + }, + { + "name": "eth11-block-ping-permit-other", + "type": "ipv4-acl-type", + "aces": { + "ace": [{ + "name": "eth11-block-ping", + "matches": { + "ingress-interface": "Ethernet11", + "ipv4": { + "protocol": 1, + "source-ipv4-network": "172.16.11.10/32", + "destination-ipv4-network": "172.16.10.10/32" + }, + "icmp": {} + }, + "actions": {"forwarding": "reject"} + }, + { + "name": "eth11-permit-other", + "matches": { + "ingress-interface": "Ethernet11" + }, + "actions": {"forwarding": "accept"} + }] + } + }, + { + "name": "eth12-permit-other", + "type": "ipv4-acl-type", + "aces": { + "ace": [{ + "name": "eth12-permit-other", + "matches": { + "ingress-interface": "Ethernet12" + }, + "actions": {"forwarding": "accept"} + }] + } + } + ], + "attachment-points": { + "interface": [ + { + "interface-id": "Ethernet10", + "ingress": { + "acl-sets": { + "acl-set": [{"name": "eth10-permit-other"}] + } + } + }, + { + "interface-id": "Ethernet11", + "ingress": { + "acl-sets": { + "acl-set": [{"name": "eth11-block-ping-permit-other"}] + } + } + }, + { + "interface-id": "Ethernet12", + "ingress": { + "acl-sets": { + "acl-set": [{"name": "eth12-permit-other"}] + } + } + } + ] + } + } +} diff --git a/src/tests/acl_end2end/data/tfs-topology.json b/src/tests/acl_end2end/data/tfs-topology.json new file mode 100644 index 0000000000000000000000000000000000000000..6875b5075b6ff61db4c7897a377a6b2d10b99ddd --- /dev/null +++ b/src/tests/acl_end2end/data/tfs-topology.json @@ -0,0 +1,100 @@ +{ + "contexts": [ + {"context_id": {"context_uuid": {"uuid": "admin"}}} + ], + "topologies": [ + {"topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}}} + ], + "devices": [ + { + "device_id": {"device_uuid": {"uuid": "client1"}}, "device_type": "emu-client", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": {"config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"uuid": "eth1", "type": "copper"}, {"uuid": "int", "type": "copper"} + ]}}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "client2"}}, "device_type": "emu-client", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": {"config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"uuid": "eth1", "type": "copper"}, {"uuid": "int", "type": "copper"} + ]}}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "dc"}}, "device_type": "emu-datacenter", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": {"config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"uuid": "eth1", "type": "copper"}, {"uuid": "int", "type": "copper"} + ]}}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "firewall"}}, "device_type": "packet-router", + "device_drivers": ["DEVICEDRIVER_GNMI_OPENCONFIG"], + "device_config": {"config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "172.20.20.101"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "6030"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "username": "admin", "password": "admin", "use_tls": false + }}} + ]} + } + ], + "links": [ + { + "link_id": {"link_uuid": {"uuid": "firewall/Ethernet10==dc/eth1"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "firewall"}}, "endpoint_uuid": {"uuid": "Ethernet10"}}, + {"device_id": {"device_uuid": {"uuid": "dc"}}, "endpoint_uuid": {"uuid": "eth1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "dc/eth1==firewall/Ethernet10"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "dc"}}, "endpoint_uuid": {"uuid": "eth1"}}, + {"device_id": {"device_uuid": {"uuid": "firewall"}}, "endpoint_uuid": {"uuid": "Ethernet10"}} + ] + }, + + { + "link_id": {"link_uuid": {"uuid": "firewall/Ethernet11==client1/eth1"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "firewall"}}, "endpoint_uuid": {"uuid": "Ethernet11"}}, + {"device_id": {"device_uuid": {"uuid": "client1"}}, "endpoint_uuid": {"uuid": "eth1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "client1/eth1==firewall/Ethernet11"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "client1"}}, "endpoint_uuid": {"uuid": "eth1"}}, + {"device_id": {"device_uuid": {"uuid": "firewall"}}, "endpoint_uuid": {"uuid": "Ethernet11"}} + ] + }, + + { + "link_id": {"link_uuid": {"uuid": "firewall/Ethernet12==client2/eth1"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "firewall"}}, "endpoint_uuid": {"uuid": "Ethernet12"}}, + {"device_id": {"device_uuid": {"uuid": "client2"}}, "endpoint_uuid": {"uuid": "eth1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "client2/eth1==firewall/Ethernet12"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "client2"}}, "endpoint_uuid": {"uuid": "eth1"}}, + {"device_id": {"device_uuid": {"uuid": "firewall"}}, "endpoint_uuid": {"uuid": "Ethernet12"}} + ] + } + ] +} diff --git a/src/tests/acl_end2end/deploy-scripts/clab-cli-client1.sh b/src/tests/acl_end2end/deploy-scripts/clab-cli-client1.sh new file mode 100755 index 0000000000000000000000000000000000000000..4c0a5740de15e774c4f4e76519df0e323f2ab719 --- /dev/null +++ b/src/tests/acl_end2end/deploy-scripts/clab-cli-client1.sh @@ -0,0 +1,16 @@ +#!/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. + +docker exec -it clab-acl_end2end-client1 bash diff --git a/src/tests/acl_end2end/deploy-scripts/clab-cli-client2.sh b/src/tests/acl_end2end/deploy-scripts/clab-cli-client2.sh new file mode 100644 index 0000000000000000000000000000000000000000..54ca743a4ebd7d2f86d3b616e138b64a8a13b600 --- /dev/null +++ b/src/tests/acl_end2end/deploy-scripts/clab-cli-client2.sh @@ -0,0 +1,16 @@ +#!/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. + +docker exec -it clab-acl_end2end-client2 bash diff --git a/src/tests/acl_end2end/deploy-scripts/clab-cli-dc.sh b/src/tests/acl_end2end/deploy-scripts/clab-cli-dc.sh new file mode 100755 index 0000000000000000000000000000000000000000..bde012b370fddb84a7ce9b50e26100b4b5959028 --- /dev/null +++ b/src/tests/acl_end2end/deploy-scripts/clab-cli-dc.sh @@ -0,0 +1,16 @@ +#!/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. + +docker exec -it clab-acl_end2end-dc bash diff --git a/src/tests/acl_end2end/deploy-scripts/clab-cli-firewall.sh b/src/tests/acl_end2end/deploy-scripts/clab-cli-firewall.sh new file mode 100755 index 0000000000000000000000000000000000000000..ad5ab0ce77e14298825d938744f3f3f20ab7a962 --- /dev/null +++ b/src/tests/acl_end2end/deploy-scripts/clab-cli-firewall.sh @@ -0,0 +1,16 @@ +#!/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. + +docker exec -it clab-acl_end2end-firewall Cli diff --git a/src/tests/acl_end2end/deploy-scripts/clab-deploy.sh b/src/tests/acl_end2end/deploy-scripts/clab-deploy.sh new file mode 100755 index 0000000000000000000000000000000000000000..7738f011dcad4d11ffd2d99273ba8e4e0381baf0 --- /dev/null +++ b/src/tests/acl_end2end/deploy-scripts/clab-deploy.sh @@ -0,0 +1,17 @@ +#!/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 ~/tfs-ctrl/src/tests/acl_end2end +sudo containerlab deploy --topo clab/acl_end2end.clab.yml diff --git a/src/tests/p4-fabric-tna/run_test_03a_service_provision_l2.sh b/src/tests/acl_end2end/deploy-scripts/clab-destroy.sh similarity index 79% rename from src/tests/p4-fabric-tna/run_test_03a_service_provision_l2.sh rename to src/tests/acl_end2end/deploy-scripts/clab-destroy.sh index 618a3457f481a0cbe23888dd7e0d13e4f36dc68a..efcfcc09d92334510a82549f3256f22188d597c5 100755 --- a/src/tests/p4-fabric-tna/run_test_03a_service_provision_l2.sh +++ b/src/tests/acl_end2end/deploy-scripts/clab-destroy.sh @@ -13,5 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_l2.py +cd ~/tfs-ctrl/src/tests/acl_end2end +sudo containerlab destroy --topo clab/acl_end2end.clab.yml +sudo rm -rf clab/clab-acl_end2end/ clab/.acl_end2end.clab.yml.bak diff --git a/src/tests/acl_end2end/deploy-scripts/clab-inspect.sh b/src/tests/acl_end2end/deploy-scripts/clab-inspect.sh new file mode 100755 index 0000000000000000000000000000000000000000..bec97444d7b38dc7d957149e82201800215c4674 --- /dev/null +++ b/src/tests/acl_end2end/deploy-scripts/clab-inspect.sh @@ -0,0 +1,17 @@ +#!/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 ~/tfs-ctrl/src/tests/acl_end2end +sudo containerlab inspect --topo acl_end2end.clab.yml diff --git a/src/tests/acl_end2end/deploy_specs.sh b/src/tests/acl_end2end/deploy_specs.sh new file mode 100755 index 0000000000000000000000000000000000000000..72cd25b58a02f442838bab866cc969680c073ebc --- /dev/null +++ b/src/tests/acl_end2end/deploy_specs.sh @@ -0,0 +1,208 @@ +#!/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. + + +# ----- TeraFlowSDN ------------------------------------------------------------ + +# Set the URL of the internal MicroK8s Docker registry where the images will be uploaded to. +export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/" + +# Set the list of components, separated by spaces, you want to build images for, and deploy. +#export TFS_COMPONENTS="context device pathcomp service slice nbi webui load_generator" +export TFS_COMPONENTS="context device pathcomp service nbi" + +# Uncomment to activate Monitoring (old) +#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring" + +# Uncomment to activate Monitoring Framework (new) +#export TFS_COMPONENTS="${TFS_COMPONENTS} kpi_manager kpi_value_writer kpi_value_api telemetry analytics automation" + +# Uncomment to activate QoS Profiles +#export TFS_COMPONENTS="${TFS_COMPONENTS} qos_profile" + +# Uncomment to activate BGP-LS Speaker +#export TFS_COMPONENTS="${TFS_COMPONENTS} bgpls_speaker" + +# Uncomment to activate Optical Controller +# To manage optical connections, "service" requires "opticalcontroller" to be deployed +# before "service", thus we "hack" the TFS_COMPONENTS environment variable prepending the +# "opticalcontroller" only if "service" is already in TFS_COMPONENTS, and re-export it. +#if [[ "$TFS_COMPONENTS" == *"service"* ]]; then +# BEFORE="${TFS_COMPONENTS% service*}" +# AFTER="${TFS_COMPONENTS#* service}" +# export TFS_COMPONENTS="${BEFORE} opticalcontroller service ${AFTER}" +#fi + +# Uncomment to activate ZTP +#export TFS_COMPONENTS="${TFS_COMPONENTS} ztp" + +# Uncomment to activate Policy Manager +#export TFS_COMPONENTS="${TFS_COMPONENTS} policy" + +# Uncomment to activate Optical CyberSecurity +#export TFS_COMPONENTS="${TFS_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector opticalattackmanager" + +# Uncomment to activate L3 CyberSecurity +#export TFS_COMPONENTS="${TFS_COMPONENTS} l3_attackmitigator l3_centralizedattackdetector" + +# Uncomment to activate TE +#export TFS_COMPONENTS="${TFS_COMPONENTS} te" + +# Uncomment to activate Forecaster +#export TFS_COMPONENTS="${TFS_COMPONENTS} forecaster" + +# Uncomment to activate E2E Orchestrator +#export TFS_COMPONENTS="${TFS_COMPONENTS} e2e_orchestrator" + +# Uncomment to activate DLT and Interdomain +#export TFS_COMPONENTS="${TFS_COMPONENTS} interdomain dlt" +#if [[ "$TFS_COMPONENTS" == *"dlt"* ]]; then +# export KEY_DIRECTORY_PATH="src/dlt/gateway/keys/priv_sk" +# export CERT_DIRECTORY_PATH="src/dlt/gateway/keys/cert.pem" +# export TLS_CERT_PATH="src/dlt/gateway/keys/ca.crt" +#fi + +# Uncomment to activate QKD App +# To manage QKD Apps, "service" requires "qkd_app" to be deployed +# before "service", thus we "hack" the TFS_COMPONENTS environment variable prepending the +# "qkd_app" only if "service" is already in TFS_COMPONENTS, and re-export it. +#if [[ "$TFS_COMPONENTS" == *"service"* ]]; then +# BEFORE="${TFS_COMPONENTS% service*}" +# AFTER="${TFS_COMPONENTS#* service}" +# export TFS_COMPONENTS="${BEFORE} qkd_app service ${AFTER}" +#fi + + +# Set the tag you want to use for your images. +export TFS_IMAGE_TAG="dev" + +# Set the name of the Kubernetes namespace to deploy TFS to. +export TFS_K8S_NAMESPACE="tfs" + +# Set additional manifest files to be applied after the deployment +export TFS_EXTRA_MANIFESTS="manifests/nginx_ingress_http.yaml" + +# Uncomment to monitor performance of components +#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/servicemonitors.yaml" + +# Uncomment when deploying Optical CyberSecurity +#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/cachingservice.yaml" + +# Set the new Grafana admin password +export TFS_GRAFANA_PASSWORD="admin123+" + +# Disable skip-build flag to rebuild the Docker images. +export TFS_SKIP_BUILD="" + + +# ----- CockroachDB ------------------------------------------------------------ + +# Set the namespace where CockroackDB will be deployed. +export CRDB_NAMESPACE="crdb" + +# Set the external port CockroackDB Postgre SQL interface will be exposed to. +export CRDB_EXT_PORT_SQL="26257" + +# Set the external port CockroackDB HTTP Mgmt GUI interface will be exposed to. +export CRDB_EXT_PORT_HTTP="8081" + +# Set the database username to be used by Context. +export CRDB_USERNAME="tfs" + +# Set the database user's password to be used by Context. +export CRDB_PASSWORD="tfs123" + +# Set CockroachDB installation mode to 'single'. This option is convenient for development and testing. +# See ./deploy/all.sh or ./deploy/crdb.sh for additional details +export CRDB_DEPLOY_MODE="single" + +# Disable flag for dropping database, if it exists. +export CRDB_DROP_DATABASE_IF_EXISTS="YES" + +# Disable flag for re-deploying CockroachDB from scratch. +export CRDB_REDEPLOY="" + + +# ----- NATS ------------------------------------------------------------------- + +# Set the namespace where NATS will be deployed. +export NATS_NAMESPACE="nats" + +# Set the external port NATS Client interface will be exposed to. +export NATS_EXT_PORT_CLIENT="4222" + +# Set the external port NATS HTTP Mgmt GUI interface will be exposed to. +export NATS_EXT_PORT_HTTP="8222" + +# Set NATS installation mode to 'single'. This option is convenient for development and testing. +# See ./deploy/all.sh or ./deploy/nats.sh for additional details +export NATS_DEPLOY_MODE="single" + +# Disable flag for re-deploying NATS from scratch. +export NATS_REDEPLOY="" + + +# ----- QuestDB ---------------------------------------------------------------- + +# Set the namespace where QuestDB will be deployed. +export QDB_NAMESPACE="qdb" + +# Set the external port QuestDB Postgre SQL interface will be exposed to. +export QDB_EXT_PORT_SQL="8812" + +# Set the external port QuestDB Influx Line Protocol interface will be exposed to. +export QDB_EXT_PORT_ILP="9009" + +# Set the external port QuestDB HTTP Mgmt GUI interface will be exposed to. +export QDB_EXT_PORT_HTTP="9000" + +# Set the database username to be used for QuestDB. +export QDB_USERNAME="admin" + +# Set the database user's password to be used for QuestDB. +export QDB_PASSWORD="quest" + +# Set the table name to be used by Monitoring for KPIs. +export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis" + +# Set the table name to be used by Slice for plotting groups. +export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups" + +# Disable flag for dropping tables if they exist. +export QDB_DROP_TABLES_IF_EXIST="YES" + +# Disable flag for re-deploying QuestDB from scratch. +export QDB_REDEPLOY="" + + +# ----- K8s Observability ------------------------------------------------------ + +# Set the external port Prometheus Mgmt HTTP GUI interface will be exposed to. +export PROM_EXT_PORT_HTTP="9090" + +# Set the external port Grafana HTTP Dashboards will be exposed to. +export GRAF_EXT_PORT_HTTP="3000" + + +# ----- Apache Kafka ----------------------------------------------------------- + +# Set the namespace where Apache Kafka will be deployed. +export KFK_NAMESPACE="kafka" + +# Set the port Apache Kafka server will be exposed to. +export KFK_SERVER_PORT="9092" + +# Set the flag to YES for redeploying of Apache Kafka +export KFK_REDEPLOY="" diff --git a/src/tests/acl_end2end/redeploy-tfs.sh b/src/tests/acl_end2end/redeploy-tfs.sh new file mode 100755 index 0000000000000000000000000000000000000000..614cbf2a79d88020bca900c2a796317265ae9041 --- /dev/null +++ b/src/tests/acl_end2end/redeploy-tfs.sh @@ -0,0 +1,17 @@ +#!/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. + +source ~/tfs-ctrl/src/tests/acl_end2end/deploy_specs.sh +./deploy/all.sh diff --git a/src/tests/acl_end2end/requirements.in b/src/tests/acl_end2end/requirements.in new file mode 100644 index 0000000000000000000000000000000000000000..5c92783a232a5bbe18b4dd6d0e6735e3ce8414c2 --- /dev/null +++ b/src/tests/acl_end2end/requirements.in @@ -0,0 +1,15 @@ +# 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. + +requests==2.27.* diff --git a/src/tests/acl_end2end/scripts/run-acl-create.sh b/src/tests/acl_end2end/scripts/run-acl-create.sh new file mode 100755 index 0000000000000000000000000000000000000000..97b8da8dbd52bc576df3c91c012175001ed10f62 --- /dev/null +++ b/src/tests/acl_end2end/scripts/run-acl-create.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. + +source /var/teraflow/tfs_runtime_env_vars.sh +export PYTHONPATH=/var/teraflow +pytest --verbose --log-level=INFO \ + --junitxml=/opt/results/report_acl_create.xml \ + /var/teraflow/tests/acl_end2end/tests/test_acl_create.py diff --git a/src/tests/acl_end2end/scripts/run-acl-delete.sh b/src/tests/acl_end2end/scripts/run-acl-delete.sh new file mode 100755 index 0000000000000000000000000000000000000000..c3450174a7a5fabed6d2bba485e9a4bb251cc01a --- /dev/null +++ b/src/tests/acl_end2end/scripts/run-acl-delete.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. + +source /var/teraflow/tfs_runtime_env_vars.sh +export PYTHONPATH=/var/teraflow +pytest --verbose --log-level=INFO \ + --junitxml=/opt/results/report_acl_delete.xml \ + /var/teraflow/tests/acl_end2end/tests/test_acl_delete.py diff --git a/src/tests/acl_end2end/scripts/run-cleanup.sh b/src/tests/acl_end2end/scripts/run-cleanup.sh new file mode 100755 index 0000000000000000000000000000000000000000..65329f32f958f68aed33f156ab557e4af6028b3e --- /dev/null +++ b/src/tests/acl_end2end/scripts/run-cleanup.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. + +source /var/teraflow/tfs_runtime_env_vars.sh +export PYTHONPATH=/var/teraflow +pytest --verbose --log-level=INFO \ + --junitxml=/opt/results/report_cleanup.xml \ + /var/teraflow/tests/acl_end2end/tests/test_cleanup.py diff --git a/src/tests/acl_end2end/scripts/run-onboarding.sh b/src/tests/acl_end2end/scripts/run-onboarding.sh new file mode 100755 index 0000000000000000000000000000000000000000..c01580ac4b6cd318e4beafb4c6451ec0b9fd3c59 --- /dev/null +++ b/src/tests/acl_end2end/scripts/run-onboarding.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. + +source /var/teraflow/tfs_runtime_env_vars.sh +export PYTHONPATH=/var/teraflow +pytest --verbose --log-level=INFO \ + --junitxml=/opt/results/report_onboarding.xml \ + /var/teraflow/tests/acl_end2end/tests/test_onboarding.py diff --git a/src/tests/Fixtures.py b/src/tests/acl_end2end/tests/Fixtures.py similarity index 86% rename from src/tests/Fixtures.py rename to src/tests/acl_end2end/tests/Fixtures.py index 687642762e6a1faf3cc61282ade13099171dde9a..5997e58c8100d8b89f2d9287fc57b9b3d1434ac4 100644 --- a/src/tests/Fixtures.py +++ b/src/tests/acl_end2end/tests/Fixtures.py @@ -16,16 +16,8 @@ import pytest from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from monitoring.client.MonitoringClient import MonitoringClient -from e2e_orchestrator.client.E2EOrchestratorClient import E2EOrchestratorClient from service.client.ServiceClient import ServiceClient - -@pytest.fixture(scope='session') -def service_client(): - _client = ServiceClient() - yield _client - _client.close() - @pytest.fixture(scope='session') def context_client(): _client = ContextClient() @@ -45,7 +37,7 @@ def monitoring_client(): _client.close() @pytest.fixture(scope='session') -def e2eorchestrator_client(): - _client = E2EOrchestratorClient() +def service_client(): + _client = ServiceClient() yield _client _client.close() diff --git a/src/tests/acl_end2end/tests/Tools.py b/src/tests/acl_end2end/tests/Tools.py new file mode 100644 index 0000000000000000000000000000000000000000..bbee845cd57f8dcb57e19f1f8ecc71940e99df30 --- /dev/null +++ b/src/tests/acl_end2end/tests/Tools.py @@ -0,0 +1,109 @@ +# 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, logging, requests +from typing import Any, Dict, List, Optional, Set, Union +from common.Constants import ServiceNameEnum +from common.Settings import get_service_host, get_service_port_http + +NBI_ADDRESS = get_service_host(ServiceNameEnum.NBI) +NBI_PORT = get_service_port_http(ServiceNameEnum.NBI) +NBI_USERNAME = 'admin' +NBI_PASSWORD = 'admin' +NBI_BASE_URL = '' + +class RestRequestMethod(enum.Enum): + GET = 'get' + POST = 'post' + PUT = 'put' + PATCH = 'patch' + DELETE = 'delete' + +EXPECTED_STATUS_CODES : Set[int] = { + requests.codes['OK' ], + requests.codes['CREATED' ], + requests.codes['ACCEPTED' ], + requests.codes['NO_CONTENT'], +} + +def do_rest_request( + method : RestRequestMethod, url : str, body : Optional[Any] = None, timeout : int = 10, + allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES, + logger : Optional[logging.Logger] = None +) -> Optional[Union[Dict, List]]: + request_url = 'http://{:s}:{:s}@{:s}:{:d}{:s}{:s}'.format( + NBI_USERNAME, NBI_PASSWORD, NBI_ADDRESS, NBI_PORT, str(NBI_BASE_URL), url + ) + + if logger is not None: + msg = 'Request: {:s} {:s}'.format(str(method.value).upper(), str(request_url)) + if body is not None: msg += ' body={:s}'.format(str(body)) + logger.warning(msg) + reply = requests.request(method.value, request_url, timeout=timeout, json=body, allow_redirects=allow_redirects) + if logger is not None: + logger.warning('Reply: {:s}'.format(str(reply.text))) + assert reply.status_code in expected_status_codes, 'Reply failed with status code {:d}'.format(reply.status_code) + + if reply.content and len(reply.content) > 0: return reply.json() + return None + +def do_rest_get_request( + url : str, body : Optional[Any] = None, timeout : int = 10, + allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES, + logger : Optional[logging.Logger] = None +) -> Optional[Union[Dict, List]]: + return do_rest_request( + RestRequestMethod.GET, url, body=body, timeout=timeout, allow_redirects=allow_redirects, + expected_status_codes=expected_status_codes, logger=logger + ) + +def do_rest_post_request( + url : str, body : Optional[Any] = None, timeout : int = 10, + allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES, + logger : Optional[logging.Logger] = None +) -> Optional[Union[Dict, List]]: + return do_rest_request( + RestRequestMethod.POST, url, body=body, timeout=timeout, allow_redirects=allow_redirects, + expected_status_codes=expected_status_codes, logger=logger + ) + +def do_rest_put_request( + url : str, body : Optional[Any] = None, timeout : int = 10, + allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES, + logger : Optional[logging.Logger] = None +) -> Optional[Union[Dict, List]]: + return do_rest_request( + RestRequestMethod.PUT, url, body=body, timeout=timeout, allow_redirects=allow_redirects, + expected_status_codes=expected_status_codes, logger=logger + ) + +def do_rest_patch_request( + url : str, body : Optional[Any] = None, timeout : int = 10, + allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES, + logger : Optional[logging.Logger] = None +) -> Optional[Union[Dict, List]]: + return do_rest_request( + RestRequestMethod.PATCH, url, body=body, timeout=timeout, allow_redirects=allow_redirects, + expected_status_codes=expected_status_codes, logger=logger + ) + +def do_rest_delete_request( + url : str, body : Optional[Any] = None, timeout : int = 10, + allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES, + logger : Optional[logging.Logger] = None +) -> Optional[Union[Dict, List]]: + return do_rest_request( + RestRequestMethod.DELETE, url, body=body, timeout=timeout, allow_redirects=allow_redirects, + expected_status_codes=expected_status_codes, logger=logger + ) diff --git a/src/tests/acl_end2end/tests/__init__.py b/src/tests/acl_end2end/tests/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..3ccc21c7db78aac26daa1f8c5ff8e1ffd3f35460 --- /dev/null +++ b/src/tests/acl_end2end/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/tests/acl_end2end/tests/test_acl_create.py b/src/tests/acl_end2end/tests/test_acl_create.py new file mode 100644 index 0000000000000000000000000000000000000000..ff38434c22fffa8c5826d4f6c8161f3c6fafa191 --- /dev/null +++ b/src/tests/acl_end2end/tests/test_acl_create.py @@ -0,0 +1,54 @@ +# 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 +from typing import Dict, List +from .Tools import do_rest_get_request, do_rest_post_request + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +ACL_URL = '/restconf/data/device=firewall/ietf-access-control-list:acls' +ACL_GET_URL_TEMPLATE = '/restconf/data/device=firewall/ietf-access-control-list:acl={acl_name}' +ACL_FILE = os.path.join( + os.path.dirname(os.path.abspath(__file__)), '..', 'data', 'ietf-acl.json' +) + + +def load_acl_payload() -> Dict: + with open(ACL_FILE, 'r', encoding='UTF-8') as f: + return json.load(f) + +def get_acl_names(payload: Dict) -> List[str]: + return [ + acl['name'] + for acl in payload['ietf-access-control-list:acls']['acl'] + ] + + +def test_ietf_acl_create() -> None: + acl_payload = load_acl_payload() + acl_names = get_acl_names(acl_payload) + + do_rest_post_request( + ACL_URL, body=acl_payload, logger=LOGGER, + expected_status_codes={201, 204} + ) + + for acl_name in acl_names: + response = do_rest_get_request( + ACL_GET_URL_TEMPLATE.format(acl_name=acl_name), logger=LOGGER, + expected_status_codes={200} + ) + assert response is not None diff --git a/src/tests/acl_end2end/tests/test_acl_delete.py b/src/tests/acl_end2end/tests/test_acl_delete.py new file mode 100644 index 0000000000000000000000000000000000000000..c52079ec5b92320db546bde556c80da3a1936826 --- /dev/null +++ b/src/tests/acl_end2end/tests/test_acl_delete.py @@ -0,0 +1,52 @@ +# 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 +from typing import Dict, List +from .Tools import do_rest_delete_request, do_rest_get_request + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +ACL_URL = '/restconf/data/device=firewall/ietf-access-control-list:acls' +ACL_GET_URL_TEMPLATE = '/restconf/data/device=firewall/ietf-access-control-list:acl={acl_name}' +ACL_FILE = os.path.join( + os.path.dirname(os.path.abspath(__file__)), '..', 'data', 'ietf-acl.json' +) + + +def load_acl_payload() -> Dict: + with open(ACL_FILE, 'r', encoding='UTF-8') as f: + return json.load(f) + +def get_acl_names(payload: Dict) -> List[str]: + return [ + acl['name'] + for acl in payload['ietf-access-control-list:acls']['acl'] + ] + + +def test_ietf_acl_delete() -> None: + acl_payload = load_acl_payload() + acl_names = get_acl_names(acl_payload) + + for acl_name in acl_names: + do_rest_delete_request( + ACL_GET_URL_TEMPLATE.format(acl_name=acl_name), logger=LOGGER, + expected_status_codes={200, 204} + ) + do_rest_get_request( + ACL_GET_URL_TEMPLATE.format(acl_name=acl_name), logger=LOGGER, + expected_status_codes={404} + ) diff --git a/src/tests/acl_end2end/tests/test_cleanup.py b/src/tests/acl_end2end/tests/test_cleanup.py new file mode 100644 index 0000000000000000000000000000000000000000..91d90e7b46a8295061626e2ce19a9a1e4e16be2d --- /dev/null +++ b/src/tests/acl_end2end/tests/test_cleanup.py @@ -0,0 +1,50 @@ +# 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, os + +from common.Constants import DEFAULT_CONTEXT_NAME +from common.proto.context_pb2 import ContextId +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) +from common.tools.object_factory.Context import json_context_id +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +DESCRIPTOR_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'data', 'tfs-topology.json') +ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) + +def test_scenario_cleanup( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient, # pylint: disable=redefined-outer-name +) -> None: + # Verify the scenario has no services/slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 0 + assert len(response.slice_ids) == 0 + + # Load descriptors and validate the base scenario + descriptor_loader = DescriptorLoader( + descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client) + descriptor_loader.validate() + descriptor_loader.unload() + validate_empty_scenario(context_client) diff --git a/src/tests/acl_end2end/tests/test_onboarding.py b/src/tests/acl_end2end/tests/test_onboarding.py new file mode 100644 index 0000000000000000000000000000000000000000..5d652e6f58948fd20772fe756ba7eb8776f00384 --- /dev/null +++ b/src/tests/acl_end2end/tests/test_onboarding.py @@ -0,0 +1,75 @@ +# 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, os, time + +from common.Constants import DEFAULT_CONTEXT_NAME +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) +from common.tools.object_factory.Context import json_context_id +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +DESCRIPTOR_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'data', 'tfs-topology.json') +ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) + +def test_scenario_onboarding( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient, # pylint: disable=redefined-outer-name +) -> None: + validate_empty_scenario(context_client) + + descriptor_loader = DescriptorLoader( + descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client) + results = descriptor_loader.process() + check_descriptor_load_results(results, descriptor_loader) + descriptor_loader.validate() + + # Verify the scenario has no services/slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 0 + assert len(response.slice_ids) == 0 + +def test_scenario_devices_enabled( + context_client : ContextClient, # pylint: disable=redefined-outer-name +) -> None: + """ + This test validates that the devices are enabled. + """ + DEVICE_OP_STATUS_ENABLED = DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_ENABLED + + num_devices = -1 + num_devices_enabled, num_retry = 0, 0 + while (num_devices != num_devices_enabled) and (num_retry < 10): + time.sleep(1.0) + response = context_client.ListDevices(Empty()) + num_devices = len(response.devices) + num_devices_enabled = 0 + for device in response.devices: + if device.device_operational_status != DEVICE_OP_STATUS_ENABLED: continue + num_devices_enabled += 1 + LOGGER.info('Num Devices enabled: {:d}/{:d}'.format(num_devices_enabled, num_devices)) + num_retry += 1 + assert num_devices_enabled == num_devices diff --git a/src/tests/automation/Fixtures.py b/src/tests/automation/Fixtures.py new file mode 100644 index 0000000000000000000000000000000000000000..40eb419f595a69fb17d52c27a15c5a78b3ee9f30 --- /dev/null +++ b/src/tests/automation/Fixtures.py @@ -0,0 +1,55 @@ +# Copyright 2022-2026 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 automation.client.AutomationClient import AutomationClient +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from kpi_manager.client.KpiManagerClient import KpiManagerClient +from service.client.ServiceClient import ServiceClient + + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def service_client(): + _client = ServiceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def automation_client(): + _client = AutomationClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def kpi_manager_client(): + _client = KpiManagerClient() + yield _client + _client.close() diff --git a/src/tests/automation/README.md b/src/tests/automation/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c0b62f80ff55af915fbe544b256754edbc2f71db --- /dev/null +++ b/src/tests/automation/README.md @@ -0,0 +1,109 @@ +# Tests for the TFS Automation Service + +This test invokes a closed loop example using the TFS Automation service. +For Automation to have proper context, we use the p4-fabric-tna test to provision an example topology, forwarding service, and telemetry service. +On top of this setup, Automation on the one hand employs an Analyzer to ingest telemetry data stemming from the dataplane, process this data, and define a target KPI of interest, while on the other hand employs Policy to define what action needs to happen in the dataplane if an alarm is raised on this KPI. + +## Steps to setup and run a TFS program atop Stratum + +To conduct this test, follow the steps below. + +### Setup pyenv + +Setup the Python virtual environment as follows: + +```shell +python3 -m venv venv && source venv/bin/activate +``` + +### Deploy TFS + +Deploy TFS as follows: + +```shell +cd ~/tfs-ctrl/ +source my_deploy.sh && source tfs_runtime_env_vars.sh +./deploy/all.sh +``` + +### Path setup + +Ensure that `PATH` variable contains the parent project directory, e.g., "home/$USER/tfs-ctrl". + +Ensure that `PYTHONPATH` variable contains the source code directory of TFS, e.g., "home/$USER/tfs-ctrl/src" + +## Test + +### Provision test + +First deploy the TFS topology, connectivity, and telemetry services as follows: + +```shell +cd ~/tfs-ctrl/ +source my_deploy.sh && source tfs_runtime_env_vars.sh +bash src/tests/p4-fabric-tna/setup.sh +bash src/tests/p4-fabric-tna/run_test_01_bootstrap.sh +bash src/tests/p4-fabric-tna/run_test_03a_service_provision_l2.sh +bash src/tests/p4-fabric-tna/run_test_04a_service_provision_l3.sh +bash src/tests/p4-fabric-tna/run_test_06a_service_provision_int.sh +``` + +Once this is done, login on the WebUI to observe the example topology and verify that there are 2 services in ACTIVE state: + +- A P4 L2 forwarding that establishes connectivity between the hosts of the topology +- A P4 INT service that invokes the INT Telemetry Collector as a service + +``` +http:///webui +``` + +Then, login on Grafana to observe the `Latency` Dashboard already created for you. + +``` +http:///grafana +``` + +Finally, login on Prometheus to check the KPI ID of interest. + +``` +http://:30090/ +``` + +Example KPI of interest could be `KPISAMPLETYPE_INT_HOP_LAT`. + +#### Fill-in input JSON file for Automation + +Open the `automation.json` file located in `descriptors/`. and fill in the following critical fattrbutes: + +- Under `target_service_id.service_uuid.uuid`, add the service uuid of the L2 forwarding service that you saw on the WebUI (Service tab) +- Under `target_service_id.context_id.context_uuid.uuid`, add the context uuid that you saw on the WebUI (Service tab, open any service) +- Under `telemetry_service_id.service_uuid.uuid`, add the service uuid of the INT forwarding service that you saw on the WebUI (Service tab) +- Under `telemetry_service_id.context_id.context_uuid.uuid`, add the context uuid that you saw on the WebUI (same as above) +- Under `input_kpi_ids.kpi_id.uuid`, add the KPI ID you saw when you queried the `KPISAMPLETYPE_INT_HOP_LAT` KPI on Prometheus +- In case you want to tweak the KPI thresholds, modify `analyzer.parameters.thresholds` + +Now, you are ready to fire the test: + +```shell +cd ~/tfs-ctrl/ +bash +``` + +To observe the logs of Automation, do: + +```shell +cd ~/tfs-ctrl/ +bash src/tests/automation/run_test_automation.sh +``` + +### Deprovision test + +To deprovision the test, follow the steps below: + +```shell + +bash src/tests/p4-fabric-tna/run_test_03b_service_deprovision_l2.sh +bash src/tests/p4-fabric-tna/run_test_04b_service_deprovision_l3.sh +bash src/tests/p4-fabric-tna/run_test_06b_service_deprovision_int.sh +bash src/tests/p4-fabric-tna/run_test_07_cleanup.sh +``` diff --git a/src/tests/automation/__init__.py b/src/tests/automation/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..023830645e0fcb60e3f8583674a954810af222f2 --- /dev/null +++ b/src/tests/automation/__init__.py @@ -0,0 +1,13 @@ +# 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. diff --git a/src/tests/automation/descriptors/automation.json b/src/tests/automation/descriptors/automation.json new file mode 100644 index 0000000000000000000000000000000000000000..bef7c4aa63c316631e0de3fc1ea6c79baf9898b5 --- /dev/null +++ b/src/tests/automation/descriptors/automation.json @@ -0,0 +1,38 @@ +{ + "target_service_id": { + "service_uuid": {"uuid": "b2a60c5b-8c46-5707-a64a-9c6539d395f2"}, + "context_id": {"context_uuid": {"uuid": "43813baf-195e-5da6-af20-b3d0922e71a7"}} + }, + "telemetry_service_id": { + "service_uuid": {"uuid": "7397bdf2-eec8-57f4-9406-4f9e9f3dc50e"}, + "context_id": {"context_uuid": {"uuid": "43813baf-195e-5da6-af20-b3d0922e71a7"}} + }, + "analyzer":{ + "operation_mode": "ANALYZEROPERATIONMODE_STREAMING", + "parameters": { + "thresholds": "{\"task_type\": \"AggregationHandler\",\"task_parameter\": [ {\"last\": [-20, 5]}]}" + }, + "input_kpi_ids": [ + {"kpi_id": { "uuid": "6e22f180-ba28-4641-b190-2287bf447777"}} + ], + "output_kpi_ids": [ + {"kpi_id": { "uuid": "c45b09d8-c84a-45d8-b4c2-9fa9902d157d"}} + ], + "batch_min_duration_s": 10, + "batch_min_size": 5 + }, + "policy": { + "serviceId": { + "context_id": {"context_uuid": {"uuid": "43813baf-195e-5da6-af20-b3d0922e71a7"}}, + "service_uuid": {"uuid": "b2a60c5b-8c46-5707-a64a-9c6539d395f2"} + }, + "policyRuleBasic": { + "actionList": [ + { + "action": "POLICY_RULE_ACTION_RECALCULATE_PATH", + "action_config": [] + } + ] + } + } +} diff --git a/src/tests/automation/run_test_automation.sh b/src/tests/automation/run_test_automation.sh new file mode 100755 index 0000000000000000000000000000000000000000..ce8938cae609b6272aac3a9752253f4ddbcc1115 --- /dev/null +++ b/src/tests/automation/run_test_automation.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2026 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. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/automation/test_functional_automation.py diff --git a/src/tests/automation/test_functional_automation.py b/src/tests/automation/test_functional_automation.py new file mode 100644 index 0000000000000000000000000000000000000000..9f692bf014b46dd34f7b5b588f488c55d19462e0 --- /dev/null +++ b/src/tests/automation/test_functional_automation.py @@ -0,0 +1,212 @@ +# Copyright 2022-2026 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, uuid + +from automation.client.AutomationClient import AutomationClient +from common.proto.analytics_frontend_pb2 import ( + AnalyzerId, AnalyzerOperationMode, +) +from common.proto.automation_pb2 import ZSMCreateRequest +from common.proto.context_pb2 import ( + ContextId, ServiceId, ServiceList, ServiceStatusEnum, +) +from common.proto.kpi_manager_pb2 import ( + KpiDescriptorFilter, KpiDescriptorList, KpiId, +) +from common.proto.policy_action_pb2 import ( + PolicyRuleAction, PolicyRuleActionEnum, +) +from common.proto.policy_pb2 import PolicyRuleKpiId, PolicyRuleStateEnum +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from kpi_manager.client.KpiManagerClient import KpiManagerClient +from service.client.ServiceClient import ServiceClient +from tests.tools.test_tools_p4 import * + +from .Fixtures import ( + automation_client, context_client, device_client, kpi_manager_client, + service_client, +) # pylint: disable=unused-import + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +TEST_PATH = os.path.join( + os.path.dirname( + os.path.abspath(__file__) + ) + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to tests" + +DESC_FILE_SERVICE_AUTOMATION = os.path.join(TEST_PATH, 'automation.json') +assert os.path.exists(DESC_FILE_SERVICE_AUTOMATION),\ + "Invalid path to the automation descriptor" + +def test_service_zsm_create( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient, # pylint: disable=redefined-outer-name + service_client : ServiceClient, # pylint: disable=redefined-outer-name + automation_client : AutomationClient, # pylint: disable=redefined-outer-name + kpi_manager_client : KpiManagerClient +) -> None: + + # Load service + descriptor_loader = DescriptorLoader( + descriptors_file=DESC_FILE_SERVICE_AUTOMATION, + context_client=context_client, device_client=device_client, service_client=service_client + ) + results = descriptor_loader.process() + check_descriptor_load_results(results, descriptor_loader) + + data = None + with open(DESC_FILE_SERVICE_AUTOMATION) as f: + data = json.load(f) + + loaded_request : ZSMCreateRequest = ZSMCreateRequest(**data) # type: ignore + assert loaded_request + + # Mark important service IDs + context_uuid = loaded_request.target_service_id.context_id.context_uuid.uuid + target_service_uuid = loaded_request.target_service_id.service_uuid.uuid + telemetry_service_uuid = loaded_request.telemetry_service_id.service_uuid.uuid + + # Check that the associated services are valid + try: + _check_context(context_client, context_uuid, target_service_uuid, telemetry_service_uuid) + except Exception as ex: + raise(ex) + + # Add important information in the request + loaded_request = _zsm_create_request(loaded_request, kpi_manager_client) + + # Invoke Automation + automation_client.ZSMCreate(loaded_request) + +def _check_context(context_client, context_uuid : str, target_service_uuid : str, telemetry_service_uuid : str): + context_id : ContextId = ContextId() # type: ignore + context_id.context_uuid.uuid = context_uuid + + # Get the available services + service_list : ServiceList = context_client.ListServices(context_id) # type: ignore + for service in service_list.services: + service_id = service.service_id + assert service_id + + ctx_uuid = service_id.context_id.context_uuid.uuid + assert ctx_uuid == context_uuid, "Context UUID does not match" + + service_uuid = service_id.service_uuid.uuid + assert service_uuid, "Invalid service UUID" + + if service_uuid not in [target_service_uuid, telemetry_service_uuid]: + continue + + # The service we care about must be active + assert service.service_status.service_status == ServiceStatusEnum.SERVICESTATUS_ACTIVE + +def _zsm_create_request(request : ZSMCreateRequest, kpi_manager_client : KpiManagerClient) -> ZSMCreateRequest: # type: ignore + LOGGER.info("Preparing the ZSM request") + telemetry_service_obj = ServiceId() + telemetry_service_obj.service_uuid.uuid = request.telemetry_service_id.service_uuid.uuid + + ### Analyzer + # Analyzer requires an ID + if not request.analyzer.HasField("analyzer_id"): + request.analyzer.analyzer_id.analyzer_id.uuid = str(uuid.uuid4()) + + # Validate the inserted KPIs + for kpi_id in request.analyzer.input_kpi_ids: + create_kpi_filter_request = KpiDescriptorFilter() + create_kpi_filter_request.kpi_id.append(kpi_id) + create_kpi_filter_request.service_id.append(telemetry_service_obj) + desc_list = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request) + assert isinstance(desc_list, KpiDescriptorList) + for kpi in desc_list.kpi_descriptor_list: + LOGGER.info(f"Validated KPI:\n{kpi}") + + ### Policy + assert request.policy.policyRuleBasic, "Policy must at least have a basic rule body" + # Policy requires an ID + if not request.policy.policyRuleBasic.HasField("policyRuleId"): + request.policy.policyRuleBasic.policyRuleId.uuid.uuid = str(uuid.uuid4()) + # Policy requires a state + if not request.policy.policyRuleBasic.HasField("policyRuleState"): + request.policy.policyRuleBasic.policyRuleState.policyRuleState = PolicyRuleStateEnum.POLICY_UNDEFINED + request.policy.policyRuleBasic.policyRuleState.policyRuleStateMessage = "About to insert policy" + # Link policy with the output KPI + for kpi_id in request.analyzer.output_kpi_ids: + rule_kpi = PolicyRuleKpiId() + rule_kpi.policyRuleKpiUuid.uuid = kpi_id.kpi_id.uuid + request.policy.policyRuleBasic.policyRuleKpiList.append(rule_kpi) + + # Policy requires a priority + request.policy.policyRuleBasic.policyRulePriority = 1 + + return request + +def _static_zsm_create_request(): + context_uuid = "43813baf-195e-5da6-af20-b3d0922e71a7" + target_service_uuid = "66d498ad-5d94-5d90-8cb4-861e30689c64" + telemetry_service_uuid = "db73d789-4abc-5514-88bb-e21f7e31d36a" + kpi_input_uuid = "b7006457-610b-4d76-b3fe-7ef36f1d4f49" + kpi_output_uuid = "c45b09d8-c84a-45d8-b4c2-9fa9902d157d" + + request : ZSMCreateRequest = ZSMCreateRequest() # type: ignore + + # Services + request.target_service_id.service_uuid.uuid = target_service_uuid + request.target_service_id.context_id.context_uuid.uuid = context_uuid + request.telemetry_service_id.service_uuid.uuid = telemetry_service_uuid + request.telemetry_service_id.context_id.context_uuid.uuid = context_uuid + + # Analyzer + request.analyzer.analyzer_id.analyzer_id.uuid = str(uuid.uuid4()) + request.analyzer.operation_mode = AnalyzerOperationMode.ANALYZEROPERATIONMODE_STREAMING + threshold_dict = { + "task_type": "AggregationHandler", + "task_parameter": [ + {"avg": [0, 2500]} + ] + } + request.analyzer.parameters["thresholds"] = json.dumps(threshold_dict) + request.analyzer.parameters["window_size"] = "10" + request.analyzer.parameters["window_slider"] = "5" + request.analyzer.batch_min_duration_s = 10 + request.analyzer.batch_min_size = 5 + + i_kpi_id = KpiId() + i_kpi_id.kpi_id.uuid = kpi_input_uuid + request.analyzer.input_kpi_ids.append(i_kpi_id) + + o_kpi_id = KpiId() + o_kpi_id.kpi_id.uuid = kpi_output_uuid + request.analyzer.output_kpi_ids.append(o_kpi_id) + + # Policy + action = PolicyRuleAction() + action.action = PolicyRuleActionEnum.POLICY_RULE_ACTION_CALL_SERVICE_RPC + request.policy.policyRuleBasic.policyRuleId.uuid.uuid = str(uuid.uuid4()) + request.policy.policyRuleBasic.actionList.append(action) + request.policy.policyRuleBasic.policyRuleState.policyRuleState = PolicyRuleStateEnum.POLICY_UNDEFINED + request.policy.policyRuleBasic.policyRuleState.policyRuleStateMessage = "About to insert policy" + rule_kpi = PolicyRuleKpiId() + rule_kpi.policyRuleKpiUuid.uuid = o_kpi_id.kpi_id.uuid + request.policy.policyRuleBasic.policyRuleKpiList.append(rule_kpi) + request.policy.serviceId.context_id.context_uuid.uuid = context_uuid + request.policy.serviceId.service_uuid.uuid = target_service_uuid + + return request diff --git a/src/tests/benchmark/policy/tests/Fixtures.py b/src/tests/benchmark/policy/tests/Fixtures.py index b6e5d0d5966c530f45fc94b9816b51049ec359b3..b1d338bd4b502d4b7a31283b07a16ae19d4246f8 100644 --- a/src/tests/benchmark/policy/tests/Fixtures.py +++ b/src/tests/benchmark/policy/tests/Fixtures.py @@ -12,14 +12,41 @@ # See the License for the specific language governing permissions and # limitations under the License. -import pytest, logging +import logging + +import pytest from common.Settings import get_setting +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from monitoring.client.MonitoringClient import MonitoringClient from tests.tools.mock_osm.Constants import WIM_PASSWORD, WIM_USERNAME from tests.tools.mock_osm.MockOSM import MockOSM from .Objects import WIM_MAPPING LOGGER = logging.getLogger(__name__) + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def monitoring_client(): + _client = MonitoringClient() + yield _client + _client.close() + + @pytest.fixture(scope='session') def osm_wim(): wim_url = 'http://{:s}:{:s}'.format( diff --git a/src/tests/benchmark/policy/tests/test_functional_bootstrap.py b/src/tests/benchmark/policy/tests/test_functional_bootstrap.py index c9711ddbd940a197c86406a906a755f1f7d90b6c..a6ba495f4cd2149ca2c6bf5e0eed78700697e76e 100644 --- a/src/tests/benchmark/policy/tests/test_functional_bootstrap.py +++ b/src/tests/benchmark/policy/tests/test_functional_bootstrap.py @@ -13,15 +13,21 @@ # limitations under the License. import logging, time + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, Empty from common.proto.monitoring_pb2 import KpiDescriptorList -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from monitoring.client.MonitoringClient import MonitoringClient -from tests.Fixtures import context_client, device_client, monitoring_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, monitoring_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/benchmark/policy/tests/test_functional_cleanup.py b/src/tests/benchmark/policy/tests/test_functional_cleanup.py index 25632738e9f5a0e84f7fc4b8c15e306f64b96212..b03b5a879984833b97297e12e86ee67d0a6fe886 100644 --- a/src/tests/benchmark/policy/tests/test_functional_cleanup.py +++ b/src/tests/benchmark/policy/tests/test_functional_cleanup.py @@ -13,13 +13,19 @@ # limitations under the License. import logging + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/benchmark/policy/tests/test_functional_create_service.py b/src/tests/benchmark/policy/tests/test_functional_create_service.py index c1915938cb97895d4bab3f18f9a4cd991dbb1f9a..3b4c9ef12299d09af16aa9468708aeef5aad95c1 100644 --- a/src/tests/benchmark/policy/tests/test_functional_create_service.py +++ b/src/tests/benchmark/policy/tests/test_functional_create_service.py @@ -13,6 +13,7 @@ # limitations under the License. import logging, random + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, Empty, ServiceTypeEnum from common.proto.kpi_sample_types_pb2 import KpiSampleType @@ -21,9 +22,11 @@ from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from monitoring.client.MonitoringClient import MonitoringClient -from tests.Fixtures import context_client, monitoring_client # pylint: disable=unused-import from tests.tools.mock_osm.MockOSM import MockOSM -from .Fixtures import osm_wim # pylint: disable=unused-import + +from .Fixtures import ( + context_client, monitoring_client, osm_wim, +) # pylint: disable=unused-import from .Objects import WIM_SERVICE_CONNECTION_POINTS, WIM_SERVICE_TYPE LOGGER = logging.getLogger(__name__) diff --git a/src/tests/benchmark/policy/tests/test_functional_delete_service.py b/src/tests/benchmark/policy/tests/test_functional_delete_service.py index 995fb808c3f11b7980a0b4734b04d1fb48eb3a99..3d16daa749df3a78319903abb7cf0393b33c6c49 100644 --- a/src/tests/benchmark/policy/tests/test_functional_delete_service.py +++ b/src/tests/benchmark/policy/tests/test_functional_delete_service.py @@ -13,15 +13,16 @@ # limitations under the License. import logging + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, ServiceTypeEnum from common.tools.descriptor.Loader import DescriptorLoader from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from tests.Fixtures import context_client # pylint: disable=unused-import from tests.tools.mock_osm.MockOSM import MockOSM -from .Fixtures import osm_wim # pylint: disable=unused-import + +from .Fixtures import context_client, osm_wim # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/benchmark/ztp/tests/Fixtures.py b/src/tests/benchmark/ztp/tests/Fixtures.py index b6e5d0d5966c530f45fc94b9816b51049ec359b3..b1d338bd4b502d4b7a31283b07a16ae19d4246f8 100644 --- a/src/tests/benchmark/ztp/tests/Fixtures.py +++ b/src/tests/benchmark/ztp/tests/Fixtures.py @@ -12,14 +12,41 @@ # See the License for the specific language governing permissions and # limitations under the License. -import pytest, logging +import logging + +import pytest from common.Settings import get_setting +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from monitoring.client.MonitoringClient import MonitoringClient from tests.tools.mock_osm.Constants import WIM_PASSWORD, WIM_USERNAME from tests.tools.mock_osm.MockOSM import MockOSM from .Objects import WIM_MAPPING LOGGER = logging.getLogger(__name__) + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def monitoring_client(): + _client = MonitoringClient() + yield _client + _client.close() + + @pytest.fixture(scope='session') def osm_wim(): wim_url = 'http://{:s}:{:s}'.format( diff --git a/src/tests/benchmark/ztp/tests/test_functional_bootstrap.py b/src/tests/benchmark/ztp/tests/test_functional_bootstrap.py index 1067e966146feaba1410fe6d9576a593cebf88d6..bc8f7bbe0dbc6e094cee117361b3e6a7b1b81398 100644 --- a/src/tests/benchmark/ztp/tests/test_functional_bootstrap.py +++ b/src/tests/benchmark/ztp/tests/test_functional_bootstrap.py @@ -12,21 +12,27 @@ # See the License for the specific language governing permissions and # limitations under the License. -import copy, logging, pytest -from common.Settings import get_setting +import copy, logging + +import pytest + +from common.proto.context_pb2 import Context, ContextId, Device, Empty, Topology from common.proto.monitoring_pb2 import KpiDescriptorList +from common.Settings import get_setting from common.tests.EventTools import EVENT_CREATE, EVENT_UPDATE, check_events from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Device import json_device_id from common.tools.object_factory.Link import json_link_id from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient -from monitoring.client.MonitoringClient import MonitoringClient from context.client.EventsCollector import EventsCollector -from common.proto.context_pb2 import Context, ContextId, Device, Empty, Topology from device.client.DeviceClient import DeviceClient +from monitoring.client.MonitoringClient import MonitoringClient + +from .Fixtures import ( + context_client, device_client, monitoring_client, +) # pylint: disable=unused-import from .Objects import CONTEXT_ID, CONTEXTS, DEVICES, TOPOLOGIES -from tests.Fixtures import context_client, device_client, monitoring_client LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -107,4 +113,4 @@ def test_links_created(context_client : ContextClient): # pylint: disable=redef assert len(response.topologies) == len(TOPOLOGIES) response = context_client.ListDevices(Empty()) - assert len(response.devices) == len(DEVICES) \ No newline at end of file + assert len(response.devices) == len(DEVICES) diff --git a/src/tests/benchmark/ztp/tests/test_functional_cleanup.py b/src/tests/benchmark/ztp/tests/test_functional_cleanup.py index 5938e37b84d3e213b9c4a2eaacd1431a962f2e37..d14ad42086554c44e29d27f9ebfe6f1ca3ded5df 100644 --- a/src/tests/benchmark/ztp/tests/test_functional_cleanup.py +++ b/src/tests/benchmark/ztp/tests/test_functional_cleanup.py @@ -12,7 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, pytest +import logging + +import pytest + +from common.proto.context_pb2 import ( + ContextId, DeviceId, Empty, LinkId, TopologyId, +) from common.Settings import get_setting from common.tests.EventTools import EVENT_REMOVE, check_events from common.tools.object_factory.Context import json_context_id @@ -21,9 +27,11 @@ from common.tools.object_factory.Link import json_link_id from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient from context.client.EventsCollector import EventsCollector -from common.proto.context_pb2 import ContextId, DeviceId, Empty, LinkId, TopologyId from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import from .Objects import CONTEXT_ID, CONTEXTS, DEVICES, TOPOLOGIES LOGGER = logging.getLogger(__name__) diff --git a/src/tests/ecoc22/tests/Fixtures.py b/src/tests/ecoc22/tests/Fixtures.py index b6e5d0d5966c530f45fc94b9816b51049ec359b3..25cfc385418959a675874e7a0c158547a0327405 100644 --- a/src/tests/ecoc22/tests/Fixtures.py +++ b/src/tests/ecoc22/tests/Fixtures.py @@ -12,14 +12,33 @@ # See the License for the specific language governing permissions and # limitations under the License. -import pytest, logging +import logging + +import pytest from common.Settings import get_setting +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient from tests.tools.mock_osm.Constants import WIM_PASSWORD, WIM_USERNAME from tests.tools.mock_osm.MockOSM import MockOSM from .Objects import WIM_MAPPING LOGGER = logging.getLogger(__name__) + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + @pytest.fixture(scope='session') def osm_wim(): wim_url = 'http://{:s}:{:s}'.format( diff --git a/src/tests/ecoc22/tests/test_functional_bootstrap.py b/src/tests/ecoc22/tests/test_functional_bootstrap.py index a72512a179f810683411ecfc9f64376d94e9cda1..70fc6b489bc347137d62305420879eb45595568d 100644 --- a/src/tests/ecoc22/tests/test_functional_bootstrap.py +++ b/src/tests/ecoc22/tests/test_functional_bootstrap.py @@ -13,13 +13,21 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ecoc22/tests/test_functional_cleanup.py b/src/tests/ecoc22/tests/test_functional_cleanup.py index 94217423da33d6525cde16bce71f3ae6965ef988..a6d1eddedfa5468ad225b348a4213f162d5569bc 100644 --- a/src/tests/ecoc22/tests/test_functional_cleanup.py +++ b/src/tests/ecoc22/tests/test_functional_cleanup.py @@ -13,13 +13,19 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ecoc22/tests/test_functional_create_service.py b/src/tests/ecoc22/tests/test_functional_create_service.py index da411d4330211b0cddefc6bfffc1a487e52513a5..e04d573cd54bb83715e9b21a40a97899a525bd8e 100644 --- a/src/tests/ecoc22/tests/test_functional_create_service.py +++ b/src/tests/ecoc22/tests/test_functional_create_service.py @@ -13,15 +13,16 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, ServiceTypeEnum from common.tools.descriptor.Loader import DescriptorLoader from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from tests.Fixtures import context_client # pylint: disable=unused-import from tests.tools.mock_osm.MockOSM import MockOSM -from .Fixtures import osm_wim # pylint: disable=unused-import + +from .Fixtures import context_client, osm_wim # pylint: disable=unused-import from .Objects import WIM_SERVICE_CONNECTION_POINTS, WIM_SERVICE_TYPE LOGGER = logging.getLogger(__name__) diff --git a/src/tests/ecoc22/tests/test_functional_delete_service.py b/src/tests/ecoc22/tests/test_functional_delete_service.py index 24463012ecf37512b158d6febe39e5e91de1a92e..550a42656a365560b050f019cfcd88fbad169740 100644 --- a/src/tests/ecoc22/tests/test_functional_delete_service.py +++ b/src/tests/ecoc22/tests/test_functional_delete_service.py @@ -13,15 +13,16 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, ServiceTypeEnum from common.tools.descriptor.Loader import DescriptorLoader from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from tests.Fixtures import context_client # pylint: disable=unused-import from tests.tools.mock_osm.MockOSM import MockOSM -from .Fixtures import osm_wim # pylint: disable=unused-import + +from .Fixtures import context_client, osm_wim # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/eucnc24/.gitlab-ci.yml b/src/tests/eucnc24/.gitlab-ci.yml index ee99ea2715a777c976b4102c01907a34fbe97c4f..a4fbac0ab6dd368eb5dbd7ebced7605f8519a717 100644 --- a/src/tests/eucnc24/.gitlab-ci.yml +++ b/src/tests/eucnc24/.gitlab-ci.yml @@ -130,7 +130,7 @@ end2end_test eucnc24: - cp -R src/tests/${TEST_NAME}/clab/* /tmp/clab/${TEST_NAME} - tree -la /tmp/clab/${TEST_NAME} - cd /tmp/clab/${TEST_NAME} - - containerlab deploy --reconfigure --topo eucnc24.clab.yml + - containerlab deploy --reconfigure --topo ${TEST_NAME}.clab.yml - cd $RUNNER_PATH # Wait for initialization of Device NOSes @@ -138,9 +138,9 @@ end2end_test eucnc24: - docker ps -a # Dump configuration of the routers (before any configuration) - - containerlab exec --name eucnc24 --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" - - containerlab exec --name eucnc24 --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" - - containerlab exec --name eucnc24 --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" # Configure TeraFlowSDN deployment # Uncomment if DEBUG log level is needed for the components @@ -198,27 +198,27 @@ end2end_test eucnc24: $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-tfs-create.sh # Dump configuration of the routers (after configure TFS service) - - containerlab exec --name eucnc24 --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" - - containerlab exec --name eucnc24 --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" - - containerlab exec --name eucnc24 --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" # Run end-to-end test: test connectivity with ping - - export TEST1_10=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.10' --format json) + - export TEST1_10=$(containerlab exec --name ${TEST_NAME} --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.10' --format json) - echo $TEST1_10 - echo $TEST1_10 | grep -E '3 packets transmitted, 3 received, 0\% packet loss' - - export TEST1_1=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.1' --format json) + - export TEST1_1=$(containerlab exec --name ${TEST_NAME} --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.1' --format json) - echo $TEST1_1 - echo $TEST1_1 | grep -E '3 packets transmitted, 3 received, 0\% packet loss' - - export TEST2_1=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.2.1' --format json) + - export TEST2_1=$(containerlab exec --name ${TEST_NAME} --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.2.1' --format json) - echo $TEST2_1 - echo $TEST2_1 | grep -E '3 packets transmitted, 3 received, 0\% packet loss' - - export TEST2_10=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.2.10' --format json) + - export TEST2_10=$(containerlab exec --name ${TEST_NAME} --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.2.10' --format json) - echo $TEST2_10 - echo $TEST2_10 | grep -E '3 packets transmitted, 3 received, 0\% packet loss' - - export TEST3_1=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.3.1' --format json) + - export TEST3_1=$(containerlab exec --name ${TEST_NAME} --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.3.1' --format json) - echo $TEST3_1 - echo $TEST3_1 | grep -E '3 packets transmitted, 0 received, 100\% packet loss' - - export TEST3_10=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.3.10' --format json) + - export TEST3_10=$(containerlab exec --name ${TEST_NAME} --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.3.10' --format json) - echo $TEST3_10 - echo $TEST3_10 | grep -E '3 packets transmitted, 0 received, 100\% packet loss' @@ -230,9 +230,9 @@ end2end_test eucnc24: $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-tfs-remove.sh # Dump configuration of the routers (after deconfigure TFS service) - - containerlab exec --name eucnc24 --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" - - containerlab exec --name eucnc24 --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" - - containerlab exec --name eucnc24 --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" # Run end-to-end test: configure service IETF - > @@ -242,27 +242,27 @@ end2end_test eucnc24: $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-ietf-create.sh # Dump configuration of the routers (after configure IETF service) - - containerlab exec --name eucnc24 --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" - - containerlab exec --name eucnc24 --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" - - containerlab exec --name eucnc24 --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" # Run end-to-end test: test connectivity with ping - - export TEST1_10=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.10' --format json) + - export TEST1_10=$(containerlab exec --name ${TEST_NAME} --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.10' --format json) - echo $TEST1_10 - echo $TEST1_10 | grep -E '3 packets transmitted, 3 received, 0\% packet loss' - - export TEST1_1=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.1' --format json) + - export TEST1_1=$(containerlab exec --name ${TEST_NAME} --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.1' --format json) - echo $TEST1_1 - echo $TEST1_1 | grep -E '3 packets transmitted, 3 received, 0\% packet loss' - - export TEST2_1=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.2.1' --format json) + - export TEST2_1=$(containerlab exec --name ${TEST_NAME} --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.2.1' --format json) - echo $TEST2_1 - echo $TEST2_1 | grep -E '3 packets transmitted, 3 received, 0\% packet loss' - - export TEST2_10=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.2.10' --format json) + - export TEST2_10=$(containerlab exec --name ${TEST_NAME} --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.2.10' --format json) - echo $TEST2_10 - echo $TEST2_10 | grep -E '3 packets transmitted, 3 received, 0\% packet loss' - - export TEST3_1=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.3.1' --format json) + - export TEST3_1=$(containerlab exec --name ${TEST_NAME} --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.3.1' --format json) - echo $TEST3_1 - echo $TEST3_1 | grep -E '3 packets transmitted, 0 received, 100\% packet loss' - - export TEST3_10=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.3.10' --format json) + - export TEST3_10=$(containerlab exec --name ${TEST_NAME} --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.3.10' --format json) - echo $TEST3_10 - echo $TEST3_10 | grep -E '3 packets transmitted, 0 received, 100\% packet loss' @@ -274,9 +274,9 @@ end2end_test eucnc24: $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-ietf-remove.sh # Dump configuration of the routers (after deconfigure IETF service) - - containerlab exec --name eucnc24 --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" - - containerlab exec --name eucnc24 --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" - - containerlab exec --name eucnc24 --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" # Run end-to-end test: cleanup scenario - > @@ -287,9 +287,9 @@ end2end_test eucnc24: after_script: # Dump configuration of the routers (on after_script) - - containerlab exec --name eucnc24 --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" - - containerlab exec --name eucnc24 --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" - - containerlab exec --name eucnc24 --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" # Dump TeraFlowSDN component logs - source src/tests/${TEST_NAME}/deploy_specs.sh @@ -303,8 +303,8 @@ end2end_test eucnc24: - RUNNER_PATH=`pwd` #- cd $PWD/src/tests/${TEST_NAME} - cd /tmp/clab/${TEST_NAME} - - containerlab destroy --topo eucnc24.clab.yml --cleanup || true - - sudo rm -rf clab-eucnc24/ .eucnc24.clab.yml.bak || true + - containerlab destroy --topo ${TEST_NAME}.clab.yml --cleanup || true + - sudo rm -rf clab-${TEST_NAME}/ .${TEST_NAME}.clab.yml.bak || true - cd $RUNNER_PATH - kubectl delete namespaces tfs || true - docker ps --all --quiet | xargs --no-run-if-empty docker stop diff --git a/src/tests/eucnc24/deploy-scripts/clab-deploy.sh b/src/tests/eucnc24/deploy-scripts/clab-deploy.sh index 5e79b0253d0e0452e47eebff72fb5dde72b47dda..4ed529e4886136c3a377529732449d22469449ba 100755 --- a/src/tests/eucnc24/deploy-scripts/clab-deploy.sh +++ b/src/tests/eucnc24/deploy-scripts/clab-deploy.sh @@ -14,4 +14,4 @@ # limitations under the License. cd ~/tfs-ctrl/src/tests/eucnc24 -sudo containerlab deploy --topo eucnc24.clab.yml +sudo containerlab deploy --topo clab/eucnc24.clab.yml diff --git a/src/tests/eucnc24/deploy-scripts/clab-destroy.sh b/src/tests/eucnc24/deploy-scripts/clab-destroy.sh index 55dcf96dceaa762d3628a52f7d7c36911761507c..464b82df6595e2dd28428250d0eab1476cdced08 100755 --- a/src/tests/eucnc24/deploy-scripts/clab-destroy.sh +++ b/src/tests/eucnc24/deploy-scripts/clab-destroy.sh @@ -14,5 +14,5 @@ # limitations under the License. cd ~/tfs-ctrl/src/tests/eucnc24 -sudo containerlab destroy --topo eucnc24.clab.yml -sudo rm -rf clab-eucnc24/ .eucnc24.clab.yml.bak +sudo containerlab destroy --topo clab/eucnc24.clab.yml +sudo rm -rf clab/clab-eucnc24/ clab/.eucnc24.clab.yml.bak diff --git a/src/tests/eucnc24/tests/Fixtures.py b/src/tests/eucnc24/tests/Fixtures.py index 5997e58c8100d8b89f2d9287fc57b9b3d1434ac4..aa37459a10e188723c9173b9258daf2372204e4d 100644 --- a/src/tests/eucnc24/tests/Fixtures.py +++ b/src/tests/eucnc24/tests/Fixtures.py @@ -15,29 +15,22 @@ import pytest from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from monitoring.client.MonitoringClient import MonitoringClient from service.client.ServiceClient import ServiceClient @pytest.fixture(scope='session') -def context_client(): +def context_client() -> ContextClient: _client = ContextClient() yield _client _client.close() @pytest.fixture(scope='session') -def device_client(): +def device_client() -> DeviceClient: _client = DeviceClient() yield _client _client.close() @pytest.fixture(scope='session') -def monitoring_client(): - _client = MonitoringClient() - yield _client - _client.close() - -@pytest.fixture(scope='session') -def service_client(): +def service_client() -> ServiceClient: _client = ServiceClient() yield _client _client.close() diff --git a/src/tests/eucnc24/tests/test_cleanup.py b/src/tests/eucnc24/tests/test_cleanup.py index 20afb5fe02d63f64de45fe87830e8996302c4395..91d90e7b46a8295061626e2ce19a9a1e4e16be2d 100644 --- a/src/tests/eucnc24/tests/test_cleanup.py +++ b/src/tests/eucnc24/tests/test_cleanup.py @@ -13,13 +13,19 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from .Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/eucnc24/tests/test_onboarding.py b/src/tests/eucnc24/tests/test_onboarding.py index 763d7da171c99b781a6d25fc01e3c10c340bfb43..5d652e6f58948fd20772fe756ba7eb8776f00384 100644 --- a/src/tests/eucnc24/tests/test_onboarding.py +++ b/src/tests/eucnc24/tests/test_onboarding.py @@ -13,13 +13,21 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from .Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/eucnc24/tests/test_service_ietf_create.py b/src/tests/eucnc24/tests/test_service_ietf_create.py index f3a68801df4e9e0070d45ea4a398a5e766786ec4..02ef43e28f5ef040ae41a06a7f86cb734ffa6398 100644 --- a/src/tests/eucnc24/tests/test_service_ietf_create.py +++ b/src/tests/eucnc24/tests/test_service_ietf_create.py @@ -13,15 +13,17 @@ # limitations under the License. import json, logging, os -from typing import Dict + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from .Fixtures import context_client # pylint: disable=unused-import -from .Tools import do_rest_get_request, do_rest_post_request +from .Fixtures import context_client # pylint: disable=unused-import +from .Tools import do_rest_get_request, do_rest_post_request LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/eucnc24/tests/test_service_ietf_remove.py b/src/tests/eucnc24/tests/test_service_ietf_remove.py index 2c39208248700c2183871c1a4954ef997253a954..3dc7051fa21a6a6f86d276e20dbc6d2cb58a3751 100644 --- a/src/tests/eucnc24/tests/test_service_ietf_remove.py +++ b/src/tests/eucnc24/tests/test_service_ietf_remove.py @@ -13,15 +13,18 @@ # limitations under the License. import logging, os -from typing import Dict, Set, Tuple +from typing import Set + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from .Fixtures import context_client # pylint: disable=unused-import -from .Tools import do_rest_delete_request +from .Fixtures import context_client # pylint: disable=unused-import +from .Tools import do_rest_delete_request LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -41,12 +44,16 @@ def test_service_ietf_removal( # Check there are no slices response = context_client.ListSlices(ADMIN_CONTEXT_ID) - LOGGER.warning('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response))) + LOGGER.warning('Slices[{:d}] = {:s}'.format( + len(response.slices), grpc_message_to_json_string(response) + )) assert len(response.slices) == 0 # Check there is 1 service response = context_client.ListServices(ADMIN_CONTEXT_ID) - LOGGER.warning('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) + LOGGER.warning('Services[{:d}] = {:s}'.format( + len(response.services), grpc_message_to_json_string(response) + )) assert len(response.services) == 1 service_uuids : Set[str] = set() @@ -66,7 +73,7 @@ def test_service_ietf_removal( # Identify service to delete assert len(service_uuids) == 1 - service_uuid = set(service_uuids).pop() + service_uuid = service_uuids.pop() URL = '/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services/vpn-service={:s}/'.format(service_uuid) do_rest_delete_request(URL, logger=LOGGER, expected_status_codes={204}) diff --git a/src/tests/eucnc24/tests/test_service_tfs_create.py b/src/tests/eucnc24/tests/test_service_tfs_create.py index 3016027927e0cf20b5abffcffb7d76ede6c5e264..8884adcac4cc97316b4e788705e80c9864a3a096 100644 --- a/src/tests/eucnc24/tests/test_service_tfs_create.py +++ b/src/tests/eucnc24/tests/test_service_tfs_create.py @@ -13,16 +13,23 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from .Fixtures import context_client, device_client, service_client # pylint: disable=unused-import +from .Fixtures import ( + context_client, device_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/eucnc24/tests/test_service_tfs_remove.py b/src/tests/eucnc24/tests/test_service_tfs_remove.py index 50d4acb7a56ea9321cdd43f12a13cf60ed3783e6..eaf6680787488f475f1218a42d82c1552bcdec23 100644 --- a/src/tests/eucnc24/tests/test_service_tfs_remove.py +++ b/src/tests/eucnc24/tests/test_service_tfs_remove.py @@ -14,15 +14,20 @@ import logging, os from typing import Set, Tuple + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient -from .Fixtures import context_client, service_client # pylint: disable=unused-import +from .Fixtures import ( + context_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/l2_vpn_gnmi_oc/.gitignore b/src/tests/l2_vpn_gnmi_oc/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..a47dc9eff49108f99e8869a9ea8981c1d6b321c1 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/.gitignore @@ -0,0 +1,19 @@ +# 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. + +clab-*/ +images/ +*.clab.yml.bak +*.tar +*.tar.gz diff --git a/src/tests/l2_vpn_gnmi_oc/.gitlab-ci.yml b/src/tests/l2_vpn_gnmi_oc/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..310770df5b377de818f2b5ed5cbe2ff6b76c430a --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/.gitlab-ci.yml @@ -0,0 +1,340 @@ +# 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. + +# Build, tag, and push the Docker image to the GitLab Docker registry +build l2_vpn_gnmi_oc: + variables: + TEST_NAME: 'l2_vpn_gnmi_oc' + 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 "${TEST_NAME}:latest" -f ./src/tests/${TEST_NAME}/Dockerfile . + - docker tag "${TEST_NAME}:latest" "$CI_REGISTRY_IMAGE/${TEST_NAME}:latest" + - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}:latest" + 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/tests/${TEST_NAME}/**/*.{py,in,sh,yml} + - src/tests/${TEST_NAME}/Dockerfile + - .gitlab-ci.yml + +# Deploy TeraFlowSDN and Execute end-2-end test +end2end_test l2_vpn_gnmi_oc: + timeout: 45m + variables: + TEST_NAME: 'l2_vpn_gnmi_oc' + stage: end2end_test + # Disable to force running it after all other tasks + #needs: + # - build l2_vpn_gnmi_oc + before_script: + # Cleanup old ContainerLab scenarios + - containerlab destroy --all --cleanup || true + + # Do Docker cleanup + - docker ps --all --quiet | xargs --no-run-if-empty docker stop + - docker container prune --force + - docker ps --all --quiet | xargs --no-run-if-empty docker rm --force + - docker image prune --force + - docker network prune --force + - docker volume prune --all --force + - docker buildx prune --force + + # Check MicroK8s is ready + - microk8s status --wait-ready + - LOOP_MAX_ATTEMPTS=10 + - LOOP_COUNTER=0 + - > + while ! kubectl get pods --all-namespaces &> /dev/null; do + printf "%c" "." + sleep 1 + LOOP_COUNTER=$((LOOP_COUNTER + 1)) + if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then + echo "Max attempts reached, exiting the loop." + exit 1 + fi + done + - kubectl get pods --all-namespaces + + # Always delete Kubernetes namespaces + - export K8S_NAMESPACES=$(kubectl get namespace -o jsonpath='{.items[*].metadata.name}') + - echo "K8S_NAMESPACES=${K8S_NAMESPACES}" + + - export OLD_NATS_NAMESPACES=$(echo "${K8S_NAMESPACES}" | tr ' ' '\n' | grep -E '^nats') + - echo "OLD_NATS_NAMESPACES=${OLD_NATS_NAMESPACES}" + - > + for ns in ${OLD_NATS_NAMESPACES}; do + if [[ "$ns" == nats* ]]; then + if helm3 status "$ns" &>/dev/null; then + helm3 uninstall "$ns" -n "$ns" + else + echo "Release '$ns' not found, skipping..." + fi + fi + done + - export OLD_NAMESPACES=$(echo "${K8S_NAMESPACES}" | tr ' ' '\n' | grep -E '^(tfs|crdb|qdb|kafka|nats)') + - echo "OLD_NAMESPACES=${OLD_NAMESPACES}" + - kubectl delete namespace ${OLD_NAMESPACES} || true + + # Clean-up Kubernetes Failed pods + - > + kubectl get pods --all-namespaces --no-headers --field-selector=status.phase=Failed + -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name | + xargs --no-run-if-empty --max-args=2 kubectl delete pod --namespace + + # Login Docker repository + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + + script: + # Download Docker image to run the test + - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}:latest" + + # Check MicroK8s is ready + - microk8s status --wait-ready + - LOOP_MAX_ATTEMPTS=10 + - LOOP_COUNTER=0 + - > + while ! kubectl get pods --all-namespaces &> /dev/null; do + printf "%c" "." + sleep 1 + LOOP_COUNTER=$((LOOP_COUNTER + 1)) + if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then + echo "Max attempts reached, exiting the loop." + exit 1 + fi + done + - kubectl get pods --all-namespaces + + # Deploy ContainerLab Scenario + - RUNNER_PATH=`pwd` + #- cd $PWD/src/tests/${TEST_NAME} + - mkdir -p /tmp/clab/${TEST_NAME} + - cp -R src/tests/${TEST_NAME}/clab/* /tmp/clab/${TEST_NAME} + - tree -la /tmp/clab/${TEST_NAME} + - cd /tmp/clab/${TEST_NAME} + - containerlab deploy --reconfigure --topo ${TEST_NAME}.clab.yml + - cd $RUNNER_PATH + + # Wait for initialization of Device NOSes + - sleep 3 + - docker ps -a + + # Dump configuration of the routers (before any configuration) + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + + # Configure TeraFlowSDN deployment + # Uncomment if DEBUG log level is needed for the components + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/contextservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/deviceservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="frontend").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/pathcompservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/serviceservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/nbiservice.yaml + + - source src/tests/${TEST_NAME}/deploy_specs.sh + #- export TFS_REGISTRY_IMAGES="${CI_REGISTRY_IMAGE}" + #- export TFS_SKIP_BUILD="YES" + #- export TFS_IMAGE_TAG="latest" + #- echo "TFS_REGISTRY_IMAGES=${CI_REGISTRY_IMAGE}" + + # Deploy TeraFlowSDN + - ./deploy/crdb.sh + - ./deploy/nats.sh + - ./deploy/kafka.sh + #- ./deploy/qdb.sh + - ./deploy/tfs.sh + - ./deploy/show.sh + + ## Wait for Context to be subscribed to NATS + ## WARNING: this loop is infinite if there is no subscriber (such as monitoring). + ## Investigate if we can use a counter to limit the number of iterations. + ## For now, keep it commented out. + #- LOOP_MAX_ATTEMPTS=180 + #- LOOP_COUNTER=0 + #- > + # while ! kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server 2>&1 | grep -q 'Subscriber is Ready? True'; do + # echo "Attempt: $LOOP_COUNTER" + # kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server 2>&1; + # sleep 1; + # LOOP_COUNTER=$((LOOP_COUNTER + 1)) + # if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then + # echo "Max attempts reached, exiting the loop." + # break + # fi + # done + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server + + - | + ping_check() { + local SRC=$1 DST_IP=$2 PATTERN=$3 + local OUTPUT + OUTPUT=$(containerlab exec --name ${TEST_NAME} --label clab-node-name=${SRC} --cmd "ping -n -c3 ${DST_IP}" --format json) + echo "$OUTPUT" + if echo "$OUTPUT" | grep -E "$PATTERN" >/dev/null; then + echo "PASSED ${SRC}->${DST_IP} + else + echo "FAILED ${SRC}->${DST_IP} + fi + echo "$OUTPUT" | grep -E "$PATTERN" + } + + # Run end-to-end test: onboard scenario + - > + docker run -t --rm --name ${TEST_NAME} --network=host + --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-onboarding.sh + + # Dump configuration of the routers (after configure TFS service) + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + + # Run end-to-end test: test no connectivity with ping + - ping_check "dc1" "172.16.1.10" "3 packets transmitted, 3 received, 0% packet loss" + - ping_check "dc1" "172.16.1.20" "3 packets transmitted, 0 received,( [\+]{0,1}[0-9]+ error[s]{0,1},)? 100% packet loss" + - ping_check "dc1" "172.16.1.30" "3 packets transmitted, 0 received,( [\+]{0,1}[0-9]+ error[s]{0,1},)? 100% packet loss" + + # Run end-to-end test: configure service TFS + - > + docker run -t --rm --name ${TEST_NAME} --network=host + --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-tfs-create.sh + + # Give time to routers for being configured and stabilized + - sleep 60 + + # Dump configuration of the routers (after configure TFS service) + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + + # Run end-to-end test: test connectivity with ping + - ping_check "dc1" "172.16.1.10" "3 packets transmitted, 3 received, 0% packet loss" + - ping_check "dc1" "172.16.1.20" "3 packets transmitted, 3 received, 0% packet loss" + - ping_check "dc1" "172.16.1.30" "3 packets transmitted, 0 received,( [\+]{0,1}[0-9]+ error[s]{0,1},)? 100% packet loss" + + # Run end-to-end test: deconfigure service TFS + - > + docker run -t --rm --name ${TEST_NAME} --network=host + --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-tfs-remove.sh + + # Give time to routers for being configured and stabilized + - sleep 60 + + # Dump configuration of the routers (after deconfigure TFS service) + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + + # Run end-to-end test: test no connectivity with ping + - ping_check "dc1" "172.16.1.10" "3 packets transmitted, 3 received, 0% packet loss" + - ping_check "dc1" "172.16.1.20" "3 packets transmitted, 0 received,( [\+]{0,1}[0-9]+ error[s]{0,1},)? 100% packet loss" + - ping_check "dc1" "172.16.1.30" "3 packets transmitted, 0 received,( [\+]{0,1}[0-9]+ error[s]{0,1},)? 100% packet loss" + + # Run end-to-end test: configure service IETF + - > + docker run -t --rm --name ${TEST_NAME} --network=host + --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-ietf-create.sh + + # Give time to routers for being configured and stabilized + - sleep 60 + + # Dump configuration of the routers (after configure IETF service) + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + + # Run end-to-end test: test connectivity with ping + - ping_check "dc1" "172.16.1.10" "3 packets transmitted, 3 received, 0% packet loss" + - ping_check "dc1" "172.16.1.20" "3 packets transmitted, 3 received, 0% packet loss" + - ping_check "dc1" "172.16.1.30" "3 packets transmitted, 0 received,( [\+]{0,1}[0-9]+ error[s]{0,1},)? 100% packet loss" + + # Run end-to-end test: deconfigure service IETF + - > + docker run -t --rm --name ${TEST_NAME} --network=host + --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-ietf-remove.sh + + # Give time to routers for being configured and stabilized + - sleep 60 + + # Dump configuration of the routers (after deconfigure IETF service) + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + + # Run end-to-end test: test no connectivity with ping + - ping_check "dc1" "172.16.1.10" "3 packets transmitted, 3 received, 0% packet loss" + - ping_check "dc1" "172.16.1.20" "3 packets transmitted, 0 received,( [\+]{0,1}[0-9]+ error[s]{0,1},)? 100% packet loss" + - ping_check "dc1" "172.16.1.30" "3 packets transmitted, 0 received,( [\+]{0,1}[0-9]+ error[s]{0,1},)? 100% packet loss" + + # Run end-to-end test: cleanup scenario + - > + docker run -t --rm --name ${TEST_NAME} --network=host + --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-cleanup.sh + + after_script: + # Dump configuration of the routers (on after_script) + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - containerlab exec --name ${TEST_NAME} --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + + # Dump TeraFlowSDN component logs + - source src/tests/${TEST_NAME}/deploy_specs.sh + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/deviceservice -c server + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/pathcompservice -c frontend + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/serviceservice -c server + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/nbiservice -c server + + # Clean up + - RUNNER_PATH=`pwd` + #- cd $PWD/src/tests/${TEST_NAME} + - cd /tmp/clab/${TEST_NAME} + - containerlab destroy --topo ${TEST_NAME}.clab.yml --cleanup || true + - sudo rm -rf clab-${TEST_NAME}/ .${TEST_NAME}.clab.yml.bak || true + - cd $RUNNER_PATH + - kubectl delete namespaces tfs || true + - docker ps --all --quiet | xargs --no-run-if-empty docker stop + - docker container prune --force + - docker ps --all --quiet | xargs --no-run-if-empty docker rm --force + - docker network prune --force + - docker volume prune --all --force + - docker image prune --force + + #coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' + - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' + artifacts: + when: always + reports: + junit: ./src/tests/${TEST_NAME}/report_*.xml diff --git a/src/tests/l2_vpn_gnmi_oc/Dockerfile b/src/tests/l2_vpn_gnmi_oc/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..e091adc53b9e33bc8ce3852e56b6fdc2e5cd8def --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/Dockerfile @@ -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 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 + +# Get generic Python packages +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 +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/tests/l2_vpn_gnmi_oc +WORKDIR /var/teraflow/tests/l2_vpn_gnmi_oc +COPY src/tests/l2_vpn_gnmi_oc/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/__init__.py ./__init__.py +COPY src/common/*.py ./common/ +COPY src/common/tests/. ./common/tests/ +COPY src/common/tools/. ./common/tools/ +COPY src/context/__init__.py context/__init__.py +COPY src/context/client/. context/client/ +COPY src/device/__init__.py device/__init__.py +COPY src/device/client/. device/client/ +COPY src/monitoring/__init__.py monitoring/__init__.py +COPY src/monitoring/client/. monitoring/client/ +COPY src/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/vnt_manager/__init__.py vnt_manager/__init__.py +COPY src/vnt_manager/client/. vnt_manager/client/ +COPY src/tests/*.py ./tests/ +COPY src/tests/l2_vpn_gnmi_oc/__init__.py ./tests/l2_vpn_gnmi_oc/__init__.py +COPY src/tests/l2_vpn_gnmi_oc/data/. ./tests/l2_vpn_gnmi_oc/data/ +COPY src/tests/l2_vpn_gnmi_oc/tests/. ./tests/l2_vpn_gnmi_oc/tests/ +COPY src/tests/l2_vpn_gnmi_oc/scripts/. ./ + +RUN apt-get --yes --quiet --quiet update && \ + apt-get --yes --quiet --quiet install tree && \ + rm -rf /var/lib/apt/lists/* + +RUN tree -la /var/teraflow diff --git a/src/tests/l2_vpn_gnmi_oc/README.md b/src/tests/l2_vpn_gnmi_oc/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0bd02d5f9974553d77b0dc3b3496f001c73c3ebf --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/README.md @@ -0,0 +1,128 @@ +# L2 VPN test with gNMI/OpenConfig + +## Emulated DataPlane Deployment +- ContainerLab +- Scenario +- Descriptor + +## TeraFlowSDN Deployment +```bash +cd ~/tfs-ctrl +source ~/tfs-ctrl/src/tests/l2_vpn_gnmi_oc/deploy_specs.sh +./deploy/all.sh +``` + +# ContainerLab - Arista cEOS - Commands + +## Download and install ContainerLab +```bash +sudo bash -c "$(curl -sL https://get.containerlab.dev)" -- -v 0.59.0 +``` + +## Download Arista cEOS image and create Docker image +```bash +cd ~/tfs-ctrl/src/tests/l2_vpn_gnmi_oc/ +docker import arista/cEOS64-lab-4.33.5M.tar ceos:4.33.5M +``` + +## Deploy scenario +```bash +cd ~/tfs-ctrl/src/tests/l2_vpn_gnmi_oc/ +sudo containerlab deploy --topo l2_vpn_gnmi_oc.clab.yml +``` + +## Inspect scenario +```bash +cd ~/tfs-ctrl/src/tests/l2_vpn_gnmi_oc/ +sudo containerlab inspect --topo l2_vpn_gnmi_oc.clab.yml +``` + +## Destroy scenario +```bash +cd ~/tfs-ctrl/src/tests/l2_vpn_gnmi_oc/ +sudo containerlab destroy --topo l2_vpn_gnmi_oc.clab.yml +sudo rm -rf clab-l2_vpn_gnmi_oc/ .l2_vpn_gnmi_oc.clab.yml.bak +``` + +## Access cEOS Bash/CLI +```bash +docker exec -it clab-l2_vpn_gnmi_oc-r1 bash +docker exec -it clab-l2_vpn_gnmi_oc-r2 bash +docker exec -it clab-l2_vpn_gnmi_oc-r3 bash +docker exec -it clab-l2_vpn_gnmi_oc-r1 Cli +docker exec -it clab-l2_vpn_gnmi_oc-r2 Cli +docker exec -it clab-l2_vpn_gnmi_oc-r3 Cli +``` + +## Configure ContainerLab clients +```bash +docker exec -it clab-l2_vpn_gnmi_oc-dc1 bash + ip link set address 00:c1:ab:00:01:0a dev eth1 + ip link set eth1 up + ip link add link eth1 name eth1.125 type vlan id 125 + ip address add 172.16.1.10/24 dev eth1.125 + ip link set eth1.125 up + ping 172.16.1.20 + +docker exec -it clab-l2_vpn_gnmi_oc-dc2 bash + ip link set address 00:c1:ab:00:01:14 dev eth1 + ip link set eth1 up + ip link add link eth1 name eth1.125 type vlan id 125 + ip address add 172.16.1.20/24 dev eth1.125 + ip link set eth1.125 up + ping 172.16.1.10 +``` + +## Install gNMIc +```bash +sudo bash -c "$(curl -sL https://get-gnmic.kmrd.dev)" +``` + +## gNMI Capabilities request +```bash +gnmic --address clab-l2_vpn_gnmi_oc-r1 --port 6030 --username admin --password admin --insecure capabilities +``` + +## gNMI Get request +```bash +gnmic --address clab-l2_vpn_gnmi_oc-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path / > r1.json +gnmic --address clab-l2_vpn_gnmi_oc-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path /interfaces/interface > r1-ifaces.json +``` + +## gNMI Set request +```bash +gnmic --address clab-l2_vpn_gnmi_oc-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set --update-path /system/config/hostname --update-value srl11 +gnmic --address clab-l2_vpn_gnmi_oc-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path /system/config/hostname + +gnmic --address clab-l2_vpn_gnmi_oc-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set \ +--update-path '/network-instances/network-instance[name=default]/vlans/vlan[vlan-id=200]/config/vlan-id' --update-value 200 \ +--update-path '/interfaces/interface[name=Ethernet10]/config/name' --update-value '"Ethernet10"' \ +--update-path '/interfaces/interface[name=Ethernet10]/ethernet/switched-vlan/config/interface-mode' --update-value '"ACCESS"' \ +--update-path '/interfaces/interface[name=Ethernet10]/ethernet/switched-vlan/config/access-vlan' --update-value 200 \ +--update-path '/interfaces/interface[name=Ethernet2]/config/name' --update-value '"Ethernet2"' \ +--update-path '/interfaces/interface[name=Ethernet2]/ethernet/switched-vlan/config/interface-mode' --update-value '"TRUNK"' +--update-path '/interfaces/interface[name=Ethernet2]/ethernet/switched-vlan/config/trunk-vlans' --update-value 200 + +``` + +## Subscribe request +```bash +gnmic --address clab-l2_vpn_gnmi_oc-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf subscribe --path /interfaces/interface[name=Management0]/state/ + +# In another terminal, you can generate traffic opening SSH connection +ssh admin@clab-l2_vpn_gnmi_oc-r1 +``` + +# Check configurations done: +```bash +gnmic --address clab-l2_vpn_gnmi_oc-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path '/' > r1-all.json +gnmic --address clab-l2_vpn_gnmi_oc-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path '/network-instances' > r1-nis.json +gnmic --address clab-l2_vpn_gnmi_oc-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path '/interfaces' > r1-ifs.json +``` + +# Delete elements: +```bash +--address clab-l2_vpn_gnmi_oc-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set --delete '/network-instances/network-instance[name=b19229e8]' +--address clab-l2_vpn_gnmi_oc-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set --delete '/interfaces/interface[name=ethernet-1/1]/subinterfaces/subinterface[index=0]' +--address clab-l2_vpn_gnmi_oc-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set --delete '/interfaces/interface[name=ethernet-1/2]/subinterfaces/subinterface[index=0]' +``` diff --git a/src/tests/l2_vpn_gnmi_oc/__init__.py b/src/tests/l2_vpn_gnmi_oc/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..3ccc21c7db78aac26daa1f8c5ff8e1ffd3f35460 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/__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/l2_vpn_gnmi_oc/clab/cfg-static-pseudowires/r1-l2-vpn.cfg b/src/tests/l2_vpn_gnmi_oc/clab/cfg-static-pseudowires/r1-l2-vpn.cfg new file mode 100644 index 0000000000000000000000000000000000000000..93b91da828a464cb1aaa477b0783465422f275cb --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/clab/cfg-static-pseudowires/r1-l2-vpn.cfg @@ -0,0 +1,74 @@ +! Command: show running-config +! device: r1 (cEOSLab, EOS-4.33.5M-43712898.4335M (engineering build)) +! +no aaa root +! +username admin privilege 15 role network-admin secret sha512 $6$OmfaAwJRg/r44r5U$9Fca1O1G6Bgsd4NKwSyvdRJcHHk71jHAR3apDWAgSTN/t/j1iroEhz5J36HjWjOF/jEVC/R8Wa60VmbX6.cr70 +! +management api http-commands + no shutdown +! +no service interface inactive port-id allocation disabled +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname r1 +! +spanning-tree mode mstp +! +system l1 + unsupported speed action error + unsupported error-correction action error +! +management api gnmi + transport grpc default +! +management api netconf + transport ssh default +! +interface Ethernet2 + no switchport + ip address 10.0.12.1/30 + mpls ldp interface +! +interface Ethernet10 + no switchport +! +interface Loopback0 + ip address 1.1.1.1/32 +! +interface Management0 + ip address 172.20.20.101/24 +! +ip routing +! +ip route 0.0.0.0/0 172.20.20.1 +ip route 2.2.2.2/32 10.0.12.2 +! +mpls ip +! +mpls ldp + router-id interface Loopback0 + no shutdown + ! + pseudowires + pseudowire pw-dc1-dc2 + neighbor 2.2.2.2 + pseudowire-id 100 + mtu 1500 +! +patch panel + patch dc1-pw + connector 1 interface Ethernet10 dot1q vlan 100 + connector 2 pseudowire ldp pw-dc1-dc2 +! +router multicast + ipv4 + software-forwarding kernel + ! + ipv6 + software-forwarding kernel +! +end diff --git a/src/tests/l2_vpn_gnmi_oc/clab/cfg-static-pseudowires/r2-l2-vpn.cfg b/src/tests/l2_vpn_gnmi_oc/clab/cfg-static-pseudowires/r2-l2-vpn.cfg new file mode 100644 index 0000000000000000000000000000000000000000..f90737f82f5c148a8d8bfffef01a01ab14697f99 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/clab/cfg-static-pseudowires/r2-l2-vpn.cfg @@ -0,0 +1,74 @@ +! Command: show running-config +! device: r2 (cEOSLab, EOS-4.33.5M-43712898.4335M (engineering build)) +! +no aaa root +! +username admin privilege 15 role network-admin secret sha512 $6$OmfaAwJRg/r44r5U$9Fca1O1G6Bgsd4NKwSyvdRJcHHk71jHAR3apDWAgSTN/t/j1iroEhz5J36HjWjOF/jEVC/R8Wa60VmbX6.cr70 +! +management api http-commands + no shutdown +! +no service interface inactive port-id allocation disabled +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname r2 +! +spanning-tree mode mstp +! +system l1 + unsupported speed action error + unsupported error-correction action error +! +management api gnmi + transport grpc default +! +management api netconf + transport ssh default +! +interface Ethernet1 + no switchport + ip address 10.0.12.2/30 + mpls ldp interface +! +interface Ethernet10 + no switchport +! +interface Loopback0 + ip address 2.2.2.2/32 +! +interface Management0 + ip address 172.20.20.102/24 +! +ip routing +! +ip route 0.0.0.0/0 172.20.20.1 +ip route 1.1.1.1/32 10.0.12.1 +! +mpls ip +! +mpls ldp + router-id interface Loopback0 + no shutdown + ! + pseudowires + pseudowire pw-dc1-dc2 + neighbor 1.1.1.1 + pseudowire-id 100 + mtu 1500 +! +patch panel + patch dc2-pw + connector 1 interface Ethernet10 dot1q vlan 100 + connector 2 pseudowire ldp pw-dc1-dc2 +! +router multicast + ipv4 + software-forwarding kernel + ! + ipv6 + software-forwarding kernel +! +end diff --git a/src/tests/l2_vpn_gnmi_oc/clab/l2_vpn_gnmi_oc.clab.yml b/src/tests/l2_vpn_gnmi_oc/clab/l2_vpn_gnmi_oc.clab.yml new file mode 100644 index 0000000000000000000000000000000000000000..611dd90b316a8e71be18d327f0fbce77a17ac2a4 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/clab/l2_vpn_gnmi_oc.clab.yml @@ -0,0 +1,80 @@ +# 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. + +# TFS - Arista devices + Linux clients + +name: l2_vpn_gnmi_oc + +mgmt: + network: mgmt-net + ipv4-subnet: 172.20.20.0/24 + +topology: + kinds: + arista_ceos: + kind: arista_ceos + #image: ceos:4.30.4M + #image: ceos:4.31.2F + #image: ceos:4.31.5M # tested, works + #image: ceos:4.32.0F + #image: ceos:4.33.5M + #image: ceos:4.34.4M + image: ceos:4.32.2F + #image: ceos:4.32.2.1F + #image: ceos:4.33.1F # does not work, libyang.util.LibyangError: failed to parse data tree: No module named "openconfig-platform-healthz" in the context. + linux: + kind: linux + image: ghcr.io/hellt/network-multitool:latest + + nodes: + r1: + kind: arista_ceos + mgmt-ipv4: 172.20.20.101 + startup-config: r1-startup.cfg + + r2: + kind: arista_ceos + mgmt-ipv4: 172.20.20.102 + startup-config: r2-startup.cfg + + r3: + kind: arista_ceos + mgmt-ipv4: 172.20.20.103 + startup-config: r3-startup.cfg + + dc1: + kind: linux + mgmt-ipv4: 172.20.20.201 + exec: + - ip link set address 00:c1:ab:00:01:0a dev eth1 + - ip link set eth1 up + - ip link add link eth1 name eth1.125 type vlan id 125 + - ip address add 172.16.1.10/24 dev eth1.125 + - ip link set eth1.125 up + + dc2: + kind: linux + mgmt-ipv4: 172.20.20.202 + exec: + - ip link set address 00:c1:ab:00:01:14 dev eth1 + - ip link set eth1 up + - ip link add link eth1 name eth1.125 type vlan id 125 + - ip address add 172.16.1.20/24 dev eth1.125 + - ip link set eth1.125 up + + links: + - endpoints: ["r1:eth2", "r2:eth1"] + - endpoints: ["r2:eth3", "r3:eth2"] + - endpoints: ["r1:eth10", "dc1:eth1"] + - endpoints: ["r3:eth10", "dc2:eth1"] diff --git a/src/tests/l2_vpn_gnmi_oc/clab/r1-startup.cfg b/src/tests/l2_vpn_gnmi_oc/clab/r1-startup.cfg new file mode 100644 index 0000000000000000000000000000000000000000..712797deb76a3345e4a756c6bee9d6f3d13400db --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/clab/r1-startup.cfg @@ -0,0 +1,48 @@ +! device: r1 (cEOSLab, EOS-4.34.4M) +! +no aaa root +! +username admin privilege 15 role network-admin secret sha512 $6$OmfaAwJRg/r44r5U$9Fca1O1G6Bgsd4NKwSyvdRJcHHk71jHAR3apDWAgSTN/t/j1iroEhz5J36HjWjOF/jEVC/R8Wa60VmbX6.cr70 +! +management api http-commands + no shutdown +! +no service interface inactive port-id allocation disabled +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname r1 +! +spanning-tree mode mstp +! +system l1 + unsupported speed action error + unsupported error-correction action error +! +management api gnmi + transport grpc default +! +management api netconf + transport ssh default +! +interface Ethernet2 +! +interface Ethernet10 +! +interface Management0 + ip address 172.20.20.101/24 +! +ip routing +! +ip route 0.0.0.0/0 172.20.20.1 +! +router multicast + ipv4 + software-forwarding kernel + ! + ipv6 + software-forwarding kernel +! +end diff --git a/src/tests/l2_vpn_gnmi_oc/clab/r2-startup.cfg b/src/tests/l2_vpn_gnmi_oc/clab/r2-startup.cfg new file mode 100644 index 0000000000000000000000000000000000000000..6a1133703d0e195f58c0a8cd0b42a84068ef90b2 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/clab/r2-startup.cfg @@ -0,0 +1,48 @@ +! device: r2 (cEOSLab, EOS-4.34.4M) +! +no aaa root +! +username admin privilege 15 role network-admin secret sha512 $6$OmfaAwJRg/r44r5U$9Fca1O1G6Bgsd4NKwSyvdRJcHHk71jHAR3apDWAgSTN/t/j1iroEhz5J36HjWjOF/jEVC/R8Wa60VmbX6.cr70 +! +management api http-commands + no shutdown +! +no service interface inactive port-id allocation disabled +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname r2 +! +spanning-tree mode mstp +! +system l1 + unsupported speed action error + unsupported error-correction action error +! +management api gnmi + transport grpc default +! +management api netconf + transport ssh default +! +interface Ethernet1 +! +interface Ethernet3 +! +interface Management0 + ip address 172.20.20.102/24 +! +ip routing +! +ip route 0.0.0.0/0 172.20.20.1 +! +router multicast + ipv4 + software-forwarding kernel + ! + ipv6 + software-forwarding kernel +! +end diff --git a/src/tests/l2_vpn_gnmi_oc/clab/r3-startup.cfg b/src/tests/l2_vpn_gnmi_oc/clab/r3-startup.cfg new file mode 100644 index 0000000000000000000000000000000000000000..946de6f77a5a2803fccebef4f3777e7102608225 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/clab/r3-startup.cfg @@ -0,0 +1,48 @@ +! device: r3 (cEOSLab, EOS-4.34.4M) +! +no aaa root +! +username admin privilege 15 role network-admin secret sha512 $6$OmfaAwJRg/r44r5U$9Fca1O1G6Bgsd4NKwSyvdRJcHHk71jHAR3apDWAgSTN/t/j1iroEhz5J36HjWjOF/jEVC/R8Wa60VmbX6.cr70 +! +management api http-commands + no shutdown +! +no service interface inactive port-id allocation disabled +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname r3 +! +spanning-tree mode mstp +! +system l1 + unsupported speed action error + unsupported error-correction action error +! +management api gnmi + transport grpc default +! +management api netconf + transport ssh default +! +interface Ethernet2 +! +interface Ethernet10 +! +interface Management0 + ip address 172.20.20.103/24 +! +ip routing +! +ip route 0.0.0.0/0 172.20.20.1 +! +router multicast + ipv4 + software-forwarding kernel + ! + ipv6 + software-forwarding kernel +! +end diff --git a/src/tests/l2_vpn_gnmi_oc/data/ietf-l2vpn-service.json b/src/tests/l2_vpn_gnmi_oc/data/ietf-l2vpn-service.json new file mode 100644 index 0000000000000000000000000000000000000000..95bea42eacba9440fc5e68a035d3a9ff5a3e59a5 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/data/ietf-l2vpn-service.json @@ -0,0 +1,81 @@ +{ + "ietf-l2vpn-svc:l2vpn-svc": { + "vpn-services": {"vpn-service": [ + { + "vpn-id": "ietf-l2vpn-svc", + "vpn-svc-type": "vpws", + "svc-topo": "any-to-any", + "customer-name": "somebody", + "ce-vlan-preservation": true, + "ce-vlan-cos-preservation": true, + "frame-delivery": { + "multicast-gp-port-mapping": "ietf-l2vpn-svc:static-mapping" + } + } + ]}, + "sites": { + "site": [ + { + "site-id": "site_DC1", + "management": {"type": "ietf-l2vpn-svc:provider-managed"}, + "locations": {"location": [{"location-id": "DC1"}]}, + "devices": {"device": [{"device-id": "dc1", "location": "DC1"}]}, + "default-ce-vlan-id": 1, + "site-network-accesses": { + "site-network-access": [ + { + "network-access-id": "eth1", + "type": "ietf-l2vpn-svc:multipoint", + "device-reference": "dc1", + "vpn-attachment": { + "vpn-id": "ietf-l2vpn-svc", + "site-role": "ietf-l2vpn-svc:any-to-any-role" + }, + "bearer": {"bearer-reference": "r1:Ethernet10"}, + "service": {"svc-mtu": 1400}, + "connection": { + "encapsulation-type": "vlan", + "tagged-interface": { + "type": "ietf-l2vpn-svc:dot1q", + "dot1q-vlan-tagged": {"cvlan-id": 125} + }, + "oam": {"md-name": "fake-md-name", "md-level": 0} + } + } + ] + } + }, + { + "site-id": "site_DC2", + "management": {"type": "ietf-l2vpn-svc:provider-managed"}, + "locations": {"location": [{"location-id": "DC2"}]}, + "devices": {"device": [{"device-id": "dc2", "location": "DC2"}]}, + "default-ce-vlan-id": 1, + "site-network-accesses": { + "site-network-access": [ + { + "network-access-id": "eth1", + "type": "ietf-l2vpn-svc:multipoint", + "device-reference": "dc2", + "vpn-attachment": { + "vpn-id": "ietf-l2vpn-svc", + "site-role": "ietf-l2vpn-svc:any-to-any-role" + }, + "bearer": {"bearer-reference": "r3:Ethernet10"}, + "service": {"svc-mtu": 1400}, + "connection": { + "encapsulation-type": "vlan", + "tagged-interface": { + "type": "ietf-l2vpn-svc:dot1q", + "dot1q-vlan-tagged": {"cvlan-id": 125} + }, + "oam": {"md-name": "fake-md-name", "md-level": 0} + } + } + ] + } + } + ] + } + } +} diff --git a/src/tests/l2_vpn_gnmi_oc/data/tfs-service-vlan-125-tagged.json b/src/tests/l2_vpn_gnmi_oc/data/tfs-service-vlan-125-tagged.json new file mode 100644 index 0000000000000000000000000000000000000000..c5cc6b5e94930f947058c9b677148a3c78232186 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/data/tfs-service-vlan-125-tagged.json @@ -0,0 +1,21 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, "service_uuid": {"uuid": "tfs-l2vpn-svc-125"} + }, + "service_type": "SERVICETYPE_L2NM", + "service_status": {"service_status": "SERVICESTATUS_PLANNED"}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "dc1"}}, "endpoint_uuid": {"uuid": "int"}}, + {"device_id": {"device_uuid": {"uuid": "dc2"}}, "endpoint_uuid": {"uuid": "int"}} + ], + "service_config": {"config_rules": [ + {"action": "CONFIGACTION_SET", "custom": { + "resource_key": "/settings", + "resource_value": {"vlan_id": 125, "access_vlan_tagged": true} + }} + ]} + } + ] +} diff --git a/src/tests/l2_vpn_gnmi_oc/data/tfs-service-vlan-125-untagged.json b/src/tests/l2_vpn_gnmi_oc/data/tfs-service-vlan-125-untagged.json new file mode 100644 index 0000000000000000000000000000000000000000..f7031955531fc08dbf99836a17abbf7346b88b4b --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/data/tfs-service-vlan-125-untagged.json @@ -0,0 +1,21 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, "service_uuid": {"uuid": "tfs-l2vpn-svc-125"} + }, + "service_type": "SERVICETYPE_L2NM", + "service_status": {"service_status": "SERVICESTATUS_PLANNED"}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "dc1"}}, "endpoint_uuid": {"uuid": "int"}}, + {"device_id": {"device_uuid": {"uuid": "dc2"}}, "endpoint_uuid": {"uuid": "int"}} + ], + "service_config": {"config_rules": [ + {"action": "CONFIGACTION_SET", "custom": { + "resource_key": "/settings", + "resource_value": {"vlan_id": 125} + }} + ]} + } + ] +} diff --git a/src/tests/l2_vpn_gnmi_oc/data/tfs-topology.json b/src/tests/l2_vpn_gnmi_oc/data/tfs-topology.json new file mode 100644 index 0000000000000000000000000000000000000000..ac87af62d31e4728c12687c525233d8e840d7441 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/data/tfs-topology.json @@ -0,0 +1,126 @@ +{ + "contexts": [ + {"context_id": {"context_uuid": {"uuid": "admin"}}} + ], + "topologies": [ + {"topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}}} + ], + "devices": [ + { + "device_id": {"device_uuid": {"uuid": "dc1"}}, "device_type": "emu-datacenter", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": {"config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"uuid": "eth1", "type": "copper"}, {"uuid": "int", "type": "copper"} + ]}}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "dc2"}}, "device_type": "emu-datacenter", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": {"config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"uuid": "eth1", "type": "copper"}, {"uuid": "int", "type": "copper"} + ]}}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "r1"}}, "device_type": "packet-router", + "device_drivers": ["DEVICEDRIVER_GNMI_OPENCONFIG"], + "device_config": {"config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "172.20.20.101"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "6030"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "username": "admin", "password": "admin", "use_tls": false + }}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "r2"}}, "device_type": "packet-router", + "device_drivers": ["DEVICEDRIVER_GNMI_OPENCONFIG"], + "device_config": {"config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "172.20.20.102"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "6030"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "username": "admin", "password": "admin", "use_tls": false + }}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "r3"}}, "device_type": "packet-router", + "device_drivers": ["DEVICEDRIVER_GNMI_OPENCONFIG"], + "device_config": {"config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "172.20.20.103"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "6030"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "username": "admin", "password": "admin", "use_tls": false + }}} + ]} + } + ], + "links": [ + { + "link_id": {"link_uuid": {"uuid": "r1/Ethernet2==r2/Ethernet1"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "r1"}}, "endpoint_uuid": {"uuid": "Ethernet2"}}, + {"device_id": {"device_uuid": {"uuid": "r2"}}, "endpoint_uuid": {"uuid": "Ethernet1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "r2/Ethernet1==r1/Ethernet2"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "r2"}}, "endpoint_uuid": {"uuid": "Ethernet1"}}, + {"device_id": {"device_uuid": {"uuid": "r1"}}, "endpoint_uuid": {"uuid": "Ethernet2"}} + ] + }, + + { + "link_id": {"link_uuid": {"uuid": "r2/Ethernet3==r3/Ethernet2"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "r2"}}, "endpoint_uuid": {"uuid": "Ethernet3"}}, + {"device_id": {"device_uuid": {"uuid": "r3"}}, "endpoint_uuid": {"uuid": "Ethernet2"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "r3/Ethernet2==r2/Ethernet3"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "r3"}}, "endpoint_uuid": {"uuid": "Ethernet2"}}, + {"device_id": {"device_uuid": {"uuid": "r2"}}, "endpoint_uuid": {"uuid": "Ethernet3"}} + ] + }, + + { + "link_id": {"link_uuid": {"uuid": "r1/Ethernet10==dc1/eth1"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "r1"}}, "endpoint_uuid": {"uuid": "Ethernet10"}}, + {"device_id": {"device_uuid": {"uuid": "dc1"}}, "endpoint_uuid": {"uuid": "eth1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "dc1/eth1==r1/Ethernet10"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "dc1"}}, "endpoint_uuid": {"uuid": "eth1"}}, + {"device_id": {"device_uuid": {"uuid": "r1"}}, "endpoint_uuid": {"uuid": "Ethernet10"}} + ] + }, + + { + "link_id": {"link_uuid": {"uuid": "r3/Ethernet10==dc2/eth1"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "r3"}}, "endpoint_uuid": {"uuid": "Ethernet10"}}, + {"device_id": {"device_uuid": {"uuid": "dc2"}}, "endpoint_uuid": {"uuid": "eth1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "dc2/eth1==r3/Ethernet10"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "dc2"}}, "endpoint_uuid": {"uuid": "eth1"}}, + {"device_id": {"device_uuid": {"uuid": "r3"}}, "endpoint_uuid": {"uuid": "Ethernet10"}} + ] + } + ] +} diff --git a/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-cli-dc1.sh b/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-cli-dc1.sh new file mode 100755 index 0000000000000000000000000000000000000000..94c4d7d5181bc90abda5692d41742853574a0a74 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-cli-dc1.sh @@ -0,0 +1,16 @@ +#!/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. + +docker exec -it clab-l2_vpn_gnmi_oc-dc1 bash diff --git a/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-cli-dc2.sh b/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-cli-dc2.sh new file mode 100755 index 0000000000000000000000000000000000000000..9d6e84b1f376cfe02afdf99fa098fbeaa7a35b21 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-cli-dc2.sh @@ -0,0 +1,16 @@ +#!/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. + +docker exec -it clab-l2_vpn_gnmi_oc-dc2 bash diff --git a/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-cli-r1.sh b/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-cli-r1.sh new file mode 100755 index 0000000000000000000000000000000000000000..26d39cfcd3a406e46648d83b84f1c0ac5a9020d8 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-cli-r1.sh @@ -0,0 +1,16 @@ +#!/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. + +docker exec -it clab-l2_vpn_gnmi_oc-r1 Cli diff --git a/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-cli-r2.sh b/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-cli-r2.sh new file mode 100755 index 0000000000000000000000000000000000000000..e6ee51ec92bcd071f279c6721050f4d81d80c7e0 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-cli-r2.sh @@ -0,0 +1,16 @@ +#!/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. + +docker exec -it clab-l2_vpn_gnmi_oc-r2 Cli diff --git a/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-cli-r3.sh b/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-cli-r3.sh new file mode 100755 index 0000000000000000000000000000000000000000..d817ccffda0f9863cb6ee429e85741c9af675abb --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-cli-r3.sh @@ -0,0 +1,16 @@ +#!/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. + +docker exec -it clab-l2_vpn_gnmi_oc-r3 Cli diff --git a/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-deploy.sh b/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-deploy.sh new file mode 100755 index 0000000000000000000000000000000000000000..294f680b21d1b7f24d2cb820bd8e8a2b6b123065 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-deploy.sh @@ -0,0 +1,17 @@ +#!/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 ~/tfs-ctrl/src/tests/l2_vpn_gnmi_oc +sudo containerlab deploy --topo clab/l2_vpn_gnmi_oc.clab.yml diff --git a/src/tests/p4-fabric-tna/run_test_03b_service_deprovision_l2.sh b/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-destroy.sh similarity index 78% rename from src/tests/p4-fabric-tna/run_test_03b_service_deprovision_l2.sh rename to src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-destroy.sh index 4bd4edb4556aebe87dfe84ae073ca8dc81878251..68f7c30b1d74e1d942eeb39422c27e6477781ef1 100755 --- a/src/tests/p4-fabric-tna/run_test_03b_service_deprovision_l2.sh +++ b/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-destroy.sh @@ -13,5 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_l2.py +cd ~/tfs-ctrl/src/tests/l2_vpn_gnmi_oc +sudo containerlab destroy --topo clab/l2_vpn_gnmi_oc.clab.yml +sudo rm -rf clab/clab-l2_vpn_gnmi_oc/ clab/.l2_vpn_gnmi_oc.clab.yml.bak diff --git a/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-inspect.sh b/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-inspect.sh new file mode 100755 index 0000000000000000000000000000000000000000..2a8325f59d076dd76ce6305f980680133884b384 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/deploy-scripts/clab-inspect.sh @@ -0,0 +1,17 @@ +#!/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 ~/tfs-ctrl/src/tests/l2_vpn_gnmi_oc +sudo containerlab inspect --topo l2_vpn_gnmi_oc.clab.yml diff --git a/src/tests/l2_vpn_gnmi_oc/deploy_specs.sh b/src/tests/l2_vpn_gnmi_oc/deploy_specs.sh new file mode 100755 index 0000000000000000000000000000000000000000..72cd25b58a02f442838bab866cc969680c073ebc --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/deploy_specs.sh @@ -0,0 +1,208 @@ +#!/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. + + +# ----- TeraFlowSDN ------------------------------------------------------------ + +# Set the URL of the internal MicroK8s Docker registry where the images will be uploaded to. +export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/" + +# Set the list of components, separated by spaces, you want to build images for, and deploy. +#export TFS_COMPONENTS="context device pathcomp service slice nbi webui load_generator" +export TFS_COMPONENTS="context device pathcomp service nbi" + +# Uncomment to activate Monitoring (old) +#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring" + +# Uncomment to activate Monitoring Framework (new) +#export TFS_COMPONENTS="${TFS_COMPONENTS} kpi_manager kpi_value_writer kpi_value_api telemetry analytics automation" + +# Uncomment to activate QoS Profiles +#export TFS_COMPONENTS="${TFS_COMPONENTS} qos_profile" + +# Uncomment to activate BGP-LS Speaker +#export TFS_COMPONENTS="${TFS_COMPONENTS} bgpls_speaker" + +# Uncomment to activate Optical Controller +# To manage optical connections, "service" requires "opticalcontroller" to be deployed +# before "service", thus we "hack" the TFS_COMPONENTS environment variable prepending the +# "opticalcontroller" only if "service" is already in TFS_COMPONENTS, and re-export it. +#if [[ "$TFS_COMPONENTS" == *"service"* ]]; then +# BEFORE="${TFS_COMPONENTS% service*}" +# AFTER="${TFS_COMPONENTS#* service}" +# export TFS_COMPONENTS="${BEFORE} opticalcontroller service ${AFTER}" +#fi + +# Uncomment to activate ZTP +#export TFS_COMPONENTS="${TFS_COMPONENTS} ztp" + +# Uncomment to activate Policy Manager +#export TFS_COMPONENTS="${TFS_COMPONENTS} policy" + +# Uncomment to activate Optical CyberSecurity +#export TFS_COMPONENTS="${TFS_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector opticalattackmanager" + +# Uncomment to activate L3 CyberSecurity +#export TFS_COMPONENTS="${TFS_COMPONENTS} l3_attackmitigator l3_centralizedattackdetector" + +# Uncomment to activate TE +#export TFS_COMPONENTS="${TFS_COMPONENTS} te" + +# Uncomment to activate Forecaster +#export TFS_COMPONENTS="${TFS_COMPONENTS} forecaster" + +# Uncomment to activate E2E Orchestrator +#export TFS_COMPONENTS="${TFS_COMPONENTS} e2e_orchestrator" + +# Uncomment to activate DLT and Interdomain +#export TFS_COMPONENTS="${TFS_COMPONENTS} interdomain dlt" +#if [[ "$TFS_COMPONENTS" == *"dlt"* ]]; then +# export KEY_DIRECTORY_PATH="src/dlt/gateway/keys/priv_sk" +# export CERT_DIRECTORY_PATH="src/dlt/gateway/keys/cert.pem" +# export TLS_CERT_PATH="src/dlt/gateway/keys/ca.crt" +#fi + +# Uncomment to activate QKD App +# To manage QKD Apps, "service" requires "qkd_app" to be deployed +# before "service", thus we "hack" the TFS_COMPONENTS environment variable prepending the +# "qkd_app" only if "service" is already in TFS_COMPONENTS, and re-export it. +#if [[ "$TFS_COMPONENTS" == *"service"* ]]; then +# BEFORE="${TFS_COMPONENTS% service*}" +# AFTER="${TFS_COMPONENTS#* service}" +# export TFS_COMPONENTS="${BEFORE} qkd_app service ${AFTER}" +#fi + + +# Set the tag you want to use for your images. +export TFS_IMAGE_TAG="dev" + +# Set the name of the Kubernetes namespace to deploy TFS to. +export TFS_K8S_NAMESPACE="tfs" + +# Set additional manifest files to be applied after the deployment +export TFS_EXTRA_MANIFESTS="manifests/nginx_ingress_http.yaml" + +# Uncomment to monitor performance of components +#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/servicemonitors.yaml" + +# Uncomment when deploying Optical CyberSecurity +#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/cachingservice.yaml" + +# Set the new Grafana admin password +export TFS_GRAFANA_PASSWORD="admin123+" + +# Disable skip-build flag to rebuild the Docker images. +export TFS_SKIP_BUILD="" + + +# ----- CockroachDB ------------------------------------------------------------ + +# Set the namespace where CockroackDB will be deployed. +export CRDB_NAMESPACE="crdb" + +# Set the external port CockroackDB Postgre SQL interface will be exposed to. +export CRDB_EXT_PORT_SQL="26257" + +# Set the external port CockroackDB HTTP Mgmt GUI interface will be exposed to. +export CRDB_EXT_PORT_HTTP="8081" + +# Set the database username to be used by Context. +export CRDB_USERNAME="tfs" + +# Set the database user's password to be used by Context. +export CRDB_PASSWORD="tfs123" + +# Set CockroachDB installation mode to 'single'. This option is convenient for development and testing. +# See ./deploy/all.sh or ./deploy/crdb.sh for additional details +export CRDB_DEPLOY_MODE="single" + +# Disable flag for dropping database, if it exists. +export CRDB_DROP_DATABASE_IF_EXISTS="YES" + +# Disable flag for re-deploying CockroachDB from scratch. +export CRDB_REDEPLOY="" + + +# ----- NATS ------------------------------------------------------------------- + +# Set the namespace where NATS will be deployed. +export NATS_NAMESPACE="nats" + +# Set the external port NATS Client interface will be exposed to. +export NATS_EXT_PORT_CLIENT="4222" + +# Set the external port NATS HTTP Mgmt GUI interface will be exposed to. +export NATS_EXT_PORT_HTTP="8222" + +# Set NATS installation mode to 'single'. This option is convenient for development and testing. +# See ./deploy/all.sh or ./deploy/nats.sh for additional details +export NATS_DEPLOY_MODE="single" + +# Disable flag for re-deploying NATS from scratch. +export NATS_REDEPLOY="" + + +# ----- QuestDB ---------------------------------------------------------------- + +# Set the namespace where QuestDB will be deployed. +export QDB_NAMESPACE="qdb" + +# Set the external port QuestDB Postgre SQL interface will be exposed to. +export QDB_EXT_PORT_SQL="8812" + +# Set the external port QuestDB Influx Line Protocol interface will be exposed to. +export QDB_EXT_PORT_ILP="9009" + +# Set the external port QuestDB HTTP Mgmt GUI interface will be exposed to. +export QDB_EXT_PORT_HTTP="9000" + +# Set the database username to be used for QuestDB. +export QDB_USERNAME="admin" + +# Set the database user's password to be used for QuestDB. +export QDB_PASSWORD="quest" + +# Set the table name to be used by Monitoring for KPIs. +export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis" + +# Set the table name to be used by Slice for plotting groups. +export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups" + +# Disable flag for dropping tables if they exist. +export QDB_DROP_TABLES_IF_EXIST="YES" + +# Disable flag for re-deploying QuestDB from scratch. +export QDB_REDEPLOY="" + + +# ----- K8s Observability ------------------------------------------------------ + +# Set the external port Prometheus Mgmt HTTP GUI interface will be exposed to. +export PROM_EXT_PORT_HTTP="9090" + +# Set the external port Grafana HTTP Dashboards will be exposed to. +export GRAF_EXT_PORT_HTTP="3000" + + +# ----- Apache Kafka ----------------------------------------------------------- + +# Set the namespace where Apache Kafka will be deployed. +export KFK_NAMESPACE="kafka" + +# Set the port Apache Kafka server will be exposed to. +export KFK_SERVER_PORT="9092" + +# Set the flag to YES for redeploying of Apache Kafka +export KFK_REDEPLOY="" diff --git a/src/tests/l2_vpn_gnmi_oc/redeploy-tfs.sh b/src/tests/l2_vpn_gnmi_oc/redeploy-tfs.sh new file mode 100755 index 0000000000000000000000000000000000000000..d3e80c1084ae8b52351a0a488b53bca65bba7f9b --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/redeploy-tfs.sh @@ -0,0 +1,17 @@ +#!/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. + +source ~/tfs-ctrl/src/tests/l2_vpn_gnmi_oc/deploy_specs.sh +./deploy/all.sh diff --git a/src/tests/l2_vpn_gnmi_oc/requirements.in b/src/tests/l2_vpn_gnmi_oc/requirements.in new file mode 100644 index 0000000000000000000000000000000000000000..5c92783a232a5bbe18b4dd6d0e6735e3ce8414c2 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/requirements.in @@ -0,0 +1,15 @@ +# 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. + +requests==2.27.* diff --git a/src/tests/l2_vpn_gnmi_oc/scripts/run-cleanup.sh b/src/tests/l2_vpn_gnmi_oc/scripts/run-cleanup.sh new file mode 100755 index 0000000000000000000000000000000000000000..0bdae7627017f5b9e32aa2560114e23e8aebb1cc --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/scripts/run-cleanup.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. + +source /var/teraflow/tfs_runtime_env_vars.sh +export PYTHONPATH=/var/teraflow +pytest --verbose --log-level=INFO \ + --junitxml=/opt/results/report_cleanup.xml \ + /var/teraflow/tests/l2_vpn_gnmi_oc/tests/test_cleanup.py diff --git a/src/tests/l2_vpn_gnmi_oc/scripts/run-onboarding.sh b/src/tests/l2_vpn_gnmi_oc/scripts/run-onboarding.sh new file mode 100755 index 0000000000000000000000000000000000000000..36b2ab29282e0a761ad8f44a7922af78ba27608d --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/scripts/run-onboarding.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. + +source /var/teraflow/tfs_runtime_env_vars.sh +export PYTHONPATH=/var/teraflow +pytest --verbose --log-level=INFO \ + --junitxml=/opt/results/report_onboarding.xml \ + /var/teraflow/tests/l2_vpn_gnmi_oc/tests/test_onboarding.py diff --git a/src/tests/ryu-openflow/scripts/run-service-ietf-create.sh b/src/tests/l2_vpn_gnmi_oc/scripts/run-service-ietf-create.sh similarity index 91% rename from src/tests/ryu-openflow/scripts/run-service-ietf-create.sh rename to src/tests/l2_vpn_gnmi_oc/scripts/run-service-ietf-create.sh index 78ec797da4bdf06851d41e63544f3234d1c374e1..4c60250bb3bccfdc3d042fdaf652fb139e97fbc9 100755 --- a/src/tests/ryu-openflow/scripts/run-service-ietf-create.sh +++ b/src/tests/l2_vpn_gnmi_oc/scripts/run-service-ietf-create.sh @@ -17,4 +17,4 @@ source /var/teraflow/tfs_runtime_env_vars.sh export PYTHONPATH=/var/teraflow pytest --verbose --log-level=INFO \ --junitxml=/opt/results/report_service_ietf_create.xml \ - /var/teraflow/tests/ryu-openflow/tests/test_service_ietf_create.py + /var/teraflow/tests/l2_vpn_gnmi_oc/tests/test_service_ietf_create.py diff --git a/src/tests/ryu-openflow/scripts/run-service-ietf-remove.sh b/src/tests/l2_vpn_gnmi_oc/scripts/run-service-ietf-remove.sh similarity index 91% rename from src/tests/ryu-openflow/scripts/run-service-ietf-remove.sh rename to src/tests/l2_vpn_gnmi_oc/scripts/run-service-ietf-remove.sh index ffcedf82b15d2db6c559bc8b287c65e396e4c105..02fabe7d7e9c47ffa7561b529c145903476bf267 100755 --- a/src/tests/ryu-openflow/scripts/run-service-ietf-remove.sh +++ b/src/tests/l2_vpn_gnmi_oc/scripts/run-service-ietf-remove.sh @@ -17,4 +17,4 @@ source /var/teraflow/tfs_runtime_env_vars.sh export PYTHONPATH=/var/teraflow pytest --verbose --log-level=INFO \ --junitxml=/opt/results/report_service_ietf_remove.xml \ - /var/teraflow/tests/ryu-openflow/tests/test_service_ietf_remove.py + /var/teraflow/tests/l2_vpn_gnmi_oc/tests/test_service_ietf_remove.py diff --git a/src/tests/l2_vpn_gnmi_oc/scripts/run-service-tfs-create.sh b/src/tests/l2_vpn_gnmi_oc/scripts/run-service-tfs-create.sh new file mode 100755 index 0000000000000000000000000000000000000000..91dc1f2aa67997c3c4be74a2f8b7a5fc729c0284 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/scripts/run-service-tfs-create.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. + +source /var/teraflow/tfs_runtime_env_vars.sh +export PYTHONPATH=/var/teraflow +pytest --verbose --log-level=INFO \ + --junitxml=/opt/results/report_service_tfs_create.xml \ + /var/teraflow/tests/l2_vpn_gnmi_oc/tests/test_service_tfs_create.py diff --git a/src/tests/l2_vpn_gnmi_oc/scripts/run-service-tfs-remove.sh b/src/tests/l2_vpn_gnmi_oc/scripts/run-service-tfs-remove.sh new file mode 100755 index 0000000000000000000000000000000000000000..d170a6ef430704b2e7345607095d0895897c424f --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/scripts/run-service-tfs-remove.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. + +source /var/teraflow/tfs_runtime_env_vars.sh +export PYTHONPATH=/var/teraflow +pytest --verbose --log-level=INFO \ + --junitxml=/opt/results/report_service_tfs_remove.xml \ + /var/teraflow/tests/l2_vpn_gnmi_oc/tests/test_service_tfs_remove.py diff --git a/src/tests/l2_vpn_gnmi_oc/tests/Fixtures.py b/src/tests/l2_vpn_gnmi_oc/tests/Fixtures.py new file mode 100644 index 0000000000000000000000000000000000000000..aa37459a10e188723c9173b9258daf2372204e4d --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/tests/Fixtures.py @@ -0,0 +1,36 @@ +# 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 context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient + +@pytest.fixture(scope='session') +def context_client() -> ContextClient: + _client = ContextClient() + yield _client + _client.close() + +@pytest.fixture(scope='session') +def device_client() -> DeviceClient: + _client = DeviceClient() + yield _client + _client.close() + +@pytest.fixture(scope='session') +def service_client() -> ServiceClient: + _client = ServiceClient() + yield _client + _client.close() diff --git a/src/tests/l2_vpn_gnmi_oc/tests/Tools.py b/src/tests/l2_vpn_gnmi_oc/tests/Tools.py new file mode 100644 index 0000000000000000000000000000000000000000..bbee845cd57f8dcb57e19f1f8ecc71940e99df30 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/tests/Tools.py @@ -0,0 +1,109 @@ +# 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, logging, requests +from typing import Any, Dict, List, Optional, Set, Union +from common.Constants import ServiceNameEnum +from common.Settings import get_service_host, get_service_port_http + +NBI_ADDRESS = get_service_host(ServiceNameEnum.NBI) +NBI_PORT = get_service_port_http(ServiceNameEnum.NBI) +NBI_USERNAME = 'admin' +NBI_PASSWORD = 'admin' +NBI_BASE_URL = '' + +class RestRequestMethod(enum.Enum): + GET = 'get' + POST = 'post' + PUT = 'put' + PATCH = 'patch' + DELETE = 'delete' + +EXPECTED_STATUS_CODES : Set[int] = { + requests.codes['OK' ], + requests.codes['CREATED' ], + requests.codes['ACCEPTED' ], + requests.codes['NO_CONTENT'], +} + +def do_rest_request( + method : RestRequestMethod, url : str, body : Optional[Any] = None, timeout : int = 10, + allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES, + logger : Optional[logging.Logger] = None +) -> Optional[Union[Dict, List]]: + request_url = 'http://{:s}:{:s}@{:s}:{:d}{:s}{:s}'.format( + NBI_USERNAME, NBI_PASSWORD, NBI_ADDRESS, NBI_PORT, str(NBI_BASE_URL), url + ) + + if logger is not None: + msg = 'Request: {:s} {:s}'.format(str(method.value).upper(), str(request_url)) + if body is not None: msg += ' body={:s}'.format(str(body)) + logger.warning(msg) + reply = requests.request(method.value, request_url, timeout=timeout, json=body, allow_redirects=allow_redirects) + if logger is not None: + logger.warning('Reply: {:s}'.format(str(reply.text))) + assert reply.status_code in expected_status_codes, 'Reply failed with status code {:d}'.format(reply.status_code) + + if reply.content and len(reply.content) > 0: return reply.json() + return None + +def do_rest_get_request( + url : str, body : Optional[Any] = None, timeout : int = 10, + allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES, + logger : Optional[logging.Logger] = None +) -> Optional[Union[Dict, List]]: + return do_rest_request( + RestRequestMethod.GET, url, body=body, timeout=timeout, allow_redirects=allow_redirects, + expected_status_codes=expected_status_codes, logger=logger + ) + +def do_rest_post_request( + url : str, body : Optional[Any] = None, timeout : int = 10, + allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES, + logger : Optional[logging.Logger] = None +) -> Optional[Union[Dict, List]]: + return do_rest_request( + RestRequestMethod.POST, url, body=body, timeout=timeout, allow_redirects=allow_redirects, + expected_status_codes=expected_status_codes, logger=logger + ) + +def do_rest_put_request( + url : str, body : Optional[Any] = None, timeout : int = 10, + allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES, + logger : Optional[logging.Logger] = None +) -> Optional[Union[Dict, List]]: + return do_rest_request( + RestRequestMethod.PUT, url, body=body, timeout=timeout, allow_redirects=allow_redirects, + expected_status_codes=expected_status_codes, logger=logger + ) + +def do_rest_patch_request( + url : str, body : Optional[Any] = None, timeout : int = 10, + allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES, + logger : Optional[logging.Logger] = None +) -> Optional[Union[Dict, List]]: + return do_rest_request( + RestRequestMethod.PATCH, url, body=body, timeout=timeout, allow_redirects=allow_redirects, + expected_status_codes=expected_status_codes, logger=logger + ) + +def do_rest_delete_request( + url : str, body : Optional[Any] = None, timeout : int = 10, + allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES, + logger : Optional[logging.Logger] = None +) -> Optional[Union[Dict, List]]: + return do_rest_request( + RestRequestMethod.DELETE, url, body=body, timeout=timeout, allow_redirects=allow_redirects, + expected_status_codes=expected_status_codes, logger=logger + ) diff --git a/src/tests/l2_vpn_gnmi_oc/tests/__init__.py b/src/tests/l2_vpn_gnmi_oc/tests/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..3ccc21c7db78aac26daa1f8c5ff8e1ffd3f35460 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/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/tests/l2_vpn_gnmi_oc/tests/test_cleanup.py b/src/tests/l2_vpn_gnmi_oc/tests/test_cleanup.py new file mode 100644 index 0000000000000000000000000000000000000000..91d90e7b46a8295061626e2ce19a9a1e4e16be2d --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/tests/test_cleanup.py @@ -0,0 +1,50 @@ +# 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, os + +from common.Constants import DEFAULT_CONTEXT_NAME +from common.proto.context_pb2 import ContextId +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) +from common.tools.object_factory.Context import json_context_id +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +DESCRIPTOR_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'data', 'tfs-topology.json') +ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) + +def test_scenario_cleanup( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient, # pylint: disable=redefined-outer-name +) -> None: + # Verify the scenario has no services/slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 0 + assert len(response.slice_ids) == 0 + + # Load descriptors and validate the base scenario + descriptor_loader = DescriptorLoader( + descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client) + descriptor_loader.validate() + descriptor_loader.unload() + validate_empty_scenario(context_client) diff --git a/src/tests/l2_vpn_gnmi_oc/tests/test_onboarding.py b/src/tests/l2_vpn_gnmi_oc/tests/test_onboarding.py new file mode 100644 index 0000000000000000000000000000000000000000..5d652e6f58948fd20772fe756ba7eb8776f00384 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/tests/test_onboarding.py @@ -0,0 +1,75 @@ +# 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, os, time + +from common.Constants import DEFAULT_CONTEXT_NAME +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) +from common.tools.object_factory.Context import json_context_id +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +DESCRIPTOR_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'data', 'tfs-topology.json') +ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) + +def test_scenario_onboarding( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient, # pylint: disable=redefined-outer-name +) -> None: + validate_empty_scenario(context_client) + + descriptor_loader = DescriptorLoader( + descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client) + results = descriptor_loader.process() + check_descriptor_load_results(results, descriptor_loader) + descriptor_loader.validate() + + # Verify the scenario has no services/slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 0 + assert len(response.slice_ids) == 0 + +def test_scenario_devices_enabled( + context_client : ContextClient, # pylint: disable=redefined-outer-name +) -> None: + """ + This test validates that the devices are enabled. + """ + DEVICE_OP_STATUS_ENABLED = DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_ENABLED + + num_devices = -1 + num_devices_enabled, num_retry = 0, 0 + while (num_devices != num_devices_enabled) and (num_retry < 10): + time.sleep(1.0) + response = context_client.ListDevices(Empty()) + num_devices = len(response.devices) + num_devices_enabled = 0 + for device in response.devices: + if device.device_operational_status != DEVICE_OP_STATUS_ENABLED: continue + num_devices_enabled += 1 + LOGGER.info('Num Devices enabled: {:d}/{:d}'.format(num_devices_enabled, num_devices)) + num_retry += 1 + assert num_devices_enabled == num_devices diff --git a/src/tests/ryu-openflow/tests/test_service_ietf_create.py b/src/tests/l2_vpn_gnmi_oc/tests/test_service_ietf_create.py similarity index 86% rename from src/tests/ryu-openflow/tests/test_service_ietf_create.py rename to src/tests/l2_vpn_gnmi_oc/tests/test_service_ietf_create.py index f3a68801df4e9e0070d45ea4a398a5e766786ec4..655d395c2e393d4cb1ba6dc56efedb516053a64f 100644 --- a/src/tests/ryu-openflow/tests/test_service_ietf_create.py +++ b/src/tests/l2_vpn_gnmi_oc/tests/test_service_ietf_create.py @@ -13,20 +13,22 @@ # limitations under the License. import json, logging, os -from typing import Dict + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from .Fixtures import context_client # pylint: disable=unused-import -from .Tools import do_rest_get_request, do_rest_post_request +from .Fixtures import context_client # pylint: disable=unused-import +from .Tools import do_rest_get_request, do_rest_post_request LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) -REQUEST_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'data', 'ietf-l3vpn-service.json') +REQUEST_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'data', 'ietf-l2vpn-service.json') ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) @@ -37,11 +39,11 @@ def test_service_ietf_creation( # Issue service creation request with open(REQUEST_FILE, 'r', encoding='UTF-8') as f: svc1_data = json.load(f) - URL = '/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services' + URL = '/restconf/data/ietf-l2vpn-svc:l2vpn-svc/vpn-services' do_rest_post_request(URL, body=svc1_data, logger=LOGGER, expected_status_codes={201}) - vpn_id = svc1_data['ietf-l3vpn-svc:l3vpn-svc']['vpn-services']['vpn-service'][0]['vpn-id'] + vpn_id = svc1_data['ietf-l2vpn-svc:l2vpn-svc']['vpn-services']['vpn-service'][0]['vpn-id'] - URL = '/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services/vpn-service={:s}/'.format(vpn_id) + URL = '/restconf/data/ietf-l2vpn-svc:l2vpn-svc/vpn-services/vpn-service={:s}/'.format(vpn_id) service_data = do_rest_get_request(URL, logger=LOGGER, expected_status_codes={200}) service_uuid = service_data['service-id'] @@ -61,7 +63,7 @@ def test_service_ietf_creation( service_id = service.service_id assert service_id.service_uuid.uuid == service_uuid assert service.service_status.service_status == ServiceStatusEnum.SERVICESTATUS_ACTIVE - assert service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM + assert service.service_type == ServiceTypeEnum.SERVICETYPE_L2NM response = context_client.ListConnections(service_id) LOGGER.warning(' ServiceId[{:s}] => Connections[{:d}] = {:s}'.format( diff --git a/src/tests/ryu-openflow/tests/test_service_ietf_remove.py b/src/tests/l2_vpn_gnmi_oc/tests/test_service_ietf_remove.py similarity index 82% rename from src/tests/ryu-openflow/tests/test_service_ietf_remove.py rename to src/tests/l2_vpn_gnmi_oc/tests/test_service_ietf_remove.py index 2c39208248700c2183871c1a4954ef997253a954..0235c32a2c7135ac085e42df7a5d2ce4b3306581 100644 --- a/src/tests/ryu-openflow/tests/test_service_ietf_remove.py +++ b/src/tests/l2_vpn_gnmi_oc/tests/test_service_ietf_remove.py @@ -13,20 +13,23 @@ # limitations under the License. import logging, os -from typing import Dict, Set, Tuple +from typing import Set + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from .Fixtures import context_client # pylint: disable=unused-import -from .Tools import do_rest_delete_request +from .Fixtures import context_client # pylint: disable=unused-import +from .Tools import do_rest_delete_request LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) -REQUEST_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'data', 'ietf-l3vpn-service.json') +REQUEST_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'data', 'ietf-l2vpn-service.json') ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) @@ -41,19 +44,23 @@ def test_service_ietf_removal( # Check there are no slices response = context_client.ListSlices(ADMIN_CONTEXT_ID) - LOGGER.warning('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response))) + LOGGER.warning('Slices[{:d}] = {:s}'.format( + len(response.slices), grpc_message_to_json_string(response) + )) assert len(response.slices) == 0 # Check there is 1 service response = context_client.ListServices(ADMIN_CONTEXT_ID) - LOGGER.warning('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) + LOGGER.warning('Services[{:d}] = {:s}'.format( + len(response.services), grpc_message_to_json_string(response) + )) assert len(response.services) == 1 service_uuids : Set[str] = set() for service in response.services: service_id = service.service_id assert service.service_status.service_status == ServiceStatusEnum.SERVICESTATUS_ACTIVE - assert service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM + assert service.service_type == ServiceTypeEnum.SERVICETYPE_L2NM response = context_client.ListConnections(service_id) LOGGER.warning(' ServiceId[{:s}] => Connections[{:d}] = {:s}'.format( @@ -66,9 +73,9 @@ def test_service_ietf_removal( # Identify service to delete assert len(service_uuids) == 1 - service_uuid = set(service_uuids).pop() + service_uuid = service_uuids.pop() - URL = '/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services/vpn-service={:s}/'.format(service_uuid) + URL = '/restconf/data/ietf-l2vpn-svc:l2vpn-svc/vpn-services/vpn-service={:s}/'.format(service_uuid) do_rest_delete_request(URL, logger=LOGGER, expected_status_codes={204}) # Verify the scenario has no services/slices diff --git a/src/tests/l2_vpn_gnmi_oc/tests/test_service_tfs_create.py b/src/tests/l2_vpn_gnmi_oc/tests/test_service_tfs_create.py new file mode 100644 index 0000000000000000000000000000000000000000..5d802e92eb5daafa34ae5bb3a48649075e3b9cc7 --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/tests/test_service_tfs_create.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. + +import logging, os + +from common.Constants import DEFAULT_CONTEXT_NAME +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.object_factory.Context import json_context_id +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient + +from .Fixtures import ( + context_client, device_client, service_client, +) # pylint: disable=unused-import + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +DESCRIPTOR_FILE = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + '..', 'data', 'tfs-service-vlan-125-tagged.json' +) +ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) + + +def test_service_tfs_creation( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient, # pylint: disable=redefined-outer-name + service_client : ServiceClient, # pylint: disable=redefined-outer-name +): + # Load descriptors and validate the base scenario + descriptor_loader = DescriptorLoader( + descriptors_file=DESCRIPTOR_FILE, context_client=context_client, + device_client=device_client, service_client=service_client + ) + results = descriptor_loader.process() + check_descriptor_load_results(results, descriptor_loader) + + # Verify the scenario has 1 service and 0 slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 1 + assert len(response.slice_ids) == 0 + + # Check there are no slices + response = context_client.ListSlices(ADMIN_CONTEXT_ID) + LOGGER.warning('Slices[{:d}] = {:s}'.format( + len(response.slices), grpc_message_to_json_string(response) + )) + assert len(response.slices) == 0 + + # Check there is 1 service + response = context_client.ListServices(ADMIN_CONTEXT_ID) + LOGGER.warning('Services[{:d}] = {:s}'.format( + len(response.services), grpc_message_to_json_string(response) + )) + assert len(response.services) == 1 + + for service in response.services: + service_id = service.service_id + assert service.service_status.service_status == ServiceStatusEnum.SERVICESTATUS_ACTIVE + assert service.service_type == ServiceTypeEnum.SERVICETYPE_L2NM + + response = context_client.ListConnections(service_id) + LOGGER.warning(' ServiceId[{:s}] => Connections[{:d}] = {:s}'.format( + grpc_message_to_json_string(service_id), len(response.connections), + grpc_message_to_json_string(response) + )) + assert len(response.connections) == 1 diff --git a/src/tests/l2_vpn_gnmi_oc/tests/test_service_tfs_remove.py b/src/tests/l2_vpn_gnmi_oc/tests/test_service_tfs_remove.py new file mode 100644 index 0000000000000000000000000000000000000000..264f0de0a311a106fe14e3de9ea0fc4dfd786bbb --- /dev/null +++ b/src/tests/l2_vpn_gnmi_oc/tests/test_service_tfs_remove.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 logging, os +from typing import Set, Tuple + +from common.Constants import DEFAULT_CONTEXT_NAME +from common.proto.context_pb2 import ( + ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.object_factory.Context import json_context_id +from common.tools.object_factory.Service import json_service_id +from context.client.ContextClient import ContextClient +from service.client.ServiceClient import ServiceClient + +from .Fixtures import ( + context_client, service_client, +) # pylint: disable=unused-import + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +DESCRIPTOR_FILE = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + '..', 'data', 'tfs-service-vlan-125-tagged.json' +) +ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) + + +def test_service_tfs_removal( + context_client : ContextClient, # pylint: disable=redefined-outer-name + service_client : ServiceClient, # pylint: disable=redefined-outer-name +): + # Verify the scenario has 1 service and 0 slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 1 + assert len(response.slice_ids) == 0 + + # Check there are no slices + response = context_client.ListSlices(ADMIN_CONTEXT_ID) + LOGGER.warning('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response))) + assert len(response.slices) == 0 + + # Check there is 1 service + response = context_client.ListServices(ADMIN_CONTEXT_ID) + LOGGER.warning('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) + assert len(response.services) == 1 + + context_service_uuids : Set[Tuple[str, str]] = set() + for service in response.services: + service_id = service.service_id + assert service.service_status.service_status == ServiceStatusEnum.SERVICESTATUS_ACTIVE + assert service.service_type == ServiceTypeEnum.SERVICETYPE_L2NM + + response = context_client.ListConnections(service_id) + LOGGER.warning(' ServiceId[{:s}] => Connections[{:d}] = {:s}'.format( + grpc_message_to_json_string(service_id), len(response.connections), + grpc_message_to_json_string(response) + )) + assert len(response.connections) == 1 + + context_uuid = service_id.context_id.context_uuid.uuid + service_uuid = service_id.service_uuid.uuid + context_service_uuids.add((context_uuid, service_uuid)) + + # Identify service to delete + assert len(context_service_uuids) == 1 + context_uuid, service_uuid = set(context_service_uuids).pop() + + # Delete Service + service_client.DeleteService(ServiceId(**json_service_id(service_uuid, json_context_id(context_uuid)))) + + # Verify the scenario has no services/slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 0 + assert len(response.slice_ids) == 0 diff --git a/src/tests/ofc22/tests/Fixtures.py b/src/tests/ofc22/tests/Fixtures.py index b6e5d0d5966c530f45fc94b9816b51049ec359b3..b1d338bd4b502d4b7a31283b07a16ae19d4246f8 100644 --- a/src/tests/ofc22/tests/Fixtures.py +++ b/src/tests/ofc22/tests/Fixtures.py @@ -12,14 +12,41 @@ # See the License for the specific language governing permissions and # limitations under the License. -import pytest, logging +import logging + +import pytest from common.Settings import get_setting +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from monitoring.client.MonitoringClient import MonitoringClient from tests.tools.mock_osm.Constants import WIM_PASSWORD, WIM_USERNAME from tests.tools.mock_osm.MockOSM import MockOSM from .Objects import WIM_MAPPING LOGGER = logging.getLogger(__name__) + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def monitoring_client(): + _client = MonitoringClient() + yield _client + _client.close() + + @pytest.fixture(scope='session') def osm_wim(): wim_url = 'http://{:s}:{:s}'.format( diff --git a/src/tests/ofc22/tests/test_functional_bootstrap.py b/src/tests/ofc22/tests/test_functional_bootstrap.py index 523e533bf8b6cd6b3705ba75646561d17dd692e4..44e12c13105acdc31b1a88f3b028267ce9fcfd2b 100644 --- a/src/tests/ofc22/tests/test_functional_bootstrap.py +++ b/src/tests/ofc22/tests/test_functional_bootstrap.py @@ -13,15 +13,23 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) from common.proto.monitoring_pb2 import KpiDescriptorList -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from monitoring.client.MonitoringClient import MonitoringClient -from tests.Fixtures import context_client, device_client, monitoring_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, monitoring_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc22/tests/test_functional_cleanup.py b/src/tests/ofc22/tests/test_functional_cleanup.py index 94217423da33d6525cde16bce71f3ae6965ef988..a6d1eddedfa5468ad225b348a4213f162d5569bc 100644 --- a/src/tests/ofc22/tests/test_functional_cleanup.py +++ b/src/tests/ofc22/tests/test_functional_cleanup.py @@ -13,13 +13,19 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc22/tests/test_functional_create_service.py b/src/tests/ofc22/tests/test_functional_create_service.py index 1a4dcd325e875d2f75ef73b0b3569acb01955030..eb8e07f70c26e928314f5f74fbdc1ad13615dc53 100644 --- a/src/tests/ofc22/tests/test_functional_create_service.py +++ b/src/tests/ofc22/tests/test_functional_create_service.py @@ -13,6 +13,7 @@ # limitations under the License. import logging, os, random + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, Empty, ServiceTypeEnum from common.proto.kpi_sample_types_pb2 import KpiSampleType @@ -21,9 +22,11 @@ from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from monitoring.client.MonitoringClient import MonitoringClient -from tests.Fixtures import context_client, monitoring_client # pylint: disable=unused-import from tests.tools.mock_osm.MockOSM import MockOSM -from .Fixtures import osm_wim # pylint: disable=unused-import + +from .Fixtures import ( + context_client, monitoring_client, osm_wim, +) # pylint: disable=unused-import from .Objects import WIM_SERVICE_CONNECTION_POINTS, WIM_SERVICE_TYPE LOGGER = logging.getLogger(__name__) @@ -49,7 +52,7 @@ def test_service_creation(context_client : ContextClient, osm_wim : MockOSM): # # Ensure slices and services are created response = context_client.ListSlices(ADMIN_CONTEXT_ID) LOGGER.info('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response))) - assert len(response.slices) == 1 # OSM slice + assert len(response.slices) == 0 # no slice should be created response = context_client.ListServices(ADMIN_CONTEXT_ID) LOGGER.info('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) diff --git a/src/tests/ofc22/tests/test_functional_delete_service.py b/src/tests/ofc22/tests/test_functional_delete_service.py index 88677b0fe043f7dfa18204976ca0f1a2bca18a07..ef491b8f5421babed80b16fc248105453e8b4ae1 100644 --- a/src/tests/ofc22/tests/test_functional_delete_service.py +++ b/src/tests/ofc22/tests/test_functional_delete_service.py @@ -13,15 +13,16 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, ServiceTypeEnum from common.tools.descriptor.Loader import DescriptorLoader from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from tests.Fixtures import context_client # pylint: disable=unused-import from tests.tools.mock_osm.MockOSM import MockOSM -from .Fixtures import osm_wim # pylint: disable=unused-import + +from .Fixtures import context_client, osm_wim # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -33,7 +34,7 @@ def test_service_removal(context_client : ContextClient, osm_wim : MockOSM): # p # Ensure slices and services are created response = context_client.ListSlices(ADMIN_CONTEXT_ID) LOGGER.info('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response))) - assert len(response.slices) == 1 # OSM slice + assert len(response.slices) == 0 # no slice should be created response = context_client.ListServices(ADMIN_CONTEXT_ID) LOGGER.info('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) diff --git a/src/tests/ofc24/deploy-node-agents.sh b/src/tests/ofc24/deploy-node-agents.sh index 5a809a140de2e2bcbe5c24c27680f935e7e40a7d..18b1603a3f8432159fdd044a12daa5681e3b23d4 100755 --- a/src/tests/ofc24/deploy-node-agents.sh +++ b/src/tests/ofc24/deploy-node-agents.sh @@ -34,19 +34,22 @@ echo echo "Create Management Network and Node Agents:" echo "------------------------------------------" docker network create -d bridge --subnet=172.254.253.0/24 --gateway=172.254.253.254 --ip-range=172.254.253.0/24 na-br -docker run -d --name na-t1 --network=na-br --ip 172.254.253.1 \ - --volume "$PWD/src/tests/${TEST_NAME}/platform_t1.xml:/confd/examples.confd/OC23/init_openconfig-platform.xml" \ - asgamb1/flexscale-hhi.img:latest ./startNetconfAgent.sh -docker run -d --name na-t2 --network=na-br --ip 172.254.253.2 \ - --volume "$PWD/src/tests/${TEST_NAME}/platform_t2.xml:/confd/examples.confd/OC23/init_openconfig-platform.xml" \ - asgamb1/flexscale-hhi.img:latest ./startNetconfAgent.sh -docker run -d --name na-r1 --network=na-br --ip 172.254.253.101 \ - --volume "$PWD/src/tests/${TEST_NAME}/platform_r1.xml:/confd/examples.confd/OC23/init_openconfig-platform.xml" \ - asgamb1/flexscale-node.img:latest ./startNetconfAgent.sh - -docker run -d --name na-r2 --network=na-br --ip 172.254.253.102 \ - --volume "$PWD/src/tests/${TEST_NAME}/platform_r2.xml:/confd/examples.confd/OC23/init_openconfig-platform.xml" \ - asgamb1/flexscale-node.img:latest ./startNetconfAgent.sh +docker run -dit --init --name na-t1 --network=na-br --ip 172.254.253.101 --publish 2022 \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-tp.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_t1.xml:/confd/examples.confd/OC23/platform.xml" \ + asgamb1/oc23bgp.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh +docker run -dit --init --name na-t2 --network=na-br --ip 172.254.253.102 --publish 2022 \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-tp.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_t2.xml:/confd/examples.confd/OC23/platform.xml" \ + asgamb1/oc23bgp.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh +docker run -dit --init --name na-r1 --network=na-br --ip 172.254.253.201 --publish 2022 \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-mg-on.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_r1.xml:/confd/examples.confd/OC23/platform.xml" \ + asgamb1/flexscale-node.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh +docker run -dit --init --name na-r2 --network=na-br --ip 172.254.253.202 --publish 2022 \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-mg-on.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_r2.xml:/confd/examples.confd/OC23/platform.xml" \ + asgamb1/flexscale-node.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh echo diff --git a/src/tests/ofc24/refresh_op.sh b/src/tests/ofc24/refresh_op.sh index 3a8fca7f9d3a8d9568b62a309b62d941b887704b..e3e68fa5e573b2ef6d5afa4c62ad4f7da1e86c17 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/tests/ofc24/tests/Fixtures.py b/src/tests/ofc24/tests/Fixtures.py new file mode 100644 index 0000000000000000000000000000000000000000..69e4cbaa96d4b613088730eb6bca5c50770d17c6 --- /dev/null +++ b/src/tests/ofc24/tests/Fixtures.py @@ -0,0 +1,39 @@ +# Copyright 2022-2026 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 context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient + + +@pytest.fixture(scope='session') +def context_client() -> ContextClient: + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client() -> DeviceClient: + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def service_client() -> ServiceClient: + _client = ServiceClient() + yield _client + _client.close() diff --git a/src/tests/ofc24/tests/test_functional_bootstrap.py b/src/tests/ofc24/tests/test_functional_bootstrap.py index 5bcf4dbb92fcfc41d190c2dcb983d0f368a9c363..ed914852dc21efc5d77e517e9cda7400676de98a 100644 --- a/src/tests/ofc24/tests/test_functional_bootstrap.py +++ b/src/tests/ofc24/tests/test_functional_bootstrap.py @@ -13,14 +13,24 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario -from common.tools.grpc.Tools import grpc_message_to_json, grpc_message_to_json_string +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) +from common.tools.grpc.Tools import ( + grpc_message_to_json, grpc_message_to_json_string, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc24/tests/test_functional_cleanup.py b/src/tests/ofc24/tests/test_functional_cleanup.py index 88c37dea3badf10ed04f0a6599c7a7592bf0ba07..d8dd7660d465557363052d560993c9c88f134405 100644 --- a/src/tests/ofc24/tests/test_functional_cleanup.py +++ b/src/tests/ofc24/tests/test_functional_cleanup.py @@ -13,13 +13,19 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc24/tests/test_functional_create_service_bidir.py b/src/tests/ofc24/tests/test_functional_create_service_bidir.py index 022c32c83f77f9e0d41191747114c81b7d5e83e8..7ba1ba5b477e4bcc0a11575b2a6b5306514af616 100644 --- a/src/tests/ofc24/tests/test_functional_create_service_bidir.py +++ b/src/tests/ofc24/tests/test_functional_create_service_bidir.py @@ -13,15 +13,23 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc24/tests/test_functional_create_service_unidir.py b/src/tests/ofc24/tests/test_functional_create_service_unidir.py index 33fd0c3796724a69b686344f5d472ccaeb08ad63..a13073a9265c2f43658348291bc56502deaa4bce 100644 --- a/src/tests/ofc24/tests/test_functional_create_service_unidir.py +++ b/src/tests/ofc24/tests/test_functional_create_service_unidir.py @@ -13,15 +13,23 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc24/tests/test_functional_delete_service_bidir.py b/src/tests/ofc24/tests/test_functional_delete_service_bidir.py index 9055313997f9dfd4f23cffb5cca166f9380839e9..3ff489472bd00122f4b912155c1678bc88f23ffc 100644 --- a/src/tests/ofc24/tests/test_functional_delete_service_bidir.py +++ b/src/tests/ofc24/tests/test_functional_delete_service_bidir.py @@ -14,14 +14,20 @@ import logging from typing import Set, Tuple + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, service_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc24/tests/test_functional_delete_service_unidir.py b/src/tests/ofc24/tests/test_functional_delete_service_unidir.py index 7e83b3812eca18242afb77f2c83f70053663e2cb..5e6ae6b6cea808000aad421357d21c95cb6dfb7e 100644 --- a/src/tests/ofc24/tests/test_functional_delete_service_unidir.py +++ b/src/tests/ofc24/tests/test_functional_delete_service_unidir.py @@ -14,14 +14,20 @@ import logging from typing import Set, Tuple + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, service_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc25-camara-agg-net-controller/tests/test_onboarding.py b/src/tests/ofc25-camara-agg-net-controller/tests/test_onboarding.py index 657e7c07accb221c2a8e0c85c716c8d3536a7414..58dee06445b6c261feaa0affb7ee93054b2ad941 100644 --- a/src/tests/ofc25-camara-agg-net-controller/tests/test_onboarding.py +++ b/src/tests/ofc25-camara-agg-net-controller/tests/test_onboarding.py @@ -13,13 +13,21 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from .Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc25-camara-e2e-controller/tests/test_onboarding.py b/src/tests/ofc25-camara-e2e-controller/tests/test_onboarding.py index a0435712fe6c3e6283f3a3123cfa198c09e24e2d..e7c8981bfa70bda2d2c54265b837bb92e9939a5b 100644 --- a/src/tests/ofc25-camara-e2e-controller/tests/test_onboarding.py +++ b/src/tests/ofc25-camara-e2e-controller/tests/test_onboarding.py @@ -13,13 +13,21 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from .Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc25/tests/Fixtures.py b/src/tests/ofc25/tests/Fixtures.py new file mode 100644 index 0000000000000000000000000000000000000000..69e4cbaa96d4b613088730eb6bca5c50770d17c6 --- /dev/null +++ b/src/tests/ofc25/tests/Fixtures.py @@ -0,0 +1,39 @@ +# Copyright 2022-2026 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 context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient + + +@pytest.fixture(scope='session') +def context_client() -> ContextClient: + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client() -> DeviceClient: + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def service_client() -> ServiceClient: + _client = ServiceClient() + yield _client + _client.close() diff --git a/src/tests/ofc25/tests/test_functional_bootstrap_e2e.py b/src/tests/ofc25/tests/test_functional_bootstrap_e2e.py index 5a4a25232d6c8dbc57437e46acab168e1f010264..23586b5536d86e84e2502134252f4a37c03640d5 100644 --- a/src/tests/ofc25/tests/test_functional_bootstrap_e2e.py +++ b/src/tests/ofc25/tests/test_functional_bootstrap_e2e.py @@ -13,14 +13,24 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario -from common.tools.grpc.Tools import grpc_message_to_json, grpc_message_to_json_string +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) +from common.tools.grpc.Tools import ( + grpc_message_to_json, grpc_message_to_json_string, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc25/tests/test_functional_bootstrap_ip.py b/src/tests/ofc25/tests/test_functional_bootstrap_ip.py index 580a774fa4ace2c2739aa612edea340e2af85da9..501904d1f8e1fc16e67acc11d528362cbb15ab10 100644 --- a/src/tests/ofc25/tests/test_functional_bootstrap_ip.py +++ b/src/tests/ofc25/tests/test_functional_bootstrap_ip.py @@ -13,13 +13,21 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc25/tests/test_functional_bootstrap_opt.py b/src/tests/ofc25/tests/test_functional_bootstrap_opt.py index a6e74af3aa37b28225db572d16a023e6d94068a5..8a6b8ddb4c82f537c81a35f46c096a1e30330109 100644 --- a/src/tests/ofc25/tests/test_functional_bootstrap_opt.py +++ b/src/tests/ofc25/tests/test_functional_bootstrap_opt.py @@ -13,13 +13,21 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc25/tests/test_functional_cleanup_e2e.py b/src/tests/ofc25/tests/test_functional_cleanup_e2e.py index 0c4bb088dcaa77deb5e711c647574b7cbba528b7..8f81d3cd9d559a044f52bee6d4e08325870d2bb6 100644 --- a/src/tests/ofc25/tests/test_functional_cleanup_e2e.py +++ b/src/tests/ofc25/tests/test_functional_cleanup_e2e.py @@ -13,13 +13,19 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc25/tests/test_functional_cleanup_ip.py b/src/tests/ofc25/tests/test_functional_cleanup_ip.py index bf93adbc58715ffdac5b51e6c19fb9b45a1e7df3..fb33a4d45826f73c3bf62b31dbd79a0f68f7c814 100644 --- a/src/tests/ofc25/tests/test_functional_cleanup_ip.py +++ b/src/tests/ofc25/tests/test_functional_cleanup_ip.py @@ -13,13 +13,19 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc25/tests/test_functional_cleanup_opt.py b/src/tests/ofc25/tests/test_functional_cleanup_opt.py index 060297822903ff21553897f896af0bea80b2b330..4e7a76d1cb7286ce1f0d73f1123d5eed67172e1d 100644 --- a/src/tests/ofc25/tests/test_functional_cleanup_opt.py +++ b/src/tests/ofc25/tests/test_functional_cleanup_opt.py @@ -13,13 +13,19 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc25/tests/test_functional_create_service.py b/src/tests/ofc25/tests/test_functional_create_service.py index 72eb1585670b7511e999d129eddeb1384c04e76e..b987bf8dedd354bee2cf8e6eb9a8ffdf52e9b0e9 100644 --- a/src/tests/ofc25/tests/test_functional_create_service.py +++ b/src/tests/ofc25/tests/test_functional_create_service.py @@ -13,15 +13,23 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc25/tests/test_functional_delete_service.py b/src/tests/ofc25/tests/test_functional_delete_service.py index f989485dc95194bd85999f6b2280c35356098de5..9c689d259226ae53c14ffcd90e14941d9a9cba5a 100644 --- a/src/tests/ofc25/tests/test_functional_delete_service.py +++ b/src/tests/ofc25/tests/test_functional_delete_service.py @@ -14,14 +14,20 @@ import logging from typing import Set, Tuple + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, service_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc26_flexscale/Fixtures.py b/src/tests/ofc26_flexscale/Fixtures.py new file mode 100644 index 0000000000000000000000000000000000000000..b958a39cddce5d2b093ab8d3e49bfeb418d9355b --- /dev/null +++ b/src/tests/ofc26_flexscale/Fixtures.py @@ -0,0 +1,76 @@ +# 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 +import logging +import os +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 +from telemetry.frontend.client.TelemetryFrontendClient import TelemetryFrontendClient + +# Import ENV variables +_ip_kpi_address = os.getenv('IP_KPI', None) +_ip_tele_address = os.getenv('IP_TELE', None) + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient(host="10.152.183.180") + _client.connect() + LOGGER.info('Yielding Connected ContextClient...') + yield _client + LOGGER.info('Closing ContextClient...') + _client.close() + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient(host="10.152.183.212") + _client.connect() + LOGGER.info('Yielding Connected DeviceClient...') + yield _client + LOGGER.info('Closing DeviceClient...') + _client.close() + +@pytest.fixture(scope='session') +def service_client(): + _client = ServiceClient(host="10.152.183.98") + _client.connect() + LOGGER.info('Yielding Connected ServiceClient...') + yield _client + LOGGER.info('Closing ServiceClient...') + _client.close() + +@pytest.fixture(scope='session') +def kpi_manager_client(): + _client = KpiManagerClient(host=_ip_kpi_address) + _client.connect() + LOGGER.info('Yielding Connected KpiManagerClient...') + yield _client + LOGGER.info('Closed KpiManagerClient...') + _client.close() + + +@pytest.fixture(scope='session') +def telemetry_frontend_client(): + _client = TelemetryFrontendClient(host=_ip_tele_address) + _client.connect() + LOGGER.info('Yielding Connected TelemetryFrontendClient...') + yield _client + LOGGER.info('Closed TelemetryFrontendClient...') + _client.close() diff --git a/src/tests/ofc26_flexscale/__init__.py b/src/tests/ofc26_flexscale/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..3ccc21c7db78aac26daa1f8c5ff8e1ffd3f35460 --- /dev/null +++ b/src/tests/ofc26_flexscale/__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/ofc26.sh b/src/tests/ofc26_flexscale/deploy_specs.sh old mode 100644 new mode 100755 similarity index 94% rename from ofc26.sh rename to src/tests/ofc26_flexscale/deploy_specs.sh index e6926b64e591ac61013eef5429a729c29fedffad..5c9282e9f084f6abf28580f449ad70c58cecbc16 --- a/ofc26.sh +++ b/src/tests/ofc26_flexscale/deploy_specs.sh @@ -48,7 +48,7 @@ export TFS_COMPONENTS="${TFS_COMPONENTS} kpi_manager kpi_value_writer kpi_value_ #export TFS_COMPONENTS="${TFS_COMPONENTS} ztp" # Uncomment to activate Policy Manager -#export TFS_COMPONENTS="${TFS_COMPONENTS} policy" +export TFS_COMPONENTS="${TFS_COMPONENTS} policy" # Uncomment to activate Optical CyberSecurity #export TFS_COMPONENTS="${TFS_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector opticalattackmanager" @@ -95,6 +95,9 @@ export TFS_COMPONENTS="${TFS_COMPONENTS} kpi_manager kpi_value_writer kpi_value_ # 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" @@ -143,7 +146,7 @@ export CRDB_DEPLOY_MODE="single" export CRDB_DROP_DATABASE_IF_EXISTS="YES" # Disable flag for re-deploying CockroachDB from scratch. -export CRDB_REDEPLOY="" +export CRDB_REDEPLOY="YES" # ----- NATS ------------------------------------------------------------------- @@ -214,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. diff --git a/src/tests/ofc26_flexscale/mock_tfs_services.py b/src/tests/ofc26_flexscale/mock_tfs_services.py new file mode 100644 index 0000000000000000000000000000000000000000..6145e60f50abb07a65d42f22c8a843f120ea7853 --- /dev/null +++ b/src/tests/ofc26_flexscale/mock_tfs_services.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. + + +import os, pytest +import logging +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.tests.MockServicerImpl_Context import MockServicerImpl_Context +from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server + +from common.tools.service.GenericGrpcService import GenericGrpcService + +from kpi_manager.service.KpiManagerService import KpiManagerService +from kpi_manager.client.KpiManagerClient import KpiManagerClient + + + +LOGGER = logging.getLogger(__name__) + +LOCAL_HOST = '127.0.0.1' + +KPIMANAGER_SERVICE_PORT = get_service_port_grpc(ServiceNameEnum.KPIMANAGER) # type: ignore +os.environ[get_env_var_name(ServiceNameEnum.KPIMANAGER, ENVVAR_SUFIX_SERVICE_HOST )] = str(LOCAL_HOST) +os.environ[get_env_var_name(ServiceNameEnum.KPIMANAGER, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(KPIMANAGER_SERVICE_PORT) + + +# NOTE: ---> For local testing, without need of running TFS services. + +class MockContextService(GenericGrpcService): + # Mock Service implementing Context to simplify unitary tests of Monitoring + + def __init__(self, bind_port: Union[str, int]) -> None: + super().__init__(bind_port, LOCAL_HOST, enable_health_servicer=False, cls_name='MockService') + + # pylint: disable=attribute-defined-outside-init + def install_servicers(self): + self.context_servicer = MockServicerImpl_Context() + add_ContextServiceServicer_to_server(self.context_servicer, self.server) + +# This fixture will be requested by test cases and last during testing session +@pytest.fixture(scope='session') +def kpi_manager_service(): + LOGGER.info('Initializing KpiManagerService...') + _service = KpiManagerService() + _service.start() + + # yield the server, when test finishes, execution will resume to stop it + LOGGER.info('Yielding KpiManagerService...') + yield _service + + LOGGER.info('Terminating KpiManagerService...') + _service.stop() + + LOGGER.info('Terminated KpiManagerService...') + +# This fixture will be requested by test cases and last during testing session. +# The client requires the server, so client fixture has the server as dependency. +# def monitoring_client(monitoring_service : MonitoringService): (Add for better understanding) +@pytest.fixture(scope='session') +def kpi_manager_client(kpi_manager_service : KpiManagerService): # pylint: disable=redefined-outer-name,unused-argument + LOGGER.info('Initializing KpiManagerClient...') + _client = KpiManagerClient() + + # yield the server, when test finishes, execution will resume to stop it + LOGGER.info('Yielding KpiManagerClient...') + yield _client + + LOGGER.info('Closing KpiManagerClient...') + _client.close() + + LOGGER.info('Closed KpiManagerClient...') \ No newline at end of file diff --git a/src/tests/ofc26_flexscale/run_ofc26_test.sh b/src/tests/ofc26_flexscale/run_ofc26_test.sh new file mode 100755 index 0000000000000000000000000000000000000000..2644320f514bac5c08a195954a6a1f36f6703100 --- /dev/null +++ b/src/tests/ofc26_flexscale/run_ofc26_test.sh @@ -0,0 +1,47 @@ +#!/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. + +# Make folder containing the script the root folder for its execution +cd $(dirname $0)/../../../ +echo "Running OFC26 test from folder: $(pwd)" +cd src/ +CRDB_SQL_ADDRESS=$(kubectl get service --namespace ${CRDB_NAMESPACE} cockroachdb-public -o 'jsonpath={.spec.clusterIP}') +export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_kpi_mgmt?sslmode=require" + +#added for kafka exposure +export KFK_SERVER_ADDRESS='127.0.0.1:9092' + +kubectl port-forward -n kafka service/kafka-service 9092:9092 > /dev/null 2>&1 & +KAFKA_PF_PID=$! + +# Function to cleanup port-forward on exit +cleanup() { + # echo "Cleaning up Kafka port-forward (PID: ${KAFKA_PF_PID})..." + kill ${KAFKA_PF_PID} 2>/dev/null || true + wait ${KAFKA_PF_PID} 2>/dev/null || true +} + + +IP_KPI=$(kubectl get all --all-namespaces | grep service/kpi-managerservice | awk '{print $4}') +export IP_KPI +echo "KPI Manager Service IP: ${IP_KPI}" + +IP_TELE=$(kubectl get all --all-namespaces | grep service/telemetryservice | awk '{print $4}') +export IP_TELE +echo "Telemetry Frontend Service IP: ${IP_TELE}" + + +python -m pytest --log-level=INFO --log-cli-level=INFO --verbose \ + tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py diff --git a/src/tests/ofc26_flexscale/test_ofc26_messages.py b/src/tests/ofc26_flexscale/test_ofc26_messages.py new file mode 100644 index 0000000000000000000000000000000000000000..87549a3000161d1cea4474ae239d611772f62efd --- /dev/null +++ b/src/tests/ofc26_flexscale/test_ofc26_messages.py @@ -0,0 +1,84 @@ +# 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 common.proto import kpi_manager_pb2 +from common.proto.kpi_sample_types_pb2 import KpiSampleType +from src.telemetry.backend.service.collectors.gnmi_oc.KPI import KPI +from common.proto import telemetry_frontend_pb2 + + +# ---> KPI Manager messages creation for testing + +def create_kpi_descriptor_request(descriptor_name: str = "Test_name"): + _create_kpi_request = kpi_manager_pb2.KpiDescriptor() + _create_kpi_request.kpi_id.kpi_id.uuid = "6e22f180-ba28-4641-b190-2287bf447777" + _create_kpi_request.kpi_description = descriptor_name + _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER + _create_kpi_request.device_id.device_uuid.uuid = "ddb3ef8e-ee65-5cf9-9d21-dac56a27f85b" # confirm for TFS + _create_kpi_request.service_id.service_uuid.uuid = "b2a60c5b-8c46-5707-a64a-9c6539d395f2" + # _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC1' + _create_kpi_request.endpoint_id.endpoint_uuid.uuid = "2" + # _create_kpi_request.connection_id.connection_uuid.uuid = 'CON1' + # _create_kpi_request.link_id.link_uuid.uuid = 'LNK1' + return _create_kpi_request + + +# ---> Telemetry messages creation for testing + +devices = { + 'mgon': { + 'host' : '172.17.254.24', + 'port' : '50061', + 'username' : 'admin', + 'password' : 'admin', + 'insecure' : True, + 'kpi' : KPI.KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER, + #'resource': 'oc-wave-router:wavelength-router/fsmgon:optical-bands/optical-band[index=4]/state/optical-power-total-input/instant', + 'resource' : 'wavelength-router', #TODO: verify resource name form mg-on model + 'endpoint' : '2', + 'skip_verify': True + }, +} + +def create_basic_sub_request_parameters() -> dict: + + device = devices['mgon'] + if device: + return { + 'host' : device['host'], + 'port' : device['port'], + 'username' : device['username'], + 'password' : device['password'], + 'connect_timeout' : 15, + 'insecure' : device['insecure'], + 'mode' : 'sample', # Subscription internal mode posibly: on_change, poll, sample + 'sample_interval' : 10, # This should be in seconds units + 'duration' : 300.0, # Duration in seconds for how long to receive samples + 'kpi' : device['kpi'], + 'resource' : device['resource'], + 'endpoint' : device['endpoint'], + } + return {} + + +def create_collector_request(): + _create_collector_request = telemetry_frontend_pb2.Collector() + _create_collector_request.collector_id.collector_id.uuid = "efef4d95-1cf1-43c4-9742-95c283dddddd" + _create_collector_request.kpi_id.kpi_id.uuid = "6e22f180-ba28-4641-b190-2287bf447777" + _create_collector_request.duration_s = 300 + _create_collector_request.interval_s = 10 + _create_collector_request.int_collector.context_id = "43813baf-195e-5da6-af20-b3d0922e71a7" + return _create_collector_request diff --git a/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py new file mode 100644 index 0000000000000000000000000000000000000000..49ac18b0c95991a3d1dce4ff9b08d0b53a19bcaa --- /dev/null +++ b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py @@ -0,0 +1,171 @@ +# 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 time +from common.proto.kpi_manager_pb2 import KpiId +from common.proto.telemetry_frontend_pb2 import CollectorId +import time +import threading + +from common.proto import kpi_manager_pb2 +from common.proto.kpi_sample_types_pb2 import KpiSampleType + +from src.telemetry.backend.service.collector_api import DriverFactory +from tests.ofc26_flexscale.test_ofc26_messages import create_kpi_descriptor_request, create_collector_request +from src.tests.ofc26_flexscale.test_ofc26_messages import create_basic_sub_request_parameters + +from src.telemetry.backend.service.TelemetryBackendService import DriverInstanceCache, TelemetryBackendService + + +WITH_TFS = True #True/False +if WITH_TFS: + from .Fixtures import kpi_manager_client, telemetry_frontend_client +else: + from .mock_tfs_services import kpi_manager_client + +LOGGER = logging.getLogger(__name__) + + +def create_kpi_descriptor_request(descriptor_name: str = "Test_name"): + _create_kpi_request = kpi_manager_pb2.KpiDescriptor() + _create_kpi_request.kpi_id.kpi_id.uuid = "6e22f180-ba28-4641-b190-2287bf447777" + _create_kpi_request.kpi_description = descriptor_name + _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER + _create_kpi_request.device_id.device_uuid.uuid = "ddb3ef8e-ee65-5cf9-9d21-dac56a27f85b" # confirm for TFS + _create_kpi_request.service_id.service_uuid.uuid = "b2a60c5b-8c46-5707-a64a-9c6539d395f2" + # _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC1' + # _create_kpi_request.endpoint_id.endpoint_uuid.uuid = str(uuid.uuid4()) + # _create_kpi_request.connection_id.connection_uuid.uuid = 'CON1' + # _create_kpi_request.link_id.link_uuid.uuid = 'LNK1' + return _create_kpi_request + +# def create_collector_filter(): +# _create_collector_filter = telemetry_frontend_pb2.CollectorFilter() +# kpi_id_obj = KpiId() +# # kpi_id_obj.kpi_id.uuid = str(uuid.uuid4()) +# kpi_id_obj.kpi_id.uuid = "8c5ca114-cdc7-4081-b128-b667fd159832" +# _create_collector_filter.kpi_id.append(kpi_id_obj) +# return _create_collector_filter + + +def test_Complete_MGON_Integration(kpi_manager_client, telemetry_frontend_client): + + # 1. KPI Descriptor Creation + LOGGER.info(" >>> test_Complete_MGON_Integration: START <<< ") + kpi_descriptor_obj = create_kpi_descriptor_request() + _search_kpi_id = kpi_descriptor_obj.kpi_id + + try: + response = kpi_manager_client.GetKpiDescriptor(_search_kpi_id) + if isinstance(response, kpi_manager_pb2.KpiDescriptor): + LOGGER.info("KPI Descriptor already exists with ID: %s. Skipping creation.", _search_kpi_id.kpi_id.uuid) + except Exception as e: + LOGGER.info("No existing KPI Descriptor found with ID: %s. Proceeding to create it. Error: %s", _search_kpi_id.kpi_id.uuid, str(e)) + response = kpi_manager_client.SetKpiDescriptor(kpi_descriptor_obj) + LOGGER.info("Response gRPC message object: {:}".format(response)) + assert isinstance(response, KpiId) + + # 2. Telemetry Collector Creation + + # _collector_request = create_collector_request() + # _search_collector_id = CollectorId() + # _search_collector_id = _collector_request.collector_id + # try: + # response_col = telemetry_frontend_client.StopCollector(_search_collector_id) + # LOGGER.info("Response gRPC message object: {:}".format(response_col)) + # if response is not None: + # response = telemetry_frontend_client.StartCollector(_collector_request) + # LOGGER.info("Response gRPC message object: {:}".format(response)) + # assert isinstance(response, CollectorId) + # except Exception as e: + # LOGGER.info("Error finding the collector with ID: %s. Proceeding to create it.", _search_collector_id.collector_id.uuid) + # response = telemetry_frontend_client.StartCollector(_collector_request) + # LOGGER.info("Response gRPC message object: {:}".format(response)) + # assert isinstance(response, CollectorId) + + # step 2: Telemetry Collector backup option + from telemetry.backend.service.collectors import COLLECTORS + from telemetry.backend.service.collector_api.DriverFactory import DriverFactory + from telemetry.backend.service.collector_api.DriverInstanceCache import DriverInstanceCache, preload_drivers + + driver_factory = DriverFactory(COLLECTORS) + driver_instance_cache = DriverInstanceCache(driver_factory) + _service = TelemetryBackendService(driver_instance_cache) + + _collector_request = create_collector_request() + _collector = create_basic_sub_request_parameters() + _coll_id = "mgon_collector_id" + LOGGER.info("Subscription for collector %s parameters: %s", _coll_id, _collector) + + _duration = _collector_request.duration_s + _interval = _collector_request.interval_s + + stop_event = threading.Event() + collector_thread = threading.Thread( + target=_service.GenericCollectorHandler, + args=( + _coll_id, _collector, "6e22f180-ba28-4641-b190-2287bf447777", _duration, _interval, + None, None, None, "43813baf-195e-5da6-af20-b3d0922e71a7", stop_event + ), + daemon=False + ) + collector_thread.start() + + def stop_after_duration(completion_time, stop_event): + time.sleep(completion_time) + if not stop_event.is_set(): + LOGGER.warning(f"Execution duration ({completion_time}) completed for Collector: {_coll_id}") + stop_event.set() + + duration_thread = threading.Thread( + target=stop_after_duration, daemon=True, name=f"stop_after_duration_{_coll_id}", + args=(_duration, stop_event) + ) + duration_thread.start() + + LOGGER.info("Sleeping for %d seconds...", _duration) + time.sleep(_duration) + + LOGGER.info("Setting stop event for Collector: %s", _coll_id) + stop_event.set() + + # Wait for collector thread to complete + collector_thread.join(timeout=10) + if collector_thread.is_alive(): + LOGGER.warning("Collector thread did not terminate within timeout") + + LOGGER.info("Done sleeping.") + LOGGER.info(" >>> test_Complete_MGON_Integration: END <<< ") + + +# def test_get_state_updates(collector, subscription_data): +# """Test getting state updates.""" +# LOGGER.info("----- Testing State Updates -----") +# collector.SubscribeState(subscription_data) + +# LOGGER.info("Requesting state updates for 300 seconds ...") +# updates_received = [] +# for samples in collector.GetState(duration=300, blocking=True): +# LOGGER.info("Received state update: %s", samples) +# updates_received.append(samples) + +# assert len(updates_received) > 0 + + +if __name__ == "__main__": + test_Complete_MGON_Integration(kpi_manager_client, telemetry_frontend_client) + + diff --git a/src/tests/ofc26_flexscale/topology/CNIT/1.context.json b/src/tests/ofc26_flexscale/topology/CNIT/1.context.json new file mode 100644 index 0000000000000000000000000000000000000000..36b3c44fd61fdec9d208a82a11d5a16c3671d004 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/1.context.json @@ -0,0 +1,19 @@ +{ + "contexts": [ + { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "topology_ids": [], + "service_ids": [] + } + ], + "topologies": [ + { + "topology_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "topology_uuid": {"uuid": "admin"} + }, + "device_ids": [], + "link_ids": [] + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/CNIT/2.0nodes-links_no_slots.json b/src/tests/ofc26_flexscale/topology/CNIT/2.0nodes-links_no_slots.json new file mode 100644 index 0000000000000000000000000000000000000000..d9f643f0918e70981e3adc6680f572603d8c16d9 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/2.0nodes-links_no_slots.json @@ -0,0 +1,1378 @@ +{ + "devices": [ + { + "device_id": { + "device_uuid": { + "uuid": "T1.1" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.17.254.51" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "2022" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.2" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.17.254.51" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "2022" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.3" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.17.254.51" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "2022" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.1" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.17.254.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "2022" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.2" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.17.254.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "2022" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.3" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.17.254.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "2022" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.17.254.21" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "2022" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.17.254.22" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "2022" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.17.254.23" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "2022" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.17.254.24" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "2022" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + } + ], + "optical_links": [ + { + "name": "T1.1-MGON1", + "link_id": { + "link_uuid": { + "uuid": "T1.1->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T1.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-33-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "1", + "dst_port": "port-33-in", + "local_peer_port": "1", + "remote_peer_port": "port-33-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T1.2-MGON1", + "link_id": { + "link_uuid": { + "uuid": "T1.2->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T1.2" + } + }, + "endpoint_uuid": { + "uuid": "2" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-34-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "2", + "dst_port": "port-34-in", + "local_peer_port": "2", + "remote_peer_port": "port-34-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T1.3-MGON1", + "link_id": { + "link_uuid": { + "uuid": "T1.3->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T1.3" + } + }, + "endpoint_uuid": { + "uuid": "3" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-35-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "3", + "dst_port": "port-35-in", + "local_peer_port": "3", + "remote_peer_port": "port-35-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-T1.1", + "link_id": { + "link_uuid": { + "uuid": "MGON1->T1.1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-33-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-33-out", + "dst_port": "1", + "local_peer_port": "port-33-in", + "remote_peer_port": "1", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-T1.2", + "link_id": { + "link_uuid": { + "uuid": "MGON1->T1.2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-34-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.2" + } + }, + "endpoint_uuid": { + "uuid": "2" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-34-out", + "dst_port": "2", + "local_peer_port": "port-34-in", + "remote_peer_port": "2", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-T1.3", + "link_id": { + "link_uuid": { + "uuid": "MGON1->T1.3" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-35-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.3" + } + }, + "endpoint_uuid": { + "uuid": "3" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-35-out", + "dst_port": "3", + "local_peer_port": "port-35-in", + "remote_peer_port": "3", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-MGON2", + "link_id": { + "link_uuid": { + "uuid": "MGON1->MGON2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-9-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-3-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-9-out", + "dst_port": "port-3-in", + "local_peer_port": "port-9-in", + "remote_peer_port": "port-3-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON2-MGON1", + "link_id": { + "link_uuid": { + "uuid": "MGON2->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-3-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-9-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-3-out", + "dst_port": "port-9-in", + "local_peer_port": "port-3-in", + "remote_peer_port": "port-9-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-MGON3", + "link_id": { + "link_uuid": { + "uuid": "MGON1->MGON3" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-1-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-3-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-1-out", + "dst_port": "port-3-in", + "local_peer_port": "port-1-in", + "remote_peer_port": "port-3-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON3-MGON1", + "link_id": { + "link_uuid": { + "uuid": "MGON3->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-3-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-3-out", + "dst_port": "port-1-in", + "local_peer_port": "port-3-in", + "remote_peer_port": "port-1-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON2-MGON4", + "link_id": { + "link_uuid": { + "uuid": "MGON2->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-1-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-1-out", + "dst_port": "port-1-in", + "local_peer_port": "port-1-in", + "remote_peer_port": "port-1-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-MGON2", + "link_id": { + "link_uuid": { + "uuid": "MGON4->MGON2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-1-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-1-out", + "dst_port": "port-1-in", + "local_peer_port": "port-1-in", + "remote_peer_port": "port-1-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON3-MGON4", + "link_id": { + "link_uuid": { + "uuid": "MGON3->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-1-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-9-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-1-out", + "dst_port": "port-9-in", + "local_peer_port": "port-1-in", + "remote_peer_port": "port-9-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-MGON3", + "link_id": { + "link_uuid": { + "uuid": "MGON4->MGON3" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-9-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-9-out", + "dst_port": "port-1-in", + "local_peer_port": "port-9-in", + "remote_peer_port": "port-1-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T2.1-MGON4", + "link_id": { + "link_uuid": { + "uuid": "T2.1->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T2.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-33-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "1", + "dst_port": "port-33-in", + "local_peer_port": "1", + "remote_peer_port": "port-33-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T2.2-MGON4", + "link_id": { + "link_uuid": { + "uuid": "T2.2->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T2.2" + } + }, + "endpoint_uuid": { + "uuid": "2" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-34-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "2", + "dst_port": "port-34-in", + "local_peer_port": "2", + "remote_peer_port": "port-34-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T2.3-MGON4", + "link_id": { + "link_uuid": { + "uuid": "T2.3->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T2.3" + } + }, + "endpoint_uuid": { + "uuid": "3" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-35-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "3", + "dst_port": "port-35-in", + "local_peer_port": "3", + "remote_peer_port": "port-35-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-T2.1", + "link_id": { + "link_uuid": { + "uuid": "MGON4->T2.1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-33-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-33-out", + "dst_port": "1", + "local_peer_port": "port-33-in", + "remote_peer_port": "1", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-T2.2", + "link_id": { + "link_uuid": { + "uuid": "MGON4->T2.2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-34-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.2" + } + }, + "endpoint_uuid": { + "uuid": "2" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-34-out", + "dst_port": "2", + "local_peer_port": "port-34-in", + "remote_peer_port": "2", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-T2.3", + "link_id": { + "link_uuid": { + "uuid": "MGON4->T2.3" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-35-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.3" + } + }, + "endpoint_uuid": { + "uuid": "3" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-35-out", + "dst_port": "3", + "local_peer_port": "port-35-in", + "remote_peer_port": "3", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/CNIT/3.0-ob-s.json b/src/tests/ofc26_flexscale/topology/CNIT/3.0-ob-s.json new file mode 100644 index 0000000000000000000000000000000000000000..d3fa89a1f3c86cbb66a02200bfa25e977d36cefc --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/3.0-ob-s.json @@ -0,0 +1,23 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-band-S"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-9-out"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-1-in"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "preferred_band", "constraint_value": "S_BAND"}}, + {"custom": {"constraint_type": "optical-band-width[GHz]", "constraint_value": "6000"}} + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/CNIT/3.1-sc-s1-alien.json b/src/tests/ofc26_flexscale/topology/CNIT/3.1-sc-s1-alien.json new file mode 100644 index 0000000000000000000000000000000000000000..f1752d7e637ab83eb3e67bde0d3b47348f96739f --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/3.1-sc-s1-alien.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "super-channel-s1"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-25-in"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-25-out"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "alien", "constraint_value": "1"}}, + {"custom": {"constraint_type": "alien_spectrum[GHz]", "constraint_value": "3000"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "1"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/CNIT/3.2-sc-s2-alien.json b/src/tests/ofc26_flexscale/topology/CNIT/3.2-sc-s2-alien.json new file mode 100644 index 0000000000000000000000000000000000000000..4a38e9022041b50a38aa743d79db7ed320bdfe69 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/3.2-sc-s2-alien.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "super-channel-s2"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-26-in"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-26-out"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "alien", "constraint_value": "1"}}, + {"custom": {"constraint_type": "alien_spectrum[GHz]", "constraint_value": "2900"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "1"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}} + + ], + "service_config": {"config_rules": []} + } + ] +} \ No newline at end of file diff --git a/src/tests/ofc26_flexscale/topology/CNIT/4.0.ob_l.json b/src/tests/ofc26_flexscale/topology/CNIT/4.0.ob_l.json new file mode 100644 index 0000000000000000000000000000000000000000..0f02c6122dead037955fb7b0da5cdaeb9d1173dd --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/4.0.ob_l.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-band-L"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-1-out"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-9-in"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "preferred_band", "constraint_value": "L_BAND"}}, + {"custom": {"constraint_type": "optical-band-width[GHz]", "constraint_value": "3000"}}, + {"custom": {"constraint_type": "disjoint_optical_band_id", "constraint_value": "1"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/CNIT/4.1-sc-l1-alien.json b/src/tests/ofc26_flexscale/topology/CNIT/4.1-sc-l1-alien.json new file mode 100644 index 0000000000000000000000000000000000000000..e92ef29da561c2e30c6ab43c8ffe4a05e85f4824 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/4.1-sc-l1-alien.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "super-channel-l1"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-27-in"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-27-out"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "alien", "constraint_value": "1"}}, + {"custom": {"constraint_type": "alien_spectrum[GHz]", "constraint_value": "1500"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "2"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/CNIT/4.2-sc-l2-alien.json b/src/tests/ofc26_flexscale/topology/CNIT/4.2-sc-l2-alien.json new file mode 100644 index 0000000000000000000000000000000000000000..bada34dbc5d771844de42e68171ef9d4d328d24b --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/4.2-sc-l2-alien.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "super-channel-l2"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-28-in"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-28-out"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "alien", "constraint_value": "1"}}, + {"custom": {"constraint_type": "alien_spectrum[GHz]", "constraint_value": "1500"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "2"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/CNIT/5.0ob_c1.json b/src/tests/ofc26_flexscale/topology/CNIT/5.0ob_c1.json new file mode 100644 index 0000000000000000000000000000000000000000..ab56e9daaf723f5580bd045131264534d77fa34e --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/5.0ob_c1.json @@ -0,0 +1,23 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-band-C1"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-9-out"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-1-in"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "preferred_band", "constraint_value": "C_BAND"}}, + {"custom": {"constraint_type": "optical-band-width[GHz]", "constraint_value": "3900"}} + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/CNIT/5.1ob_c2.json b/src/tests/ofc26_flexscale/topology/CNIT/5.1ob_c2.json new file mode 100644 index 0000000000000000000000000000000000000000..b9398c1066171b80fc49b8c8fdfd31155c2f3593 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/5.1ob_c2.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-band-C2"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-1-out"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-9-in"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "preferred_band", "constraint_value": "C_BAND"}}, + {"custom": {"constraint_type": "optical-band-width[GHz]", "constraint_value": "3900"}}, + {"custom": {"constraint_type": "disjoint_optical_band_id", "constraint_value": "3"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/CNIT/5.2-sc-c-alien.json b/src/tests/ofc26_flexscale/topology/CNIT/5.2-sc-c-alien.json new file mode 100644 index 0000000000000000000000000000000000000000..831a271d2eaf62c6ab3007055595c5beb6201d0c --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/5.2-sc-c-alien.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "super-channel-c"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-29-in"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-29-out"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "alien", "constraint_value": "1"}}, + {"custom": {"constraint_type": "alien_spectrum[GHz]", "constraint_value": "3000"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "4"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/CNIT/5.3-oc-c-service.json b/src/tests/ofc26_flexscale/topology/CNIT/5.3-oc-c-service.json new file mode 100644 index 0000000000000000000000000000000000000000..47b551a94be5a99392434a79b14f4c84a8a15137 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/5.3-oc-c-service.json @@ -0,0 +1,23 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-channel-C"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "T1.1"}}, "endpoint_uuid": {"uuid": "1"}}, + {"device_id": {"device_uuid": {"uuid": "T2.1"}}, "endpoint_uuid": {"uuid": "1"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bandwidth[gbps]", "constraint_value": "800.0"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "4"}} + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/1.context.json b/src/tests/ofc26_flexscale/topology/HHI/1.context.json new file mode 100644 index 0000000000000000000000000000000000000000..36b3c44fd61fdec9d208a82a11d5a16c3671d004 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/1.context.json @@ -0,0 +1,19 @@ +{ + "contexts": [ + { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "topology_ids": [], + "service_ids": [] + } + ], + "topologies": [ + { + "topology_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "topology_uuid": {"uuid": "admin"} + }, + "device_ids": [], + "link_ids": [] + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/2.0nodes-links_no_slots_2TPs.json b/src/tests/ofc26_flexscale/topology/HHI/2.0nodes-links_no_slots_2TPs.json new file mode 100644 index 0000000000000000000000000000000000000000..2fa10174412789348dcdba9949d9d6d85a2f552d --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/2.0nodes-links_no_slots_2TPs.json @@ -0,0 +1,826 @@ +{ + "devices": [ + { + "device_id": { + "device_uuid": { + "uuid": "T1.1" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.16.31.93" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "830" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "hussein", + "password": "flexscale", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.1" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.16.31.93" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "3830" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "hussein", + "password": "flexscale", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.24.36.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "44551" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.24.36.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "44552" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.24.36.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "44553" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.24.36.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "44554" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + } + ], + "optical_links": [ + { + "name": "T1.1-MGON1", + "link_id": { + "link_uuid": { + "uuid": "T1.1->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T1.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-33-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "1", + "dst_port": "port-33-in", + "local_peer_port": "1", + "remote_peer_port": "port-33-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-T1.1", + "link_id": { + "link_uuid": { + "uuid": "MGON1->T1.1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-33-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-33-out", + "dst_port": "1", + "local_peer_port": "port-33-in", + "remote_peer_port": "1", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-MGON2", + "link_id": { + "link_uuid": { + "uuid": "MGON1->MGON2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-9-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-3-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-9-out", + "dst_port": "port-3-in", + "local_peer_port": "port-9-in", + "remote_peer_port": "port-3-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON2-MGON1", + "link_id": { + "link_uuid": { + "uuid": "MGON2->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-3-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-9-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-3-out", + "dst_port": "port-9-in", + "local_peer_port": "port-3-in", + "remote_peer_port": "port-9-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-MGON3", + "link_id": { + "link_uuid": { + "uuid": "MGON1->MGON3" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-10-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-3-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-10-out", + "dst_port": "port-3-in", + "local_peer_port": "port-10-in", + "remote_peer_port": "port-3-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON3-MGON1", + "link_id": { + "link_uuid": { + "uuid": "MGON3->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-3-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-3-out", + "dst_port": "port-10-in", + "local_peer_port": "port-3-in", + "remote_peer_port": "port-10-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON2-MGON4", + "link_id": { + "link_uuid": { + "uuid": "MGON2->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-1-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-1-out", + "dst_port": "port-1-in", + "local_peer_port": "port-1-in", + "remote_peer_port": "port-1-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-MGON2", + "link_id": { + "link_uuid": { + "uuid": "MGON4->MGON2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-1-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-1-out", + "dst_port": "port-1-in", + "local_peer_port": "port-1-in", + "remote_peer_port": "port-1-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON3-MGON4", + "link_id": { + "link_uuid": { + "uuid": "MGON3->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-1-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-2-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-1-out", + "dst_port": "port-2-in", + "local_peer_port": "port-1-in", + "remote_peer_port": "port-2-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-MGON3", + "link_id": { + "link_uuid": { + "uuid": "MGON4->MGON3" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-2-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-2-out", + "dst_port": "port-1-in", + "local_peer_port": "port-2-in", + "remote_peer_port": "port-1-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T2.1-MGON4", + "link_id": { + "link_uuid": { + "uuid": "T2.1->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T2.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-33-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "1", + "dst_port": "port-33-in", + "local_peer_port": "1", + "remote_peer_port": "port-33-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-T2.1", + "link_id": { + "link_uuid": { + "uuid": "MGON4->T2.1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-33-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-33-out", + "dst_port": "1", + "local_peer_port": "port-33-in", + "remote_peer_port": "1", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/2.0nodes-links_no_slots_6TPs.json b/src/tests/ofc26_flexscale/topology/HHI/2.0nodes-links_no_slots_6TPs.json new file mode 100644 index 0000000000000000000000000000000000000000..a4dea6ae3349d09a56966edbf0ecb64e99f56dc0 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/2.0nodes-links_no_slots_6TPs.json @@ -0,0 +1,1378 @@ +{ + "devices": [ + { + "device_id": { + "device_uuid": { + "uuid": "T1.1" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.16.31.93" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "830" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "hussein", + "password": "flexscale", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.2" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.16.31.93" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "830" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "hussein", + "password": "flexscale", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.3" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.16.31.93" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "830" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "hussein", + "password": "flexscale", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.1" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.16.31.93" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "3830" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "hussein", + "password": "flexscale", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.2" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.16.31.93" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "3830" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "hussein", + "password": "flexscale", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.3" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.16.31.93" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "3830" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "hussein", + "password": "flexscale", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.24.36.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "44551" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.24.36.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "44552" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.24.36.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "44553" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.24.36.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "44554" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + } + ], + "optical_links": [ + { + "name": "T1.1-MGON1", + "link_id": { + "link_uuid": { + "uuid": "T1.1->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T1.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-33-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "1", + "dst_port": "port-33-in", + "local_peer_port": "1", + "remote_peer_port": "port-33-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T1.2-MGON1", + "link_id": { + "link_uuid": { + "uuid": "T1.2->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T1.2" + } + }, + "endpoint_uuid": { + "uuid": "2" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-34-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "2", + "dst_port": "port-34-in", + "local_peer_port": "2", + "remote_peer_port": "port-34-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T1.3-MGON1", + "link_id": { + "link_uuid": { + "uuid": "T1.3->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T1.3" + } + }, + "endpoint_uuid": { + "uuid": "3" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-35-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "3", + "dst_port": "port-35-in", + "local_peer_port": "3", + "remote_peer_port": "port-35-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-T1.1", + "link_id": { + "link_uuid": { + "uuid": "MGON1->T1.1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-33-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-33-out", + "dst_port": "1", + "local_peer_port": "port-33-in", + "remote_peer_port": "1", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-T1.2", + "link_id": { + "link_uuid": { + "uuid": "MGON1->T1.2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-34-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.2" + } + }, + "endpoint_uuid": { + "uuid": "2" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-34-out", + "dst_port": "2", + "local_peer_port": "port-34-in", + "remote_peer_port": "2", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-T1.3", + "link_id": { + "link_uuid": { + "uuid": "MGON1->T1.3" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-35-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.3" + } + }, + "endpoint_uuid": { + "uuid": "3" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-35-out", + "dst_port": "3", + "local_peer_port": "port-35-in", + "remote_peer_port": "3", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-MGON2", + "link_id": { + "link_uuid": { + "uuid": "MGON1->MGON2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-9-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-3-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-9-out", + "dst_port": "port-3-in", + "local_peer_port": "port-9-in", + "remote_peer_port": "port-3-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON2-MGON1", + "link_id": { + "link_uuid": { + "uuid": "MGON2->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-3-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-9-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-3-out", + "dst_port": "port-9-in", + "local_peer_port": "port-3-in", + "remote_peer_port": "port-9-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-MGON3", + "link_id": { + "link_uuid": { + "uuid": "MGON1->MGON3" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-10-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-3-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-10-out", + "dst_port": "port-3-in", + "local_peer_port": "port-10-in", + "remote_peer_port": "port-3-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON3-MGON1", + "link_id": { + "link_uuid": { + "uuid": "MGON3->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-3-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-3-out", + "dst_port": "port-10-in", + "local_peer_port": "port-3-in", + "remote_peer_port": "port-10-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON2-MGON4", + "link_id": { + "link_uuid": { + "uuid": "MGON2->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-1-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-1-out", + "dst_port": "port-1-in", + "local_peer_port": "port-1-in", + "remote_peer_port": "port-1-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-MGON2", + "link_id": { + "link_uuid": { + "uuid": "MGON4->MGON2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-1-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-1-out", + "dst_port": "port-1-in", + "local_peer_port": "port-1-in", + "remote_peer_port": "port-1-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON3-MGON4", + "link_id": { + "link_uuid": { + "uuid": "MGON3->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-1-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-2-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-1-out", + "dst_port": "port-2-in", + "local_peer_port": "port-1-in", + "remote_peer_port": "port-2-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-MGON3", + "link_id": { + "link_uuid": { + "uuid": "MGON4->MGON3" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-2-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-2-out", + "dst_port": "port-1-in", + "local_peer_port": "port-2-in", + "remote_peer_port": "port-1-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T2.1-MGON4", + "link_id": { + "link_uuid": { + "uuid": "T2.1->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T2.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-33-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "1", + "dst_port": "port-33-in", + "local_peer_port": "1", + "remote_peer_port": "port-33-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T2.2-MGON4", + "link_id": { + "link_uuid": { + "uuid": "T2.2->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T2.2" + } + }, + "endpoint_uuid": { + "uuid": "2" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-34-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "2", + "dst_port": "port-34-in", + "local_peer_port": "2", + "remote_peer_port": "port-34-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T2.3-MGON4", + "link_id": { + "link_uuid": { + "uuid": "T2.3->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T2.3" + } + }, + "endpoint_uuid": { + "uuid": "3" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-35-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "3", + "dst_port": "port-35-in", + "local_peer_port": "3", + "remote_peer_port": "port-35-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-T2.1", + "link_id": { + "link_uuid": { + "uuid": "MGON4->T2.1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-33-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-33-out", + "dst_port": "1", + "local_peer_port": "port-33-in", + "remote_peer_port": "1", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-T2.2", + "link_id": { + "link_uuid": { + "uuid": "MGON4->T2.2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-34-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.2" + } + }, + "endpoint_uuid": { + "uuid": "2" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-34-out", + "dst_port": "2", + "local_peer_port": "port-34-in", + "remote_peer_port": "2", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-T2.3", + "link_id": { + "link_uuid": { + "uuid": "MGON4->T2.3" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-35-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.3" + } + }, + "endpoint_uuid": { + "uuid": "3" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-35-out", + "dst_port": "3", + "local_peer_port": "port-35-in", + "remote_peer_port": "3", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/3.0-ob-s.json b/src/tests/ofc26_flexscale/topology/HHI/3.0-ob-s.json new file mode 100644 index 0000000000000000000000000000000000000000..d3fa89a1f3c86cbb66a02200bfa25e977d36cefc --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/3.0-ob-s.json @@ -0,0 +1,23 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-band-S"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-9-out"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-1-in"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "preferred_band", "constraint_value": "S_BAND"}}, + {"custom": {"constraint_type": "optical-band-width[GHz]", "constraint_value": "6000"}} + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/3.1-sc-s1-alien.json b/src/tests/ofc26_flexscale/topology/HHI/3.1-sc-s1-alien.json new file mode 100644 index 0000000000000000000000000000000000000000..37969cfb80b5c19681ab6a079ac979786dd94943 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/3.1-sc-s1-alien.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "super-channel-s1"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-25-in"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-25-out"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "alien", "constraint_value": "1"}}, + {"custom": {"constraint_type": "alien_spectrum[GHz]", "constraint_value": "3000"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "3"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/3.2-sc-s2-alien.json b/src/tests/ofc26_flexscale/topology/HHI/3.2-sc-s2-alien.json new file mode 100644 index 0000000000000000000000000000000000000000..e4d620d4762fa0b7342726eb41b1e91ea757b74d --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/3.2-sc-s2-alien.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "super-channel-s2"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-26-in"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-26-out"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "alien", "constraint_value": "1"}}, + {"custom": {"constraint_type": "alien_spectrum[GHz]", "constraint_value": "2900"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "3"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}} + + ], + "service_config": {"config_rules": []} + } + ] +} \ No newline at end of file diff --git a/src/tests/ofc26_flexscale/topology/HHI/4.0.ob_l.json b/src/tests/ofc26_flexscale/topology/HHI/4.0.ob_l.json new file mode 100644 index 0000000000000000000000000000000000000000..c63243f328aa21924d828f6ec5e9bf613899adf7 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/4.0.ob_l.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-band-L"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-1-out"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-9-in"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "preferred_band", "constraint_value": "L_BAND"}}, + {"custom": {"constraint_type": "optical-band-width[GHz]", "constraint_value": "3000"}}, + {"custom": {"constraint_type": "disjoint_optical_band_id", "constraint_value": "3"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/4.1-sc-l1-alien.json b/src/tests/ofc26_flexscale/topology/HHI/4.1-sc-l1-alien.json new file mode 100644 index 0000000000000000000000000000000000000000..3d24a34e30c9f40d113ca3b7486f6a9ef25349e5 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/4.1-sc-l1-alien.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "super-channel-l1"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-27-in"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-27-out"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "alien", "constraint_value": "1"}}, + {"custom": {"constraint_type": "alien_spectrum[GHz]", "constraint_value": "1500"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "4"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/4.2-sc-l2-alien.json b/src/tests/ofc26_flexscale/topology/HHI/4.2-sc-l2-alien.json new file mode 100644 index 0000000000000000000000000000000000000000..8210c786ea4b8fd2b9acd13a7bcc1c8bbe341a5c --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/4.2-sc-l2-alien.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "super-channel-l2"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-28-in"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-28-out"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "alien", "constraint_value": "1"}}, + {"custom": {"constraint_type": "alien_spectrum[GHz]", "constraint_value": "1200"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "4"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/5.0ob_c1.json b/src/tests/ofc26_flexscale/topology/HHI/5.0ob_c1.json new file mode 100644 index 0000000000000000000000000000000000000000..ab56e9daaf723f5580bd045131264534d77fa34e --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/5.0ob_c1.json @@ -0,0 +1,23 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-band-C1"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-9-out"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-1-in"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "preferred_band", "constraint_value": "C_BAND"}}, + {"custom": {"constraint_type": "optical-band-width[GHz]", "constraint_value": "3900"}} + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/5.1ob_c2 - Copia.json b/src/tests/ofc26_flexscale/topology/HHI/5.1ob_c2 - Copia.json new file mode 100644 index 0000000000000000000000000000000000000000..d34f10d8590a3e7e4e35a2e3e63cb0e7397796a4 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/5.1ob_c2 - Copia.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-band-C2"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-1-out"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-9-in"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "preferred_band", "constraint_value": "C_BAND"}}, + {"custom": {"constraint_type": "optical-band-width[GHz]", "constraint_value": "1900"}}, + {"custom": {"constraint_type": "disjoint_optical_band_id", "constraint_value": "1"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/5.1ob_c2.json b/src/tests/ofc26_flexscale/topology/HHI/5.1ob_c2.json new file mode 100644 index 0000000000000000000000000000000000000000..31229c1dcb3828517a2d648238cb0364037d8280 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/5.1ob_c2.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-band-C2"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-1-out"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-9-in"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "preferred_band", "constraint_value": "C_BAND"}}, + {"custom": {"constraint_type": "optical-band-width[GHz]", "constraint_value": "3900"}}, + {"custom": {"constraint_type": "disjoint_optical_band_id", "constraint_value": "1"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/5.2-sc-c-alien.json b/src/tests/ofc26_flexscale/topology/HHI/5.2-sc-c-alien.json new file mode 100644 index 0000000000000000000000000000000000000000..8411862c0b3c3f82b65b9b73bab7919dbe19ecf1 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/5.2-sc-c-alien.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "super-channel-c"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-29-in"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-29-out"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "alien", "constraint_value": "1"}}, + {"custom": {"constraint_type": "alien_spectrum[GHz]", "constraint_value": "1959"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "2"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/5.3-oc-c-service.json b/src/tests/ofc26_flexscale/topology/HHI/5.3-oc-c-service.json new file mode 100644 index 0000000000000000000000000000000000000000..169b854c20adc1e30d4c0fbbbf5a06cf26089790 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/5.3-oc-c-service.json @@ -0,0 +1,23 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-channel-C"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "T1.1"}}, "endpoint_uuid": {"uuid": "1"}}, + {"device_id": {"device_uuid": {"uuid": "T2.1"}}, "endpoint_uuid": {"uuid": "1"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bandwidth[gbps]", "constraint_value": "800.0"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "2"}} + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/p4-fabric-tna/run_test_04b_service_deprovision_l3.sh b/src/tests/p4-fabric-tna/run_test_04b_service_deprovision_l3.sh deleted file mode 100755 index eeb64cdd20f9cfc16068ac889585dca7ac6467a4..0000000000000000000000000000000000000000 --- a/src/tests/p4-fabric-tna/run_test_04b_service_deprovision_l3.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/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. - -source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_l3.py diff --git a/src/tests/p4-fabric-tna/run_test_05a_service_provision_acl.sh b/src/tests/p4-fabric-tna/run_test_05a_service_provision_acl.sh deleted file mode 100755 index cbc0d3a2556abdc5ba80a5d2cc851b4f4285cbb0..0000000000000000000000000000000000000000 --- a/src/tests/p4-fabric-tna/run_test_05a_service_provision_acl.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/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. - -source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_acl.py diff --git a/src/tests/p4-fabric-tna/run_test_05b_service_deprovision_acl.sh b/src/tests/p4-fabric-tna/run_test_05b_service_deprovision_acl.sh deleted file mode 100755 index 253b51622eae6a39a4fc60de24c45221ea913235..0000000000000000000000000000000000000000 --- a/src/tests/p4-fabric-tna/run_test_05b_service_deprovision_acl.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/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. - -source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_acl.py diff --git a/src/tests/p4-fabric-tna/run_test_06a_service_provision_int.sh b/src/tests/p4-fabric-tna/run_test_06a_service_provision_int.sh deleted file mode 100755 index c3e1b285566dc943a7c1324872bc136e4b4cf713..0000000000000000000000000000000000000000 --- a/src/tests/p4-fabric-tna/run_test_06a_service_provision_int.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/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. - -source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_int.py diff --git a/src/tests/p4-fabric-tna/run_test_06b_service_deprovision_int.sh b/src/tests/p4-fabric-tna/run_test_06b_service_deprovision_int.sh deleted file mode 100755 index 5e3b1a5ff43e1e1a944bf5d9bdb53e96f0940285..0000000000000000000000000000000000000000 --- a/src/tests/p4-fabric-tna/run_test_06b_service_deprovision_int.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/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. - -source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_int.py diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/Fixtures.py b/src/tests/p4-sd-fabric-sbi-connectivity/Fixtures.py new file mode 100644 index 0000000000000000000000000000000000000000..cf77538f9d3860c1a45c56038288b87b08b8fd01 --- /dev/null +++ b/src/tests/p4-sd-fabric-sbi-connectivity/Fixtures.py @@ -0,0 +1,39 @@ +# Copyright 2022-2026 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 context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient + + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def service_client(): + _client = ServiceClient() + yield _client + _client.close() diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/README.md b/src/tests/p4-sd-fabric-sbi-connectivity/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0ff0ee6ed4f5d1133b657d54a76e421c68d8cce8 --- /dev/null +++ b/src/tests/p4-sd-fabric-sbi-connectivity/README.md @@ -0,0 +1,185 @@ +# Tests for P4 routing, ACL, and In-Band Network Telemetry functions via TFS SBI + +This directory contains the necessary scripts and configurations to run tests atop a Stratum-based P4 whitebox that performs a set of network functions, including forwarding (L2), routing (L3), L3/L4 access control list (ACL), and In-Band Network Telemetry (INT). +The P4 data plane is based on ONF's SD-Fabric implementation, titled [fabric-tna](https://github.com/stratum/fabric-tna) + +## Prerequisites + +You need Python3, which should already be installed while preparing for a TFS build. +Additionally, `pytest` is also mandatory as it is used by our tests below. +Aliasing python with python3 will also help bridging issues between older and newer python versions. + +```shell +alias python='python3' +pip3 install pytest +pip3 install grpclib protobuf +pip3 install grpcio-tools +``` + +The versions used for this test are: + +- `protobuf` 3.20.3 +- `grpclib` 0.4.4 +- `grpcio` 1.47.5 +- `grpcio-tools` 1.47.5 + +After the installation of `grpclib`, protoc-gen-grpclib_python binary is in /home/$USER/.local/bin/ +First we copy it to /usr/local/bin/: + +```shell + sudo cp /home/$USER/.local/bin/protoc-gen-grpclib_python /usr/local/bin/ +``` + +Then, we include this path to the PYTHONPATH: + +```shell +export PYTHONPATH="${PYTHONPATH}:/usr/local/bin/protoc-gen-grpclib_python" +``` + +You need to build and deploy a software-based Stratum switch, before being able to use TFS to control it. +To do so, follow the instructions in the `./topology` folder. + +## Steps to setup and run a TFS program atop Stratum + +To conduct this test, follow the steps below. + +### Deploy TFS + +Go to the TFS parent folder. + +```shell +cd ~/tfs-ctrl/ +``` + +Edit `my_deploy.sh` to include the following TFS components and then source the file. + +```shell +nano my_deploy.sh +`export TFS_COMPONENTS="context device pathcomp service kpi_manager kpi_value_writer kpi_value_api telemetry nbi webui"` +``` + +```shell +source my_deploy.sh && source tfs_runtime_env_vars.sh +``` + +Now deploy TFS: + +```shell +./deploy/all.sh +``` + +When deployed, execute the following command to ensure that the above components are all in place and in a running state: + +```shell +./deploy/show.sh +``` + +### Path setup + +Ensure that `PATH` variable contains the parent project directory, e.g., "home/$USER/tfs-ctrl". + +Ensure that `PYTHONPATH` variable contains the source code directory of TFS, e.g., "home/$USER/tfs-ctrl/src" + +## Topology setup + +Go to `src/tests/p4-topologies/` and follow the instructions on how to install Mininet in your machine. +After Mininet is installed, run the following command to deploy a single switch P4 topology on Mininet. + +```bash +cd ~/tfs-ctrl/src/tests/p4-topologies/topo-mininet/ +sudo python3 topo-mininet/1switch1path-int.py --host-int-iface=eth0 +``` + +You may need to change the `host-int-iface` to a network interface that suits your setup. +This is the interface through which Mininet sends in-band network telemetry packets to TFS. + +## P4 artifacts + +In the `./p4src/` directory there are compiled P4 artifacts of the pipeline that will be pushed to the P4 switch, along with the P4-runtime definitions. +The `./setup.sh` script copies from this directory. If you need to change the P4 program, make sure to put the compiled artifacts there. + +## Tests + +A set of tests is implemented, each focusing on different aspects of TFS. +For each of these tests, an auxiliary bash script allows to run it with less typing. + +| Bash Runner | Purpose | +| -------------------------------------------- | --------------------------------------------------------------------------- | +| setup.sh | Copy P4 artifacts into the SBI pod | +| run_test_01_bootstrap.sh | Connect TFS to the P4 switch | +| run_test_02_sbi_provision_int_l2_l3_acl.sh | Install L2, L3, INT, and ACL rules on the P4 switch via the SBI service | +| run_test_03_sbi_deprovision_int_l2_l3_acl.sh | Uninstall L2, L3, INT, and ACL rules from the P4 switch via the SBI service | +| run_test_04_cleanup.sh | Clean-up context and topology and disconnect TFS from the P4 switch | + +Each of the tests above is described in detail below. + +### Step 0: Copy the necessary P4 artifacts into the TFS SBI service pod + +The setup script copies the necessary artifacts to the SBI service pod. +It should be run just once, after a fresh install of TFS. +If you `deploy/all.sh` again, you need to repeat this step. + +```shell +cd ~/tfs-ctrl/ +source my_deploy.sh && source tfs_runtime_env_vars.sh +bash src/tests/p4-sd-fabric-sbi-connectivity/setup.sh +``` + +### Step 1: Bootstrap topology + +The bootstrap script registers the context, topology, links, and devices to TFS. + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-sbi-connectivity/run_test_01_bootstrap.sh +``` + +### Step 2: Provision L2, L3, ACL, and INT via the SBI API + +Implement forwarding, routing, ACL, and INT network functions by installing P4 rules to the Stratum switch via the TFS SBI API. +In this test, these rules are installed in batches, as the switch cannot digest all these rules at once. + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-sbi-connectivity/run_test_02_sbi_provision_int_l2_l3_acl.sh +``` + +To observe the telemetry coming from Mininet, you may configure Prometheus and Grafana as follows. +First, connect TFS Grafana with the Prometheus data source, after you modify `TFS_IP` variable in the following script: + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-sbi-connectivity/run_grafana_datasources.sh +``` + +Then, publish a dashboard showing the switch latency, after you ensure that the `DASHBOARD_FILE` variable in the following script points to the correct file in your filesystem. + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-sbi-connectivity/run_grafana_dashboard.sh +``` + +### Step 3: Deprovision L2, L3, ACL, and INT via the SBI API + +Deprovision forwarding, routing, ACL, and INT network functions by removing the previously installed P4 rules (via the TFS SBI API) from the Stratum switch. + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-sbi-connectivity/run_test_03_sbi_deprovision_int_l2_l3_acl.sh +``` + +### Step 4: Deprovision topology + +Delete all the objects (context, topology, links, devices) from TFS: + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-sbi-connectivity/run_test_04_cleanup.sh +``` + +Alternatively, a purge test is implemented; this test removes services, links, devices, topology, and context in this order. + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-sbi-connectivity/run_test_05_purge.sh +``` diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/__init__.py b/src/tests/p4-sd-fabric-sbi-connectivity/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..7363515f07a52d996229bcbd72932ce1423258d7 --- /dev/null +++ b/src/tests/p4-sd-fabric-sbi-connectivity/__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/tests/p4-sd-fabric-sbi-connectivity/descriptors/grafana-latency.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/grafana-latency.json new file mode 100644 index 0000000000000000000000000000000000000000..e02d1cc268d628de2bcc2f7d4211b77d7a575757 --- /dev/null +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/grafana-latency.json @@ -0,0 +1,175 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": [], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "8.5.22" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "Latency", + "axisPlacement": "left", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 17, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineStyle": { + "dash": [ + 20, + 10 + ], + "fill": "dash" + }, + "lineWidth": 2, + "pointSize": 4, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ns" + }, + "overrides": [] + }, + "gridPos": { + "h": 17, + "w": 23, + "x": 0, + "y": 0 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "avg(KPISAMPLETYPE_INT_HOP_LAT_SW01)", + "refId": "A" + } + ], + "title": "P4 switch latency", + "transparent": true, + "type": "timeseries" + } + ], + "refresh": "5s", + "schemaVersion": 36, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Latency", + "uid": "VefdTgZvk", + "version": 2, + "weekStart": "" +} \ No newline at end of file diff --git a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-acl.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-acl.json similarity index 94% rename from src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-acl.json rename to src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-acl.json index 97a548983f29c7af8c1da21fda5ab09b45a940aa..9fd750539bae8f8da2f80ade9df92fbcac209491 100644 --- a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-acl.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-acl.json @@ -3,10 +3,10 @@ { "device_id": { "device_uuid": { - "uuid": "p4-sw1" + "uuid": "sw1" } }, - "name": "p4-sw1", + "name": "sw1", "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", "device_config": { "config_rules": [ diff --git a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-int-b1.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b1.json similarity index 97% rename from src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-int-b1.json rename to src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b1.json index 3fc9a71732aef424b85c9b91b255083b3e1badbb..22aa84205972705b60af50056b2053ff2915cca8 100644 --- a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-int-b1.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b1.json @@ -3,10 +3,10 @@ { "device_id": { "device_uuid": { - "uuid": "p4-sw1" + "uuid": "sw1" } }, - "name": "p4-sw1", + "name": "sw1", "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", "device_config": { "config_rules": [ @@ -120,7 +120,7 @@ }, { "match-field": "ipv4_dst", - "match-value": "10.10.10.41&&&0xFFFFFFFF" + "match-value": "192.168.5.137&&&0xFFFFFFFF" } ], "action-name": "FabricIngress.int_watchlist.no_report_collector", diff --git a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-int-b2.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b2.json similarity index 88% rename from src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-int-b2.json rename to src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b2.json index e6b5a8ea8590586b2aeee46eb9b736b1e27ba35e..8650d18ec11c79b69643dbc1fa793c0150b8ea7f 100644 --- a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-int-b2.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b2.json @@ -3,10 +3,10 @@ { "device_id": { "device_uuid": { - "uuid": "p4-sw1" + "uuid": "sw1" } }, - "name": "p4-sw1", + "name": "sw1", "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", "device_config": { "config_rules": [ @@ -34,15 +34,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -76,15 +76,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -118,15 +118,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -160,15 +160,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -202,15 +202,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -244,15 +244,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", diff --git a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-int-b3.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b3.json similarity index 95% rename from src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-int-b3.json rename to src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b3.json index f8d2c71830d3ef55ea8ffd97e3557fc9d8cc6315..66bdbbdd1923ad2078154ba99240967e89c4970d 100644 --- a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-int-b3.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b3.json @@ -3,10 +3,10 @@ { "device_id": { "device_uuid": { - "uuid": "p4-sw1" + "uuid": "sw1" } }, - "name": "p4-sw1", + "name": "sw1", "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", "device_config": { "config_rules": [ @@ -102,7 +102,7 @@ }, { "match-field": "eth_dst", - "match-value": "fa:16:3e:fb:cf:96" + "match-value": "46:e4:58:c6:74:53" } ], "action-name": "FabricIngress.forwarding.set_next_id_bridging", @@ -147,7 +147,7 @@ "match-fields": [ { "match-field": "ipv4_dst", - "match-value": "10.10.10.41/32" + "match-value": "192.168.5.137/32" } ], "action-name": "FabricIngress.forwarding.set_next_id_routing_v4", @@ -180,11 +180,11 @@ }, { "action-param": "smac", - "action-value": "fa:16:3e:93:8c:c0" + "action-value": "ee:ee:8c:6c:f3:2c" }, { "action-param": "dmac", - "action-value": "fa:16:3e:fb:cf:96" + "action-value": "46:e4:58:c6:74:53" } ] } diff --git a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-routing-east.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-routing-east.json similarity index 95% rename from src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-routing-east.json rename to src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-routing-east.json index 0fe8b5036f8446f65e8fca85ddeea97cd6ed8cd0..2a54108f010fe3172a1b872c0e9939f77f41e7a4 100644 --- a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-routing-east.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-routing-east.json @@ -3,10 +3,10 @@ { "device_id": { "device_uuid": { - "uuid": "p4-sw1" + "uuid": "sw1" } }, - "name": "p4-sw1", + "name": "sw1", "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", "device_config": { "config_rules": [ @@ -102,7 +102,7 @@ }, { "match-field": "eth_dst", - "match-value": "fa:16:3e:e2:af:28" + "match-value": "00:00:00:00:00:02" } ], "action-name": "FabricIngress.forwarding.set_next_id_bridging", @@ -147,7 +147,7 @@ "match-fields": [ { "match-field": "ipv4_dst", - "match-value": "172.16.10.9/32" + "match-value": "10.0.0.2/32" } ], "action-name": "FabricIngress.forwarding.set_next_id_routing_v4", @@ -180,11 +180,11 @@ }, { "action-param": "smac", - "action-value": "fa:16:3e:9b:cb:a1" + "action-value": "00:00:00:00:00:01" }, { "action-param": "dmac", - "action-value": "fa:16:3e:e2:af:28" + "action-value": "00:00:00:00:00:02" } ] } diff --git a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-routing-west.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-routing-west.json similarity index 95% rename from src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-routing-west.json rename to src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-routing-west.json index c48d9d31e2b36dd1710ab53d51280759e82cca1c..6e30d8b3a7ee28560eaae9a86b94b4d50c9bf80e 100644 --- a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-routing-west.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-routing-west.json @@ -3,10 +3,10 @@ { "device_id": { "device_uuid": { - "uuid": "p4-sw1" + "uuid": "sw1" } }, - "name": "p4-sw1", + "name": "sw1", "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", "device_config": { "config_rules": [ @@ -102,7 +102,7 @@ }, { "match-field": "eth_dst", - "match-value": "fa:16:3e:58:92:ba" + "match-value": "00:00:00:00:00:01" } ], "action-name": "FabricIngress.forwarding.set_next_id_bridging", @@ -147,7 +147,7 @@ "match-fields": [ { "match-field": "ipv4_dst", - "match-value": "10.158.72.25/32" + "match-value": "10.0.0.1/32" } ], "action-name": "FabricIngress.forwarding.set_next_id_routing_v4", @@ -180,11 +180,11 @@ }, { "action-param": "smac", - "action-value": "fa:16:3e:e2:af:28" + "action-value": "00:00:00:00:00:02" }, { "action-param": "dmac", - "action-value": "fa:16:3e:58:92:ba" + "action-value": "00:00:00:00:00:01" } ] } diff --git a/src/tests/p4-fabric-tna/descriptors/sbi-rules-remove.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-remove.json similarity index 94% rename from src/tests/p4-fabric-tna/descriptors/sbi-rules-remove.json rename to src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-remove.json index 68132e9e6ec09435cfcbaae16a9c2287e9c649b5..f82b25f893fa5b0f85c93659d70ab75f97c456e3 100644 --- a/src/tests/p4-fabric-tna/descriptors/sbi-rules-remove.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-remove.json @@ -3,10 +3,10 @@ { "device_id": { "device_uuid": { - "uuid": "p4-sw1" + "uuid": "sw1" } }, - "name": "p4-sw1", + "name": "sw1", "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", "device_config": { "config_rules": [ @@ -131,15 +131,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -173,15 +173,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -215,15 +215,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -257,15 +257,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -299,15 +299,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -341,15 +341,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -372,7 +372,7 @@ }, { "match-field": "ipv4_dst", - "match-value": "10.10.10.41&&&0xFFFFFFFF" + "match-value": "192.168.5.137&&&0xFFFFFFFF" } ], "action-name": "FabricIngress.int_watchlist.no_report_collector", @@ -473,7 +473,7 @@ }, { "match-field": "eth_dst", - "match-value": "fa:16:3e:fb:cf:96" + "match-value": "46:e4:58:c6:74:53" } ], "action-name": "FabricIngress.forwarding.set_next_id_bridging", @@ -518,7 +518,7 @@ "match-fields": [ { "match-field": "ipv4_dst", - "match-value": "10.10.10.41/32" + "match-value": "192.168.5.137/32" } ], "action-name": "FabricIngress.forwarding.set_next_id_routing_v4", @@ -551,11 +551,11 @@ }, { "action-param": "smac", - "action-value": "fa:16:3e:93:8c:c0" + "action-value": "ee:ee:8c:6c:f3:2c" }, { "action-param": "dmac", - "action-value": "fa:16:3e:fb:cf:96" + "action-value": "46:e4:58:c6:74:53" } ] } @@ -668,7 +668,7 @@ }, { "match-field": "eth_dst", - "match-value": "fa:16:3e:58:92:ba" + "match-value": "00:00:00:00:00:01" } ], "action-name": "FabricIngress.forwarding.set_next_id_bridging", @@ -713,7 +713,7 @@ "match-fields": [ { "match-field": "ipv4_dst", - "match-value": "10.158.72.25/32" + "match-value": "10.0.0.1/32" } ], "action-name": "FabricIngress.forwarding.set_next_id_routing_v4", @@ -746,11 +746,11 @@ }, { "action-param": "smac", - "action-value": "fa:16:3e:e2:af:28" + "action-value": "00:00:00:00:00:02" }, { "action-param": "dmac", - "action-value": "fa:16:3e:58:92:ba" + "action-value": "00:00:00:00:00:01" } ] } @@ -848,7 +848,7 @@ }, { "match-field": "eth_dst", - "match-value": "fa:16:3e:e2:af:28" + "match-value": "00:00:00:00:00:02" } ], "action-name": "FabricIngress.forwarding.set_next_id_bridging", @@ -893,7 +893,7 @@ "match-fields": [ { "match-field": "ipv4_dst", - "match-value": "172.16.10.9/32" + "match-value": "10.0.0.2/32" } ], "action-name": "FabricIngress.forwarding.set_next_id_routing_v4", @@ -926,11 +926,11 @@ }, { "action-param": "smac", - "action-value": "fa:16:3e:9b:cb:a1" + "action-value": "00:00:00:00:00:01" }, { "action-param": "dmac", - "action-value": "fa:16:3e:e2:af:28" + "action-value": "00:00:00:00:00:02" } ] } diff --git a/src/tests/p4-fabric-tna/descriptors/topology.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/topology.json similarity index 79% rename from src/tests/p4-fabric-tna/descriptors/topology.json rename to src/tests/p4-sd-fabric-sbi-connectivity/descriptors/topology.json index 619060e9e00bd589ea988d2cda77f177615b85a0..420cc8f0f883a37ddb07fff749220590b79fe2c2 100644 --- a/src/tests/p4-fabric-tna/descriptors/topology.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/topology.json @@ -10,8 +10,8 @@ { "device_id": {"device_uuid": {"uuid": "tfs-sdn-controller"}}, "name": "tfs-sdn-controller", - "device_type": "ietf-slice", - "device_drivers": ["DEVICEDRIVER_IETF_SLICE"], + "device_type": "teraflowsdn", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], "device_operational_status": "DEVICEOPERATIONALSTATUS_UNDEFINED", "device_config": {"config_rules": [ {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, @@ -22,8 +22,8 @@ ]} }, { - "device_id": {"device_uuid": {"uuid": "west-net"}}, - "device_type": "network", + "device_id": {"device_uuid": {"uuid": "h1"}}, + "device_type": "emu-client", "device_drivers": ["DEVICEDRIVER_UNDEFINED"], "device_config": { "config_rules": [ @@ -36,8 +36,8 @@ } }, { - "device_id": {"device_uuid": {"uuid": "east-net"}}, - "device_type": "network", + "device_id": {"device_uuid": {"uuid": "h2"}}, + "device_type": "emu-client", "device_drivers": ["DEVICEDRIVER_UNDEFINED"], "device_config": { "config_rules": [ @@ -80,26 +80,26 @@ ], "links": [ { - "link_id": {"link_uuid": {"uuid": "sw1/1==west-net/eth1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + "link_id": {"link_uuid": {"uuid": "sw1/1==h1/eth1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ {"device_id": {"device_uuid": {"uuid": "sw1"}}, "endpoint_uuid": {"uuid": "1"}}, - {"device_id": {"device_uuid": {"uuid": "west-net"}}, "endpoint_uuid": {"uuid": "eth1"}} + {"device_id": {"device_uuid": {"uuid": "h1"}}, "endpoint_uuid": {"uuid": "eth1"}} ] }, { - "link_id": {"link_uuid": {"uuid": "west-net/eth1==sw1/1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ - {"device_id": {"device_uuid": {"uuid": "west-net"}}, "endpoint_uuid": {"uuid": "eth1"}}, + "link_id": {"link_uuid": {"uuid": "h1/eth1==sw1/1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "h1"}}, "endpoint_uuid": {"uuid": "eth1"}}, {"device_id": {"device_uuid": {"uuid": "sw1"}}, "endpoint_uuid": {"uuid": "1"}} ] }, { - "link_id": {"link_uuid": {"uuid": "sw1/2==east-net/eth1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + "link_id": {"link_uuid": {"uuid": "sw1/2==h2/eth1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ {"device_id": {"device_uuid": {"uuid": "sw1"}}, "endpoint_uuid": {"uuid": "2"}}, - {"device_id": {"device_uuid": {"uuid": "east-net"}}, "endpoint_uuid": {"uuid": "eth1"}} + {"device_id": {"device_uuid": {"uuid": "h2"}}, "endpoint_uuid": {"uuid": "eth1"}} ] }, { - "link_id": {"link_uuid": {"uuid": "east-net/eth1==sw1/2"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ - {"device_id": {"device_uuid": {"uuid": "east-net"}}, "endpoint_uuid": {"uuid": "eth1"}}, + "link_id": {"link_uuid": {"uuid": "h2/eth1==sw1/2"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "h2"}}, "endpoint_uuid": {"uuid": "eth1"}}, {"device_id": {"device_uuid": {"uuid": "sw1"}}, "endpoint_uuid": {"uuid": "2"}} ] }, diff --git a/src/tests/p4-fabric-tna/p4src/README.md b/src/tests/p4-sd-fabric-sbi-connectivity/p4src/README.md similarity index 100% rename from src/tests/p4-fabric-tna/p4src/README.md rename to src/tests/p4-sd-fabric-sbi-connectivity/p4src/README.md diff --git a/src/tests/p4-fabric-tna/p4src/_pp.p4 b/src/tests/p4-sd-fabric-sbi-connectivity/p4src/_pp.p4 similarity index 100% rename from src/tests/p4-fabric-tna/p4src/_pp.p4 rename to src/tests/p4-sd-fabric-sbi-connectivity/p4src/_pp.p4 diff --git a/src/tests/p4-fabric-tna/p4src/bmv2.json b/src/tests/p4-sd-fabric-sbi-connectivity/p4src/bmv2.json similarity index 100% rename from src/tests/p4-fabric-tna/p4src/bmv2.json rename to src/tests/p4-sd-fabric-sbi-connectivity/p4src/bmv2.json diff --git a/src/tests/p4-fabric-tna/p4src/p4info.txt b/src/tests/p4-sd-fabric-sbi-connectivity/p4src/p4info.txt similarity index 100% rename from src/tests/p4-fabric-tna/p4src/p4info.txt rename to src/tests/p4-sd-fabric-sbi-connectivity/p4src/p4info.txt diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/run_grafana_dashboard.sh b/src/tests/p4-sd-fabric-sbi-connectivity/run_grafana_dashboard.sh new file mode 100644 index 0000000000000000000000000000000000000000..0664cc6cdf81f91103142f816fcc9a23f27efc82 --- /dev/null +++ b/src/tests/p4-sd-fabric-sbi-connectivity/run_grafana_dashboard.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +# ----------------------------------- +# CONFIGURATION +# ----------------------------------- + +GRAFANA_URL="http://localhost:80/grafana" # Your Grafana URL +GRAFANA_USERNAME="admin" +GRAFANA_PASSWORD="admin" + +DATASOURCE_NAME="Prometheus" +DASHBOARD_FILE="/home/ubuntu/tfs-ctrl/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/grafana-latency.json" # Path to your dashboard JSON + +# ----------------------------------- +# READ DASHBOARD JSON +# ----------------------------------- +if [ ! -f "$DASHBOARD_FILE" ]; then + echo "[ERROR] Dashboard file not found: $DASHBOARD_FILE" + exit 1 +fi + +DASHBOARD_JSON=$(cat "$DASHBOARD_FILE") + +# --------------------------------------- +# 1. Get the datasource UID +# --------------------------------------- + +PROM_UID=$(curl -s \ + -u "${GRAFANA_USERNAME}:${GRAFANA_PASSWORD}" \ + "${GRAFANA_URL}/api/datasources/name/${DATASOURCE_NAME}" \ + | jq -r '.uid') + +if [ -z "$PROM_UID" ] || [ "$PROM_UID" == "null" ]; then + echo "ERROR: Could not retrieve datasource UID. Check datasource name/auth." + exit 1 +fi + +echo "Found datasource UID: $PROM_UID" + +# --------------------------------------- +# 2. Inject the UID into dashboard JSON +# --------------------------------------- + +DASHBOARD_JSON=$(jq --arg uid "$PROM_UID" ' + walk( + if type == "object" and has("datasource") then + .datasource |= + (if type == "object" then .uid = $uid else $uid end) + else . + end + ) +' "$DASHBOARD_FILE") + +# --------------------------------------- +# 3. Wrap in Grafana API import format +# --------------------------------------- + +read -r -d '' IMPORT_JSON << EOF +{ + "dashboard": ${DASHBOARD_JSON}, + "overwrite": true, + "folderId": 0, + "message": "Imported via API" +} +EOF + +# ----------------------------------- +# 4. Import dashboard using API +# ----------------------------------- + +echo "Importing dashboard into Grafana..." + +curl -X POST "${GRAFANA_URL}/api/dashboards/db" \ + -H "Content-Type: application/json" \ + -u "${GRAFANA_USERNAME}:${GRAFANA_PASSWORD}" \ + -d "${IMPORT_JSON}" + +echo +echo "Done" diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/run_grafana_datasources.sh b/src/tests/p4-sd-fabric-sbi-connectivity/run_grafana_datasources.sh new file mode 100644 index 0000000000000000000000000000000000000000..2e82eebe5d4187d0e0adc6f90d73e6bf95ea6ebb --- /dev/null +++ b/src/tests/p4-sd-fabric-sbi-connectivity/run_grafana_datasources.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +# --------------------------- +# CONFIGURATION +# --------------------------- + +TFS_IP="192.168.5.137" + +GRAFANA_URL="http://localhost:80/grafana" # Your Grafana URL +GRAFANA_USERNAME="admin" +GRAFANA_PASSWORD="admin" + +DATASOURCE_NAME="Prometheus" +PROMETHEUS_URL="http://${TFS_IP}:30090/" # URL of your Prometheus server + +# --------------------------- +# CREATE DATA SOURCE PAYLOAD +# --------------------------- + +read -r -d '' DATA_SOURCE_JSON << EOF +{ + "name": "${DATASOURCE_NAME}", + "type": "prometheus", + "access": "proxy", + "url": "${PROMETHEUS_URL}", + "basicAuth": false, + "isDefault": true, + "editable": true +} +EOF + +# --------------------------- +# SEND REQUEST (with username/password) +# --------------------------- + +echo "Creating Prometheus datasource in Grafana..." + +curl -X POST "${GRAFANA_URL}/api/datasources" \ + -H "Content-Type: application/json" \ + -u "${GRAFANA_USERNAME}:${GRAFANA_PASSWORD}" \ + -d "${DATA_SOURCE_JSON}" + +echo +echo "Done" diff --git a/src/tests/p4-fabric-tna/run_test_01_bootstrap.sh b/src/tests/p4-sd-fabric-sbi-connectivity/run_test_01_bootstrap.sh similarity index 88% rename from src/tests/p4-fabric-tna/run_test_01_bootstrap.sh rename to src/tests/p4-sd-fabric-sbi-connectivity/run_test_01_bootstrap.sh index 7bef3a4487c0b2a0e0c97e09672871206906de5e..d2a119b191f02636e7625054acf29d6005b14690 100755 --- a/src/tests/p4-fabric-tna/run_test_01_bootstrap.sh +++ b/src/tests/p4-sd-fabric-sbi-connectivity/run_test_01_bootstrap.sh @@ -18,4 +18,4 @@ # - tfs_runtime_env_vars.sh source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-setup/test_functional_bootstrap.py +python3 -m pytest --verbose src/tests/p4-sd-fabric-sbi-connectivity/test_functional_bootstrap.py diff --git a/src/tests/p4-fabric-tna/run_test_02b_sbi_deprovision_int_l2_l3_acl.sh b/src/tests/p4-sd-fabric-sbi-connectivity/run_test_02_sbi_provision.sh similarity index 86% rename from src/tests/p4-fabric-tna/run_test_02b_sbi_deprovision_int_l2_l3_acl.sh rename to src/tests/p4-sd-fabric-sbi-connectivity/run_test_02_sbi_provision.sh index af54c2cae85ab15a7548c45a0b4ce4839a5a2560..a325682e4b1734a1e1c5ede8dc16bd8da482b56a 100755 --- a/src/tests/p4-fabric-tna/run_test_02b_sbi_deprovision_int_l2_l3_acl.sh +++ b/src/tests/p4-sd-fabric-sbi-connectivity/run_test_02_sbi_provision.sh @@ -14,4 +14,4 @@ # limitations under the License. source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-sbi/test_functional_sbi_rules_deprovision.py +python3 -m pytest --verbose src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_provision.py diff --git a/src/tests/p4-fabric-tna/run_test_02a_sbi_provision_int_l2_l3_acl.sh b/src/tests/p4-sd-fabric-sbi-connectivity/run_test_03_sbi_deprovision.sh similarity index 85% rename from src/tests/p4-fabric-tna/run_test_02a_sbi_provision_int_l2_l3_acl.sh rename to src/tests/p4-sd-fabric-sbi-connectivity/run_test_03_sbi_deprovision.sh index 4ddb1e41d7e0b8cfc29c905047fafc8a1c808a24..570f73d2789ebd08722badaf246f10803aec22bf 100755 --- a/src/tests/p4-fabric-tna/run_test_02a_sbi_provision_int_l2_l3_acl.sh +++ b/src/tests/p4-sd-fabric-sbi-connectivity/run_test_03_sbi_deprovision.sh @@ -14,4 +14,4 @@ # limitations under the License. source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-sbi/test_functional_sbi_rules_provision.py +python3 -m pytest --verbose src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_deprovision.py diff --git a/src/tests/p4-fabric-tna/run_test_08_purge.sh b/src/tests/p4-sd-fabric-sbi-connectivity/run_test_04_cleanup.sh similarity index 87% rename from src/tests/p4-fabric-tna/run_test_08_purge.sh rename to src/tests/p4-sd-fabric-sbi-connectivity/run_test_04_cleanup.sh index 15913353079a1102603ac2d771415c3b7c1a3ab3..bf0aaddee780b4fb36736cd98ff1fd2b5af546f7 100755 --- a/src/tests/p4-fabric-tna/run_test_08_purge.sh +++ b/src/tests/p4-sd-fabric-sbi-connectivity/run_test_04_cleanup.sh @@ -14,4 +14,4 @@ # limitations under the License. source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-setup/test_functional_purge.py +python3 -m pytest --verbose src/tests/p4-sd-fabric-sbi-connectivity/test_functional_cleanup.py diff --git a/src/tests/p4-fabric-tna/run_test_07_cleanup.sh b/src/tests/p4-sd-fabric-sbi-connectivity/run_test_05_purge.sh similarity index 87% rename from src/tests/p4-fabric-tna/run_test_07_cleanup.sh rename to src/tests/p4-sd-fabric-sbi-connectivity/run_test_05_purge.sh index 74db934a8a4fa8390774e52526819e20cb796a23..e9a221fa976fb17014345c6e9130f24fd80d4aa3 100755 --- a/src/tests/p4-fabric-tna/run_test_07_cleanup.sh +++ b/src/tests/p4-sd-fabric-sbi-connectivity/run_test_05_purge.sh @@ -14,4 +14,4 @@ # limitations under the License. source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-setup/test_functional_cleanup.py +python3 -m pytest --verbose src/tests/p4-sd-fabric-sbi-connectivity/test_functional_purge.py diff --git a/src/tests/p4-fabric-tna/setup.sh b/src/tests/p4-sd-fabric-sbi-connectivity/setup.sh similarity index 79% rename from src/tests/p4-fabric-tna/setup.sh rename to src/tests/p4-sd-fabric-sbi-connectivity/setup.sh index d5f080e6d871e364f4f32a9bb44b7d49758f1a2c..a8b1a881e0f4ca3f79c7be25b5bfa623f14e5c1f 100755 --- a/src/tests/p4-fabric-tna/setup.sh +++ b/src/tests/p4-sd-fabric-sbi-connectivity/setup.sh @@ -18,5 +18,5 @@ export POD_NAME=$(kubectl get pods -n=tfs | grep device | awk '{print $1}') kubectl exec ${POD_NAME} -n=tfs -c=server -- mkdir -p /root/p4 -kubectl cp src/tests/p4-fabric-tna/p4src/p4info.txt tfs/${POD_NAME}:/root/p4 -c=server -kubectl cp src/tests/p4-fabric-tna/p4src/bmv2.json tfs/${POD_NAME}:/root/p4 -c=server +kubectl cp src/tests/p4-sd-fabric-sbi-connectivity/p4src/p4info.txt tfs/${POD_NAME}:/root/p4 -c=server +kubectl cp src/tests/p4-sd-fabric-sbi-connectivity/p4src/bmv2.json tfs/${POD_NAME}:/root/p4 -c=server diff --git a/src/tests/p4-fabric-tna/tests-setup/test_functional_bootstrap.py b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_bootstrap.py similarity index 84% rename from src/tests/p4-fabric-tna/tests-setup/test_functional_bootstrap.py rename to src/tests/p4-sd-fabric-sbi-connectivity/test_functional_bootstrap.py index 7c4a6c7a0c583c7dadd68cfb92bbdfab51db6cac..9d512e6d3c7656d718dd4c9f87e14efb950a6730 100644 --- a/src/tests/p4-fabric-tna/tests-setup/test_functional_bootstrap.py +++ b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_bootstrap.py @@ -13,13 +13,20 @@ # limitations under the License. import logging, time + from common.proto.context_pb2 import DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, \ - check_descriptor_load_results, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID, DESC_TOPO +from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import + +from test_functional_common import DESC_TOPOLOGY LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -36,8 +43,10 @@ def test_scenario_bootstrap( """ validate_empty_scenario(context_client) + LOGGER.info(f"------> TOPOLOGY: {DESC_TOPOLOGY}") + descriptor_loader = DescriptorLoader( - descriptors_file=DESC_TOPO, context_client=context_client, device_client=device_client) + descriptors_file=DESC_TOPOLOGY, context_client=context_client, device_client=device_client) results = descriptor_loader.process() check_descriptor_load_results(results, descriptor_loader) descriptor_loader.validate() diff --git a/src/tests/p4-fabric-tna/tests-setup/test_functional_cleanup.py b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_cleanup.py similarity index 77% rename from src/tests/p4-fabric-tna/tests-setup/test_functional_cleanup.py rename to src/tests/p4-sd-fabric-sbi-connectivity/test_functional_cleanup.py index fe197de54882f675befcbe769a6f87c4336846e1..d2aecc6bf5717c5435869a692c6e34864197ec32 100644 --- a/src/tests/p4-fabric-tna/tests-setup/test_functional_cleanup.py +++ b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_cleanup.py @@ -13,11 +13,19 @@ # limitations under the License. import logging -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario + +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID, DESC_TOPO +from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import + +from test_functional_common import DESC_TOPOLOGY LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -33,7 +41,7 @@ def test_scenario_cleanup( # Unload topology and validate empty scenario descriptor_loader = DescriptorLoader( - descriptors_file=DESC_TOPO, context_client=context_client, device_client=device_client) + descriptors_file=DESC_TOPOLOGY, context_client=context_client, device_client=device_client) descriptor_loader.validate() descriptor_loader.unload() validate_empty_scenario(context_client) diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_common.py b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_common.py new file mode 100644 index 0000000000000000000000000000000000000000..8e1b761a58599ad2325630a66f6e42a5284e316c --- /dev/null +++ b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_common.py @@ -0,0 +1,78 @@ +# 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 + +DEV_NB = 4 +CONNECTION_RULES = 3 +ENDPOINT_RULES = 3 + +INT_RULES = 19 +L2_RULES = 10 +L3_RULES = 4 +ACL_RULES = 1 + +DATAPLANE_RULES_NB_INT_B1 = 5 +DATAPLANE_RULES_NB_INT_B2 = 6 +DATAPLANE_RULES_NB_INT_B3 = 8 +DATAPLANE_RULES_NB_RT_WEST = 7 +DATAPLANE_RULES_NB_RT_EAST = 7 +DATAPLANE_RULES_NB_ACL = 1 +DATAPLANE_RULES_NB_TOT = \ + DATAPLANE_RULES_NB_INT_B1 +\ + DATAPLANE_RULES_NB_INT_B2 +\ + DATAPLANE_RULES_NB_INT_B3 +\ + DATAPLANE_RULES_NB_RT_WEST +\ + DATAPLANE_RULES_NB_RT_EAST +\ + DATAPLANE_RULES_NB_ACL + +TEST_PATH = os.path.join( + os.path.dirname(os.path.abspath(__file__)) + + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to P4 SD-Fabric tests" + +# Topology descriptor +DESC_TOPOLOGY = os.path.join(TEST_PATH, 'topology.json') +assert os.path.exists(DESC_TOPOLOGY), "Invalid path to the SD-Fabric topology descriptor" + +# SBI descriptors for Rule INSERTION +# The switch cannot digest all rules at once, hence we insert in batches +DESC_FILE_RULES_INSERT_INT_B1 = os.path.join(TEST_PATH, 'sbi-rules-insert-int-b1.json') +assert os.path.exists(DESC_FILE_RULES_INSERT_INT_B1),\ + "Invalid path to the SD-Fabric INT SBI descriptor (batch #1)" + +DESC_FILE_RULES_INSERT_INT_B2 = os.path.join(TEST_PATH, 'sbi-rules-insert-int-b2.json') +assert os.path.exists(DESC_FILE_RULES_INSERT_INT_B2),\ + "Invalid path to the SD-Fabric INT SBI descriptor (batch #2)" + +DESC_FILE_RULES_INSERT_INT_B3 = os.path.join(TEST_PATH, 'sbi-rules-insert-int-b3.json') +assert os.path.exists(DESC_FILE_RULES_INSERT_INT_B3),\ + "Invalid path to the SD-Fabric INT SBI descriptor (batch #3)" + +DESC_FILE_RULES_INSERT_ROUTING_WEST = os.path.join(TEST_PATH, 'sbi-rules-insert-routing-west.json') +assert os.path.exists(DESC_FILE_RULES_INSERT_ROUTING_WEST),\ + "Invalid path to the SD-Fabric routing SBI descriptor (domain1-side)" + +DESC_FILE_RULES_INSERT_ROUTING_EAST = os.path.join(TEST_PATH, 'sbi-rules-insert-routing-east.json') +assert os.path.exists(DESC_FILE_RULES_INSERT_ROUTING_EAST),\ + "Invalid path to the SD-Fabric routing SBI descriptor (domain2-side)" + +DESC_FILE_RULES_INSERT_ACL = os.path.join(TEST_PATH, 'sbi-rules-insert-acl.json') +assert os.path.exists(DESC_FILE_RULES_INSERT_ACL),\ + "Invalid path to the SD-Fabric ACL SBI descriptor" + +# SBI descriptors for Rule DELETION +DESC_FILE_RULES_DELETE_ALL = os.path.join(TEST_PATH, 'sbi-rules-remove.json') +assert os.path.exists(DESC_FILE_RULES_DELETE_ALL),\ + "Invalid path to the SD-Fabric rule removal SBI descriptor" diff --git a/src/tests/p4-fabric-tna/tests-setup/test_functional_purge.py b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_purge.py similarity index 93% rename from src/tests/p4-fabric-tna/tests-setup/test_functional_purge.py rename to src/tests/p4-sd-fabric-sbi-connectivity/test_functional_purge.py index a4bf927cb4eaa55b087ef08e7bef22b27364c322..d357b05a283ed1055070da3bd2cfcb6991b56b84 100644 --- a/src/tests/p4-fabric-tna/tests-setup/test_functional_purge.py +++ b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_purge.py @@ -13,7 +13,10 @@ # limitations under the License. import logging -from common.proto.context_pb2 import ServiceId, DeviceId, LinkId, ServiceStatusEnum, ServiceTypeEnum + +from common.proto.context_pb2 import ( + DeviceId, LinkId, ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Device import json_device_id @@ -21,9 +24,12 @@ from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID +from .Fixtures import ( + context_client, device_client, service_client, +) # pylint: disable=unused-import + LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-fabric-tna/tests-sbi/test_functional_sbi_rules_deprovision.py b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_deprovision.py similarity index 87% rename from src/tests/p4-fabric-tna/tests-sbi/test_functional_sbi_rules_deprovision.py rename to src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_deprovision.py index 4fbf182c5ae81f2f72105736d0b57dcd94cc1e5d..80b42d908b1b19047a9713d0bd4b815ce4bb9b36 100644 --- a/src/tests/p4-fabric-tna/tests-sbi/test_functional_sbi_rules_deprovision.py +++ b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_deprovision.py @@ -13,26 +13,20 @@ # limitations under the License. import logging -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results + +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ( - ADMIN_CONTEXT_ID, - DESC_FILE_RULES_DELETE_ALL, - DEV_NB, - CONNECTION_RULES, - ENDPOINT_RULES, - DATAPLANE_RULES_NB_INT_B1, - DATAPLANE_RULES_NB_INT_B2, - DATAPLANE_RULES_NB_INT_B3, - DATAPLANE_RULES_NB_RT_WEST, - DATAPLANE_RULES_NB_RT_EAST, - DATAPLANE_RULES_NB_ACL, - DATAPLANE_RULES_NB_TOT, - verify_number_of_rules -) +from tests.tools.test_tools_p4 import * + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import + +from test_functional_common import * LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-fabric-tna/tests-sbi/test_functional_sbi_rules_provision.py b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_provision.py similarity index 93% rename from src/tests/p4-fabric-tna/tests-sbi/test_functional_sbi_rules_provision.py rename to src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_provision.py index 08b9e2f5ece3057bb985ebb4433a0a9838187b8f..c09cff55ea68b8def274232c80cedfbe84407cf3 100644 --- a/src/tests/p4-fabric-tna/tests-sbi/test_functional_sbi_rules_provision.py +++ b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_provision.py @@ -13,31 +13,20 @@ # limitations under the License. import logging -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results + +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ( - ADMIN_CONTEXT_ID, - DESC_FILE_RULES_INSERT_INT_B1, - DESC_FILE_RULES_INSERT_INT_B2, - DESC_FILE_RULES_INSERT_INT_B3, - DESC_FILE_RULES_INSERT_ROUTING_WEST, - DESC_FILE_RULES_INSERT_ROUTING_EAST, - DESC_FILE_RULES_INSERT_ACL, - DEV_NB, - CONNECTION_RULES, - ENDPOINT_RULES, - DATAPLANE_RULES_NB_INT_B1, - DATAPLANE_RULES_NB_INT_B2, - DATAPLANE_RULES_NB_INT_B3, - DATAPLANE_RULES_NB_RT_WEST, - DATAPLANE_RULES_NB_RT_EAST, - DATAPLANE_RULES_NB_ACL, - DATAPLANE_RULES_NB_TOT, - verify_number_of_rules -) +from tests.tools.test_tools_p4 import * + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import + +from test_functional_common import * LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-fabric-tna/README.md b/src/tests/p4-sd-fabric-svc-connectivity/README.md similarity index 61% rename from src/tests/p4-fabric-tna/README.md rename to src/tests/p4-sd-fabric-svc-connectivity/README.md index e8ae8fde918b6dd65fc1eb9a078753ea442f22a6..e828cb11f323d1339da9a4b24b3c6d4c02be60f1 100644 --- a/src/tests/p4-fabric-tna/README.md +++ b/src/tests/p4-sd-fabric-svc-connectivity/README.md @@ -1,4 +1,4 @@ -# Tests for P4 routing, ACL, and In-Band Network Telemetry functions +# Tests for P4 routing, ACL, and In-Band Network Telemetry functions via TFS Service API This directory contains the necessary scripts and configurations to run tests atop a Stratum-based P4 whitebox that performs a set of network functions, including forwarding (L2), routing (L3), L3/L4 access control list (ACL), and In-Band Network Telemetry (INT). The P4 data plane is based on ONF's SD-Fabric implementation, titled [fabric-tna](https://github.com/stratum/fabric-tna) @@ -45,12 +45,35 @@ To conduct this test, follow the steps below. ### Deploy TFS +Go to the TFS parent folder. + ```shell cd ~/tfs-ctrl/ +``` + +Edit `my_deploy.sh` to include the following TFS components and then source the file. + +```shell +nano my_deploy.sh +`export TFS_COMPONENTS="context device pathcomp service kpi_manager kpi_value_writer kpi_value_api telemetry nbi webui"` +``` + +```shell source my_deploy.sh && source tfs_runtime_env_vars.sh +``` + +Now deploy TFS: + +```shell ./deploy/all.sh ``` +When deployed, execute the following command to ensure that the above components are all in place and in a running state: + +```shell +./deploy/show.sh +``` + ### Path setup Ensure that `PATH` variable contains the parent project directory, e.g., "home/$USER/tfs-ctrl". @@ -59,8 +82,16 @@ Ensure that `PYTHONPATH` variable contains the source code directory of TFS, e.g ## Topology setup -In the `./topology/` directory there are scripts that allow to build Stratum on a target machine (e.g., a VM) and then deploy a P4 switch atop this machine. -This test assumes a Stratum P4 switch with 2 network interfaces used as a data plane (routing traffic from one to another) as well as another network interface used to send telemetry information to an external telemetry collector. +Go to `src/tests/p4-topologies/` and follow the instructions on how to install Mininet in your machine. +After Mininet is installed, run the following command to deploy a single switch P4 topology on Mininet. + +```bash +cd ~/tfs-ctrl/src/tests/p4-topologies/topo-mininet/ +sudo python3 topo-mininet/1switch1path-int.py --host-int-iface=eth0 +``` + +You may need to change the `host-int-iface` to a network interface that suits your setup. +This is the interface through which Mininet sends in-band network telemetry packets to TFS. ## P4 artifacts @@ -76,17 +107,15 @@ For each of these tests, an auxiliary bash script allows to run it with less typ | --------------------------------------------- | --------------------------------------------------------------------------- | | setup.sh | Copy P4 artifacts into the SBI pod | | run_test_01_bootstrap.sh | Connect TFS to the P4 switch | -| run_test_02a_sbi_provision_int_l2_l3_acl.sh | Install L2, L3, INT, and ACL rules on the P4 switch via the SBI service | -| run_test_02b_sbi_deprovision_int_l2_l3_acl.sh | Uninstall L2, L3, INT, and ACL rules from the P4 switch via the SBI service | -| run_test_03a_service_provision_l2.sh | Install L2 forwarding rules via a dedicated P4 L2 service handler | -| run_test_03b_service_deprovision_l2.sh | Uninstall L2 forwarding rules via a dedicated P4 L2 service handler | -| run_test_04a_service_provision_l3.sh | Install L3 routing rules via a dedicated P4 L3 service handler | -| run_test_04b_service_deprovision_l3.sh | Uninstall L3 routing rules via a dedicated P4 L3 service handler | -| run_test_05a_service_provision_acl.sh | Install ACL rules via a dedicated P4 ACL service handler | -| run_test_05b_service_deprovision_acl.sh | Uninstall ACL rules via a dedicated P4 ACL service handler | -| run_test_06a_service_provision_int.sh | Install INT rules via a dedicated P4 INT service handler | -| run_test_06b_service_deprovision_int.sh | Uninstall INT rules via a dedicated P4 INT service handler | -| run_test_07_cleanup.sh | Clean-up context and topology and disconnect TFS from the P4 switch | +| run_test_02_service_provision_int.sh | Install INT rules via a dedicated P4 INT service handler | +| run_test_03_service_provision_l2.sh | Install L2 forwarding rules via a dedicated P4 L2 service handler | +| run_test_04_service_provision_l3.sh | Install L3 routing rules via a dedicated P4 L3 service handler | +| run_test_05_service_provision_acl.sh | Install ACL rules via a dedicated P4 ACL service handler | +| run_test_06_service_deprovision_int.sh | Uninstall INT rules via a dedicated P4 INT service handler | +| run_test_07_service_deprovision_l2.sh | Uninstall L2 forwarding rules via a dedicated P4 L2 service handler | +| run_test_08_service_deprovision_l3.sh | Uninstall L3 routing rules via a dedicated P4 L3 service handler | +| run_test_09_service_deprovision_acl.sh | Uninstall ACL rules via a dedicated P4 ACL service handler | +| run_test_10_cleanup.sh | Clean-up context and topology and disconnect TFS from the P4 switch | Each of the tests above is described in detail below. @@ -99,7 +128,7 @@ If you `deploy/all.sh` again, you need to repeat this step. ```shell cd ~/tfs-ctrl/ source my_deploy.sh && source tfs_runtime_env_vars.sh -bash src/tests/p4-fabric-tna/setup.sh +bash src/tests/p4-sd-fabric-svc-connectivity/setup.sh ``` ### Step 1: Bootstrap topology @@ -108,85 +137,50 @@ The bootstrap script registers the context, topology, links, and devices to TFS. ```shell cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_01_bootstrap.sh -``` - -### Step 2: Manage L2, L3, ACL, and INT via the SBI API (rules) - -Implement forwarding, routing, ACL, and INT network functions by installing P4 rules to the Stratum switch via the TFS SBI API. -In this test, these rules are installed in batches, as the switch cannot digest all these rules at once. - -```shell -cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_02a_sbi_provision_int_l2_l3_acl.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_01_bootstrap.sh ``` -Deprovision forwarding, routing, ACL, and INT network functions by removing the previously installed P4 rules (via the TFS SBI API) from the Stratum switch. - -```shell -cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_02b_sbi_deprovision_int_l2_l3_acl.sh -``` - -### Step 3: Manage L2, L3, ACL, and INT via the Service API +### Step 2: Manage L2, L3, ACL, and INT via the Service API To avoid interacting with the switch using low-level P4 rules (via the SBI), we created modular network services, which allow users to easily provision L2, L3, ACL, and INT network functions. These services require users to define the service endpoints as well as some high-level service configuration, while leaving the rest of complexity to tailored service handlers that interact with the SBI on behalf of the user. -#### Provision L2 network service via the Service API - -```shell -cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_03a_service_provision_l2.sh -``` - -#### Deprovision L2 network service via the Service API - -```shell -cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_03b_service_deprovision_l2.sh -``` - -#### Provision L3 network service via the Service API - -```shell -cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_04a_service_provision_l3.sh -``` - -#### Deprovision L3 network service via the Service API +#### Provision L2 + INT + ACL network services via the Service API ```shell cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_04b_service_deprovision_l3.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_02_service_provision_int.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_03_service_provision_l2.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_05_service_provision_acl.sh ``` -#### Provision ACL network service via the Service API - -```shell -cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_05a_service_provision_acl.sh -``` +#### Provision L3 + INT + ACL network services via the Service API -#### Deprovision ACL network service via the Service API +Alternatively, you can replace L2 with L3 connectivity as follows: ```shell cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_05b_service_deprovision_acl.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_02_service_provision_int.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_04_service_provision_l3.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_05_service_provision_acl.sh ``` -#### Provision INT service via the Service API +#### Deprovision L2 + INT + ACL network services via the Service API ```shell cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_06a_service_provision_int.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_06_service_deprovision_int.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_07_service_deprovision_l2.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_09_service_deprovision_acl.sh ``` -#### Deprovision INT service via the Service API +And for the corresponding L3 service: ```shell cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_06b_service_deprovision_int.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_06_service_deprovision_int.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_08_service_deprovision_l3.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_09_service_deprovision_acl.sh ``` ### Step 4: Deprovision topology @@ -195,12 +189,12 @@ Delete all the objects (context, topology, links, devices) from TFS: ```shell cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_07_cleanup.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_10_cleanup.sh ``` Alternatively, a purge test is implemented; this test removes services, links, devices, topology, and context in this order. ```shell cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_08_purge.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_11_purge.sh ``` diff --git a/src/tests/p4-sd-fabric-svc-connectivity/__init__.py b/src/tests/p4-sd-fabric-svc-connectivity/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..7363515f07a52d996229bcbd72932ce1423258d7 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/__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/tests/p4-sd-fabric-svc-connectivity/descriptors/grafana-latency.json b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/grafana-latency.json new file mode 100644 index 0000000000000000000000000000000000000000..e02d1cc268d628de2bcc2f7d4211b77d7a575757 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/grafana-latency.json @@ -0,0 +1,175 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": [], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "8.5.22" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "Latency", + "axisPlacement": "left", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 17, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineStyle": { + "dash": [ + 20, + 10 + ], + "fill": "dash" + }, + "lineWidth": 2, + "pointSize": 4, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ns" + }, + "overrides": [] + }, + "gridPos": { + "h": 17, + "w": 23, + "x": 0, + "y": 0 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "avg(KPISAMPLETYPE_INT_HOP_LAT_SW01)", + "refId": "A" + } + ], + "title": "P4 switch latency", + "transparent": true, + "type": "timeseries" + } + ], + "refresh": "5s", + "schemaVersion": 36, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Latency", + "uid": "VefdTgZvk", + "version": 2, + "weekStart": "" +} \ No newline at end of file diff --git a/src/tests/p4-fabric-tna/descriptors/service-p4-acl.json b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-acl.json similarity index 100% rename from src/tests/p4-fabric-tna/descriptors/service-p4-acl.json rename to src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-acl.json diff --git a/src/tests/p4-fabric-tna/descriptors/service-p4-int.json b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-int.json similarity index 94% rename from src/tests/p4-fabric-tna/descriptors/service-p4-int.json rename to src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-int.json index 1a55179ad4167b0857db831a912c85e5d814f0bb..1538f29d1cda6a6892941137653952d5797feaad 100644 --- a/src/tests/p4-fabric-tna/descriptors/service-p4-int.json +++ b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-int.json @@ -40,8 +40,8 @@ ], "int_collector_info": { "iface": "eth0", - "mac": "3e:87:de:3d:6d:33", - "ip": "192.168.5.131", + "mac": "46:e4:58:c6:74:53", + "ip": "192.168.5.137", "port": 12345, "vlan_id": 4094, "duration_sec": 2000, diff --git a/src/tests/p4-fabric-tna/descriptors/service-p4-l2-simple.json b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-l2.json similarity index 95% rename from src/tests/p4-fabric-tna/descriptors/service-p4-l2-simple.json rename to src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-l2.json index 8ecc2df96b95fc398f87ac42a9badf3dd051f5dd..d943dfb6bf8ed0105ef727c878852a7b5f0f49e9 100644 --- a/src/tests/p4-fabric-tna/descriptors/service-p4-l2-simple.json +++ b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-l2.json @@ -2,11 +2,11 @@ "services": [ { "service_id": { - "context_id": {"context_uuid": {"uuid": "admin"}}, "service_uuid": {"uuid": "p4-service-l2"} + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "p4-service-l2"} }, "name": "p4-service-l2", "service_type": "SERVICETYPE_L2NM", - "service_status": {"service_status": "SERVICESTATUS_PLANNED"}, "service_endpoint_ids": [ { "device_id": {"device_uuid": {"uuid": "sw1"}}, diff --git a/src/tests/p4-fabric-tna/descriptors/service-p4-l3.json b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-l3.json similarity index 93% rename from src/tests/p4-fabric-tna/descriptors/service-p4-l3.json rename to src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-l3.json index 6fda23e80daf4ba1b549618064ed104bdb5c36e1..1e2c0e84f043c37b4f95b7f744ae5343af226378 100644 --- a/src/tests/p4-fabric-tna/descriptors/service-p4-l3.json +++ b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-l3.json @@ -2,11 +2,11 @@ "services": [ { "service_id": { - "context_id": {"context_uuid": {"uuid": "admin"}}, "service_uuid": {"uuid": "p4-service-l3"} + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "p4-service-l3"} }, "name": "p4-service-l3", "service_type": "SERVICETYPE_L3NM", - "service_status": {"service_status": "SERVICESTATUS_PLANNED"}, "service_endpoint_ids": [ { "device_id": {"device_uuid": {"uuid": "sw1"}}, @@ -32,11 +32,13 @@ "port_list": [ { "port_id": 1, - "port_type": "host" + "port_type": "host", + "vlan_id": 4094 }, { "port_id": 2, - "port_type": "host" + "port_type": "host", + "vlan_id": 4094 } ], "routing_list": [ diff --git a/src/tests/p4-sd-fabric-svc-connectivity/descriptors/topology.json b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/topology.json new file mode 100644 index 0000000000000000000000000000000000000000..420cc8f0f883a37ddb07fff749220590b79fe2c2 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/topology.json @@ -0,0 +1,113 @@ +{ + "contexts": [ + {"context_id": {"context_uuid": {"uuid": "admin"}}} + ], + "topologies": [ + {"topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}} + } + ], + "devices": [ + { + "device_id": {"device_uuid": {"uuid": "tfs-sdn-controller"}}, + "name": "tfs-sdn-controller", + "device_type": "teraflowsdn", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_operational_status": "DEVICEOPERATIONALSTATUS_UNDEFINED", + "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "mgmt", "name": "mgmt", "type": "mgmt-int"}] + }}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "h1"}}, + "device_type": "emu-client", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "eth1", "name": "eth1", "type": "copper"}] + }}} + ] + } + }, + { + "device_id": {"device_uuid": {"uuid": "h2"}}, + "device_type": "emu-client", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "eth1", "name": "eth1", "type": "copper"}] + }}} + ] + } + }, + { + "device_id": {"device_uuid": {"uuid": "sw1"}}, + "device_type": "p4-switch", + "device_drivers": ["DEVICEDRIVER_P4"], + "device_operational_status": "DEVICEOPERATIONALSTATUS_DISABLED", + "name": "sw1", + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "192.168.5.139"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "50001"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "id": 1, + "name": "sw1", + "vendor": "Open Networking Foundation", + "hw_ver": "BMv2 simple_switch", + "sw_ver": "Stratum", + "timeout": 60, + "p4bin": "/root/p4/bmv2.json", + "p4info": "/root/p4/p4info.txt", + "endpoints": [ + {"uuid": "1", "name": "1", "type": "port-dataplane"}, + {"uuid": "2", "name": "2", "type": "port-dataplane"}, + {"uuid": "3", "name": "3", "type": "port-int"} + ] + }}} + ] + } + } + ], + "links": [ + { + "link_id": {"link_uuid": {"uuid": "sw1/1==h1/eth1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1"}}, "endpoint_uuid": {"uuid": "1"}}, + {"device_id": {"device_uuid": {"uuid": "h1"}}, "endpoint_uuid": {"uuid": "eth1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "h1/eth1==sw1/1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "h1"}}, "endpoint_uuid": {"uuid": "eth1"}}, + {"device_id": {"device_uuid": {"uuid": "sw1"}}, "endpoint_uuid": {"uuid": "1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "sw1/2==h2/eth1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1"}}, "endpoint_uuid": {"uuid": "2"}}, + {"device_id": {"device_uuid": {"uuid": "h2"}}, "endpoint_uuid": {"uuid": "eth1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "h2/eth1==sw1/2"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "h2"}}, "endpoint_uuid": {"uuid": "eth1"}}, + {"device_id": {"device_uuid": {"uuid": "sw1"}}, "endpoint_uuid": {"uuid": "2"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "sw1/3==tfs-sdn-controller/mgmt"}}, "link_type": "LINKTYPE_MANAGEMENT", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1"}}, "endpoint_uuid": {"uuid": "3"}}, + {"device_id": {"device_uuid": {"uuid": "tfs-sdn-controller"}}, "endpoint_uuid": {"uuid": "mgmt"}} + ] + } + ] +} diff --git a/src/tests/p4-sd-fabric-svc-connectivity/p4src/README.md b/src/tests/p4-sd-fabric-svc-connectivity/p4src/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e17d044fb6100c13e47f1dffb779f4800c59b9d3 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/p4src/README.md @@ -0,0 +1,24 @@ +# P4 Sources + +We employ the P4 sources from the [fabric-tna](https://github.com/stratum/fabric-tna/tree/main) project. + +To compile a relevant P4 target binary and P4 info file, do: + +```shell +git clone https://github.com/stratum/fabric-tna.git + +cd ./fabric-tna + +make fabric-upf-int-v1model +``` + +At this point, a relevant `build.sh` script is being run and a P4 program is being compiled. + +After a successful compilation, some artifacts (p4info.txt, bmv2.json) will be generated and placed into `build` sub-folder. + +```shell +ls build/fabric-int/bmv2 +_pp.p4 bmv2.json p4info.txt +``` + +These artefacts are now moved into this repository. diff --git a/src/tests/p4-sd-fabric-svc-connectivity/p4src/_pp.p4 b/src/tests/p4-sd-fabric-svc-connectivity/p4src/_pp.p4 new file mode 100644 index 0000000000000000000000000000000000000000..870509db7f530c7bf9070e4c24b5b546a2a3441d --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/p4src/_pp.p4 @@ -0,0 +1,2452 @@ +error { + PacketRejectedByParser +} +#include +#define V1MODEL_VERSION 20180101 +#include + +typedef bit<9> PortId_t; +typedef bit<16> MulticastGroupId_t; +typedef bit<5> QueueId_t; +typedef bit<10> MirrorId_t; +typedef bit<16> ReplicationId_t; +enum bit<2> MeterColor_t { + GREEN = 0, + YELLOW = 1, + RED = 2 +} + +typedef bit<1> BOOL; +typedef bit<8> FieldListIndex_t; +const PortId_t BMV2_DROP_PORT = 511; +const PortId_t FAKE_V1MODEL_RECIRC_PORT = 510; +const FieldListIndex_t PRESERVE_INT_MD = 241; +const FieldListIndex_t PRESERVE_INGRESS_PORT = 231; +const FieldListIndex_t NO_PRESERVATION = 0; +typedef bit<3> fwd_type_t; +typedef bit<32> next_id_t; +typedef bit<20> mpls_label_t; +typedef bit<48> mac_addr_t; +typedef bit<12> vlan_id_t; +typedef bit<32> ipv4_addr_t; +typedef bit<16> l4_port_t; +typedef bit<32> flow_hash_t; +typedef bit<4> slice_id_t; +typedef bit<2> tc_t; +typedef bit<(4 + 2)> slice_tc_t; +type bit<9> FabricPortId_t; +const bit<8> DEFAULT_APP_ID = 0; +const slice_id_t DEFAULT_SLICE_ID = 0; +const tc_t DEFAULT_TC = 0; +const QueueId_t QUEUE_ID_BEST_EFFORT = 0; +typedef bit<32> teid_t; +typedef bit<12> upf_ctr_idx_t; +typedef bit<8> tun_peer_id_t; +typedef bit<32> ue_session_id_t; +typedef bit<15> session_meter_idx_t; +typedef bit<15> app_meter_idx_t; +const session_meter_idx_t DEFAULT_SESSION_METER_IDX = 0; +const app_meter_idx_t DEFAULT_APP_METER_IDX = 0; +enum bit<2> EncapPresence { + NONE = 0x0, + GTPU_ONLY = 0x1, + GTPU_WITH_PSC = 0x2, + VXLAN = 0x3 +} + +const bit<16> GTPU_UDP_PORT = 2152; +const bit<3> GTP_V1 = 3w1; +const bit<8> GTPU_GPDU = 0xff; +const bit<1> GTP_PROTOCOL_TYPE_GTP = 1w1; +const bit<8> GTPU_NEXT_EXT_NONE = 0x0; +const bit<8> GTPU_NEXT_EXT_PSC = 0x85; +const bit<4> GTPU_EXT_PSC_TYPE_DL = 4w0; +const bit<4> GTPU_EXT_PSC_TYPE_UL = 4w1; +const bit<8> GTPU_EXT_PSC_LEN = 8w1; +enum bit<2> PortType_t { + UNKNOWN = 0x0, + EDGE = 0x1, + INFRA = 0x2, + INTERNAL = 0x3 +} + +const bit<16> ETHERTYPE_QINQ = 0x88a8; +const bit<16> ETHERTYPE_QINQ_NON_STD = 0x9100; +const bit<16> ETHERTYPE_VLAN = 0x8100; +const bit<16> ETHERTYPE_MPLS = 0x8847; +const bit<16> ETHERTYPE_MPLS_MULTICAST = 0x8848; +const bit<16> ETHERTYPE_IPV4 = 0x800; +const bit<16> ETHERTYPE_IPV6 = 0x86dd; +const bit<16> ETHERTYPE_ARP = 0x806; +const bit<16> ETHERTYPE_PPPOED = 0x8863; +const bit<16> ETHERTYPE_PPPOES = 0x8864; +const bit<16> ETHERTYPE_PACKET_OUT = 0xbf01; +const bit<16> ETHERTYPE_CPU_LOOPBACK_INGRESS = 0xbf02; +const bit<16> ETHERTYPE_CPU_LOOPBACK_EGRESS = 0xbf03; +const bit<16> ETHERTYPE_INT_WIP_IPV4 = 0xbf04; +const bit<16> ETHERTYPE_INT_WIP_MPLS = 0xbf05; +const bit<16> PPPOE_PROTOCOL_IP4 = 0x21; +const bit<16> PPPOE_PROTOCOL_IP6 = 0x57; +const bit<16> PPPOE_PROTOCOL_MPLS = 0x281; +const bit<8> PROTO_ICMP = 1; +const bit<8> PROTO_TCP = 6; +const bit<8> PROTO_UDP = 17; +const bit<8> PROTO_ICMPV6 = 58; +const bit<4> IPV4_MIN_IHL = 5; +const fwd_type_t FWD_BRIDGING = 0; +const fwd_type_t FWD_MPLS = 1; +const fwd_type_t FWD_IPV4_UNICAST = 2; +const fwd_type_t FWD_IPV4_MULTICAST = 3; +const fwd_type_t FWD_IPV6_UNICAST = 4; +const fwd_type_t FWD_IPV6_MULTICAST = 5; +const fwd_type_t FWD_UNKNOWN = 7; +const vlan_id_t DEFAULT_VLAN_ID = 12w4094; +const bit<8> DEFAULT_MPLS_TTL = 64; +const bit<8> DEFAULT_IPV4_TTL = 64; +const bit<16> VXLAN_UDP_PORT = 4789; +const bit<7> RECIRC_PORT_NUMBER = 7w68; +action nop() { + NoAction(); +} +enum bit<8> BridgedMdType_t { + INVALID = 0, + INGRESS_TO_EGRESS = 1, + EGRESS_MIRROR = 2, + INGRESS_MIRROR = 3, + INT_INGRESS_DROP = 4, + DEFLECTED = 5 +} + +enum bit<3> FabricMirrorType_t { + INVALID = 0, + INT_REPORT = 1, + PACKET_IN = 2 +} + +const MirrorId_t PACKET_IN_MIRROR_SESSION_ID = 0x1ff; +enum bit<2> CpuLoopbackMode_t { + DISABLED = 0, + DIRECT = 1, + INGRESS = 2 +} + +const bit<4> NPROTO_ETHERNET = 0; +const bit<4> NPROTO_TELEMETRY_DROP_HEADER = 1; +const bit<4> NPROTO_TELEMETRY_SWITCH_LOCAL_HEADER = 2; +const bit<16> REPORT_FIXED_HEADER_BYTES = 12; +const bit<16> DROP_REPORT_HEADER_BYTES = 12; +const bit<16> LOCAL_REPORT_HEADER_BYTES = 16; +const bit<8> INT_MIRROR_SESSION_BASE = 0x80; +const bit<10> V1MODEL_INT_MIRROR_SESSION = 0x1fa; +typedef bit<16> flow_report_filter_index_t; +typedef bit<16> drop_report_filter_index_t; +typedef bit<12> queue_report_filter_index_t; +typedef bit<16> queue_report_quota_t; +typedef bit<3> IntReportType_t; +const IntReportType_t INT_REPORT_TYPE_NO_REPORT = 0; +const IntReportType_t INT_REPORT_TYPE_DROP = 4; +const IntReportType_t INT_REPORT_TYPE_QUEUE = 2; +const IntReportType_t INT_REPORT_TYPE_FLOW = 1; +typedef bit<8> IntWipType_t; +const IntWipType_t INT_IS_NOT_WIP = 0; +const IntWipType_t INT_IS_WIP = 1; +const IntWipType_t INT_IS_WIP_WITH_MPLS = 2; +const bit<16> INT_WIP_ADJUST_IP_BYTES = 14 - 1 ^ 0xffff; +const bit<16> INT_WIP_ADJUST_UDP_BYTES = INT_WIP_ADJUST_IP_BYTES - 20; +const bit<16> INT_WIP_ADJUST_IP_MPLS_BYTES = INT_WIP_ADJUST_IP_BYTES - 4; +const bit<16> INT_WIP_ADJUST_UDP_MPLS_BYTES = INT_WIP_ADJUST_UDP_BYTES - 4; +enum bit<8> IntDropReason_t { + DROP_REASON_UNKNOWN = 0, + DROP_REASON_IP_TTL_ZERO = 26, + DROP_REASON_ROUTING_V4_MISS = 29, + DROP_REASON_ROUTING_V6_MISS = 29, + DROP_REASON_PORT_VLAN_MAPPING_MISS = 55, + DROP_REASON_TRAFFIC_MANAGER = 71, + DROP_REASON_ACL_DENY = 80, + DROP_REASON_BRIDGING_MISS = 89, + DROP_REASON_NEXT_ID_MISS = 128, + DROP_REASON_MPLS_MISS = 129, + DROP_REASON_EGRESS_NEXT_MISS = 130, + DROP_REASON_MPLS_TTL_ZERO = 131, + DROP_REASON_UPF_DL_SESSION_MISS = 132, + DROP_REASON_UPF_DL_SESSION_DROP = 133, + DROP_REASON_UPF_UL_SESSION_MISS = 134, + DROP_REASON_UPF_UL_SESSION_DROP = 135, + DROP_REASON_UPF_DL_SESSION_DROP_BUFF = 136, + DROP_REASON_UPF_DL_TERMINATION_MISS = 137, + DROP_REASON_UPF_DL_TERMINATION_DROP = 138, + DROP_REASON_UPF_UL_TERMINATION_MISS = 139, + DROP_REASON_UPF_UL_TERMINATION_DROP = 140, + DROP_REASON_UPF_UPLINK_RECIRC_DENY = 150, + DROP_REASON_INGRESS_QOS_METER = 160, + DROP_REASON_ROUTING_V4_DROP = 170, + DROP_REASON_ROUTING_V6_DROP = 171 +} + +@controller_header("packet_in") header packet_in_header_t { + FabricPortId_t ingress_port; + bit<7> _pad0; +} + +@controller_header("packet_out") header packet_out_header_t { + @padding + bit<7> pad0; + FabricPortId_t egress_port; + @padding + bit<3> pad1; + QueueId_t queue_id; + @padding + bit<5> pad2; + CpuLoopbackMode_t cpu_loopback_mode; + bit<1> do_forwarding; + @padding + bit<16> pad3; + @padding + bit<48> pad4; + bit<16> ether_type; +} + +header ethernet_t { + mac_addr_t dst_addr; + mac_addr_t src_addr; +} + +header eth_type_t { + bit<16> value; +} + +header vlan_tag_t { + bit<16> eth_type; + bit<3> pri; + bit<1> cfi; + vlan_id_t vlan_id; +} + +header mpls_t { + mpls_label_t label; + bit<3> tc; + bit<1> bos; + bit<8> ttl; +} + +header pppoe_t { + bit<4> version; + bit<4> type_id; + bit<8> code; + bit<16> session_id; + bit<16> length; + bit<16> protocol; +} + +header ipv4_t { + bit<4> version; + bit<4> ihl; + bit<6> dscp; + bit<2> ecn; + bit<16> total_len; + bit<16> identification; + bit<3> flags; + bit<13> frag_offset; + bit<8> ttl; + bit<8> protocol; + bit<16> hdr_checksum; + bit<32> src_addr; + bit<32> dst_addr; +} + +header ipv6_t { + bit<4> version; + bit<8> traffic_class; + bit<20> flow_label; + bit<16> payload_len; + bit<8> next_hdr; + bit<8> hop_limit; + bit<128> src_addr; + bit<128> dst_addr; +} + +header tcp_t { + bit<16> sport; + bit<16> dport; +} + +@pa_container_size("egress" , "hdr.outer_udp.sport" , 16) @pa_container_size("egress" , "hdr.outer_udp.dport" , 16) header udp_t { + bit<16> sport; + bit<16> dport; + bit<16> len; + bit<16> checksum; +} + +header icmp_t { + bit<8> icmp_type; + bit<8> icmp_code; +} + +header vxlan_t { + bit<8> flags; + bit<24> reserved; + bit<24> vni; + bit<8> reserved_2; +} + +header gtpu_t { + bit<3> version; + bit<1> pt; + bit<1> spare; + bit<1> ex_flag; + bit<1> seq_flag; + bit<1> npdu_flag; + bit<8> msgtype; + bit<16> msglen; + teid_t teid; +} + +header gtpu_options_t { + bit<16> seq_num; + bit<8> n_pdu_num; + bit<8> next_ext; +} + +header gtpu_ext_psc_t { + bit<8> len; + bit<4> type; + bit<4> spare0; + bit<1> ppp; + bit<1> rqi; + bit<6> qfi; + bit<8> next_ext; +} + +@flexible struct upf_bridged_metadata_t { + tun_peer_id_t tun_peer_id; + upf_ctr_idx_t upf_ctr_id; + bit<6> qfi; + bool needs_gtpu_encap; + bool skip_upf; + bool skip_egress_upf_ctr; + teid_t teid; + bit<4> _pad; +} + +@pa_no_overlay("egress" , "hdr.report_fixed_header.rsvd") header report_fixed_header_t { + bit<4> ver; + bit<4> nproto; + bit<3> dqf; + bit<15> rsvd; + bit<6> hw_id; + bit<32> seq_no; + bit<32> ig_tstamp; +} + +@pa_container_size("egress" , "hdr.common_report_header.queue_id" , 8) @pa_container_size("egress" , "hdr.common_report_header.ig_port" , 16) @pa_container_size("egress" , "hdr.common_report_header.eg_port" , 16) @pa_no_overlay("egress" , "hdr.common_report_header.queue_id") @pa_no_overlay("egress" , "hdr.common_report_header.eg_port") header common_report_header_t { + bit<32> switch_id; + bit<7> pad1; + bit<9> ig_port; + bit<7> pad2; + bit<9> eg_port; + bit<3> pad3; + bit<5> queue_id; +} + +header drop_report_header_t { + bit<8> drop_reason; + @padding + bit<16> pad; +} + +header local_report_header_t { + bit<5> pad1; + bit<19> queue_occupancy; + bit<32> eg_tstamp; +} + +@pa_no_overlay("egress" , "fabric_md.int_report_md.bmd_type") @pa_no_overlay("egress" , "fabric_md.int_report_md.mirror_type") @pa_no_overlay("egress" , "fabric_md.int_report_md.ig_port") @pa_no_overlay("egress" , "fabric_md.int_report_md.eg_port") @pa_no_overlay("egress" , "fabric_md.int_report_md.queue_id") @pa_no_overlay("egress" , "fabric_md.int_report_md.queue_occupancy") @pa_no_overlay("egress" , "fabric_md.int_report_md.ig_tstamp") @pa_no_overlay("egress" , "fabric_md.int_report_md.eg_tstamp") @pa_no_overlay("egress" , "fabric_md.int_report_md.drop_reason") @pa_no_overlay("egress" , "fabric_md.int_report_md.ip_eth_type") @pa_no_overlay("egress" , "fabric_md.int_report_md.report_type") @pa_no_overlay("egress" , "fabric_md.int_report_md.flow_hash") @pa_no_overlay("egress" , "fabric_md.int_report_md.encap_presence") header int_report_metadata_t { + BridgedMdType_t bmd_type; + @padding + bit<5> _pad0; + FabricMirrorType_t mirror_type; + @padding + bit<7> _pad1; + bit<9> ig_port; + @padding + bit<7> _pad2; + bit<9> eg_port; + @padding + bit<3> _pad3; + bit<5> queue_id; + @padding + bit<5> _pad4; + bit<19> queue_occupancy; + bit<32> ig_tstamp; + bit<32> eg_tstamp; + bit<8> drop_reason; + bit<16> ip_eth_type; + @padding + bit<6> _pad5; + EncapPresence encap_presence; + bit<3> report_type; + @padding + bit<5> _pad6; + flow_hash_t flow_hash; +} + +@flexible struct int_bridged_metadata_t { + bit<3> report_type; + MirrorId_t mirror_session_id; + IntDropReason_t drop_reason; + QueueId_t queue_id; + PortId_t egress_port; + IntWipType_t wip_type; +} + +struct int_metadata_t { + bit<32> hop_latency; + bit<48> timestamp; + bool vlan_stripped; + bool queue_report; +} + +@flexible struct bridged_metadata_base_t { + flow_hash_t inner_hash; + mpls_label_t mpls_label; + PortId_t ig_port; + bool is_multicast; + fwd_type_t fwd_type; + vlan_id_t vlan_id; + EncapPresence encap_presence; + bit<8> mpls_ttl; + bit<48> ig_tstamp; + bit<16> ip_eth_type; + bit<10> stats_flow_id; + slice_tc_t slice_tc; +} + +header bridged_metadata_t { + BridgedMdType_t bmd_type; + bridged_metadata_base_t base; + upf_bridged_metadata_t upf; + int_bridged_metadata_t int_bmd; + bit<1> _pad0; + bit<7> _pad1; + bit<5> _pad2; +} + +struct lookup_metadata_t { + mac_addr_t eth_dst; + mac_addr_t eth_src; + bit<16> eth_type; + vlan_id_t vlan_id; + bool is_ipv4; + bit<32> ipv4_src; + bit<32> ipv4_dst; + bit<8> ip_proto; + l4_port_t l4_sport; + l4_port_t l4_dport; + bit<8> icmp_type; + bit<8> icmp_code; +} + +struct common_mirror_metadata_t { + MirrorId_t mirror_session_id; + BridgedMdType_t bmd_type; +} + +@pa_auto_init_metadata struct fabric_ingress_metadata_t { + bridged_metadata_t bridged; + flow_hash_t ecmp_hash; + lookup_metadata_t lkp; + bit<32> routing_ipv4_dst; + bool skip_forwarding; + bool skip_next; + next_id_t next_id; + bool egress_port_set; + bool punt_to_cpu; + bool ipv4_checksum_err; + bool inner_ipv4_checksum_err; + slice_id_t slice_id; + tc_t tc; + bool tc_unknown; + bool is_upf_hit; + slice_id_t upf_slice_id; + tc_t upf_tc; + MeterColor_t upf_meter_color; + PortType_t ig_port_type; + common_mirror_metadata_t mirror; +} + +header common_egress_metadata_t { + BridgedMdType_t bmd_type; + @padding + bit<5> _pad; + FabricMirrorType_t mirror_type; +} + +header packet_in_mirror_metadata_t { + BridgedMdType_t bmd_type; + @padding + bit<5> _pad0; + FabricMirrorType_t mirror_type; + @padding + bit<7> _pad1; + PortId_t ingress_port; +} + +@pa_auto_init_metadata struct fabric_egress_metadata_t { + bridged_metadata_t bridged; + PortId_t cpu_port; + bool inner_ipv4_checksum_err; + int_report_metadata_t int_report_md; + int_metadata_t int_md; + bit<16> int_ipv4_len; + bool is_int_recirc; + bit<16> pkt_length; +} + +header fake_ethernet_t { + @padding + bit<48> _pad0; + @padding + bit<48> _pad1; + bit<16> ether_type; +} + +struct ingress_headers_t { + packet_out_header_t packet_out; + packet_in_header_t packet_in; + fake_ethernet_t fake_ethernet; + ethernet_t ethernet; + vlan_tag_t vlan_tag; + eth_type_t eth_type; + mpls_t mpls; + ipv4_t ipv4; + ipv6_t ipv6; + tcp_t tcp; + udp_t udp; + icmp_t icmp; + gtpu_t gtpu; + gtpu_options_t gtpu_options; + gtpu_ext_psc_t gtpu_ext_psc; + vxlan_t vxlan; + ethernet_t inner_ethernet; + eth_type_t inner_eth_type; + ipv4_t inner_ipv4; + tcp_t inner_tcp; + udp_t inner_udp; + icmp_t inner_icmp; +} + +struct egress_headers_t { + packet_in_header_t packet_in; + fake_ethernet_t fake_ethernet; + ethernet_t report_ethernet; + eth_type_t report_eth_type; + mpls_t report_mpls; + ipv4_t report_ipv4; + udp_t report_udp; + report_fixed_header_t report_fixed_header; + common_report_header_t common_report_header; + local_report_header_t local_report_header; + drop_report_header_t drop_report_header; + ethernet_t ethernet; + vlan_tag_t vlan_tag; + eth_type_t eth_type; + mpls_t mpls; + ipv4_t outer_ipv4; + udp_t outer_udp; + gtpu_t outer_gtpu; + gtpu_options_t outer_gtpu_options; + gtpu_ext_psc_t outer_gtpu_ext_psc; + ipv4_t ipv4; + ipv6_t ipv6; + udp_t udp; +} + +struct fabric_v1model_metadata_t { + bool skip_egress; + bool do_upf_uplink_recirc; + bit<1> drop_ctl; + IntReportType_t int_mirror_type; + fabric_ingress_metadata_t ingress; + fabric_egress_metadata_t egress; + @field_list(PRESERVE_INT_MD) + IntReportType_t recirc_preserved_report_type; + @field_list(PRESERVE_INT_MD) + FabricPortId_t recirc_preserved_egress_port; + @field_list(PRESERVE_INT_MD) + IntDropReason_t recirc_preserved_drop_reason; + @field_list(PRESERVE_INGRESS_PORT) + FabricPortId_t recirc_preserved_ingress_port; +} + +struct v1model_header_t { + ingress_headers_t ingress; + egress_headers_t egress; +} + +parser FabricParser(packet_in packet, out v1model_header_t hdr, inout fabric_v1model_metadata_t fabric_md, inout standard_metadata_t standard_md) { + state start { + fabric_md.egress.pkt_length = (bit<16>)standard_md.packet_length; + fabric_md.ingress.bridged.setValid(); + fabric_md.ingress.bridged.bmd_type = BridgedMdType_t.INGRESS_TO_EGRESS; + fabric_md.ingress.bridged.base.ig_port = standard_md.ingress_port; + fabric_md.recirc_preserved_ingress_port = (FabricPortId_t)standard_md.ingress_port; + fabric_md.ingress.bridged.base.ig_tstamp = standard_md.ingress_global_timestamp; + fabric_md.ingress.egress_port_set = false; + fabric_md.ingress.punt_to_cpu = false; + fabric_md.ingress.bridged.base.ip_eth_type = 0; + fabric_md.ingress.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UNKNOWN; + fabric_md.ingress.bridged.int_bmd.wip_type = INT_IS_NOT_WIP; + fabric_md.ingress.bridged.base.encap_presence = EncapPresence.NONE; + fabric_md.ingress.upf_meter_color = MeterColor_t.GREEN; + transition check_ethernet; + } + state check_ethernet { + fake_ethernet_t tmp = packet.lookahead(); + transition select(tmp.ether_type) { + ETHERTYPE_CPU_LOOPBACK_INGRESS: parse_fake_ethernet; + ETHERTYPE_CPU_LOOPBACK_EGRESS: parse_fake_ethernet_and_accept; + ETHERTYPE_PACKET_OUT: check_packet_out; + ETHERTYPE_INT_WIP_IPV4: parse_int_wip_ipv4; + ETHERTYPE_INT_WIP_MPLS: parse_int_wip_mpls; + default: parse_ethernet; + } + } + state check_packet_out { + packet_out_header_t tmp = packet.lookahead(); + transition select(tmp.do_forwarding) { + 0: parse_packet_out_and_accept; + default: strip_packet_out; + } + } + state parse_int_wip_ipv4 { + hdr.ingress.ethernet.setValid(); + hdr.ingress.eth_type.setValid(); + hdr.ingress.eth_type.value = ETHERTYPE_IPV4; + fabric_md.ingress.bridged.int_bmd.wip_type = INT_IS_WIP; + fabric_md.ingress.bridged.base.mpls_label = 0; + fabric_md.ingress.bridged.base.mpls_ttl = DEFAULT_MPLS_TTL + 1; + packet.advance(14 * 8); + transition parse_ipv4; + } + state parse_int_wip_mpls { + hdr.ingress.ethernet.setValid(); + hdr.ingress.eth_type.setValid(); + hdr.ingress.eth_type.value = ETHERTYPE_MPLS; + fabric_md.ingress.bridged.int_bmd.wip_type = INT_IS_WIP_WITH_MPLS; + packet.advance(14 * 8); + transition parse_mpls; + } + state parse_packet_out_and_accept { + packet.extract(hdr.ingress.packet_out); + transition accept; + } + state strip_packet_out { + packet.advance(14 * 8); + transition parse_ethernet; + } + state parse_fake_ethernet { + packet.extract(hdr.ingress.fake_ethernet); + fake_ethernet_t tmp = packet.lookahead(); + transition select(tmp.ether_type) { + ETHERTYPE_INT_WIP_IPV4: parse_int_wip_ipv4; + ETHERTYPE_INT_WIP_MPLS: parse_int_wip_mpls; + default: parse_ethernet; + } + } + state parse_fake_ethernet_and_accept { + packet.extract(hdr.ingress.fake_ethernet); + transition accept; + } + state parse_ethernet { + packet.extract(hdr.ingress.ethernet); + transition select(packet.lookahead>()) { + ETHERTYPE_QINQ: parse_vlan_tag; + ETHERTYPE_VLAN &&& 0xefff: parse_vlan_tag; + default: parse_untagged; + } + } + state parse_vlan_tag { + packet.extract(hdr.ingress.vlan_tag); + fabric_md.ingress.bridged.base.vlan_id = hdr.ingress.vlan_tag.vlan_id; + transition select(packet.lookahead>()) { + default: parse_eth_type; + } + } + state parse_untagged { + fabric_md.ingress.bridged.base.vlan_id = DEFAULT_VLAN_ID; + transition parse_eth_type; + } + state parse_eth_type { + packet.extract(hdr.ingress.eth_type); + transition select(hdr.ingress.eth_type.value) { + ETHERTYPE_MPLS: parse_mpls; + ETHERTYPE_IPV4: parse_non_mpls; + ETHERTYPE_IPV6: parse_non_mpls; + default: accept; + } + } + state parse_mpls { + packet.extract(hdr.ingress.mpls); + fabric_md.ingress.bridged.base.mpls_label = hdr.ingress.mpls.label; + fabric_md.ingress.bridged.base.mpls_ttl = hdr.ingress.mpls.ttl; + transition select(packet.lookahead>()) { + 4: parse_ipv4; + 6: parse_ipv6; + default: reject_packet; + } + } + state reject_packet { + verify(false, error.PacketRejectedByParser); + transition accept; + } + state parse_non_mpls { + fabric_md.ingress.bridged.base.mpls_label = 0; + fabric_md.ingress.bridged.base.mpls_ttl = DEFAULT_MPLS_TTL + 1; + transition select(hdr.ingress.eth_type.value) { + ETHERTYPE_IPV4: parse_ipv4; + ETHERTYPE_IPV6: parse_ipv6; + default: accept; + } + } + state parse_ipv4 { + packet.extract(hdr.ingress.ipv4); + fabric_md.ingress.routing_ipv4_dst = hdr.ingress.ipv4.dst_addr; + fabric_md.ingress.bridged.base.ip_eth_type = ETHERTYPE_IPV4; + transition select(hdr.ingress.ipv4.protocol) { + PROTO_TCP: parse_tcp; + PROTO_UDP: parse_udp; + PROTO_ICMP: parse_icmp; + default: accept; + } + } + state parse_ipv6 { + packet.extract(hdr.ingress.ipv6); + fabric_md.ingress.bridged.base.ip_eth_type = ETHERTYPE_IPV6; + transition select(hdr.ingress.ipv6.next_hdr) { + PROTO_TCP: parse_tcp; + PROTO_UDP: parse_udp; + PROTO_ICMPV6: parse_icmp; + default: accept; + } + } + state parse_icmp { + packet.extract(hdr.ingress.icmp); + transition accept; + } + state parse_tcp { + packet.extract(hdr.ingress.tcp); + transition accept; + } + state parse_udp { + packet.extract(hdr.ingress.udp); + gtpu_t gtpu = packet.lookahead(); + transition select(hdr.ingress.udp.dport, gtpu.version, gtpu.msgtype) { + (GTPU_UDP_PORT, GTP_V1, GTPU_GPDU): parse_gtpu; + (VXLAN_UDP_PORT, default, default): parse_vxlan; + default: accept; + } + } + state parse_gtpu { + packet.extract(hdr.ingress.gtpu); + transition select(hdr.ingress.gtpu.ex_flag, hdr.ingress.gtpu.seq_flag, hdr.ingress.gtpu.npdu_flag) { + (0, 0, 0): set_gtpu_only; + default: parse_gtpu_options; + } + } + state set_gtpu_only { + fabric_md.ingress.bridged.base.encap_presence = EncapPresence.GTPU_ONLY; + transition parse_inner_ipv4; + } + state parse_gtpu_options { + packet.extract(hdr.ingress.gtpu_options); + bit<8> gtpu_ext_len = packet.lookahead>(); + transition select(hdr.ingress.gtpu_options.next_ext, gtpu_ext_len) { + (GTPU_NEXT_EXT_PSC, GTPU_EXT_PSC_LEN): parse_gtpu_ext_psc; + default: accept; + } + } + state parse_gtpu_ext_psc { + packet.extract(hdr.ingress.gtpu_ext_psc); + fabric_md.ingress.bridged.base.encap_presence = EncapPresence.GTPU_WITH_PSC; + transition select(hdr.ingress.gtpu_ext_psc.next_ext) { + GTPU_NEXT_EXT_NONE: parse_inner_ipv4; + default: accept; + } + } + state parse_vxlan { + packet.extract(hdr.ingress.vxlan); + fabric_md.ingress.bridged.base.encap_presence = EncapPresence.VXLAN; + transition parse_inner_ethernet; + } + state parse_inner_ethernet { + packet.extract(hdr.ingress.inner_ethernet); + packet.extract(hdr.ingress.inner_eth_type); + transition select(hdr.ingress.inner_eth_type.value) { + ETHERTYPE_IPV4: parse_inner_ipv4; + default: accept; + } + } + state parse_inner_ipv4 { + packet.extract(hdr.ingress.inner_ipv4); + transition select(hdr.ingress.inner_ipv4.protocol) { + PROTO_TCP: parse_inner_tcp; + PROTO_UDP: parse_inner_udp; + PROTO_ICMP: parse_inner_icmp; + default: accept; + } + } + state parse_inner_tcp { + packet.extract(hdr.ingress.inner_tcp); + transition accept; + } + state parse_inner_udp { + packet.extract(hdr.ingress.inner_udp); + transition accept; + } + state parse_inner_icmp { + packet.extract(hdr.ingress.inner_icmp); + transition accept; + } +} + +control FabricDeparser(packet_out packet, in v1model_header_t hdr) { + apply { + packet.emit(hdr.ingress.fake_ethernet); + packet.emit(hdr.ingress.packet_in); + packet.emit(hdr.egress.report_ethernet); + packet.emit(hdr.egress.report_eth_type); + packet.emit(hdr.egress.report_mpls); + packet.emit(hdr.egress.report_ipv4); + packet.emit(hdr.egress.report_udp); + packet.emit(hdr.egress.report_fixed_header); + packet.emit(hdr.egress.common_report_header); + packet.emit(hdr.egress.local_report_header); + packet.emit(hdr.egress.drop_report_header); + packet.emit(hdr.ingress.ethernet); + packet.emit(hdr.ingress.vlan_tag); + packet.emit(hdr.ingress.eth_type); + packet.emit(hdr.ingress.mpls); + packet.emit(hdr.ingress.ipv4); + packet.emit(hdr.ingress.ipv6); + packet.emit(hdr.ingress.tcp); + packet.emit(hdr.ingress.udp); + packet.emit(hdr.ingress.icmp); + packet.emit(hdr.ingress.gtpu); + packet.emit(hdr.ingress.gtpu_options); + packet.emit(hdr.ingress.gtpu_ext_psc); + packet.emit(hdr.ingress.vxlan); + packet.emit(hdr.ingress.inner_ethernet); + packet.emit(hdr.ingress.inner_eth_type); + packet.emit(hdr.ingress.inner_ipv4); + packet.emit(hdr.ingress.inner_tcp); + packet.emit(hdr.ingress.inner_udp); + packet.emit(hdr.ingress.inner_icmp); + } +} + +control Acl(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout FabricPortId_t recirc_preserved_egress_port, inout bit<1> drop_ctl) { + direct_counter(CounterType.packets_and_bytes) acl_counter; + action set_next_id_acl(next_id_t next_id) { + fabric_md.next_id = next_id; + acl_counter.count(); + fabric_md.skip_next = false; + drop_ctl = 0; + } + action copy_to_cpu() { + clone_preserving_field_list(CloneType.I2E, (bit<32>)PACKET_IN_MIRROR_SESSION_ID, PRESERVE_INGRESS_PORT); + acl_counter.count(); + } + action punt_to_cpu() { + copy_to_cpu(); + fabric_md.skip_next = true; + fabric_md.punt_to_cpu = true; + drop_ctl = 1; + } + action drop() { + drop_ctl = 1; + fabric_md.skip_next = true; + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_ACL_DENY; + acl_counter.count(); + } + action set_output_port(FabricPortId_t port_num) { + standard_md.egress_spec = (PortId_t)port_num; + recirc_preserved_egress_port = port_num; + fabric_md.egress_port_set = true; + fabric_md.skip_next = true; + drop_ctl = 0; + acl_counter.count(); + } + action nop_acl() { + acl_counter.count(); + } + table acl { + key = { + fabric_md.bridged.base.ig_port: ternary @name("ig_port") ; + fabric_md.lkp.eth_dst : ternary @name("eth_dst") ; + fabric_md.lkp.eth_src : ternary @name("eth_src") ; + fabric_md.lkp.vlan_id : ternary @name("vlan_id") ; + fabric_md.lkp.eth_type : ternary @name("eth_type") ; + fabric_md.lkp.ipv4_src : ternary @name("ipv4_src") ; + fabric_md.lkp.ipv4_dst : ternary @name("ipv4_dst") ; + fabric_md.lkp.ip_proto : ternary @name("ip_proto") ; + fabric_md.lkp.icmp_type : ternary @name("icmp_type") ; + fabric_md.lkp.icmp_code : ternary @name("icmp_code") ; + fabric_md.lkp.l4_sport : ternary @name("l4_sport") ; + fabric_md.lkp.l4_dport : ternary @name("l4_dport") ; + fabric_md.ig_port_type : ternary @name("ig_port_type") ; + } + actions = { + set_next_id_acl; + punt_to_cpu; + copy_to_cpu; + drop; + set_output_port; + nop_acl; + } + const default_action = nop_acl(); + size = 1024; + counters = acl_counter; + } + apply { + acl.apply(); + } +} + +control Next(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout FabricPortId_t recirc_preserved_egress_port) { + @hidden action output(FabricPortId_t port_num) { + standard_md.egress_spec = (PortId_t)port_num; + recirc_preserved_egress_port = port_num; + fabric_md.egress_port_set = true; + } + @hidden action rewrite_smac(mac_addr_t smac) { + hdr.ethernet.src_addr = smac; + } + @hidden action rewrite_dmac(mac_addr_t dmac) { + hdr.ethernet.dst_addr = dmac; + } + @hidden action routing(FabricPortId_t port_num, mac_addr_t smac, mac_addr_t dmac) { + rewrite_smac(smac); + rewrite_dmac(dmac); + output(port_num); + } + @max_group_size(32w16) action_selector(HashAlgorithm.crc16, 32w16, 32w16) hashed_profile; + direct_counter(CounterType.packets_and_bytes) hashed_counter; + action output_hashed(FabricPortId_t port_num) { + output(port_num); + hashed_counter.count(); + } + action routing_hashed(FabricPortId_t port_num, mac_addr_t smac, mac_addr_t dmac) { + routing(port_num, smac, dmac); + hashed_counter.count(); + } + table hashed { + key = { + fabric_md.next_id : exact @name("next_id") ; + fabric_md.ecmp_hash: selector; + } + actions = { + output_hashed; + routing_hashed; + @defaultonly nop; + } + implementation = hashed_profile; + counters = hashed_counter; + const default_action = nop(); + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) multicast_counter; + action set_mcast_group_id(MulticastGroupId_t group_id) { + standard_md.mcast_grp = group_id; + fabric_md.bridged.base.is_multicast = true; + multicast_counter.count(); + } + action reset_mcast_group_id() { + standard_md.mcast_grp = 0; + fabric_md.bridged.base.is_multicast = false; + } + table multicast { + key = { + fabric_md.next_id: exact @name("next_id") ; + } + actions = { + set_mcast_group_id; + @defaultonly reset_mcast_group_id; + } + counters = multicast_counter; + const default_action = reset_mcast_group_id(); + size = 1024; + } + apply { + hashed.apply(); + multicast.apply(); + } +} + +control EgressNextControl(inout ingress_headers_t hdr, inout fabric_egress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout IntDropReason_t recirc_preserved_drop_reason, inout bit<1> drop_ctl) { + @hidden action pop_mpls_if_present() { + hdr.mpls.setInvalid(); + hdr.eth_type.value = fabric_md.bridged.base.ip_eth_type; + } + @hidden action set_mpls() { + hdr.mpls.setValid(); + hdr.mpls.label = fabric_md.bridged.base.mpls_label; + hdr.mpls.tc = 3w0; + hdr.mpls.bos = 1w1; + hdr.mpls.ttl = fabric_md.bridged.base.mpls_ttl; + hdr.eth_type.value = ETHERTYPE_MPLS; + } + @hidden action push_outer_vlan() { + hdr.vlan_tag.setValid(); + hdr.vlan_tag.eth_type = ETHERTYPE_VLAN; + hdr.vlan_tag.vlan_id = fabric_md.bridged.base.vlan_id; + } + direct_counter(CounterType.packets_and_bytes) egress_vlan_counter; + action push_vlan() { + push_outer_vlan(); + egress_vlan_counter.count(); + } + action pop_vlan() { + hdr.vlan_tag.setInvalid(); + egress_vlan_counter.count(); + } + action drop() { + drop_ctl = 1; + egress_vlan_counter.count(); + recirc_preserved_drop_reason = IntDropReason_t.DROP_REASON_EGRESS_NEXT_MISS; + } + table egress_vlan { + key = { + fabric_md.bridged.base.vlan_id: exact @name("vlan_id") ; + standard_md.egress_port : exact @name("eg_port") ; + } + actions = { + push_vlan; + pop_vlan; + @defaultonly drop; + } + const default_action = drop(); + counters = egress_vlan_counter; + size = 1024; + } + apply { + if (fabric_md.bridged.base.is_multicast && fabric_md.bridged.base.ig_port == standard_md.egress_port) { + fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_NO_REPORT; + drop_ctl = 1; + } + if (fabric_md.bridged.base.mpls_label == 0) { + if (hdr.mpls.isValid()) { + pop_mpls_if_present(); + } + } else { + set_mpls(); + } + if (!fabric_md.is_int_recirc) { + egress_vlan.apply(); + } + bool regular_packet = true; + regular_packet = !(fabric_md.bridged.bmd_type == BridgedMdType_t.INT_INGRESS_DROP || fabric_md.bridged.bmd_type == BridgedMdType_t.EGRESS_MIRROR); + if (hdr.mpls.isValid()) { + hdr.mpls.ttl = hdr.mpls.ttl - 1; + if (hdr.mpls.ttl == 0) { + drop_ctl = 1; + recirc_preserved_drop_reason = IntDropReason_t.DROP_REASON_MPLS_TTL_ZERO; + } + } else { + if (hdr.ipv4.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING) { + if (regular_packet) { + hdr.ipv4.ttl = hdr.ipv4.ttl - 1; + } + if (hdr.ipv4.ttl == 0) { + drop_ctl = 1; + recirc_preserved_drop_reason = IntDropReason_t.DROP_REASON_IP_TTL_ZERO; + } + } else if (hdr.ipv6.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING) { + if (regular_packet) { + hdr.ipv6.hop_limit = hdr.ipv6.hop_limit - 1; + } + if (hdr.ipv6.hop_limit == 0) { + drop_ctl = 1; + recirc_preserved_drop_reason = IntDropReason_t.DROP_REASON_IP_TTL_ZERO; + } + } + } + } +} + +const bit<10> UNSET_FLOW_ID = 0; +control StatsIngress(in lookup_metadata_t lkp, in PortId_t ig_port, out bit<10> stats_flow_id) { + direct_counter(CounterType.packets_and_bytes) flow_counter; + action count(bit<10> flow_id) { + stats_flow_id = flow_id; + flow_counter.count(); + } + table flows { + key = { + lkp.ipv4_src: ternary @name("ipv4_src") ; + lkp.ipv4_dst: ternary @name("ipv4_dst") ; + lkp.ip_proto: ternary @name("ip_proto") ; + lkp.l4_sport: ternary @name("l4_sport") ; + lkp.l4_dport: ternary @name("l4_dport") ; + ig_port : exact @name("ig_port") ; + } + actions = { + count; + } + const default_action = count(UNSET_FLOW_ID); + const size = 1 << 10; + counters = flow_counter; + } + apply { + flows.apply(); + } +} + +control StatsEgress(in bit<10> stats_flow_id, in PortId_t eg_port, in BridgedMdType_t bmd_type) { + direct_counter(CounterType.packets_and_bytes) flow_counter; + action count() { + flow_counter.count(); + } + table flows { + key = { + stats_flow_id: exact @name("stats_flow_id") ; + eg_port : exact @name("eg_port") ; + } + actions = { + count; + } + const default_action = count; + const size = 1 << 10; + counters = flow_counter; + } + apply { + if (bmd_type == BridgedMdType_t.INGRESS_TO_EGRESS) { + flows.apply(); + } + } +} + +control Hasher(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md) { + flow_hash_t max = 0xffffffff; + flow_hash_t base = 0; + apply { + hash(fabric_md.bridged.base.inner_hash, HashAlgorithm.crc32, base, { fabric_md.lkp.ipv4_src, fabric_md.lkp.ipv4_dst, fabric_md.lkp.ip_proto, fabric_md.lkp.l4_sport, fabric_md.lkp.l4_dport }, max); + if (fabric_md.bridged.upf.needs_gtpu_encap) { + hash(fabric_md.ecmp_hash, HashAlgorithm.crc32, base, { fabric_md.bridged.upf.tun_peer_id, fabric_md.bridged.upf.teid }, max); + } else if (hdr.gtpu.isValid()) { + hash(fabric_md.ecmp_hash, HashAlgorithm.crc32, base, { hdr.ipv4.src_addr, hdr.ipv4.dst_addr, hdr.gtpu.teid }, max); + } else if (fabric_md.lkp.is_ipv4) { + fabric_md.ecmp_hash = fabric_md.bridged.base.inner_hash; + } else { + fabric_md.bridged.base.inner_hash = 0; + hash(fabric_md.ecmp_hash, HashAlgorithm.crc32, base, { hdr.ethernet.dst_addr, hdr.ethernet.src_addr, hdr.eth_type.value }, max); + } + } +} + +control IngressSliceTcClassifier(inout ingress_headers_t hdr, inout standard_metadata_t standard_md, inout fabric_ingress_metadata_t fabric_md) { + direct_counter(CounterType.packets) classifier_stats; + action set_slice_id_tc(slice_id_t slice_id, tc_t tc) { + fabric_md.slice_id = slice_id; + fabric_md.tc = tc; + fabric_md.tc_unknown = false; + classifier_stats.count(); + } + action no_classification() { + set_slice_id_tc(DEFAULT_SLICE_ID, DEFAULT_TC); + fabric_md.tc_unknown = true; + } + action trust_dscp() { + fabric_md.slice_id = hdr.ipv4.dscp[4 + 2 - 1:2]; + fabric_md.tc = hdr.ipv4.dscp[2 - 1:0]; + fabric_md.tc_unknown = false; + classifier_stats.count(); + } + table classifier { + key = { + fabric_md.bridged.base.ig_port: ternary @name("ig_port") ; + fabric_md.lkp.ipv4_src : ternary @name("ipv4_src") ; + fabric_md.lkp.ipv4_dst : ternary @name("ipv4_dst") ; + fabric_md.lkp.ip_proto : ternary @name("ip_proto") ; + fabric_md.lkp.l4_sport : ternary @name("l4_sport") ; + fabric_md.lkp.l4_dport : ternary @name("l4_dport") ; + } + actions = { + set_slice_id_tc; + trust_dscp; + @defaultonly no_classification; + } + const default_action = no_classification(); + counters = classifier_stats; + size = 512; + } + apply { + classifier.apply(); + } +} + +control IngressQos(inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout bit<1> drop_ctl) { + bit<2> packet_color = 2w0; + @hidden action use_upf() { + fabric_md.bridged.base.slice_tc = fabric_md.upf_slice_id ++ fabric_md.upf_tc; + } + @hidden action use_default() { + fabric_md.bridged.base.slice_tc = fabric_md.slice_id ++ fabric_md.tc; + } + @hidden table set_slice_tc { + key = { + fabric_md.is_upf_hit: exact; + } + actions = { + use_upf; + use_default; + } + const size = 2; + const entries = { + true : use_upf; + false : use_default; + } + } + meter(1 << 4 + 2, MeterType.bytes) slice_tc_meter; + direct_counter(CounterType.packets) queues_stats; + action set_queue(QueueId_t qid) { + queues_stats.count(); + } + action meter_drop() { + drop_ctl = 1; + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_INGRESS_QOS_METER; + queues_stats.count(); + } + table queues { + key = { + fabric_md.bridged.base.slice_tc: exact @name("slice_tc") ; + packet_color : ternary @name("color") ; + } + actions = { + set_queue; + meter_drop; + } + const default_action = set_queue(QUEUE_ID_BEST_EFFORT); + counters = queues_stats; + size = 1 << 4 + 2 + 1; + } + action set_default_tc(tc_t tc) { + fabric_md.bridged.base.slice_tc = fabric_md.bridged.base.slice_tc[4 + 2 - 1:2] ++ tc; + } + table default_tc { + key = { + fabric_md.bridged.base.slice_tc: ternary @name("slice_tc") ; + fabric_md.tc_unknown : exact @name("tc_unknown") ; + } + actions = { + set_default_tc; + @defaultonly nop; + } + const default_action = nop; + size = 1 << 4; + } + apply { + set_slice_tc.apply(); + default_tc.apply(); + if (fabric_md.upf_meter_color != MeterColor_t.RED) { + slice_tc_meter.execute_meter((bit<32>)fabric_md.bridged.base.slice_tc, packet_color); + } else { + packet_color = MeterColor_t.RED; + } + queues.apply(); + } +} + +control EgressDscpRewriter(inout fabric_egress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout ingress_headers_t hdr) { + bit<6> tmp_dscp = fabric_md.bridged.base.slice_tc; + action rewrite() { + } + action clear() { + tmp_dscp = 0; + } + table rewriter { + key = { + standard_md.egress_port: exact @name("eg_port") ; + } + actions = { + rewrite; + clear; + @defaultonly nop; + } + const default_action = nop; + size = 512; + } + apply { + if (rewriter.apply().hit) { + if (hdr.ipv4.isValid()) { + hdr.ipv4.dscp = tmp_dscp; + } + } + } +} + +control FabricVerifyChecksum(inout v1model_header_t hdr, inout fabric_v1model_metadata_t meta) { + apply { + verify_checksum(hdr.ingress.ipv4.isValid(), { hdr.ingress.ipv4.version, hdr.ingress.ipv4.ihl, hdr.ingress.ipv4.dscp, hdr.ingress.ipv4.ecn, hdr.ingress.ipv4.total_len, hdr.ingress.ipv4.identification, hdr.ingress.ipv4.flags, hdr.ingress.ipv4.frag_offset, hdr.ingress.ipv4.ttl, hdr.ingress.ipv4.protocol, hdr.ingress.ipv4.src_addr, hdr.ingress.ipv4.dst_addr }, hdr.ingress.ipv4.hdr_checksum, HashAlgorithm.csum16); + verify_checksum(hdr.ingress.inner_ipv4.isValid(), { hdr.ingress.inner_ipv4.version, hdr.ingress.inner_ipv4.ihl, hdr.ingress.inner_ipv4.dscp, hdr.ingress.inner_ipv4.ecn, hdr.ingress.inner_ipv4.total_len, hdr.ingress.inner_ipv4.identification, hdr.ingress.inner_ipv4.flags, hdr.ingress.inner_ipv4.frag_offset, hdr.ingress.inner_ipv4.ttl, hdr.ingress.inner_ipv4.protocol, hdr.ingress.inner_ipv4.src_addr, hdr.ingress.inner_ipv4.dst_addr }, hdr.ingress.inner_ipv4.hdr_checksum, HashAlgorithm.csum16); + } +} + +control FabricComputeChecksum(inout v1model_header_t hdr, inout fabric_v1model_metadata_t fabric_md) { + apply { + update_checksum(hdr.ingress.ipv4.isValid(), { hdr.ingress.ipv4.version, hdr.ingress.ipv4.ihl, hdr.ingress.ipv4.dscp, hdr.ingress.ipv4.ecn, hdr.ingress.ipv4.total_len, hdr.ingress.ipv4.identification, hdr.ingress.ipv4.flags, hdr.ingress.ipv4.frag_offset, hdr.ingress.ipv4.ttl, hdr.ingress.ipv4.protocol, hdr.ingress.ipv4.src_addr, hdr.ingress.ipv4.dst_addr }, hdr.ingress.ipv4.hdr_checksum, HashAlgorithm.csum16); + update_checksum(hdr.ingress.inner_ipv4.isValid(), { hdr.ingress.inner_ipv4.version, hdr.ingress.inner_ipv4.ihl, hdr.ingress.inner_ipv4.dscp, hdr.ingress.inner_ipv4.ecn, hdr.ingress.inner_ipv4.total_len, hdr.ingress.inner_ipv4.identification, hdr.ingress.inner_ipv4.flags, hdr.ingress.inner_ipv4.frag_offset, hdr.ingress.inner_ipv4.ttl, hdr.ingress.inner_ipv4.protocol, hdr.ingress.inner_ipv4.src_addr, hdr.ingress.inner_ipv4.dst_addr }, hdr.ingress.inner_ipv4.hdr_checksum, HashAlgorithm.csum16); + update_checksum(hdr.egress.report_ipv4.isValid(), { hdr.egress.report_ipv4.version, hdr.egress.report_ipv4.ihl, hdr.egress.report_ipv4.dscp, hdr.egress.report_ipv4.ecn, hdr.egress.report_ipv4.total_len, hdr.egress.report_ipv4.identification, hdr.egress.report_ipv4.flags, hdr.egress.report_ipv4.frag_offset, hdr.egress.report_ipv4.ttl, hdr.egress.report_ipv4.protocol, hdr.egress.report_ipv4.src_addr, hdr.egress.report_ipv4.dst_addr }, hdr.egress.report_ipv4.hdr_checksum, HashAlgorithm.csum16); + } +} + +control PacketIoIngress(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout bool skip_egress, inout standard_metadata_t standard_md, inout FabricPortId_t recirc_preserved_egress_port) { + @hidden action do_packet_out() { + standard_md.egress_spec = (PortId_t)hdr.packet_out.egress_port; + recirc_preserved_egress_port = hdr.packet_out.egress_port; + fabric_md.egress_port_set = true; + hdr.packet_out.setInvalid(); + skip_egress = true; + fabric_md.bridged.setInvalid(); + exit; + } + apply { + if (hdr.packet_out.isValid()) { + do_packet_out(); + } + } +} + +control PacketIoEgress(inout ingress_headers_t hdr, inout fabric_egress_metadata_t fabric_md, inout standard_metadata_t standard_md, in FabricPortId_t preserved_ig_port) { + action set_switch_info(FabricPortId_t cpu_port) { + fabric_md.cpu_port = (PortId_t)cpu_port; + } + table switch_info { + actions = { + set_switch_info; + @defaultonly nop; + } + default_action = nop; + const size = 1; + } + apply { + switch_info.apply(); + if (standard_md.egress_port == fabric_md.cpu_port) { + hdr.packet_in.setValid(); + hdr.packet_in.ingress_port = preserved_ig_port; + hdr.fake_ethernet.setInvalid(); + exit; + } + if (hdr.fake_ethernet.isValid() && hdr.fake_ethernet.ether_type == ETHERTYPE_CPU_LOOPBACK_EGRESS) { + fabric_md.pkt_length = (bit<16>)standard_md.packet_length - 14; + } + } +} + +control PreNext(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md) { + direct_counter(CounterType.packets_and_bytes) next_mpls_counter; + action set_mpls_label(mpls_label_t label) { + fabric_md.bridged.base.mpls_label = label; + next_mpls_counter.count(); + } + table next_mpls { + key = { + fabric_md.next_id: exact @name("next_id") ; + } + actions = { + set_mpls_label; + @defaultonly nop; + } + const default_action = nop(); + counters = next_mpls_counter; + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) next_vlan_counter; + action set_vlan(vlan_id_t vlan_id) { + fabric_md.bridged.base.vlan_id = vlan_id; + next_vlan_counter.count(); + } + table next_vlan { + key = { + fabric_md.next_id: exact @name("next_id") ; + } + actions = { + set_vlan; + @defaultonly nop; + } + const default_action = nop(); + counters = next_vlan_counter; + size = 1024; + } + apply { + next_mpls.apply(); + next_vlan.apply(); + } +} + +control Filtering(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md) { + direct_counter(CounterType.packets_and_bytes) ingress_port_vlan_counter; + action deny() { + fabric_md.skip_forwarding = true; + fabric_md.skip_next = true; + fabric_md.ig_port_type = PortType_t.UNKNOWN; + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_PORT_VLAN_MAPPING_MISS; + ingress_port_vlan_counter.count(); + } + action permit(PortType_t port_type) { + fabric_md.ig_port_type = port_type; + ingress_port_vlan_counter.count(); + } + action permit_with_internal_vlan(vlan_id_t vlan_id, PortType_t port_type) { + fabric_md.bridged.base.vlan_id = vlan_id; + permit(port_type); + } + table ingress_port_vlan { + key = { + fabric_md.bridged.base.ig_port: exact @name("ig_port") ; + hdr.vlan_tag.isValid() : exact @name("vlan_is_valid") ; + hdr.vlan_tag.vlan_id : ternary @name("vlan_id") ; + } + actions = { + deny(); + permit(); + permit_with_internal_vlan(); + } + const default_action = deny(); + counters = ingress_port_vlan_counter; + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) fwd_classifier_counter; + action set_forwarding_type(fwd_type_t fwd_type) { + fabric_md.bridged.base.fwd_type = fwd_type; + fwd_classifier_counter.count(); + } + counter(8, CounterType.packets_and_bytes) fwd_type_counter; + table fwd_classifier { + key = { + fabric_md.bridged.base.ig_port : exact @name("ig_port") ; + fabric_md.lkp.eth_dst : ternary @name("eth_dst") ; + fabric_md.lkp.eth_type : ternary @name("eth_type") ; + fabric_md.bridged.base.ip_eth_type: exact @name("ip_eth_type") ; + } + actions = { + set_forwarding_type; + } + const default_action = set_forwarding_type(FWD_BRIDGING); + counters = fwd_classifier_counter; + size = 1024; + } + apply { + ingress_port_vlan.apply(); + fwd_classifier.apply(); + fwd_type_counter.count((bit<32>)fabric_md.bridged.base.fwd_type); + } +} + +control Forwarding(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout bit<1> drop_ctl) { + action set_int_drop_reason(bit<8> drop_reason) { + fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason; + } + @hidden action set_next_id(next_id_t next_id) { + fabric_md.next_id = next_id; + } + direct_counter(CounterType.packets_and_bytes) bridging_counter; + action set_next_id_bridging(next_id_t next_id) { + set_next_id(next_id); + bridging_counter.count(); + } + table bridging { + key = { + fabric_md.bridged.base.vlan_id: exact @name("vlan_id") ; + hdr.ethernet.dst_addr : ternary @name("eth_dst") ; + } + actions = { + set_next_id_bridging; + @defaultonly set_int_drop_reason; + } + const default_action = set_int_drop_reason(IntDropReason_t.DROP_REASON_BRIDGING_MISS); + counters = bridging_counter; + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) mpls_counter; + action pop_mpls_and_next(next_id_t next_id) { + hdr.mpls.setInvalid(); + hdr.eth_type.value = fabric_md.bridged.base.ip_eth_type; + fabric_md.bridged.base.mpls_label = 0; + set_next_id(next_id); + mpls_counter.count(); + } + table mpls { + key = { + fabric_md.bridged.base.mpls_label: exact @name("mpls_label") ; + } + actions = { + pop_mpls_and_next; + @defaultonly set_int_drop_reason; + } + const default_action = set_int_drop_reason(IntDropReason_t.DROP_REASON_MPLS_MISS); + counters = mpls_counter; + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) routing_v4_counter; + action set_next_id_routing_v4(next_id_t next_id) { + set_next_id(next_id); + routing_v4_counter.count(); + } + action nop_routing_v4() { + routing_v4_counter.count(); + } + action drop_routing_v4() { + fabric_md.skip_next = true; + routing_v4_counter.count(); + drop_ctl = 1; + } + table routing_v4 { + key = { + fabric_md.routing_ipv4_dst: lpm @name("ipv4_dst") ; + } + actions = { + set_next_id_routing_v4; + nop_routing_v4; + drop_routing_v4; + @defaultonly set_int_drop_reason; + } + default_action = set_int_drop_reason(IntDropReason_t.DROP_REASON_ROUTING_V4_MISS); + counters = routing_v4_counter; + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) routing_v6_counter; + action set_next_id_routing_v6(next_id_t next_id) { + set_next_id(next_id); + routing_v6_counter.count(); + } + action drop_routing_v6() { + fabric_md.skip_next = true; + routing_v6_counter.count(); + drop_ctl = 1; + } + table routing_v6 { + key = { + hdr.ipv6.dst_addr: lpm @name("ipv6_dst") ; + } + actions = { + set_next_id_routing_v6; + drop_routing_v6; + @defaultonly set_int_drop_reason; + } + default_action = set_int_drop_reason(IntDropReason_t.DROP_REASON_ROUTING_V6_MISS); + counters = routing_v6_counter; + size = 1024; + } + apply { + if (hdr.ethernet.isValid() && fabric_md.bridged.base.fwd_type == FWD_BRIDGING) { + bridging.apply(); + } else if (hdr.mpls.isValid() && fabric_md.bridged.base.fwd_type == FWD_MPLS) { + mpls.apply(); + } else if (fabric_md.lkp.is_ipv4 && (fabric_md.bridged.base.fwd_type == FWD_IPV4_UNICAST || fabric_md.bridged.base.fwd_type == FWD_IPV4_MULTICAST)) { + routing_v4.apply(); + } else if (hdr.ipv6.isValid() && fabric_md.bridged.base.fwd_type == FWD_IPV6_UNICAST) { + routing_v6.apply(); + } + } +} + +control LookupMdInit(in ingress_headers_t hdr, out lookup_metadata_t lkp_md) { + apply { + lkp_md.eth_dst = hdr.ethernet.dst_addr; + lkp_md.eth_src = hdr.ethernet.src_addr; + lkp_md.eth_type = hdr.eth_type.value; + lkp_md.vlan_id = 0; + if (hdr.vlan_tag.isValid()) { + lkp_md.vlan_id = hdr.vlan_tag.vlan_id; + } + lkp_md.is_ipv4 = false; + lkp_md.ipv4_src = 0; + lkp_md.ipv4_dst = 0; + lkp_md.ip_proto = 0; + lkp_md.l4_sport = 0; + lkp_md.l4_dport = 0; + lkp_md.icmp_type = 0; + lkp_md.icmp_code = 0; + if (hdr.inner_ipv4.isValid()) { + lkp_md.is_ipv4 = true; + lkp_md.ipv4_src = hdr.inner_ipv4.src_addr; + lkp_md.ipv4_dst = hdr.inner_ipv4.dst_addr; + lkp_md.ip_proto = hdr.inner_ipv4.protocol; + if (hdr.inner_tcp.isValid()) { + lkp_md.l4_sport = hdr.inner_tcp.sport; + lkp_md.l4_dport = hdr.inner_tcp.dport; + } else if (hdr.inner_udp.isValid()) { + lkp_md.l4_sport = hdr.inner_udp.sport; + lkp_md.l4_dport = hdr.inner_udp.dport; + } else if (hdr.inner_icmp.isValid()) { + lkp_md.icmp_type = hdr.inner_icmp.icmp_type; + lkp_md.icmp_code = hdr.inner_icmp.icmp_code; + } + } else if (hdr.ipv4.isValid()) { + lkp_md.is_ipv4 = true; + lkp_md.ipv4_src = hdr.ipv4.src_addr; + lkp_md.ipv4_dst = hdr.ipv4.dst_addr; + lkp_md.ip_proto = hdr.ipv4.protocol; + if (hdr.tcp.isValid()) { + lkp_md.l4_sport = hdr.tcp.sport; + lkp_md.l4_dport = hdr.tcp.dport; + } else if (hdr.udp.isValid()) { + lkp_md.l4_sport = hdr.udp.sport; + lkp_md.l4_dport = hdr.udp.dport; + } else if (hdr.icmp.isValid()) { + lkp_md.icmp_type = hdr.icmp.icmp_type; + lkp_md.icmp_code = hdr.icmp.icmp_code; + } + } + } +} + +control UpfIngress(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout bool do_upf_uplink_recirc, inout bit<1> drop_ctl) { + counter(4096, CounterType.packets_and_bytes) terminations_counter; + meter(20000, MeterType.bytes) session_meter; + meter(20000, MeterType.bytes) app_meter; + bool is_uplink = false; + bool term_hit = false; + bool sess_hit = false; + bit<32> app_ipv4_addr = 0; + l4_port_t app_l4_port = 0; + bit<8> app_ip_proto = 0; + bit<8> internal_app_id = DEFAULT_APP_ID; + ue_session_id_t ue_session_id = 0; + session_meter_idx_t session_meter_idx_internal = DEFAULT_SESSION_METER_IDX; + app_meter_idx_t app_meter_idx_internal = DEFAULT_APP_METER_IDX; + @hidden action _drop_common() { + drop_ctl = 1; + fabric_md.skip_forwarding = true; + fabric_md.skip_next = true; + } + @hidden action _term_hit(upf_ctr_idx_t ctr_id) { + fabric_md.bridged.upf.upf_ctr_id = ctr_id; + term_hit = true; + } + @hidden action _set_field_encap(teid_t teid, bit<6> qfi) { + fabric_md.bridged.upf.needs_gtpu_encap = true; + fabric_md.bridged.upf.teid = teid; + fabric_md.bridged.upf.qfi = qfi; + } + @hidden action _gtpu_decap() { + fabric_md.bridged.base.ip_eth_type = ETHERTYPE_IPV4; + fabric_md.routing_ipv4_dst = hdr.inner_ipv4.dst_addr; + hdr.ipv4 = hdr.inner_ipv4; + hdr.inner_ipv4.setInvalid(); + hdr.udp = hdr.inner_udp; + hdr.inner_udp.setInvalid(); + hdr.tcp = hdr.inner_tcp; + hdr.inner_tcp.setInvalid(); + hdr.icmp = hdr.inner_icmp; + hdr.inner_icmp.setInvalid(); + hdr.gtpu.setInvalid(); + hdr.gtpu_options.setInvalid(); + hdr.gtpu_ext_psc.setInvalid(); + fabric_md.bridged.base.encap_presence = EncapPresence.NONE; + } + @hidden action _iface_common(slice_id_t slice_id) { + fabric_md.bridged.upf.skip_upf = false; + fabric_md.is_upf_hit = true; + fabric_md.upf_slice_id = slice_id; + } + action iface_access(slice_id_t slice_id) { + _iface_common(slice_id); + } + action iface_core(slice_id_t slice_id) { + _iface_common(slice_id); + } + action iface_dbuf(slice_id_t slice_id) { + _iface_common(slice_id); + _gtpu_decap(); + } + action iface_miss() { + fabric_md.bridged.upf.skip_upf = true; + } + table interfaces { + key = { + hdr.ipv4.dst_addr : lpm @name("ipv4_dst_addr") ; + hdr.gtpu.isValid(): exact @name("gtpu_is_valid") ; + } + actions = { + iface_access; + iface_core; + iface_dbuf; + @defaultonly iface_miss; + } + const default_action = iface_miss(); + const size = 64; + } + action set_uplink_session_miss() { + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_UL_SESSION_MISS; + } + action set_uplink_session_drop() { + sess_hit = true; + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_UL_SESSION_DROP; + } + action set_downlink_session_miss() { + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_DL_SESSION_MISS; + } + action set_downlink_session_drop() { + sess_hit = true; + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_DL_SESSION_DROP; + } + action set_downlink_session(tun_peer_id_t tun_peer_id, session_meter_idx_t session_meter_idx) { + sess_hit = true; + ue_session_id = fabric_md.routing_ipv4_dst; + session_meter_idx_internal = session_meter_idx; + fabric_md.bridged.upf.tun_peer_id = tun_peer_id; + } + action set_downlink_session_buf(tun_peer_id_t tun_peer_id, session_meter_idx_t session_meter_idx) { + sess_hit = true; + ue_session_id = fabric_md.routing_ipv4_dst; + session_meter_idx_internal = session_meter_idx; + fabric_md.bridged.upf.tun_peer_id = tun_peer_id; + fabric_md.bridged.upf.skip_egress_upf_ctr = true; + } + action set_downlink_session_buf_drop() { + sess_hit = true; + ue_session_id = fabric_md.routing_ipv4_dst; + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_DL_SESSION_DROP_BUFF; + } + action set_uplink_session(session_meter_idx_t session_meter_idx) { + sess_hit = true; + ue_session_id = fabric_md.lkp.ipv4_src; + session_meter_idx_internal = session_meter_idx; + _gtpu_decap(); + } + table downlink_sessions { + key = { + fabric_md.routing_ipv4_dst: exact @name("ue_addr") ; + } + actions = { + set_downlink_session; + set_downlink_session_buf; + set_downlink_session_buf_drop; + set_downlink_session_drop; + @defaultonly set_downlink_session_miss; + } + size = 100000; + const default_action = set_downlink_session_miss(); + } + table uplink_sessions { + key = { + hdr.ipv4.dst_addr: exact @name("tunnel_ipv4_dst") ; + hdr.gtpu.teid : exact @name("teid") ; + } + actions = { + set_uplink_session; + set_uplink_session_drop; + @defaultonly set_uplink_session_miss; + } + size = 100000 * 1; + const default_action = set_uplink_session_miss(); + } + action uplink_drop_miss() { + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_UL_TERMINATION_MISS; + } + action downlink_drop_miss() { + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_DL_TERMINATION_MISS; + } + action uplink_drop(upf_ctr_idx_t ctr_id) { + _drop_common(); + _term_hit(ctr_id); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_UL_TERMINATION_DROP; + } + action downlink_drop(upf_ctr_idx_t ctr_id) { + _drop_common(); + _term_hit(ctr_id); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_DL_TERMINATION_DROP; + } + action app_fwd(upf_ctr_idx_t ctr_id, tc_t tc, app_meter_idx_t app_meter_idx) { + _term_hit(ctr_id); + fabric_md.upf_tc = tc; + app_meter_idx_internal = app_meter_idx; + fabric_md.tc_unknown = false; + } + action downlink_fwd_encap(upf_ctr_idx_t ctr_id, tc_t tc, teid_t teid, bit<6> qfi, app_meter_idx_t app_meter_idx) { + app_fwd(ctr_id, tc, app_meter_idx); + _set_field_encap(teid, qfi); + } + table uplink_terminations { + key = { + ue_session_id : exact @name("ue_session_id") ; + internal_app_id: exact @name("app_id") ; + } + actions = { + app_fwd; + uplink_drop; + @defaultonly uplink_drop_miss; + } + const default_action = uplink_drop_miss(); + const size = 100000; + } + table downlink_terminations { + key = { + ue_session_id : exact @name("ue_session_id") ; + internal_app_id: exact @name("app_id") ; + } + actions = { + downlink_fwd_encap; + downlink_drop; + @defaultonly downlink_drop_miss; + } + const default_action = downlink_drop_miss(); + const size = 100000; + } + action set_routing_ipv4_dst(ipv4_addr_t tun_dst_addr) { + fabric_md.routing_ipv4_dst = tun_dst_addr; + } + table ig_tunnel_peers { + key = { + fabric_md.bridged.upf.tun_peer_id: exact @name("tun_peer_id") ; + } + actions = { + set_routing_ipv4_dst; + @defaultonly nop; + } + const default_action = nop(); + const size = 256; + } + action set_app_id(bit<8> app_id) { + internal_app_id = app_id; + } + table applications { + key = { + fabric_md.upf_slice_id: exact @name("slice_id") ; + app_ipv4_addr : lpm @name("app_ipv4_addr") ; + app_l4_port : range @name("app_l4_port") ; + app_ip_proto : ternary @name("app_ip_proto") ; + } + actions = { + set_app_id; + @defaultonly nop; + } + const default_action = nop(); + size = 5 * 1; + } + direct_counter(CounterType.packets) recirc_stats; + action recirc_allow() { + standard_md.egress_spec = FAKE_V1MODEL_RECIRC_PORT; + fabric_md.bridged.base.vlan_id = DEFAULT_VLAN_ID; + do_upf_uplink_recirc = true; + fabric_md.egress_port_set = true; + fabric_md.skip_forwarding = true; + fabric_md.skip_next = true; + recirc_stats.count(); + } + action recirc_deny() { + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_UPLINK_RECIRC_DENY; + do_upf_uplink_recirc = false; + fabric_md.skip_forwarding = true; + fabric_md.skip_next = true; + recirc_stats.count(); + } + action recirc_miss() { + recirc_stats.count(); + } + table uplink_recirc_rules { + key = { + fabric_md.lkp.ipv4_src: ternary @name("ipv4_src") ; + fabric_md.lkp.ipv4_dst: ternary @name("ipv4_dst") ; + } + actions = { + recirc_allow; + recirc_deny; + @defaultonly recirc_miss; + } + const default_action = recirc_miss; + size = 64; + counters = recirc_stats; + } + apply { + if (hdr.ipv4.isValid()) { + switch (interfaces.apply().action_run) { + iface_access: { + is_uplink = true; + app_ipv4_addr = fabric_md.lkp.ipv4_dst; + app_l4_port = fabric_md.lkp.l4_dport; + app_ip_proto = fabric_md.lkp.ip_proto; + if (fabric_md.bridged.base.encap_presence != EncapPresence.NONE) { + uplink_sessions.apply(); + } + } + iface_core: { + app_ipv4_addr = fabric_md.lkp.ipv4_src; + app_l4_port = fabric_md.lkp.l4_sport; + app_ip_proto = fabric_md.lkp.ip_proto; + downlink_sessions.apply(); + } + iface_dbuf: { + app_ipv4_addr = fabric_md.lkp.ipv4_src; + app_l4_port = fabric_md.lkp.l4_sport; + app_ip_proto = fabric_md.lkp.ip_proto; + downlink_sessions.apply(); + } + } + applications.apply(); + if (sess_hit) { + if (is_uplink) { + uplink_terminations.apply(); + uplink_recirc_rules.apply(); + } else { + downlink_terminations.apply(); + } + } else { + fabric_md.bridged.upf.skip_egress_upf_ctr = true; + } + app_meter.execute_meter((bit<32>)app_meter_idx_internal, fabric_md.upf_meter_color); + if (fabric_md.upf_meter_color != MeterColor_t.RED) { + session_meter.execute_meter((bit<32>)session_meter_idx_internal, fabric_md.upf_meter_color); + } + ig_tunnel_peers.apply(); + if (term_hit) { + terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id); + } + } + } +} + +control UpfEgress(inout ingress_headers_t hdr, inout fabric_egress_metadata_t fabric_md) { + counter(4096, CounterType.packets_and_bytes) terminations_counter; + action load_tunnel_params(l4_port_t tunnel_src_port, ipv4_addr_t tunnel_src_addr, ipv4_addr_t tunnel_dst_addr) { + hdr.ipv4.src_addr = tunnel_src_addr; + hdr.ipv4.dst_addr = tunnel_dst_addr; + hdr.udp.sport = tunnel_src_port; + } + table eg_tunnel_peers { + key = { + fabric_md.bridged.upf.tun_peer_id: exact @name("tun_peer_id") ; + } + actions = { + load_tunnel_params; + @defaultonly nop; + } + const default_action = nop(); + const size = 256; + } + @hidden action _encap_initialize() { + hdr.ipv4.version = 4w4; + hdr.ipv4.ihl = 4w5; + hdr.ipv4.dscp = 0; + hdr.ipv4.ecn = 0; + hdr.ipv4.identification = 0x1513; + hdr.ipv4.flags = 0; + hdr.ipv4.frag_offset = 0; + hdr.ipv4.ttl = DEFAULT_IPV4_TTL; + hdr.ipv4.protocol = PROTO_UDP; + hdr.udp.dport = GTPU_UDP_PORT; + hdr.gtpu.version = GTP_V1; + hdr.gtpu.pt = GTP_PROTOCOL_TYPE_GTP; + hdr.gtpu.spare = 0; + hdr.gtpu.seq_flag = 0; + hdr.gtpu.npdu_flag = 0; + hdr.gtpu.msgtype = GTPU_GPDU; + hdr.gtpu.teid = fabric_md.bridged.upf.teid; + hdr.gtpu_options.seq_num = 0; + hdr.gtpu_options.n_pdu_num = 0; + hdr.gtpu_options.next_ext = GTPU_NEXT_EXT_PSC; + hdr.gtpu_ext_psc.len = GTPU_EXT_PSC_LEN; + hdr.gtpu_ext_psc.type = GTPU_EXT_PSC_TYPE_DL; + hdr.gtpu_ext_psc.spare0 = 0; + hdr.gtpu_ext_psc.ppp = 0; + hdr.gtpu_ext_psc.rqi = 0; + hdr.gtpu_ext_psc.next_ext = GTPU_NEXT_EXT_NONE; + } + @hidden action _encap_common() { + hdr.inner_ipv4.setValid(); + hdr.inner_ipv4 = hdr.ipv4; + hdr.udp.setValid(); + hdr.gtpu.setValid(); + _encap_initialize(); + } + action gtpu_only() { + _encap_common(); + hdr.ipv4.total_len = 20 + 8 + 8 + hdr.inner_ipv4.total_len; + hdr.udp.len = 8 + 8 + hdr.inner_ipv4.total_len; + hdr.gtpu.msglen = hdr.inner_ipv4.total_len; + fabric_md.int_report_md.encap_presence = EncapPresence.GTPU_ONLY; + } + action gtpu_with_psc() { + hdr.gtpu_options.setValid(); + hdr.gtpu_ext_psc.setValid(); + _encap_common(); + hdr.ipv4.total_len = 20 + 8 + 8 + 4 + 4 + hdr.inner_ipv4.total_len; + hdr.udp.len = 8 + 8 + 4 + 4 + hdr.inner_ipv4.total_len; + hdr.gtpu.msglen = 4 + 4 + hdr.inner_ipv4.total_len; + hdr.gtpu.ex_flag = 1; + hdr.gtpu_ext_psc.qfi = fabric_md.bridged.upf.qfi; + fabric_md.int_report_md.encap_presence = EncapPresence.GTPU_WITH_PSC; + } + table gtpu_encap { + actions = { + gtpu_only; + gtpu_with_psc; + } + default_action = gtpu_only(); + const size = 1; + } + apply { + if (!fabric_md.bridged.upf.skip_upf) { + if (fabric_md.bridged.upf.needs_gtpu_encap) { + if (hdr.udp.isValid()) { + hdr.inner_udp.setValid(); + hdr.inner_udp = hdr.udp; + hdr.udp.setInvalid(); + } + if (hdr.tcp.isValid()) { + hdr.inner_tcp.setValid(); + hdr.inner_tcp = hdr.tcp; + hdr.tcp.setInvalid(); + } + if (hdr.icmp.isValid()) { + hdr.inner_icmp.setValid(); + hdr.inner_icmp = hdr.icmp; + hdr.icmp.setInvalid(); + } + gtpu_encap.apply(); + eg_tunnel_peers.apply(); + } + if (!fabric_md.bridged.upf.skip_egress_upf_ctr) { + terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id); + } + } + } +} + +control IntWatchlist(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout IntReportType_t recirc_preserved_report_type) { + direct_counter(CounterType.packets_and_bytes) watchlist_counter; + action mark_to_report() { + fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_FLOW; + recirc_preserved_report_type = INT_REPORT_TYPE_FLOW; + watchlist_counter.count(); + } + action no_report() { + fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_NO_REPORT; + recirc_preserved_report_type = INT_REPORT_TYPE_NO_REPORT; + } + action no_report_collector() { + fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_NO_REPORT; + } + table watchlist { + key = { + fabric_md.lkp.is_ipv4 : exact @name("ipv4_valid") ; + fabric_md.lkp.ipv4_src: ternary @name("ipv4_src") ; + fabric_md.lkp.ipv4_dst: ternary @name("ipv4_dst") ; + fabric_md.lkp.ip_proto: ternary @name("ip_proto") ; + fabric_md.lkp.l4_sport: range @name("l4_sport") ; + fabric_md.lkp.l4_dport: range @name("l4_dport") ; + } + actions = { + mark_to_report; + no_report_collector; + @defaultonly no_report(); + } + const default_action = no_report(); + const size = 64; + counters = watchlist_counter; + } + apply { + watchlist.apply(); + } +} + +control IntIngress(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout bit<1> drop_ctl) { + direct_counter(CounterType.packets_and_bytes) drop_report_counter; + @hidden action report_drop() { + fabric_md.bridged.bmd_type = BridgedMdType_t.INT_INGRESS_DROP; + fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_DROP; + fabric_md.bridged.base.vlan_id = DEFAULT_VLAN_ID; + fabric_md.bridged.base.mpls_label = 0; + fabric_md.bridged.upf.skip_upf = true; + drop_ctl = 0; + standard_md.egress_spec = FAKE_V1MODEL_RECIRC_PORT; + drop_report_counter.count(); + } + @hidden table drop_report { + key = { + fabric_md.bridged.int_bmd.report_type: exact @name("int_report_type") ; + drop_ctl : exact @name("drop_ctl") ; + fabric_md.punt_to_cpu : exact @name("punt_to_cpu") ; + fabric_md.egress_port_set : exact @name("egress_port_set") ; + standard_md.mcast_grp : ternary @name("mcast_group_id") ; + } + actions = { + report_drop; + @defaultonly nop; + } + const entries = { + (INT_REPORT_TYPE_FLOW, 1, false, false, default) : report_drop(); + (INT_REPORT_TYPE_FLOW, 1, false, true, default) : report_drop(); + (INT_REPORT_TYPE_FLOW, 0, false, false, 0) : report_drop(); + } + const default_action = nop(); + counters = drop_report_counter; + } + apply { + fabric_md.bridged.int_bmd.egress_port = standard_md.egress_spec; + fabric_md.bridged.int_bmd.queue_id = 0; + drop_report.apply(); + } +} + +control IntEgress(inout v1model_header_t hdr_v1model, inout fabric_v1model_metadata_t fabric_v1model, inout standard_metadata_t standard_md) { + const bit<48> DEFAULT_TIMESTAMP_MASK = 0xffffc0000000; + const bit<32> DEFAULT_HOP_LATENCY_MASK = 0xffffff00; + egress_headers_t hdr = hdr_v1model.egress; + fabric_egress_metadata_t fabric_md = fabric_v1model.egress; + direct_counter(CounterType.packets_and_bytes) report_counter; + direct_counter(CounterType.packets_and_bytes) int_metadata_counter; + QueueId_t egress_qid = 0; + @hidden register>(1024) seq_number; + @hidden action get_seq_number(in bit<32> seq_number_idx, out bit<32> result) { + bit<32> reg = 0; + seq_number.read(reg, seq_number_idx); + reg = reg + 1; + result = reg; + seq_number.write(seq_number_idx, reg); + } + action check_quota() { + } + action reset_quota() { + } + table queue_latency_thresholds { + key = { + egress_qid : exact @name("egress_qid") ; + fabric_md.int_md.hop_latency[31:16]: range @name("hop_latency_upper") ; + fabric_md.int_md.hop_latency[15:0] : range @name("hop_latency_lower") ; + } + actions = { + check_quota; + reset_quota; + @defaultonly nop; + } + default_action = nop(); + const size = 32 * 4; + } + action set_config(bit<32> hop_latency_mask, bit<48> timestamp_mask) { + fabric_md.int_md.hop_latency = fabric_md.int_md.hop_latency & hop_latency_mask; + fabric_md.int_md.timestamp = fabric_md.int_md.timestamp & timestamp_mask; + } + table config { + actions = { + @defaultonly set_config; + } + default_action = set_config(DEFAULT_HOP_LATENCY_MASK, DEFAULT_TIMESTAMP_MASK); + const size = 1; + } + @hidden action _report_encap_common(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, bit<32> switch_id) { + random(hdr.report_ipv4.identification, 0, 0xffff); + hdr.report_ipv4.src_addr = src_ip; + hdr.report_ipv4.dst_addr = mon_ip; + hdr.report_udp.dport = mon_port; + get_seq_number((bit<32>)hdr.report_fixed_header.hw_id, hdr.report_fixed_header.seq_no); + hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type; + hdr.common_report_header.switch_id = switch_id; + hdr.common_report_header.pad1 = 0; + hdr.common_report_header.pad2 = 0; + hdr.common_report_header.pad3 = 0; + hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type; + fabric_v1model.int_mirror_type = (bit<3>)FabricMirrorType_t.INVALID; + report_counter.count(); + } + action do_local_report_encap(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, bit<32> switch_id) { + _report_encap_common(src_ip, mon_ip, mon_port, switch_id); + hdr.report_eth_type.value = ETHERTYPE_INT_WIP_IPV4; + hdr.report_fixed_header.nproto = NPROTO_TELEMETRY_SWITCH_LOCAL_HEADER; + hdr.local_report_header.setValid(); + } + action do_local_report_encap_mpls(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, mpls_label_t mon_label, bit<32> switch_id) { + do_local_report_encap(src_ip, mon_ip, mon_port, switch_id); + hdr.report_eth_type.value = ETHERTYPE_INT_WIP_MPLS; + hdr.report_mpls.setValid(); + hdr.report_mpls.tc = 0; + hdr.report_mpls.bos = 0; + hdr.report_mpls.ttl = DEFAULT_MPLS_TTL; + hdr.report_mpls.label = mon_label; + } + action do_drop_report_encap(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, bit<32> switch_id) { + _report_encap_common(src_ip, mon_ip, mon_port, switch_id); + hdr.report_eth_type.value = ETHERTYPE_INT_WIP_IPV4; + hdr.report_fixed_header.nproto = NPROTO_TELEMETRY_DROP_HEADER; + hdr.drop_report_header.setValid(); + hdr.local_report_header.setInvalid(); + hdr.drop_report_header.drop_reason = fabric_md.bridged.int_bmd.drop_reason; + } + action do_drop_report_encap_mpls(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, mpls_label_t mon_label, bit<32> switch_id) { + do_drop_report_encap(src_ip, mon_ip, mon_port, switch_id); + hdr.report_eth_type.value = ETHERTYPE_INT_WIP_MPLS; + hdr.report_mpls.setValid(); + hdr.report_mpls.tc = 0; + hdr.report_mpls.bos = 0; + hdr.report_mpls.ttl = DEFAULT_MPLS_TTL; + hdr.report_mpls.label = mon_label; + hdr.report_mpls.label = mon_label; + } + table report { + key = { + fabric_md.int_report_md.bmd_type : exact @name("bmd_type") ; + fabric_md.int_report_md.mirror_type: exact @name("mirror_type") ; + fabric_md.int_report_md.report_type: exact @name("int_report_type") ; + } + actions = { + do_local_report_encap; + do_local_report_encap_mpls; + do_drop_report_encap; + do_drop_report_encap_mpls; + @defaultonly nop(); + } + default_action = nop; + const size = 6; + counters = report_counter; + } + @hidden action init_int_metadata(bit<3> report_type) { + fabric_md.bridged.int_bmd.mirror_session_id = V1MODEL_INT_MIRROR_SESSION; + fabric_md.int_report_md.setValid(); + fabric_v1model.int_mirror_type = (bit<3>)FabricMirrorType_t.INT_REPORT; + fabric_md.int_report_md.bmd_type = BridgedMdType_t.EGRESS_MIRROR; + fabric_md.int_report_md.mirror_type = FabricMirrorType_t.INT_REPORT; + fabric_md.int_report_md.report_type = fabric_md.bridged.int_bmd.report_type; + fabric_md.int_report_md.ig_port = fabric_md.bridged.base.ig_port; + fabric_md.int_report_md.eg_port = (PortId_t)standard_md.egress_port; + fabric_md.int_report_md.queue_id = egress_qid; + fabric_md.int_report_md.queue_occupancy = standard_md.deq_qdepth; + fabric_md.int_report_md.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]; + fabric_md.int_report_md.eg_tstamp = standard_md.egress_global_timestamp[31:0]; + fabric_md.int_report_md.ip_eth_type = fabric_md.bridged.base.ip_eth_type; + fabric_md.int_report_md.flow_hash = fabric_md.bridged.base.inner_hash; + fabric_md.int_report_md.report_type = report_type; + int_metadata_counter.count(); + } + @hidden table int_metadata { + key = { + fabric_md.bridged.int_bmd.report_type: exact @name("int_report_type") ; + fabric_v1model.drop_ctl : exact @name("drop_ctl") ; + fabric_md.int_md.queue_report : exact @name("queue_report") ; + } + actions = { + init_int_metadata; + @defaultonly nop(); + } + const default_action = nop(); + const entries = { + (INT_REPORT_TYPE_FLOW, 0, false) : init_int_metadata(INT_REPORT_TYPE_FLOW); + (INT_REPORT_TYPE_FLOW, 1, false) : init_int_metadata(INT_REPORT_TYPE_DROP); + } + counters = int_metadata_counter; + } + @hidden action adjust_ip_udp_len(bit<16> adjust_ip, bit<16> adjust_udp) { + hdr_v1model.ingress.ipv4.total_len = fabric_md.pkt_length + adjust_ip; + hdr_v1model.ingress.udp.len = fabric_md.pkt_length + adjust_udp; + } + @hidden table adjust_int_report_hdr_length { + key = { + fabric_md.bridged.int_bmd.wip_type: exact @name("is_int_wip") ; + } + actions = { + @defaultonly nop(); + adjust_ip_udp_len; + } + const default_action = nop(); + const entries = { + INT_IS_WIP : adjust_ip_udp_len(INT_WIP_ADJUST_IP_BYTES, INT_WIP_ADJUST_UDP_BYTES); + INT_IS_WIP_WITH_MPLS : adjust_ip_udp_len(INT_WIP_ADJUST_IP_MPLS_BYTES, INT_WIP_ADJUST_UDP_MPLS_BYTES); + } + } + apply { + fabric_md.int_md.hop_latency = standard_md.egress_global_timestamp[31:0] - fabric_md.bridged.base.ig_tstamp[31:0]; + fabric_md.int_md.timestamp = standard_md.egress_global_timestamp; + queue_latency_thresholds.apply(); + config.apply(); + hdr.report_fixed_header.hw_id = 4w0 ++ standard_md.egress_spec[8:7]; + if (fabric_md.int_report_md.isValid()) { + report.apply(); + } else { + if (int_metadata.apply().hit) { + clone_preserving_field_list(CloneType.E2E, (bit<32>)fabric_md.bridged.int_bmd.mirror_session_id, PRESERVE_INT_MD); + } + } + adjust_int_report_hdr_length.apply(); + fabric_v1model.egress = fabric_md; + hdr_v1model.egress = hdr; + } +} + +control IntTnaEgressParserEmulator(inout v1model_header_t hdr_v1model, inout fabric_egress_metadata_t fabric_md, inout standard_metadata_t standard_md) { + egress_headers_t hdr = hdr_v1model.egress; + @hidden action set_common_int_headers() { + hdr.report_ethernet.setValid(); + hdr.report_eth_type.setValid(); + hdr.report_ipv4.setValid(); + hdr.report_ipv4.version = 4w4; + hdr.report_ipv4.ihl = 4w5; + hdr.report_ipv4.dscp = 0; + hdr.report_ipv4.ecn = 2w0; + hdr.report_ipv4.flags = 0; + hdr.report_ipv4.frag_offset = 0; + hdr.report_ipv4.ttl = DEFAULT_IPV4_TTL; + hdr.report_ipv4.protocol = PROTO_UDP; + hdr.report_udp.setValid(); + hdr.report_udp.sport = 0; + hdr.report_fixed_header.setValid(); + hdr.report_fixed_header.ver = 0; + hdr.report_fixed_header.nproto = NPROTO_TELEMETRY_SWITCH_LOCAL_HEADER; + hdr.report_fixed_header.rsvd = 0; + hdr.common_report_header.setValid(); + } + @hidden action set_common_int_drop_headers() { + set_common_int_headers(); + fabric_md.int_report_md.setValid(); + fabric_md.int_report_md.ip_eth_type = ETHERTYPE_IPV4; + fabric_md.int_report_md.report_type = INT_REPORT_TYPE_DROP; + fabric_md.int_report_md.mirror_type = FabricMirrorType_t.INVALID; + hdr.drop_report_header.setValid(); + } + @hidden action parse_int_ingress_drop() { + set_common_int_drop_headers(); + fabric_md.int_report_md.bmd_type = BridgedMdType_t.INT_INGRESS_DROP; + fabric_md.int_report_md.encap_presence = fabric_md.bridged.base.encap_presence; + fabric_md.int_report_md.flow_hash = fabric_md.bridged.base.inner_hash; + hdr.drop_report_header.drop_reason = fabric_md.bridged.int_bmd.drop_reason; + hdr.report_fixed_header.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]; + hdr.common_report_header.ig_port = fabric_md.bridged.base.ig_port; + hdr.common_report_header.eg_port = 0; + hdr.common_report_header.queue_id = 0; + } + @hidden action parse_int_report_mirror() { + set_common_int_headers(); + fabric_md.bridged.bmd_type = fabric_md.int_report_md.bmd_type; + fabric_md.bridged.base.vlan_id = DEFAULT_VLAN_ID; + fabric_md.bridged.base.mpls_label = 0; + fabric_md.bridged.upf.skip_upf = true; + hdr.report_fixed_header.ig_tstamp = fabric_md.int_report_md.ig_tstamp; + hdr.common_report_header.ig_port = fabric_md.int_report_md.ig_port; + hdr.common_report_header.eg_port = fabric_md.int_report_md.eg_port; + hdr.common_report_header.queue_id = fabric_md.int_report_md.queue_id; + hdr.local_report_header.setValid(); + hdr.local_report_header.queue_occupancy = fabric_md.int_report_md.queue_occupancy; + hdr.local_report_header.eg_tstamp = fabric_md.int_report_md.eg_tstamp; + } + apply { + fabric_md.is_int_recirc = true; + hdr_v1model.ingress.vlan_tag.setInvalid(); + if (hdr_v1model.ingress.gtpu.isValid() || hdr_v1model.ingress.vxlan.isValid()) { + hdr_v1model.ingress.ipv4.setInvalid(); + hdr_v1model.ingress.tcp.setInvalid(); + hdr_v1model.ingress.udp.setInvalid(); + hdr_v1model.ingress.icmp.setInvalid(); + hdr_v1model.ingress.vxlan.setInvalid(); + hdr_v1model.ingress.inner_ethernet.setInvalid(); + hdr_v1model.ingress.inner_eth_type.setInvalid(); + hdr_v1model.ingress.gtpu.setInvalid(); + hdr_v1model.ingress.gtpu_options.setInvalid(); + hdr_v1model.ingress.gtpu_ext_psc.setInvalid(); + } + if ((bit<8>)fabric_md.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP) { + parse_int_ingress_drop(); + recirculate_preserving_field_list(NO_PRESERVATION); + } else { + parse_int_report_mirror(); + recirculate_preserving_field_list(PRESERVE_INT_MD); + } + hdr_v1model.egress = hdr; + } +} + +control FabricIngress(inout v1model_header_t hdr, inout fabric_v1model_metadata_t fabric_md, inout standard_metadata_t standard_md) { + LookupMdInit() lkp_md_init; + StatsIngress() stats; + PacketIoIngress() pkt_io; + Filtering() filtering; + Forwarding() forwarding; + PreNext() pre_next; + Acl() acl; + Next() next; + Hasher() hasher; + IngressSliceTcClassifier() slice_tc_classifier; + IngressQos() qos; + UpfIngress() upf; + IntWatchlist() int_watchlist; + IntIngress() int_ingress; + apply { + mark_to_drop(standard_md); + if (standard_md.parser_error == error.PacketRejectedByParser) { + exit; + } + if (standard_md.instance_type == 4) { + fabric_md.ingress.bridged.base.ig_port = FAKE_V1MODEL_RECIRC_PORT; + } + lkp_md_init.apply(hdr.ingress, fabric_md.ingress.lkp); + pkt_io.apply(hdr.ingress, fabric_md.ingress, fabric_md.skip_egress, standard_md, fabric_md.recirc_preserved_egress_port); + int_watchlist.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.recirc_preserved_report_type); + stats.apply(fabric_md.ingress.lkp, fabric_md.ingress.bridged.base.ig_port, fabric_md.ingress.bridged.base.stats_flow_id); + slice_tc_classifier.apply(hdr.ingress, standard_md, fabric_md.ingress); + filtering.apply(hdr.ingress, fabric_md.ingress, standard_md); + if (!fabric_md.ingress.skip_forwarding) { + upf.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.do_upf_uplink_recirc, fabric_md.drop_ctl); + } + if (!fabric_md.ingress.skip_forwarding) { + forwarding.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.drop_ctl); + } + hasher.apply(hdr.ingress, fabric_md.ingress); + if (!fabric_md.ingress.skip_next) { + pre_next.apply(hdr.ingress, fabric_md.ingress); + } + acl.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.recirc_preserved_egress_port, fabric_md.drop_ctl); + if (!fabric_md.ingress.skip_next) { + next.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.recirc_preserved_egress_port); + } + qos.apply(fabric_md.ingress, standard_md, fabric_md.drop_ctl); + int_ingress.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.drop_ctl); + fabric_md.egress.bridged = fabric_md.ingress.bridged; + if (fabric_md.drop_ctl == 1) { + mark_to_drop(standard_md); + } + } +} + +control FabricEgress(inout v1model_header_t hdr, inout fabric_v1model_metadata_t fabric_md, inout standard_metadata_t standard_md) { + StatsEgress() stats; + PacketIoEgress() pkt_io_egress; + EgressNextControl() egress_next; + EgressDscpRewriter() dscp_rewriter; + UpfEgress() upf; + IntTnaEgressParserEmulator() parser_emulator; + IntEgress() int_egress; + apply { + fabric_md.egress.cpu_port = 0; + if (fabric_md.skip_egress) { + exit; + } + if (standard_md.instance_type == 2) { + fabric_md.egress.bridged.int_bmd.drop_reason = fabric_md.recirc_preserved_drop_reason; + fabric_md.egress.bridged.int_bmd.report_type = fabric_md.recirc_preserved_report_type; + parser_emulator.apply(hdr, fabric_md.egress, standard_md); + } + if ((bit<8>)fabric_md.egress.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP) { + parser_emulator.apply(hdr, fabric_md.egress, standard_md); + } + pkt_io_egress.apply(hdr.ingress, fabric_md.egress, standard_md, fabric_md.recirc_preserved_ingress_port); + stats.apply(fabric_md.egress.bridged.base.stats_flow_id, standard_md.egress_port, fabric_md.egress.bridged.bmd_type); + egress_next.apply(hdr.ingress, fabric_md.egress, standard_md, fabric_md.recirc_preserved_drop_reason, fabric_md.drop_ctl); + upf.apply(hdr.ingress, fabric_md.egress); + int_egress.apply(hdr, fabric_md, standard_md); + dscp_rewriter.apply(fabric_md.egress, standard_md, hdr.ingress); + if (fabric_md.do_upf_uplink_recirc) { + recirculate_preserving_field_list(NO_PRESERVATION); + } + if (fabric_md.drop_ctl == 1) { + mark_to_drop(standard_md); + } + } +} + +V1Switch(FabricParser(), FabricVerifyChecksum(), FabricIngress(), FabricEgress(), FabricComputeChecksum(), FabricDeparser()) main; + diff --git a/src/tests/p4-sd-fabric-svc-connectivity/p4src/bmv2.json b/src/tests/p4-sd-fabric-svc-connectivity/p4src/bmv2.json new file mode 100644 index 0000000000000000000000000000000000000000..fe66f93e4c95c397fca7f6d5251802c7a8858a0e --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/p4src/bmv2.json @@ -0,0 +1,28235 @@ +{ + "header_types" : [ + { + "name" : "scalars_0", + "id" : 0, + "fields" : [ + ["tmp_2", 16, false], + ["tmp_4", 1, false], + ["tmp_6", 16, false], + ["tmp_12", 3, false], + ["tmp_13", 8, false], + ["gtpu_ext_len_0", 8, false], + ["tmp_3", 16, false], + ["tmp_5", 16, false], + ["tmp_7", 4, false], + ["tmp_8", 112, false], + ["tmp_9", 112, false], + ["tmp_10", 112, false], + ["tmp_11", 64, false], + ["tmp_14", 32, false], + ["tmp_15", 32, false], + ["tmp_16", 32, false], + ["tmp_17", 32, false], + ["tmp_18", 8, false], + ["tmp_19", 32, false], + ["tmp_20", 32, false], + ["tmp_21", 32, false], + ["tmp_22", 32, false], + ["tmp_23", 48, false], + ["tmp_24", 48, false], + ["tmp_25", 16, false], + ["tmp_26", 32, false], + ["tmp_27", 32, false], + ["tmp_28", 8, false], + ["tmp_29", 16, false], + ["tmp_30", 16, false], + ["tmp_31", 32, false], + ["qos_packet_color", 2, false], + ["upf_is_uplink", 1, false], + ["upf_term_hit", 1, false], + ["upf_sess_hit", 1, false], + ["upf_app_ipv4_addr", 32, false], + ["upf_app_l4_port", 16, false], + ["upf_app_ip_proto", 8, false], + ["upf_internal_app_id", 8, false], + ["upf_ue_session_id", 32, false], + ["upf_session_meter_idx_internal", 15, false], + ["upf_app_meter_idx_internal", 15, false], + ["tmp_32", 32, false], + ["tmp_33", 32, false], + ["tmp_34", 32, false], + ["tmp_35", 32, false], + ["tmp_36", 32, false], + ["tmp_37", 32, false], + ["tmp_38", 32, false], + ["tmp_39", 32, false], + ["tmp_40", 32, false], + ["tmp_41", 32, false], + ["dscp_rewriter_tmp_dscp", 6, false], + ["int_egress_fabric_md_pkt_length", 16, false], + ["int_egress_egress_qid", 5, false], + ["int_egress_reg", 32, false], + ["key_0", 16, false], + ["key_1", 16, false], + ["userMetadata._skip_egress0", 1, false], + ["userMetadata._do_upf_uplink_recirc1", 1, false], + ["userMetadata._drop_ctl2", 1, false], + ["userMetadata._int_mirror_type3", 3, false], + ["userMetadata._ingress_ecmp_hash5", 32, false], + ["userMetadata._ingress_lkp_eth_dst6", 48, false], + ["userMetadata._ingress_lkp_eth_src7", 48, false], + ["userMetadata._ingress_lkp_eth_type8", 16, false], + ["userMetadata._ingress_lkp_vlan_id9", 12, false], + ["userMetadata._ingress_lkp_is_ipv410", 1, false], + ["userMetadata._ingress_lkp_ipv4_src11", 32, false], + ["userMetadata._ingress_lkp_ipv4_dst12", 32, false], + ["userMetadata._ingress_lkp_ip_proto13", 8, false], + ["userMetadata._ingress_lkp_l4_sport14", 16, false], + ["userMetadata._ingress_lkp_l4_dport15", 16, false], + ["userMetadata._ingress_lkp_icmp_type16", 8, false], + ["userMetadata._ingress_lkp_icmp_code17", 8, false], + ["userMetadata._ingress_routing_ipv4_dst18", 32, false], + ["userMetadata._ingress_skip_forwarding19", 1, false], + ["userMetadata._ingress_skip_next20", 1, false], + ["userMetadata._ingress_next_id21", 32, false], + ["userMetadata._ingress_egress_port_set22", 1, false], + ["userMetadata._ingress_punt_to_cpu23", 1, false], + ["userMetadata._ingress_ipv4_checksum_err24", 1, false], + ["userMetadata._ingress_inner_ipv4_checksum_err25", 1, false], + ["userMetadata._ingress_slice_id26", 4, false], + ["userMetadata._ingress_tc27", 2, false], + ["userMetadata._ingress_tc_unknown28", 1, false], + ["userMetadata._ingress_is_upf_hit29", 1, false], + ["userMetadata._ingress_upf_slice_id30", 4, false], + ["userMetadata._ingress_upf_tc31", 2, false], + ["userMetadata._ingress_upf_meter_color32", 2, false], + ["userMetadata._ingress_ig_port_type33", 2, false], + ["userMetadata._ingress_mirror_mirror_session_id34", 10, false], + ["userMetadata._ingress_mirror_bmd_type35", 8, false], + ["userMetadata._egress_cpu_port37", 9, false], + ["userMetadata._egress_inner_ipv4_checksum_err38", 1, false], + ["userMetadata._egress_int_md_hop_latency40", 32, false], + ["userMetadata._egress_int_md_timestamp41", 48, false], + ["userMetadata._egress_int_md_vlan_stripped42", 1, false], + ["userMetadata._egress_int_md_queue_report43", 1, false], + ["userMetadata._egress_int_ipv4_len44", 16, false], + ["userMetadata._egress_is_int_recirc45", 1, false], + ["userMetadata._egress_pkt_length46", 16, false], + ["userMetadata._recirc_preserved_report_type47", 3, false], + ["userMetadata._recirc_preserved_egress_port48", 9, false], + ["userMetadata._recirc_preserved_drop_reason49", 8, false], + ["userMetadata._recirc_preserved_ingress_port50", 9, false], + ["_padding_1", 3, false] + ] + }, + { + "name" : "fake_ethernet_t", + "id" : 1, + "fields" : [ + ["_pad0", 48, false], + ["_pad1", 48, false], + ["ether_type", 16, false] + ] + }, + { + "name" : "packet_out_header_t", + "id" : 2, + "fields" : [ + ["pad0", 7, false], + ["egress_port", 9, false], + ["pad1", 3, false], + ["queue_id", 5, false], + ["pad2", 5, false], + ["cpu_loopback_mode", 2, false], + ["do_forwarding", 1, false], + ["pad3", 16, false], + ["pad4", 48, false], + ["ether_type", 16, false] + ] + }, + { + "name" : "gtpu_t", + "id" : 3, + "fields" : [ + ["version", 3, false], + ["pt", 1, false], + ["spare", 1, false], + ["ex_flag", 1, false], + ["seq_flag", 1, false], + ["npdu_flag", 1, false], + ["msgtype", 8, false], + ["msglen", 16, false], + ["teid", 32, false] + ] + }, + { + "name" : "ethernet_t", + "id" : 4, + "fields" : [ + ["dst_addr", 48, false], + ["src_addr", 48, false] + ] + }, + { + "name" : "eth_type_t", + "id" : 5, + "fields" : [ + ["value", 16, false] + ] + }, + { + "name" : "ipv4_t", + "id" : 6, + "fields" : [ + ["version", 4, false], + ["ihl", 4, false], + ["dscp", 6, false], + ["ecn", 2, false], + ["total_len", 16, false], + ["identification", 16, false], + ["flags", 3, false], + ["frag_offset", 13, false], + ["ttl", 8, false], + ["protocol", 8, false], + ["hdr_checksum", 16, false], + ["src_addr", 32, false], + ["dst_addr", 32, false] + ] + }, + { + "name" : "udp_t", + "id" : 7, + "fields" : [ + ["sport", 16, false], + ["dport", 16, false], + ["len", 16, false], + ["checksum", 16, false] + ] + }, + { + "name" : "report_fixed_header_t", + "id" : 8, + "fields" : [ + ["ver", 4, false], + ["nproto", 4, false], + ["dqf", 3, false], + ["rsvd", 15, false], + ["hw_id", 6, false], + ["seq_no", 32, false], + ["ig_tstamp", 32, false] + ] + }, + { + "name" : "common_report_header_t", + "id" : 9, + "fields" : [ + ["switch_id", 32, false], + ["pad1", 7, false], + ["ig_port", 9, false], + ["pad2", 7, false], + ["eg_port", 9, false], + ["pad3", 3, false], + ["queue_id", 5, false] + ] + }, + { + "name" : "local_report_header_t", + "id" : 10, + "fields" : [ + ["pad1", 5, false], + ["queue_occupancy", 19, false], + ["eg_tstamp", 32, false] + ] + }, + { + "name" : "drop_report_header_t", + "id" : 11, + "fields" : [ + ["drop_reason", 8, false], + ["pad", 16, false] + ] + }, + { + "name" : "mpls_t", + "id" : 12, + "fields" : [ + ["label", 20, false], + ["tc", 3, false], + ["bos", 1, false], + ["ttl", 8, false] + ] + }, + { + "name" : "bridged_metadata_t", + "id" : 13, + "fields" : [ + ["_bmd_type0", 8, false], + ["_base_inner_hash1", 32, false], + ["_base_mpls_label2", 20, false], + ["_base_ig_port3", 9, false], + ["_base_is_multicast4", 1, 0], + ["_base_fwd_type5", 3, false], + ["_base_vlan_id6", 12, false], + ["_base_encap_presence7", 2, false], + ["_base_mpls_ttl8", 8, false], + ["_base_ig_tstamp9", 48, false], + ["_base_ip_eth_type10", 16, false], + ["_base_stats_flow_id11", 10, false], + ["_base_slice_tc12", 6, false], + ["_upf_tun_peer_id13", 8, false], + ["_upf_upf_ctr_id14", 12, false], + ["_upf_qfi15", 6, false], + ["_upf_needs_gtpu_encap16", 1, 0], + ["_upf_skip_upf17", 1, 0], + ["_upf_skip_egress_upf_ctr18", 1, 0], + ["_upf_teid19", 32, false], + ["_upf__pad20", 4, false], + ["_int_bmd_report_type21", 3, false], + ["_int_bmd_mirror_session_id22", 10, false], + ["_int_bmd_drop_reason23", 8, false], + ["_int_bmd_queue_id24", 5, false], + ["_int_bmd_egress_port25", 9, false], + ["_int_bmd_wip_type26", 8, false], + ["__pad027", 1, false], + ["__pad128", 7, false], + ["__pad229", 5, false] + ] + }, + { + "name" : "int_report_metadata_t", + "id" : 14, + "fields" : [ + ["bmd_type", 8, false], + ["_pad0", 5, false], + ["mirror_type", 3, false], + ["_pad1", 7, false], + ["ig_port", 9, false], + ["_pad2", 7, false], + ["eg_port", 9, false], + ["_pad3", 3, false], + ["queue_id", 5, false], + ["_pad4", 5, false], + ["queue_occupancy", 19, false], + ["ig_tstamp", 32, false], + ["eg_tstamp", 32, false], + ["drop_reason", 8, false], + ["ip_eth_type", 16, false], + ["_pad5", 6, false], + ["encap_presence", 2, false], + ["report_type", 3, false], + ["_pad6", 5, false], + ["flow_hash", 32, false] + ] + }, + { + "name" : "int_metadata_t", + "id" : 15, + "fields" : [ + ["hop_latency", 32, false], + ["timestamp", 48, false], + ["vlan_stripped", 1, 0], + ["queue_report", 1, 0], + ["_padding", 6, false] + ] + }, + { + "name" : "standard_metadata", + "id" : 16, + "fields" : [ + ["ingress_port", 9, false], + ["egress_spec", 9, false], + ["egress_port", 9, false], + ["instance_type", 32, false], + ["packet_length", 32, false], + ["enq_timestamp", 32, false], + ["enq_qdepth", 19, false], + ["deq_timedelta", 32, false], + ["deq_qdepth", 19, false], + ["ingress_global_timestamp", 48, false], + ["egress_global_timestamp", 48, false], + ["mcast_grp", 16, false], + ["egress_rid", 16, false], + ["checksum_error", 1, false], + ["parser_error", 32, false], + ["priority", 3, false], + ["_padding_0", 3, false] + ] + }, + { + "name" : "packet_in_header_t", + "id" : 17, + "fields" : [ + ["ingress_port", 9, false], + ["_pad0", 7, false] + ] + }, + { + "name" : "vlan_tag_t", + "id" : 18, + "fields" : [ + ["eth_type", 16, false], + ["pri", 3, false], + ["cfi", 1, false], + ["vlan_id", 12, false] + ] + }, + { + "name" : "ipv6_t", + "id" : 19, + "fields" : [ + ["version", 4, false], + ["traffic_class", 8, false], + ["flow_label", 20, false], + ["payload_len", 16, false], + ["next_hdr", 8, false], + ["hop_limit", 8, false], + ["src_addr", 128, false], + ["dst_addr", 128, false] + ] + }, + { + "name" : "tcp_t", + "id" : 20, + "fields" : [ + ["sport", 16, false], + ["dport", 16, false] + ] + }, + { + "name" : "icmp_t", + "id" : 21, + "fields" : [ + ["icmp_type", 8, false], + ["icmp_code", 8, false] + ] + }, + { + "name" : "gtpu_options_t", + "id" : 22, + "fields" : [ + ["seq_num", 16, false], + ["n_pdu_num", 8, false], + ["next_ext", 8, false] + ] + }, + { + "name" : "gtpu_ext_psc_t", + "id" : 23, + "fields" : [ + ["len", 8, false], + ["type", 4, false], + ["spare0", 4, false], + ["ppp", 1, false], + ["rqi", 1, false], + ["qfi", 6, false], + ["next_ext", 8, false] + ] + }, + { + "name" : "vxlan_t", + "id" : 24, + "fields" : [ + ["flags", 8, false], + ["reserved", 24, false], + ["vni", 24, false], + ["reserved_2", 8, false] + ] + } + ], + "headers" : [ + { + "name" : "tmp", + "id" : 0, + "header_type" : "fake_ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "tmp_0", + "id" : 1, + "header_type" : "packet_out_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "tmp_1", + "id" : 2, + "header_type" : "fake_ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "gtpu_0", + "id" : 3, + "header_type" : "gtpu_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_report_ethernet", + "id" : 4, + "header_type" : "ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_report_eth_type", + "id" : 5, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_report_ipv4", + "id" : 6, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_report_udp", + "id" : 7, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_report_fixed_header", + "id" : 8, + "header_type" : "report_fixed_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_common_report_header", + "id" : 9, + "header_type" : "common_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_local_report_header", + "id" : 10, + "header_type" : "local_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_drop_report_header", + "id" : 11, + "header_type" : "drop_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_report_eth_type", + "id" : 12, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_report_mpls", + "id" : 13, + "header_type" : "mpls_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_report_ipv4", + "id" : 14, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_report_udp", + "id" : 15, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_report_fixed_header", + "id" : 16, + "header_type" : "report_fixed_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_common_report_header", + "id" : 17, + "header_type" : "common_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_local_report_header", + "id" : 18, + "header_type" : "local_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_drop_report_header", + "id" : 19, + "header_type" : "drop_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_eth_type", + "id" : 20, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_fabric_md_bridged", + "id" : 21, + "header_type" : "bridged_metadata_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_fabric_md_int_report_md", + "id" : 22, + "header_type" : "int_report_metadata_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_fabric_md_int_md", + "id" : 23, + "header_type" : "int_metadata_t", + "metadata" : true, + "pi_omit" : true + }, + { + "name" : "scalars", + "id" : 24, + "header_type" : "scalars_0", + "metadata" : true, + "pi_omit" : true + }, + { + "name" : "standard_metadata", + "id" : 25, + "header_type" : "standard_metadata", + "metadata" : true, + "pi_omit" : true + }, + { + "name" : "_ingress_packet_out0", + "id" : 26, + "header_type" : "packet_out_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_packet_in1", + "id" : 27, + "header_type" : "packet_in_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_fake_ethernet2", + "id" : 28, + "header_type" : "fake_ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_ethernet3", + "id" : 29, + "header_type" : "ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_vlan_tag4", + "id" : 30, + "header_type" : "vlan_tag_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_eth_type5", + "id" : 31, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_mpls6", + "id" : 32, + "header_type" : "mpls_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_ipv47", + "id" : 33, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_ipv68", + "id" : 34, + "header_type" : "ipv6_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_tcp9", + "id" : 35, + "header_type" : "tcp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_udp10", + "id" : 36, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_icmp11", + "id" : 37, + "header_type" : "icmp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_gtpu12", + "id" : 38, + "header_type" : "gtpu_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_gtpu_options13", + "id" : 39, + "header_type" : "gtpu_options_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_gtpu_ext_psc14", + "id" : 40, + "header_type" : "gtpu_ext_psc_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_vxlan15", + "id" : 41, + "header_type" : "vxlan_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_ethernet16", + "id" : 42, + "header_type" : "ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_eth_type17", + "id" : 43, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_ipv418", + "id" : 44, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_tcp19", + "id" : 45, + "header_type" : "tcp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_udp20", + "id" : 46, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_icmp21", + "id" : 47, + "header_type" : "icmp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_packet_in22", + "id" : 48, + "header_type" : "packet_in_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_fake_ethernet23", + "id" : 49, + "header_type" : "fake_ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_ethernet24", + "id" : 50, + "header_type" : "ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_eth_type25", + "id" : 51, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_mpls26", + "id" : 52, + "header_type" : "mpls_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_ipv427", + "id" : 53, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_udp28", + "id" : 54, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_fixed_header29", + "id" : 55, + "header_type" : "report_fixed_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_common_report_header30", + "id" : 56, + "header_type" : "common_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_local_report_header31", + "id" : 57, + "header_type" : "local_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_drop_report_header32", + "id" : 58, + "header_type" : "drop_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_ethernet33", + "id" : 59, + "header_type" : "ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_vlan_tag34", + "id" : 60, + "header_type" : "vlan_tag_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_eth_type35", + "id" : 61, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_mpls36", + "id" : 62, + "header_type" : "mpls_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_outer_ipv437", + "id" : 63, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_outer_udp38", + "id" : 64, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_outer_gtpu39", + "id" : 65, + "header_type" : "gtpu_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_outer_gtpu_options40", + "id" : 66, + "header_type" : "gtpu_options_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_outer_gtpu_ext_psc41", + "id" : 67, + "header_type" : "gtpu_ext_psc_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_ipv442", + "id" : 68, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_ipv643", + "id" : 69, + "header_type" : "ipv6_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_udp44", + "id" : 70, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_bridged4", + "id" : 71, + "header_type" : "bridged_metadata_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_bridged36", + "id" : 72, + "header_type" : "bridged_metadata_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_int_report_md39", + "id" : 73, + "header_type" : "int_report_metadata_t", + "metadata" : false, + "pi_omit" : true + } + ], + "header_stacks" : [], + "header_union_types" : [], + "header_unions" : [], + "header_union_stacks" : [], + "field_lists" : [ + { + "id" : 1, + "name" : "field_list241", + "elements" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type47"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port48"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + } + ] + }, + { + "id" : 2, + "name" : "field_list231", + "elements" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_ingress_port50"] + } + ] + }, + { + "id" : 3, + "name" : "empty", + "elements" : [] + }, + { + "id" : 4, + "name" : "empty_0", + "elements" : [] + }, + { + "id" : 5, + "name" : "empty_1", + "elements" : [] + } + ], + "errors" : [ + ["NoError", 1], + ["PacketTooShort", 2], + ["NoMatch", 3], + ["StackOutOfBounds", 4], + ["HeaderTooShort", 5], + ["ParserTimeout", 6], + ["ParserInvalidArgument", 7], + ["PacketRejectedByParser", 8] + ], + "enums" : [], + "parsers" : [ + { + "name" : "parser", + "id" : 0, + "init_state" : "start", + "parse_states" : [ + { + "name" : "start", + "id" : 0, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_pkt_length46"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "packet_length"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x0000ffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_bridged4" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_bmd_type0"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ig_port3"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "ingress_port"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_ingress_port50"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "ingress_port"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ig_tstamp9"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "ingress_global_timestamp"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_punt_to_cpu23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_wip_type26"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_8"] + }, + { + "type" : "lookahead", + "value" : [0, 112] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "tmp" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp", "_pad0"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_8"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x40" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp", "_pad1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_8"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x10" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp", "ether_type"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_8"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_2"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_8"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0xbf02", + "mask" : null, + "next_state" : "parse_fake_ethernet" + }, + { + "type" : "hexstr", + "value" : "0xbf03", + "mask" : null, + "next_state" : "parse_fake_ethernet_and_accept" + }, + { + "type" : "hexstr", + "value" : "0xbf01", + "mask" : null, + "next_state" : "check_packet_out" + }, + { + "type" : "hexstr", + "value" : "0xbf04", + "mask" : null, + "next_state" : "parse_int_wip_ipv4" + }, + { + "type" : "hexstr", + "value" : "0xbf05", + "mask" : null, + "next_state" : "parse_int_wip_mpls" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_ethernet" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_2"] + } + ] + }, + { + "name" : "check_packet_out", + "id" : 1, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + { + "type" : "lookahead", + "value" : [0, 112] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "tmp_0" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "pad0"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x69" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x7f" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "egress_port"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x60" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "pad1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x5d" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "queue_id"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x58" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x1f" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "pad2"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x53" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x1f" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "cpu_loopback_mode"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x51" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x03" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "do_forwarding"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x50" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "pad3"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x40" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "pad4"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x10" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "ether_type"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_4"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x50" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x00", + "mask" : null, + "next_state" : "parse_packet_out_and_accept" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "strip_packet_out" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_4"] + } + ] + }, + { + "name" : "parse_int_wip_ipv4", + "id" : 2, + "parser_ops" : [ + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ethernet3" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_eth_type5" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_wip_type26"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_ttl8"] + }, + { + "type" : "hexstr", + "value" : "0x41" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x00000070" + } + ], + "op" : "advance" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_ipv4" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_int_wip_mpls", + "id" : 3, + "parser_ops" : [ + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ethernet3" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_eth_type5" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + }, + { + "type" : "hexstr", + "value" : "0x8847" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_wip_type26"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x00000070" + } + ], + "op" : "advance" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_mpls" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_packet_out_and_accept", + "id" : 4, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_packet_out0" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "strip_packet_out", + "id" : 5, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x00000070" + } + ], + "op" : "advance" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_ethernet" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_fake_ethernet", + "id" : 6, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_fake_ethernet2" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_10"] + }, + { + "type" : "lookahead", + "value" : [0, 112] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "tmp_1" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_1", "_pad0"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_10"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x40" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_1", "_pad1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_10"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x10" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_1", "ether_type"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_10"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_6"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_10"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0xbf04", + "mask" : null, + "next_state" : "parse_int_wip_ipv4" + }, + { + "type" : "hexstr", + "value" : "0xbf05", + "mask" : null, + "next_state" : "parse_int_wip_mpls" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_ethernet" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_6"] + } + ] + }, + { + "name" : "parse_fake_ethernet_and_accept", + "id" : 7, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_fake_ethernet2" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_ethernet", + "id" : 8, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_ethernet3" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_3"] + }, + { + "type" : "lookahead", + "value" : [0, 16] + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x88a8", + "mask" : null, + "next_state" : "parse_vlan_tag" + }, + { + "type" : "hexstr", + "value" : "0x8100", + "mask" : "0xefff", + "next_state" : "parse_vlan_tag" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_untagged" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_3"] + } + ] + }, + { + "name" : "parse_vlan_tag", + "id" : 9, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_vlan_tag4" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "field", + "value" : ["_ingress_vlan_tag4", "vlan_id"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_5"] + }, + { + "type" : "lookahead", + "value" : [0, 16] + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_eth_type" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_5"] + } + ] + }, + { + "name" : "parse_untagged", + "id" : 10, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "hexstr", + "value" : "0x0ffe" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_eth_type" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_eth_type", + "id" : 11, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_eth_type5" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x8847", + "mask" : null, + "next_state" : "parse_mpls" + }, + { + "type" : "hexstr", + "value" : "0x0800", + "mask" : null, + "next_state" : "parse_non_mpls" + }, + { + "type" : "hexstr", + "value" : "0x86dd", + "mask" : null, + "next_state" : "parse_non_mpls" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + } + ] + }, + { + "name" : "parse_mpls", + "id" : 12, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_mpls6" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "field", + "value" : ["_ingress_mpls6", "label"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_ttl8"] + }, + { + "type" : "field", + "value" : ["_ingress_mpls6", "ttl"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_7"] + }, + { + "type" : "lookahead", + "value" : [0, 4] + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x04", + "mask" : null, + "next_state" : "parse_ipv4" + }, + { + "type" : "hexstr", + "value" : "0x06", + "mask" : null, + "next_state" : "parse_ipv6" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "reject_packet" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_7"] + } + ] + }, + { + "name" : "reject_packet", + "id" : 13, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "bool", + "value" : false + }, + { + "type" : "hexstr", + "value" : "0x8" + } + ], + "op" : "verify" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_non_mpls", + "id" : 14, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_ttl8"] + }, + { + "type" : "hexstr", + "value" : "0x41" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x0800", + "mask" : null, + "next_state" : "parse_ipv4" + }, + { + "type" : "hexstr", + "value" : "0x86dd", + "mask" : null, + "next_state" : "parse_ipv6" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + } + ] + }, + { + "name" : "parse_ipv4", + "id" : 15, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_ipv47" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x06", + "mask" : null, + "next_state" : "parse_tcp" + }, + { + "type" : "hexstr", + "value" : "0x11", + "mask" : null, + "next_state" : "parse_udp" + }, + { + "type" : "hexstr", + "value" : "0x01", + "mask" : null, + "next_state" : "parse_icmp" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + } + ] + }, + { + "name" : "parse_ipv6", + "id" : 16, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_ipv68" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + }, + { + "type" : "hexstr", + "value" : "0x86dd" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x06", + "mask" : null, + "next_state" : "parse_tcp" + }, + { + "type" : "hexstr", + "value" : "0x11", + "mask" : null, + "next_state" : "parse_udp" + }, + { + "type" : "hexstr", + "value" : "0x3a", + "mask" : null, + "next_state" : "parse_icmp" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_ipv68", "next_hdr"] + } + ] + }, + { + "name" : "parse_icmp", + "id" : 17, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_icmp11" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_tcp", + "id" : 18, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_tcp9" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_udp", + "id" : 19, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_udp10" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + { + "type" : "lookahead", + "value" : [0, 64] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "gtpu_0" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "version"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3d" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "pt"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3c" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "spare"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3b" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "ex_flag"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3a" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "seq_flag"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x39" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "npdu_flag"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x38" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "msgtype"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x30" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "msglen"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x20" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "teid"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_12"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3d" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_13"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x30" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x086801ff", + "mask" : null, + "next_state" : "parse_gtpu" + }, + { + "type" : "hexstr", + "value" : "0x12b50000", + "mask" : "0xffff0000", + "next_state" : "parse_vxlan" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "dport"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_12"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_13"] + } + ] + }, + { + "name" : "parse_gtpu", + "id" : 20, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_gtpu12" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x000000", + "mask" : null, + "next_state" : "set_gtpu_only" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_gtpu_options" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "ex_flag"] + }, + { + "type" : "field", + "value" : ["_ingress_gtpu12", "seq_flag"] + }, + { + "type" : "field", + "value" : ["_ingress_gtpu12", "npdu_flag"] + } + ] + }, + { + "name" : "set_gtpu_only", + "id" : 21, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_inner_ipv4" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_gtpu_options", + "id" : 22, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_gtpu_options13" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "gtpu_ext_len_0"] + }, + { + "type" : "lookahead", + "value" : [0, 8] + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x8501", + "mask" : null, + "next_state" : "parse_gtpu_ext_psc" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "next_ext"] + }, + { + "type" : "field", + "value" : ["scalars", "gtpu_ext_len_0"] + } + ] + }, + { + "name" : "parse_gtpu_ext_psc", + "id" : 23, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x00", + "mask" : null, + "next_state" : "parse_inner_ipv4" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "next_ext"] + } + ] + }, + { + "name" : "parse_vxlan", + "id" : 24, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_vxlan15" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x03" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_ethernet16" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_eth_type17" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x0800", + "mask" : null, + "next_state" : "parse_inner_ipv4" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_inner_eth_type17", "value"] + } + ] + }, + { + "name" : "parse_inner_ipv4", + "id" : 25, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_ipv418" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x06", + "mask" : null, + "next_state" : "parse_inner_tcp" + }, + { + "type" : "hexstr", + "value" : "0x11", + "mask" : null, + "next_state" : "parse_inner_udp" + }, + { + "type" : "hexstr", + "value" : "0x01", + "mask" : null, + "next_state" : "parse_inner_icmp" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "protocol"] + } + ] + }, + { + "name" : "parse_inner_tcp", + "id" : 26, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_tcp19" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_inner_udp", + "id" : 27, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_udp20" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_inner_icmp", + "id" : 28, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_icmp21" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + } + ] + } + ], + "parse_vsets" : [], + "deparsers" : [ + { + "name" : "deparser", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/parser.p4", + "line" : 321, + "column" : 8, + "source_fragment" : "FabricDeparser" + }, + "order" : ["_ingress_fake_ethernet2", "_ingress_packet_in1", "_egress_report_ethernet24", "_egress_report_eth_type25", "_egress_report_mpls26", "_egress_report_ipv427", "_egress_report_udp28", "_egress_report_fixed_header29", "_egress_common_report_header30", "_egress_local_report_header31", "_egress_drop_report_header32", "_ingress_ethernet3", "_ingress_vlan_tag4", "_ingress_eth_type5", "_ingress_mpls6", "_ingress_ipv47", "_ingress_ipv68", "_ingress_tcp9", "_ingress_udp10", "_ingress_icmp11", "_ingress_gtpu12", "_ingress_gtpu_options13", "_ingress_gtpu_ext_psc14", "_ingress_vxlan15", "_ingress_inner_ethernet16", "_ingress_inner_eth_type17", "_ingress_inner_ipv418", "_ingress_inner_tcp19", "_ingress_inner_udp20", "_ingress_inner_icmp21"], + "primitives" : [] + } + ], + "meter_arrays" : [ + { + "name" : "FabricIngress.qos.slice_tc_meter", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 104, + "column" : 41, + "source_fragment" : "slice_tc_meter" + }, + "is_direct" : false, + "size" : 64, + "rate_count" : 2, + "type" : "bytes" + }, + { + "name" : "FabricIngress.upf.session_meter", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 22, + "column" : 34, + "source_fragment" : "session_meter" + }, + "is_direct" : false, + "size" : 20000, + "rate_count" : 2, + "type" : "bytes" + }, + { + "name" : "FabricIngress.upf.app_meter", + "id" : 2, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 23, + "column" : 34, + "source_fragment" : "app_meter" + }, + "is_direct" : false, + "size" : 20000, + "rate_count" : 2, + "type" : "bytes" + } + ], + "counter_arrays" : [ + { + "name" : "FabricIngress.stats.flow_counter", + "id" : 0, + "is_direct" : true, + "binding" : "FabricIngress.stats.flows", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 14, + "column" : 50, + "source_fragment" : "flow_counter" + } + }, + { + "name" : "FabricIngress.filtering.ingress_port_vlan_counter", + "id" : 1, + "is_direct" : true, + "binding" : "FabricIngress.filtering.ingress_port_vlan", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 17, + "column" : 50, + "source_fragment" : "ingress_port_vlan_counter" + } + }, + { + "name" : "FabricIngress.filtering.fwd_classifier_counter", + "id" : 2, + "is_direct" : true, + "binding" : "FabricIngress.filtering.fwd_classifier", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 71, + "column" : 50, + "source_fragment" : "fwd_classifier_counter" + } + }, + { + "name" : "FabricIngress.filtering.fwd_type_counter", + "id" : 3, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 78, + "column" : 46, + "source_fragment" : "fwd_type_counter" + }, + "size" : 8, + "is_direct" : false + }, + { + "name" : "FabricIngress.forwarding.bridging_counter", + "id" : 4, + "is_direct" : true, + "binding" : "FabricIngress.forwarding.bridging", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 29, + "column" : 50, + "source_fragment" : "bridging_counter" + } + }, + { + "name" : "FabricIngress.forwarding.mpls_counter", + "id" : 5, + "is_direct" : true, + "binding" : "FabricIngress.forwarding.mpls", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 64, + "column" : 50, + "source_fragment" : "mpls_counter" + } + }, + { + "name" : "FabricIngress.forwarding.routing_v4_counter", + "id" : 6, + "is_direct" : true, + "binding" : "FabricIngress.forwarding.routing_v4", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 98, + "column" : 50, + "source_fragment" : "routing_v4_counter" + } + }, + { + "name" : "FabricIngress.forwarding.routing_v6_counter", + "id" : 7, + "is_direct" : true, + "binding" : "FabricIngress.forwarding.routing_v6", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 142, + "column" : 50, + "source_fragment" : "routing_v6_counter" + } + }, + { + "name" : "FabricIngress.pre_next.next_mpls_counter", + "id" : 8, + "is_direct" : true, + "binding" : "FabricIngress.pre_next.next_mpls", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 15, + "column" : 50, + "source_fragment" : "next_mpls_counter" + } + }, + { + "name" : "FabricIngress.pre_next.next_vlan_counter", + "id" : 9, + "is_direct" : true, + "binding" : "FabricIngress.pre_next.next_vlan", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 39, + "column" : 50, + "source_fragment" : "next_vlan_counter" + } + }, + { + "name" : "FabricIngress.acl.acl_counter", + "id" : 10, + "is_direct" : true, + "binding" : "FabricIngress.acl.acl", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 19, + "column" : 50, + "source_fragment" : "acl_counter" + } + }, + { + "name" : "FabricIngress.next.hashed_counter", + "id" : 11, + "is_direct" : true, + "binding" : "FabricIngress.next.hashed", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 115, + "column" : 50, + "source_fragment" : "hashed_counter" + } + }, + { + "name" : "FabricIngress.next.multicast_counter", + "id" : 12, + "is_direct" : true, + "binding" : "FabricIngress.next.multicast", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 148, + "column" : 50, + "source_fragment" : "multicast_counter" + } + }, + { + "name" : "FabricIngress.slice_tc_classifier.classifier_stats", + "id" : 13, + "is_direct" : true, + "binding" : "FabricIngress.slice_tc_classifier.classifier", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 20, + "column" : 40, + "source_fragment" : "classifier_stats" + } + }, + { + "name" : "FabricIngress.qos.queues_stats", + "id" : 14, + "is_direct" : true, + "binding" : "FabricIngress.qos.queues", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 106, + "column" : 40, + "source_fragment" : "queues_stats" + } + }, + { + "name" : "FabricIngress.upf.terminations_counter", + "id" : 15, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 20, + "column" : 49, + "source_fragment" : "terminations_counter" + }, + "size" : 4096, + "is_direct" : false + }, + { + "name" : "FabricIngress.upf.recirc_stats", + "id" : 16, + "is_direct" : true, + "binding" : "FabricIngress.upf.uplink_recirc_rules", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 356, + "column" : 40, + "source_fragment" : "recirc_stats" + } + }, + { + "name" : "FabricIngress.int_watchlist.watchlist_counter", + "id" : 17, + "is_direct" : true, + "binding" : "FabricIngress.int_watchlist.watchlist", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 15, + "column" : 50, + "source_fragment" : "watchlist_counter" + } + }, + { + "name" : "FabricIngress.int_ingress.drop_report_counter", + "id" : 18, + "is_direct" : true, + "binding" : "FabricIngress.int_ingress.drop_report", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 64, + "column" : 50, + "source_fragment" : "drop_report_counter" + } + }, + { + "name" : "FabricEgress.stats.flow_counter", + "id" : 19, + "is_direct" : true, + "binding" : "FabricEgress.stats.flows", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 47, + "column" : 50, + "source_fragment" : "flow_counter" + } + }, + { + "name" : "FabricEgress.egress_next.egress_vlan_counter", + "id" : 20, + "is_direct" : true, + "binding" : "FabricEgress.egress_next.egress_vlan", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 241, + "column" : 50, + "source_fragment" : "egress_vlan_counter" + } + }, + { + "name" : "FabricEgress.upf.terminations_counter", + "id" : 21, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 477, + "column" : 49, + "source_fragment" : "terminations_counter" + }, + "size" : 4096, + "is_direct" : false + }, + { + "name" : "FabricEgress.int_egress.report_counter", + "id" : 22, + "is_direct" : true, + "binding" : "FabricEgress.int_egress.report", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 131, + "column" : 50, + "source_fragment" : "report_counter" + } + }, + { + "name" : "FabricEgress.int_egress.int_metadata_counter", + "id" : 23, + "is_direct" : true, + "binding" : "FabricEgress.int_egress.int_metadata", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 132, + "column" : 50, + "source_fragment" : "int_metadata_counter" + } + } + ], + "register_arrays" : [ + { + "name" : "FabricEgress.int_egress.seq_number", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 138, + "column" : 28, + "source_fragment" : "seq_number" + }, + "size" : 1024, + "bitwidth" : 32 + } + ], + "calculations" : [ + { + "name" : "calc", + "id" : 0, + "algo" : "crc32", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_18"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_19"] + } + ] + }, + { + "name" : "calc_0", + "id" : 1, + "algo" : "crc32", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_20"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_21"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_22"] + } + ] + }, + { + "name" : "calc_1", + "id" : 2, + "algo" : "crc32", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_23"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_24"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_25"] + } + ] + }, + { + "name" : "calc_2", + "id" : 3, + "algo" : "crc32", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_26"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_27"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_28"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_29"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_30"] + } + ] + }, + { + "name" : "calc_3", + "id" : 4, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 55, + "column" : 8, + "source_fragment" : "update_checksum(hdr.ingress.ipv4.isValid(), ..." + }, + "algo" : "csum16", + "input" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "version"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ihl"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ecn"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "total_len"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "identification"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "flags"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "frag_offset"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ] + }, + { + "name" : "calc_4", + "id" : 5, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 73, + "column" : 8, + "source_fragment" : "update_checksum(hdr.ingress.inner_ipv4.isValid(), ..." + }, + "algo" : "csum16", + "input" : [ + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "version"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ihl"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dscp"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ecn"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "identification"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "flags"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "frag_offset"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ttl"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "protocol"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "src_addr"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dst_addr"] + } + ] + }, + { + "name" : "calc_5", + "id" : 6, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 92, + "column" : 8, + "source_fragment" : "update_checksum(hdr.egress.report_ipv4.isValid(), ..." + }, + "algo" : "csum16", + "input" : [ + { + "type" : "field", + "value" : ["_egress_report_ipv427", "version"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "ihl"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "dscp"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "ecn"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "total_len"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "identification"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "flags"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "frag_offset"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "ttl"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "protocol"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "src_addr"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "dst_addr"] + } + ] + }, + { + "name" : "calc_6", + "id" : 7, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 13, + "column" : 8, + "source_fragment" : "verify_checksum(hdr.ingress.ipv4.isValid(), ..." + }, + "algo" : "csum16", + "input" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "version"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ihl"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ecn"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "total_len"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "identification"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "flags"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "frag_offset"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ] + }, + { + "name" : "calc_7", + "id" : 8, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 31, + "column" : 8, + "source_fragment" : "verify_checksum(hdr.ingress.inner_ipv4.isValid(), ..." + }, + "algo" : "csum16", + "input" : [ + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "version"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ihl"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dscp"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ecn"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "identification"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "flags"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "frag_offset"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ttl"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "protocol"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "src_addr"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dst_addr"] + } + ] + } + ], + "learn_lists" : [], + "actions" : [ + { + "name" : "nop", + "id" : 0, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 1, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 2, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 3, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 4, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 5, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 6, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "NoAction", + "id" : 7, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricIngress.stats.count", + "id" : 8, + "runtime_data" : [ + { + "name" : "flow_id", + "bitwidth" : 10 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_stats_flow_id11"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 17, + "column" : 22, + "source_fragment" : "= flow_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.pkt_io.do_packet_out", + "id" : 9, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_ingress_packet_out0", "egress_port"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 13, + "column" : 8, + "source_fragment" : "standard_md.egress_spec = (PortId_t)hdr.packet_out.egress_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port48"] + }, + { + "type" : "field", + "value" : ["_ingress_packet_out0", "egress_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 14, + "column" : 37, + "source_fragment" : "= hdr.packet_out.egress_port; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 15, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_packet_out0" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 16, + "column" : 8, + "source_fragment" : "hdr.packet_out.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._skip_egress0"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 17, + "column" : 20, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_bridged4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 19, + "column" : 8, + "source_fragment" : "fabric_md.bridged.setInvalid()" + } + }, + { + "op" : "exit", + "parameters" : [], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "exit" + } + } + ] + }, + { + "name" : "FabricIngress.filtering.deny", + "id" : 10, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 22, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 23, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ig_port_type33"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 100, + "column" : 14, + "source_fragment" : "0x0, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x37" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 250, + "column" : 41, + "source_fragment" : "55, ..." + } + } + ] + }, + { + "name" : "FabricIngress.filtering.permit", + "id" : 11, + "runtime_data" : [ + { + "name" : "port_type", + "bitwidth" : 2 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ig_port_type33"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 33, + "column" : 31, + "source_fragment" : "= port_type; ..." + } + } + ] + }, + { + "name" : "FabricIngress.filtering.permit_with_internal_vlan", + "id" : 12, + "runtime_data" : [ + { + "name" : "vlan_id", + "bitwidth" : 12 + }, + { + "name" : "port_type", + "bitwidth" : 2 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.vlan_id = vlan_id" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ig_port_type33"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 33, + "column" : 31, + "source_fragment" : "= port_type; ..." + } + } + ] + }, + { + "name" : "FabricIngress.filtering.set_forwarding_type", + "id" : 13, + "runtime_data" : [ + { + "name" : "fwd_type", + "bitwidth" : 3 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 74, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.fwd_type = fwd_type" + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_int_drop_reason", + "id" : 14, + "runtime_data" : [ + { + "name" : "drop_reason", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason" + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_int_drop_reason", + "id" : 15, + "runtime_data" : [ + { + "name" : "drop_reason", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason" + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_int_drop_reason", + "id" : 16, + "runtime_data" : [ + { + "name" : "drop_reason", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason" + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_int_drop_reason", + "id" : 17, + "runtime_data" : [ + { + "name" : "drop_reason", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason" + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_next_id_bridging", + "id" : 18, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_next_id21"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 23, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.pop_mpls_and_next", + "id" : 19, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_mpls6" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 67, + "column" : 8, + "source_fragment" : "hdr.mpls.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + }, + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 68, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 69, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.mpls_label = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_next_id21"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 23, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_next_id_routing_v4", + "id" : 20, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_next_id21"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 23, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.nop_routing_v4", + "id" : 21, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricIngress.forwarding.drop_routing_v4", + "id" : 22, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 111, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 113, + "column" : 17, + "source_fragment" : "= 1; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_next_id_routing_v6", + "id" : 23, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_next_id21"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 23, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.drop_routing_v6", + "id" : 24, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 150, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 152, + "column" : 17, + "source_fragment" : "= 1; ..." + } + } + ] + }, + { + "name" : "FabricIngress.pre_next.set_mpls_label", + "id" : 25, + "runtime_data" : [ + { + "name" : "label", + "bitwidth" : 20 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 18, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.mpls_label = label" + } + } + ] + }, + { + "name" : "FabricIngress.pre_next.set_vlan", + "id" : 26, + "runtime_data" : [ + { + "name" : "vlan_id", + "bitwidth" : 12 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 42, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.vlan_id = vlan_id" + } + } + ] + }, + { + "name" : "FabricIngress.acl.set_next_id_acl", + "id" : 27, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_next_id21"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 22, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 26, + "column" : 28, + "source_fragment" : "= false; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 27, + "column" : 17, + "source_fragment" : "= 0; ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.copy_to_cpu", + "id" : 28, + "runtime_data" : [], + "primitives" : [ + { + "op" : "clone_ingress_pkt_to_egress", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x000001ff" + }, + { + "type" : "hexstr", + "value" : "0x2" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 31, + "column" : 8, + "source_fragment" : "clone_preserving_field_list(CloneType.I2E, ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.punt_to_cpu", + "id" : 29, + "runtime_data" : [], + "primitives" : [ + { + "op" : "clone_ingress_pkt_to_egress", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x000001ff" + }, + { + "type" : "hexstr", + "value" : "0x2" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 31, + "column" : 8, + "source_fragment" : "clone_preserving_field_list(CloneType.I2E, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 40, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_punt_to_cpu23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 41, + "column" : 30, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 42, + "column" : 17, + "source_fragment" : "= 1; ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.drop", + "id" : 30, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 46, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 47, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x50" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 252, + "column" : 27, + "source_fragment" : "80, ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.set_output_port", + "id" : 31, + "runtime_data" : [ + { + "name" : "port_num", + "bitwidth" : 9 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 62, + "column" : 8, + "source_fragment" : "standard_md.egress_spec = (PortId_t) port_num" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port48"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 63, + "column" : 37, + "source_fragment" : "= port_num; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 64, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 65, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 66, + "column" : 17, + "source_fragment" : "= 0; ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.nop_acl", + "id" : 32, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricIngress.next.output_hashed", + "id" : 33, + "runtime_data" : [ + { + "name" : "port_num", + "bitwidth" : 9 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 16, + "column" : 8, + "source_fragment" : "standard_md.egress_spec = (PortId_t)port_num" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port48"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 17, + "column" : 37, + "source_fragment" : "= port_num; // Needed by INT. ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 18, + "column" : 34, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.next.routing_hashed", + "id" : 34, + "runtime_data" : [ + { + "name" : "port_num", + "bitwidth" : 9 + }, + { + "name" : "smac", + "bitwidth" : 48 + }, + { + "name" : "dmac", + "bitwidth" : 48 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ethernet3", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 23, + "column" : 8, + "source_fragment" : "hdr.ethernet.src_addr = smac; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ethernet3", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 28, + "column" : 8, + "source_fragment" : "hdr.ethernet.dst_addr = dmac; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 16, + "column" : 8, + "source_fragment" : "standard_md.egress_spec = (PortId_t)port_num" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port48"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 17, + "column" : 37, + "source_fragment" : "= port_num; // Needed by INT. ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 18, + "column" : 34, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.next.set_mcast_group_id", + "id" : 35, + "runtime_data" : [ + { + "name" : "group_id", + "bitwidth" : 16 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "mcast_grp"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 151, + "column" : 8, + "source_fragment" : "standard_md.mcast_grp = group_id" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_is_multicast4"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 152, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.is_multicast = true" + } + } + ] + }, + { + "name" : "FabricIngress.next.reset_mcast_group_id", + "id" : 36, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "mcast_grp"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 157, + "column" : 8, + "source_fragment" : "standard_md.mcast_grp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_is_multicast4"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 158, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.is_multicast = false" + } + } + ] + }, + { + "name" : "FabricIngress.slice_tc_classifier.set_slice_id_tc", + "id" : 37, + "runtime_data" : [ + { + "name" : "slice_id", + "bitwidth" : 4 + }, + { + "name" : "tc", + "bitwidth" : 2 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_slice_id26"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 23, + "column" : 27, + "source_fragment" : "= slice_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc27"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 24, + "column" : 21, + "source_fragment" : "= tc; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 25, + "column" : 29, + "source_fragment" : "= false; ..." + } + } + ] + }, + { + "name" : "FabricIngress.slice_tc_classifier.no_classification", + "id" : 38, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_slice_id26"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 57, + "column" : 36, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc27"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 58, + "column" : 24, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 25, + "column" : 29, + "source_fragment" : "= false; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 31, + "column" : 29, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.slice_tc_classifier.trust_dscp", + "id" : 39, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_slice_id26"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x0f" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 38, + "column" : 27, + "source_fragment" : "= hdr.ipv4.dscp[4 +2 -1:2]; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc27"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x03" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 39, + "column" : 21, + "source_fragment" : "= hdr.ipv4.dscp[2 -1:0]; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 40, + "column" : 29, + "source_fragment" : "= false; ..." + } + } + ] + }, + { + "name" : "FabricIngress.qos.use_upf", + "id" : 40, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_slice_tc12"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "|", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "<<", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_slice_id30"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_tc31"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 81, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.slice_tc = fabric_md.upf_slice_id++fabric_md.upf_tc" + } + } + ] + }, + { + "name" : "FabricIngress.qos.use_default", + "id" : 41, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_slice_tc12"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "|", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "<<", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_slice_id26"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc27"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 86, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.slice_tc = fabric_md.slice_id++fabric_md.tc" + } + } + ] + }, + { + "name" : "FabricIngress.qos.set_queue", + "id" : 42, + "runtime_data" : [ + { + "name" : "qid", + "bitwidth" : 5 + } + ], + "primitives" : [] + }, + { + "name" : "FabricIngress.qos.meter_drop", + "id" : 43, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 115, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0xa0" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 269, + "column" : 36, + "source_fragment" : "160, ..." + } + } + ] + }, + { + "name" : "FabricIngress.qos.set_default_tc", + "id" : 44, + "runtime_data" : [ + { + "name" : "tc", + "bitwidth" : 2 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_slice_tc12"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "|", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "<<", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_slice_tc12"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x0f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 146, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.slice_tc = fabric_md.bridged.base.slice_tc[4 +2 -1:2]++tc" + } + } + ] + }, + { + "name" : "FabricIngress.upf.iface_access", + "id" : 45, + "runtime_data" : [ + { + "name" : "slice_id", + "bitwidth" : 4 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 85, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = false" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_is_upf_hit29"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 86, + "column" : 29, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_slice_id30"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 87, + "column" : 31, + "source_fragment" : "= slice_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.iface_core", + "id" : 46, + "runtime_data" : [ + { + "name" : "slice_id", + "bitwidth" : 4 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 85, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = false" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_is_upf_hit29"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 86, + "column" : 29, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_slice_id30"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 87, + "column" : 31, + "source_fragment" : "= slice_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.iface_dbuf", + "id" : 47, + "runtime_data" : [ + { + "name" : "slice_id", + "bitwidth" : 4 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 85, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = false" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_is_upf_hit29"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 86, + "column" : 29, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_slice_id30"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 87, + "column" : 31, + "source_fragment" : "= slice_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 114, + "column" : 31, + "source_fragment" : "0x0800; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 62, + "column" : 35, + "source_fragment" : "= hdr.inner_ipv4.dst_addr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ipv47" + }, + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 64, + "column" : 17, + "source_fragment" : "= hdr.inner_ipv4; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 65, + "column" : 8, + "source_fragment" : "hdr.inner_ipv4.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + }, + { + "type" : "header", + "value" : "_ingress_inner_udp20" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 66, + "column" : 16, + "source_fragment" : "= hdr.inner_udp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_udp20" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 67, + "column" : 8, + "source_fragment" : "hdr.inner_udp.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_tcp9" + }, + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 68, + "column" : 16, + "source_fragment" : "= hdr.inner_tcp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 69, + "column" : 8, + "source_fragment" : "hdr.inner_tcp.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_icmp11" + }, + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 70, + "column" : 17, + "source_fragment" : "= hdr.inner_icmp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.inner_icmp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 72, + "column" : 8, + "source_fragment" : "hdr.gtpu.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_options13" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 73, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 74, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 80, + "column" : 11, + "source_fragment" : "0x0, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.iface_miss", + "id" : 48, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 104, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = true" + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_uplink_session_miss", + "id" : 49, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x86" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 261, + "column" : 38, + "source_fragment" : "134, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_uplink_session_drop", + "id" : 50, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 136, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x87" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 262, + "column" : 38, + "source_fragment" : "135, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_downlink_session_miss", + "id" : 51, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x84" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 259, + "column" : 38, + "source_fragment" : "132, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_downlink_session_drop", + "id" : 52, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 151, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x85" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 260, + "column" : 38, + "source_fragment" : "133, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_downlink_session", + "id" : 53, + "runtime_data" : [ + { + "name" : "tun_peer_id", + "bitwidth" : 8 + }, + { + "name" : "session_meter_idx", + "bitwidth" : 15 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 159, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_ue_session_id"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 161, + "column" : 8, + "source_fragment" : "ue_session_id = fabric_md.routing_ipv4_dst; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_session_meter_idx_internal"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 162, + "column" : 8, + "source_fragment" : "session_meter_idx_internal = session_meter_idx" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_tun_peer_id13"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 163, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.tun_peer_id = tun_peer_id" + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_downlink_session_buf", + "id" : 54, + "runtime_data" : [ + { + "name" : "tun_peer_id", + "bitwidth" : 8 + }, + { + "name" : "session_meter_idx", + "bitwidth" : 15 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 167, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_ue_session_id"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 169, + "column" : 8, + "source_fragment" : "ue_session_id = fabric_md.routing_ipv4_dst; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_session_meter_idx_internal"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 170, + "column" : 8, + "source_fragment" : "session_meter_idx_internal = session_meter_idx" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_tun_peer_id13"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 171, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.tun_peer_id = tun_peer_id" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_egress_upf_ctr18"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 175, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_egress_upf_ctr = true" + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_downlink_session_buf_drop", + "id" : 55, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 179, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_ue_session_id"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 182, + "column" : 8, + "source_fragment" : "ue_session_id = fabric_md.routing_ipv4_dst; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x88" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 263, + "column" : 43, + "source_fragment" : "136, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_uplink_session", + "id" : 56, + "runtime_data" : [ + { + "name" : "session_meter_idx", + "bitwidth" : 15 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 190, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_ue_session_id"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 192, + "column" : 8, + "source_fragment" : "ue_session_id = fabric_md.lkp.ipv4_src; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_session_meter_idx_internal"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 193, + "column" : 8, + "source_fragment" : "session_meter_idx_internal = session_meter_idx" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 114, + "column" : 31, + "source_fragment" : "0x0800; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 62, + "column" : 35, + "source_fragment" : "= hdr.inner_ipv4.dst_addr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ipv47" + }, + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 64, + "column" : 17, + "source_fragment" : "= hdr.inner_ipv4; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 65, + "column" : 8, + "source_fragment" : "hdr.inner_ipv4.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + }, + { + "type" : "header", + "value" : "_ingress_inner_udp20" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 66, + "column" : 16, + "source_fragment" : "= hdr.inner_udp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_udp20" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 67, + "column" : 8, + "source_fragment" : "hdr.inner_udp.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_tcp9" + }, + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 68, + "column" : 16, + "source_fragment" : "= hdr.inner_tcp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 69, + "column" : 8, + "source_fragment" : "hdr.inner_tcp.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_icmp11" + }, + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 70, + "column" : 17, + "source_fragment" : "= hdr.inner_icmp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.inner_icmp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 72, + "column" : 8, + "source_fragment" : "hdr.gtpu.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_options13" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 73, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 74, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 80, + "column" : 11, + "source_fragment" : "0x0, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.uplink_drop_miss", + "id" : 57, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x8b" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 266, + "column" : 42, + "source_fragment" : "139, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.downlink_drop_miss", + "id" : 58, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x89" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 264, + "column" : 42, + "source_fragment" : "137, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.uplink_drop", + "id" : 59, + "runtime_data" : [ + { + "name" : "ctr_id", + "bitwidth" : 12 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_upf_ctr_id14"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 46, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.upf_ctr_id = ctr_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 47, + "column" : 8, + "source_fragment" : "term_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x8c" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 267, + "column" : 42, + "source_fragment" : "140, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.downlink_drop", + "id" : 60, + "runtime_data" : [ + { + "name" : "ctr_id", + "bitwidth" : 12 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_upf_ctr_id14"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 46, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.upf_ctr_id = ctr_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 47, + "column" : 8, + "source_fragment" : "term_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x8a" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 265, + "column" : 42, + "source_fragment" : "138, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.app_fwd", + "id" : 61, + "runtime_data" : [ + { + "name" : "ctr_id", + "bitwidth" : 12 + }, + { + "name" : "tc", + "bitwidth" : 2 + }, + { + "name" : "app_meter_idx", + "bitwidth" : 15 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_upf_ctr_id14"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 46, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.upf_ctr_id = ctr_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 47, + "column" : 8, + "source_fragment" : "term_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_tc31"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 265, + "column" : 25, + "source_fragment" : "= tc; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_meter_idx_internal"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 266, + "column" : 8, + "source_fragment" : "app_meter_idx_internal = app_meter_idx" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 267, + "column" : 29, + "source_fragment" : "= false; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.downlink_fwd_encap", + "id" : 62, + "runtime_data" : [ + { + "name" : "ctr_id", + "bitwidth" : 12 + }, + { + "name" : "tc", + "bitwidth" : 2 + }, + { + "name" : "teid", + "bitwidth" : 32 + }, + { + "name" : "qfi", + "bitwidth" : 6 + }, + { + "name" : "app_meter_idx", + "bitwidth" : 15 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_upf_ctr_id14"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 46, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.upf_ctr_id = ctr_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 47, + "column" : 8, + "source_fragment" : "term_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_tc31"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 265, + "column" : 25, + "source_fragment" : "= tc; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_meter_idx_internal"] + }, + { + "type" : "runtime_data", + "value" : 4 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 266, + "column" : 8, + "source_fragment" : "app_meter_idx_internal = app_meter_idx; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 267, + "column" : 29, + "source_fragment" : "= false; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_needs_gtpu_encap16"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 54, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.needs_gtpu_encap = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_teid19"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 55, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.teid = teid; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_qfi15"] + }, + { + "type" : "runtime_data", + "value" : 3 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 56, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.qfi = qfi; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_routing_ipv4_dst", + "id" : 63, + "runtime_data" : [ + { + "name" : "tun_dst_addr", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 314, + "column" : 35, + "source_fragment" : "= tun_dst_addr; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_app_id", + "id" : 64, + "runtime_data" : [ + { + "name" : "app_id", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_internal_app_id"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 334, + "column" : 8, + "source_fragment" : "internal_app_id = app_id" + } + } + ] + }, + { + "name" : "FabricIngress.upf.recirc_allow", + "id" : 65, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "hexstr", + "value" : "0x01fe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4", + "line" : 36, + "column" : 42, + "source_fragment" : "510; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "hexstr", + "value" : "0x0ffe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 147, + "column" : 34, + "source_fragment" : "12w4094; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._do_upf_uplink_recirc1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 364, + "column" : 29, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 365, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 366, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 367, + "column" : 28, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.recirc_deny", + "id" : 66, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x96" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 268, + "column" : 41, + "source_fragment" : "150, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._do_upf_uplink_recirc1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 375, + "column" : 29, + "source_fragment" : "= false; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 376, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 377, + "column" : 28, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.recirc_miss", + "id" : 67, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricIngress.int_watchlist.mark_to_report", + "id" : 68, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_report_type21"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 223, + "column" : 45, + "source_fragment" : "1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type47"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 223, + "column" : 45, + "source_fragment" : "1; ..." + } + } + ] + }, + { + "name" : "FabricIngress.int_watchlist.no_report", + "id" : 69, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_report_type21"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 219, + "column" : 50, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type47"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 219, + "column" : 50, + "source_fragment" : "0; ..." + } + } + ] + }, + { + "name" : "FabricIngress.int_watchlist.no_report_collector", + "id" : 70, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_report_type21"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 219, + "column" : 50, + "source_fragment" : "0; ..." + } + } + ] + }, + { + "name" : "FabricIngress.int_ingress.report_drop", + "id" : 71, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_bmd_type0"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 169, + "column" : 23, + "source_fragment" : "4, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_report_type21"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 221, + "column" : 45, + "source_fragment" : "4; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "hexstr", + "value" : "0x0ffe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 147, + "column" : 34, + "source_fragment" : "12w4094; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.mpls_label = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 73, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 79, + "column" : 17, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "hexstr", + "value" : "0x01fe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4", + "line" : 36, + "column" : 42, + "source_fragment" : "510; ..." + } + } + ] + }, + { + "name" : "fabric_v1model64", + "id" : 72, + "runtime_data" : [], + "primitives" : [ + { + "op" : "exit", + "parameters" : [], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 64, + "column" : 12, + "source_fragment" : "exit" + } + } + ] + }, + { + "name" : "fabric_v1model61", + "id" : 73, + "runtime_data" : [], + "primitives" : [ + { + "op" : "mark_to_drop", + "parameters" : [ + { + "type" : "header", + "value" : "standard_metadata" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "mark_to_drop(standard_md)" + } + } + ] + }, + { + "name" : "fabric_v1model70", + "id" : 74, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ig_port3"] + }, + { + "type" : "hexstr", + "value" : "0x01fe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4", + "line" : 36, + "column" : 42, + "source_fragment" : "510; ..." + } + } + ] + }, + { + "name" : "lookup_md_init21", + "id" : 75, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_vlan_id9"] + }, + { + "type" : "field", + "value" : ["_ingress_vlan_tag4", "vlan_id"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 21, + "column" : 27, + "source_fragment" : "= hdr.vlan_tag.vlan_id; ..." + } + } + ] + }, + { + "name" : "lookup_md_init15", + "id" : 76, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_eth_dst6"] + }, + { + "type" : "field", + "value" : ["_ingress_ethernet3", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 15, + "column" : 23, + "source_fragment" : "= hdr.ethernet.dst_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_eth_src7"] + }, + { + "type" : "field", + "value" : ["_ingress_ethernet3", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 16, + "column" : 23, + "source_fragment" : "= hdr.ethernet.src_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_eth_type8"] + }, + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 17, + "column" : 24, + "source_fragment" : "= hdr.eth_type.value; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_vlan_id9"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 19, + "column" : 23, + "source_fragment" : "= 0; ..." + } + } + ] + }, + { + "name" : "lookup_md_init38", + "id" : 77, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_tcp19", "sport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 38, + "column" : 32, + "source_fragment" : "= hdr.inner_tcp.sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_tcp19", "dport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 39, + "column" : 32, + "source_fragment" : "= hdr.inner_tcp.dport; ..." + } + } + ] + }, + { + "name" : "lookup_md_init41", + "id" : 78, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_udp20", "sport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 41, + "column" : 32, + "source_fragment" : "= hdr.inner_udp.sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_udp20", "dport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 42, + "column" : 32, + "source_fragment" : "= hdr.inner_udp.dport; ..." + } + } + ] + }, + { + "name" : "lookup_md_init44", + "id" : 79, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_type16"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_icmp21", "icmp_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 44, + "column" : 33, + "source_fragment" : "= hdr.inner_icmp.icmp_type; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_code17"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_icmp21", "icmp_code"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 45, + "column" : 33, + "source_fragment" : "= hdr.inner_icmp.icmp_code; ..." + } + } + ] + }, + { + "name" : "lookup_md_init33", + "id" : 80, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 33, + "column" : 27, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 34, + "column" : 28, + "source_fragment" : "= hdr.inner_ipv4.src_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 35, + "column" : 28, + "source_fragment" : "= hdr.inner_ipv4.dst_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "protocol"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 36, + "column" : 28, + "source_fragment" : "= hdr.inner_ipv4.protocol; ..." + } + } + ] + }, + { + "name" : "lookup_md_init53", + "id" : 81, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + }, + { + "type" : "field", + "value" : ["_ingress_tcp9", "sport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 53, + "column" : 32, + "source_fragment" : "= hdr.tcp.sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + }, + { + "type" : "field", + "value" : ["_ingress_tcp9", "dport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 54, + "column" : 32, + "source_fragment" : "= hdr.tcp.dport; ..." + } + } + ] + }, + { + "name" : "lookup_md_init56", + "id" : 82, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + }, + { + "type" : "field", + "value" : ["_ingress_udp10", "sport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 56, + "column" : 32, + "source_fragment" : "= hdr.udp.sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + }, + { + "type" : "field", + "value" : ["_ingress_udp10", "dport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 57, + "column" : 32, + "source_fragment" : "= hdr.udp.dport; ..." + } + } + ] + }, + { + "name" : "lookup_md_init59", + "id" : 83, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_type16"] + }, + { + "type" : "field", + "value" : ["_ingress_icmp11", "icmp_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 59, + "column" : 33, + "source_fragment" : "= hdr.icmp.icmp_type; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_code17"] + }, + { + "type" : "field", + "value" : ["_ingress_icmp11", "icmp_code"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 60, + "column" : 33, + "source_fragment" : "= hdr.icmp.icmp_code; ..." + } + } + ] + }, + { + "name" : "lookup_md_init48", + "id" : 84, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 48, + "column" : 27, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 49, + "column" : 28, + "source_fragment" : "= hdr.ipv4.src_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 50, + "column" : 28, + "source_fragment" : "= hdr.ipv4.dst_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 51, + "column" : 28, + "source_fragment" : "= hdr.ipv4.protocol; ..." + } + } + ] + }, + { + "name" : "lookup_md_init24", + "id" : 85, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 24, + "column" : 23, + "source_fragment" : "= false; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 25, + "column" : 24, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 26, + "column" : 24, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 27, + "column" : 24, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 28, + "column" : 24, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 29, + "column" : 24, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_type16"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 30, + "column" : 25, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_code17"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 31, + "column" : 25, + "source_fragment" : "= 0; ..." + } + } + ] + }, + { + "name" : "upf409", + "id" : 86, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_is_uplink"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 409, + "column" : 20, + "source_fragment" : "is_uplink = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ipv4_addr"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 410, + "column" : 20, + "source_fragment" : "app_ipv4_addr = fabric_md.lkp.ipv4_dst; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_l4_port"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 411, + "column" : 20, + "source_fragment" : "app_l4_port = fabric_md.lkp.l4_dport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ip_proto"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 412, + "column" : 20, + "source_fragment" : "app_ip_proto = fabric_md.lkp.ip_proto; ..." + } + } + ] + }, + { + "name" : "upf418", + "id" : 87, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ipv4_addr"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 418, + "column" : 20, + "source_fragment" : "app_ipv4_addr = fabric_md.lkp.ipv4_src; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_l4_port"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 419, + "column" : 20, + "source_fragment" : "app_l4_port = fabric_md.lkp.l4_sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ip_proto"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 420, + "column" : 20, + "source_fragment" : "app_ip_proto = fabric_md.lkp.ip_proto; ..." + } + } + ] + }, + { + "name" : "upf424", + "id" : 88, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ipv4_addr"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 424, + "column" : 20, + "source_fragment" : "app_ipv4_addr = fabric_md.lkp.ipv4_src; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_l4_port"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 425, + "column" : 20, + "source_fragment" : "app_l4_port = fabric_md.lkp.l4_sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ip_proto"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 426, + "column" : 20, + "source_fragment" : "app_ip_proto = fabric_md.lkp.ip_proto; ..." + } + } + ] + }, + { + "name" : "upf443", + "id" : 89, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_egress_upf_ctr18"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 443, + "column" : 16, + "source_fragment" : "fabric_md.bridged.upf.skip_egress_upf_ctr = true" + } + } + ] + }, + { + "name" : "upf448", + "id" : 90, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_14"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "upf_session_meter_idx_internal"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 448, + "column" : 44, + "source_fragment" : "(bit<32>) session_meter_idx_internal" + } + }, + { + "op" : "execute_meter", + "parameters" : [ + { + "type" : "meter_array", + "value" : "FabricIngress.upf.session_meter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_14"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 448, + "column" : 16, + "source_fragment" : "session_meter.execute_meter((bit<32>) session_meter_idx_internal, fabric_md.upf_meter_color)" + } + } + ] + }, + { + "name" : "upf445", + "id" : 91, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_15"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "upf_app_meter_idx_internal"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 445, + "column" : 36, + "source_fragment" : "(bit<32>) app_meter_idx_internal" + } + }, + { + "op" : "execute_meter", + "parameters" : [ + { + "type" : "meter_array", + "value" : "FabricIngress.upf.app_meter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_15"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 445, + "column" : 12, + "source_fragment" : "app_meter.execute_meter((bit<32>) app_meter_idx_internal, fabric_md.upf_meter_color)" + } + } + ] + }, + { + "name" : "upf461", + "id" : 92, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_16"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_upf_ctr_id14"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 461, + "column" : 43, + "source_fragment" : "(bit<32>)fabric_md.bridged.upf.upf_ctr_id" + } + }, + { + "op" : "count", + "parameters" : [ + { + "type" : "counter_array", + "value" : "FabricIngress.upf.terminations_counter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_16"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 461, + "column" : 16, + "source_fragment" : "terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)" + } + } + ] + }, + { + "name" : "upf25", + "id" : 93, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_is_uplink"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 25, + "column" : 4, + "source_fragment" : "bool is_uplink = false;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 26, + "column" : 4, + "source_fragment" : "bool term_hit = false;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 27, + "column" : 4, + "source_fragment" : "bool sess_hit = false;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ipv4_addr"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 28, + "column" : 4, + "source_fragment" : "bit<32> app_ipv4_addr = 0;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_l4_port"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 29, + "column" : 4, + "source_fragment" : "l4_port_t app_l4_port = 0;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ip_proto"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 30, + "column" : 4, + "source_fragment" : "bit<8> app_ip_proto = 0;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_internal_app_id"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 55, + "column" : 30, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_ue_session_id"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 32, + "column" : 4, + "source_fragment" : "ue_session_id_t ue_session_id = 0;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_session_meter_idx_internal"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 72, + "column" : 54, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_meter_idx_internal"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 73, + "column" : 46, + "source_fragment" : "0; ..." + } + } + ] + }, + { + "name" : "filtering100", + "id" : 94, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 100, + "column" : 31, + "source_fragment" : "(bit<32>)fabric_md.bridged.base.fwd_type" + } + }, + { + "op" : "count", + "parameters" : [ + { + "type" : "counter_array", + "value" : "FabricIngress.filtering.fwd_type_counter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_17"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 100, + "column" : 8, + "source_fragment" : "fwd_type_counter.count((bit<32>)fabric_md.bridged.base.fwd_type)" + } + } + ] + }, + { + "name" : "hasher28", + "id" : 95, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_18"] + }, + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_tun_peer_id13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 32, + "column" : 17, + "source_fragment" : "fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_19"] + }, + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_teid19"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 32, + "column" : 52, + "source_fragment" : "fabric_md.bridged" + } + }, + { + "op" : "modify_field_with_hash_based_offset", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + }, + { + "type" : "calculation", + "value" : "calc" + }, + { + "type" : "hexstr", + "value" : "0xffffffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 28, + "column" : 12, + "source_fragment" : "hash( ..." + } + } + ] + }, + { + "name" : "hasher39", + "id" : 96, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_20"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 43, + "column" : 17, + "source_fragment" : "hdr.ipv4.src_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_21"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 43, + "column" : 36, + "source_fragment" : "hdr.ipv4.dst_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_22"] + }, + { + "type" : "field", + "value" : ["_ingress_gtpu12", "teid"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 43, + "column" : 55, + "source_fragment" : "hdr.gtpu.teid" + } + }, + { + "op" : "modify_field_with_hash_based_offset", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + }, + { + "type" : "calculation", + "value" : "calc_0" + }, + { + "type" : "hexstr", + "value" : "0xffffffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 39, + "column" : 12, + "source_fragment" : "hash( ..." + } + } + ] + }, + { + "name" : "hasher50", + "id" : 97, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"] + }, + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_inner_hash1"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 50, + "column" : 32, + "source_fragment" : "= fabric_md.bridged.base.inner_hash; ..." + } + } + ] + }, + { + "name" : "hasher66", + "id" : 98, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_inner_hash1"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 66, + "column" : 12, + "source_fragment" : "fabric_md.bridged.base.inner_hash = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_23"] + }, + { + "type" : "field", + "value" : ["_ingress_ethernet3", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 71, + "column" : 17, + "source_fragment" : "hdr.ethernet.dst_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_24"] + }, + { + "type" : "field", + "value" : ["_ingress_ethernet3", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 71, + "column" : 40, + "source_fragment" : "hdr.ethernet.src_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_25"] + }, + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 71, + "column" : 63, + "source_fragment" : "hdr.eth_type.value" + } + }, + { + "op" : "modify_field_with_hash_based_offset", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + }, + { + "type" : "calculation", + "value" : "calc_1" + }, + { + "type" : "hexstr", + "value" : "0xffffffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 67, + "column" : 12, + "source_fragment" : "hash( ..." + } + } + ] + }, + { + "name" : "hasher17", + "id" : 99, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_26"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_27"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_28"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_29"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_30"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "modify_field_with_hash_based_offset", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_inner_hash1"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + }, + { + "type" : "calculation", + "value" : "calc_2" + }, + { + "type" : "hexstr", + "value" : "0xffffffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "hash( ..." + } + } + ] + }, + { + "name" : "slicing174", + "id" : 100, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_31"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_slice_tc12"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 174, + "column" : 41, + "source_fragment" : "(bit<32>) fabric_md.bridged.base.slice_tc" + } + }, + { + "op" : "execute_meter", + "parameters" : [ + { + "type" : "meter_array", + "value" : "FabricIngress.qos.slice_tc_meter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_31"] + }, + { + "type" : "field", + "value" : ["scalars", "qos_packet_color"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 174, + "column" : 12, + "source_fragment" : "slice_tc_meter.execute_meter((bit<32>) fabric_md.bridged.base.slice_tc, packet_color)" + } + } + ] + }, + { + "name" : "slicing177", + "id" : 101, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "qos_packet_color"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4", + "line" : 25, + "column" : 10, + "source_fragment" : "2 ..." + } + } + ] + }, + { + "name" : "int112", + "id" : 102, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_egress_port25"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 112, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.egress_port = standard_md.egress_spec" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_queue_id24"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 113, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.queue_id = 0" + } + } + ] + }, + { + "name" : "fabric_v1model110", + "id" : 103, + "runtime_data" : [], + "primitives" : [ + { + "op" : "mark_to_drop", + "parameters" : [ + { + "type" : "header", + "value" : "standard_metadata" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 110, + "column" : 12, + "source_fragment" : "mark_to_drop(standard_md)" + } + } + ] + }, + { + "name" : "fabric_v1model106", + "id" : 104, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_bridged36" + }, + { + "type" : "header", + "value" : "_ingress_bridged4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 106, + "column" : 8, + "source_fragment" : "fabric_md.egress.bridged = fabric_md" + } + } + ] + }, + { + "name" : "nop", + "id" : 105, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 106, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 107, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 108, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 109, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 110, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 111, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.stats.count", + "id" : 112, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.pkt_io_egress.set_switch_info", + "id" : 113, + "runtime_data" : [ + { + "name" : "cpu_port", + "bitwidth" : 9 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_cpu_port37"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 36, + "column" : 27, + "source_fragment" : "= (PortId_t)cpu_port; ..." + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.pop_mpls_if_present", + "id" : 114, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_mpls6" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "hdr.mpls.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ip_eth_type10"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 200, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.bridged" + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.set_mpls", + "id" : 115, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_mpls6" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 205, + "column" : 8, + "source_fragment" : "hdr.mpls.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_mpls6", "label"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_mpls_label2"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 206, + "column" : 8, + "source_fragment" : "hdr.mpls.label = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_mpls6", "tc"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 207, + "column" : 8, + "source_fragment" : "hdr.mpls.tc = 3w0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_mpls6", "bos"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 208, + "column" : 8, + "source_fragment" : "hdr.mpls.bos = 1w1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_mpls6", "ttl"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_mpls_ttl8"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 209, + "column" : 8, + "source_fragment" : "hdr.mpls.ttl = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + }, + { + "type" : "hexstr", + "value" : "0x8847" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 112, + "column" : 31, + "source_fragment" : "0x8847; ..." + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.push_vlan", + "id" : 116, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vlan_tag4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 217, + "column" : 8, + "source_fragment" : "hdr.vlan_tag.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_vlan_tag4", "eth_type"] + }, + { + "type" : "hexstr", + "value" : "0x8100" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 111, + "column" : 31, + "source_fragment" : "0x8100; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_vlan_tag4", "vlan_id"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_vlan_id6"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 221, + "column" : 8, + "source_fragment" : "hdr.vlan_tag.vlan_id = fabric_md.bridged" + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.pop_vlan", + "id" : 117, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vlan_tag4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 249, + "column" : 8, + "source_fragment" : "hdr.vlan_tag.setInvalid()" + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.drop", + "id" : 118, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 254, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + }, + { + "type" : "hexstr", + "value" : "0x82" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 257, + "column" : 35, + "source_fragment" : "130, ..." + } + } + ] + }, + { + "name" : "FabricEgress.dscp_rewriter.rewrite", + "id" : 119, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.dscp_rewriter.clear", + "id" : 120, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "dscp_rewriter_tmp_dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "tmp_dscp = 0" + } + } + ] + }, + { + "name" : "FabricEgress.upf.load_tunnel_params", + "id" : 121, + "runtime_data" : [ + { + "name" : "tunnel_src_port", + "bitwidth" : 16 + }, + { + "name" : "tunnel_src_addr", + "bitwidth" : 32 + }, + { + "name" : "tunnel_dst_addr", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 486, + "column" : 8, + "source_fragment" : "hdr.ipv4.src_addr = tunnel_src_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 487, + "column" : 8, + "source_fragment" : "hdr.ipv4.dst_addr = tunnel_dst_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "sport"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 488, + "column" : 8, + "source_fragment" : "hdr.udp.sport = tunnel_src_port" + } + } + ] + }, + { + "name" : "FabricEgress.upf.gtpu_only", + "id" : 122, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 551, + "column" : 8, + "source_fragment" : "hdr.inner_ipv4.setValid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + }, + { + "type" : "header", + "value" : "_ingress_ipv47" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 552, + "column" : 23, + "source_fragment" : "= hdr.ipv4; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 553, + "column" : 8, + "source_fragment" : "hdr.udp.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 554, + "column" : 8, + "source_fragment" : "hdr.gtpu.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 506, + "column" : 8, + "source_fragment" : "hdr.ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 507, + "column" : 8, + "source_fragment" : "hdr.ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 508, + "column" : 8, + "source_fragment" : "hdr.ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 509, + "column" : 8, + "source_fragment" : "hdr.ipv4.ecn = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x1513" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 511, + "column" : 8, + "source_fragment" : "hdr.ipv4.identification = 0x1513" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 512, + "column" : 8, + "source_fragment" : "hdr.ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 513, + "column" : 8, + "source_fragment" : "hdr.ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "dport"] + }, + { + "type" : "hexstr", + "value" : "0x0868" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 86, + "column" : 30, + "source_fragment" : "2152; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "version"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 87, + "column" : 22, + "source_fragment" : "3w1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "pt"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 89, + "column" : 37, + "source_fragment" : "1w1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "spare"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 527, + "column" : 8, + "source_fragment" : "hdr.gtpu.spare = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "seq_flag"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 529, + "column" : 8, + "source_fragment" : "hdr.gtpu.seq_flag = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "npdu_flag"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 530, + "column" : 8, + "source_fragment" : "hdr.gtpu.npdu_flag = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "msgtype"] + }, + { + "type" : "hexstr", + "value" : "0xff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 88, + "column" : 25, + "source_fragment" : "0xff; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "teid"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_teid19"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 533, + "column" : 8, + "source_fragment" : "hdr.gtpu.teid = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "seq_num"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 535, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.seq_num = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "n_pdu_num"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 536, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.n_pdu_num = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "next_ext"] + }, + { + "type" : "hexstr", + "value" : "0x85" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 91, + "column" : 33, + "source_fragment" : "0x85; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "len"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 94, + "column" : 32, + "source_fragment" : "8w1; // 1*4-octets ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "type"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 92, + "column" : 36, + "source_fragment" : "4w0; // Downlink ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "spare0"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 541, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.spare0 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "ppp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 542, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.ppp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "rqi"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 543, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.rqi = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "next_ext"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 90, + "column" : 34, + "source_fragment" : "0x0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "total_len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "hexstr", + "value" : "0x0024" + }, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 563, + "column" : 8, + "source_fragment" : "hdr.ipv4.total_len = 20 + 8 + 8 ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "hexstr", + "value" : "0x0010" + }, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 565, + "column" : 8, + "source_fragment" : "hdr.udp.len = 8 + 8 ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "msglen"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 567, + "column" : 8, + "source_fragment" : "hdr.gtpu.msglen = hdr.inner_ipv4.total_len" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "encap_presence"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 81, + "column" : 16, + "source_fragment" : "0x1, ..." + } + } + ] + }, + { + "name" : "FabricEgress.upf.gtpu_with_psc", + "id" : 123, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_options13" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 577, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 578, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 551, + "column" : 8, + "source_fragment" : "hdr.inner_ipv4.setValid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + }, + { + "type" : "header", + "value" : "_ingress_ipv47" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 552, + "column" : 23, + "source_fragment" : "= hdr.ipv4; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 553, + "column" : 8, + "source_fragment" : "hdr.udp.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 554, + "column" : 8, + "source_fragment" : "hdr.gtpu.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 506, + "column" : 8, + "source_fragment" : "hdr.ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 507, + "column" : 8, + "source_fragment" : "hdr.ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 508, + "column" : 8, + "source_fragment" : "hdr.ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 509, + "column" : 8, + "source_fragment" : "hdr.ipv4.ecn = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x1513" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 511, + "column" : 8, + "source_fragment" : "hdr.ipv4.identification = 0x1513" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 512, + "column" : 8, + "source_fragment" : "hdr.ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 513, + "column" : 8, + "source_fragment" : "hdr.ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "dport"] + }, + { + "type" : "hexstr", + "value" : "0x0868" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 86, + "column" : 30, + "source_fragment" : "2152; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "version"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 87, + "column" : 22, + "source_fragment" : "3w1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "pt"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 89, + "column" : 37, + "source_fragment" : "1w1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "spare"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 527, + "column" : 8, + "source_fragment" : "hdr.gtpu.spare = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "seq_flag"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 529, + "column" : 8, + "source_fragment" : "hdr.gtpu.seq_flag = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "npdu_flag"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 530, + "column" : 8, + "source_fragment" : "hdr.gtpu.npdu_flag = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "msgtype"] + }, + { + "type" : "hexstr", + "value" : "0xff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 88, + "column" : 25, + "source_fragment" : "0xff; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "teid"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_teid19"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 533, + "column" : 8, + "source_fragment" : "hdr.gtpu.teid = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "seq_num"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 535, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.seq_num = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "n_pdu_num"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 536, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.n_pdu_num = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "next_ext"] + }, + { + "type" : "hexstr", + "value" : "0x85" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 91, + "column" : 33, + "source_fragment" : "0x85; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "len"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 94, + "column" : 32, + "source_fragment" : "8w1; // 1*4-octets ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "type"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 92, + "column" : 36, + "source_fragment" : "4w0; // Downlink ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "spare0"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 541, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.spare0 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "ppp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 542, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.ppp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "rqi"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 543, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.rqi = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "next_ext"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 90, + "column" : 34, + "source_fragment" : "0x0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "total_len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "hexstr", + "value" : "0x002c" + }, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 580, + "column" : 8, + "source_fragment" : "hdr.ipv4.total_len = 20 + 8 + 8 ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "hexstr", + "value" : "0x0018" + }, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 583, + "column" : 8, + "source_fragment" : "hdr.udp.len = 8 + 8 ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "msglen"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "hexstr", + "value" : "0x0008" + }, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 586, + "column" : 8, + "source_fragment" : "hdr.gtpu.msglen = 4 + 4 ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "ex_flag"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 588, + "column" : 8, + "source_fragment" : "hdr.gtpu.ex_flag = 1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "qfi"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_qfi15"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 589, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.qfi = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "encap_presence"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 82, + "column" : 20, + "source_fragment" : "0x2, ..." + } + } + ] + }, + { + "name" : "FabricEgress.parser_emulator.parse_int_ingress_drop", + "id" : 124, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "hdr.report_ethernet.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 25, + "column" : 8, + "source_fragment" : "hdr.report_eth_type.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 37, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 39, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 40, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 41, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ecn = 2w0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 44, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 45, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 53, + "column" : 8, + "source_fragment" : "hdr.report_udp.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_udp", "sport"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 54, + "column" : 8, + "source_fragment" : "hdr.report_udp.sport = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 60, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ver"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ver = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "rsvd"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 66, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.rsvd = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.common_report_header.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_int_report_md39" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 79, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ip_eth_type"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 114, + "column" : 31, + "source_fragment" : "0x0800; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "report_type"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 221, + "column" : 45, + "source_fragment" : "4; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "mirror_type"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 85, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "bmd_type"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 169, + "column" : 23, + "source_fragment" : "4, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "encap_presence"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_encap_presence7"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 93, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.encap_presence = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "flow_hash"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_inner_hash1"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 94, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.flow_hash = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_drop_report_header", "drop_reason"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_drop_reason23"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 97, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.drop_reason = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 99, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "ig_port"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ig_port3"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 101, + "column" : 8, + "source_fragment" : "hdr.common_report_header.ig_port = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "eg_port"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 102, + "column" : 8, + "source_fragment" : "hdr.common_report_header.eg_port = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "queue_id"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 103, + "column" : 8, + "source_fragment" : "hdr.common_report_header.queue_id = 0" + } + } + ] + }, + { + "name" : "FabricEgress.parser_emulator.parse_int_ingress_drop", + "id" : 125, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "hdr.report_ethernet.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 25, + "column" : 8, + "source_fragment" : "hdr.report_eth_type.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 37, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 39, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 40, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 41, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ecn = 2w0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 44, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 45, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 53, + "column" : 8, + "source_fragment" : "hdr.report_udp.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_udp", "sport"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 54, + "column" : 8, + "source_fragment" : "hdr.report_udp.sport = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 60, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ver"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ver = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "rsvd"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 66, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.rsvd = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.common_report_header.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_int_report_md39" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 79, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ip_eth_type"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 114, + "column" : 31, + "source_fragment" : "0x0800; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "report_type"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 221, + "column" : 45, + "source_fragment" : "4; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "mirror_type"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 85, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "bmd_type"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 169, + "column" : 23, + "source_fragment" : "4, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "encap_presence"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_encap_presence7"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 93, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.encap_presence = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "flow_hash"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_inner_hash1"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 94, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.flow_hash = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_drop_report_header", "drop_reason"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_drop_reason23"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 97, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.drop_reason = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 99, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "ig_port"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ig_port3"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 101, + "column" : 8, + "source_fragment" : "hdr.common_report_header.ig_port = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "eg_port"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 102, + "column" : 8, + "source_fragment" : "hdr.common_report_header.eg_port = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "queue_id"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 103, + "column" : 8, + "source_fragment" : "hdr.common_report_header.queue_id = 0" + } + } + ] + }, + { + "name" : "FabricEgress.parser_emulator.parse_int_report_mirror", + "id" : 126, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "hdr.report_ethernet.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 25, + "column" : 8, + "source_fragment" : "hdr.report_eth_type.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 37, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 39, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 40, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 41, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ecn = 2w0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 44, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 45, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 53, + "column" : 8, + "source_fragment" : "hdr.report_udp.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_udp", "sport"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 54, + "column" : 8, + "source_fragment" : "hdr.report_udp.sport = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 60, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ver"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ver = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "rsvd"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 66, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.rsvd = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.common_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "bmd_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 110, + "column" : 8, + "source_fragment" : "fabric_md.bridged.bmd_type = fabric_md.int_report_md.bmd_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_vlan_id6"] + }, + { + "type" : "hexstr", + "value" : "0x0ffe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 147, + "column" : 34, + "source_fragment" : "12w4094; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 112, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.mpls_label = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 114, + "column" : 12, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ig_tstamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 118, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ig_tstamp = fabric_md.int_report_md.ig_tstamp" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "ig_port"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ig_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 121, + "column" : 8, + "source_fragment" : "hdr.common_report_header.ig_port = fabric_md.int_report_md.ig_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "eg_port"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "eg_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 122, + "column" : 8, + "source_fragment" : "hdr.common_report_header.eg_port = fabric_md.int_report_md.eg_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "queue_id"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "queue_id"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 123, + "column" : 8, + "source_fragment" : "hdr.common_report_header.queue_id = fabric_md.int_report_md.queue_id" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 126, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_local_report_header", "queue_occupancy"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "queue_occupancy"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 127, + "column" : 8, + "source_fragment" : "hdr.local_report_header.queue_occupancy = fabric_md.int_report_md.queue_occupancy" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_local_report_header", "eg_tstamp"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "eg_tstamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 128, + "column" : 8, + "source_fragment" : "hdr.local_report_header.eg_tstamp = fabric_md.int_report_md.eg_tstamp" + } + } + ] + }, + { + "name" : "FabricEgress.parser_emulator.parse_int_report_mirror", + "id" : 127, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "hdr.report_ethernet.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 25, + "column" : 8, + "source_fragment" : "hdr.report_eth_type.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 37, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 39, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 40, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 41, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ecn = 2w0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 44, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 45, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 53, + "column" : 8, + "source_fragment" : "hdr.report_udp.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_udp", "sport"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 54, + "column" : 8, + "source_fragment" : "hdr.report_udp.sport = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 60, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ver"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ver = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "rsvd"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 66, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.rsvd = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.common_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "bmd_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 110, + "column" : 8, + "source_fragment" : "fabric_md.bridged.bmd_type = fabric_md.int_report_md.bmd_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_vlan_id6"] + }, + { + "type" : "hexstr", + "value" : "0x0ffe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 147, + "column" : 34, + "source_fragment" : "12w4094; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 112, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.mpls_label = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 114, + "column" : 12, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ig_tstamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 118, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ig_tstamp = fabric_md.int_report_md.ig_tstamp" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "ig_port"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ig_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 121, + "column" : 8, + "source_fragment" : "hdr.common_report_header.ig_port = fabric_md.int_report_md.ig_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "eg_port"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "eg_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 122, + "column" : 8, + "source_fragment" : "hdr.common_report_header.eg_port = fabric_md.int_report_md.eg_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "queue_id"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "queue_id"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 123, + "column" : 8, + "source_fragment" : "hdr.common_report_header.queue_id = fabric_md.int_report_md.queue_id" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 126, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_local_report_header", "queue_occupancy"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "queue_occupancy"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 127, + "column" : 8, + "source_fragment" : "hdr.local_report_header.queue_occupancy = fabric_md.int_report_md.queue_occupancy" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_local_report_header", "eg_tstamp"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "eg_tstamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 128, + "column" : 8, + "source_fragment" : "hdr.local_report_header.eg_tstamp = fabric_md.int_report_md.eg_tstamp" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.check_quota", + "id" : 128, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.int_egress.reset_quota", + "id" : 129, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.int_egress.set_config", + "id" : 130, + "runtime_data" : [ + { + "name" : "hop_latency_mask", + "bitwidth" : 32 + }, + { + "name" : "timestamp_mask", + "bitwidth" : 48 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + }, + "right" : { + "type" : "local", + "value" : 0 + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 179, + "column" : 8, + "source_fragment" : "fabric_md.int_md.hop_latency = fabric_md.int_md.hop_latency & hop_latency_mask" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + }, + "right" : { + "type" : "local", + "value" : 1 + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 180, + "column" : 8, + "source_fragment" : "fabric_md.int_md.timestamp = fabric_md.int_md.timestamp & timestamp_mask" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.do_local_report_encap", + "id" : 131, + "runtime_data" : [ + { + "name" : "src_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_port", + "bitwidth" : 16 + }, + { + "name" : "switch_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "modify_field_rng_uniform", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + }, + { + "type" : "hexstr", + "value" : "0xffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 195, + "column" : 8, + "source_fragment" : "random(hdr.report_ipv4.identification, 0, 0xffff)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 197, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.src_addr = src_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dst_addr = mon_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_udp", "dport"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 199, + "column" : 8, + "source_fragment" : "hdr.report_udp.dport = mon_port; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_32"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_read", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_32"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 143, + "column" : 8, + "source_fragment" : "seq_number.read(reg, seq_number_idx)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000001" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 144, + "column" : 8, + "source_fragment" : "reg = reg + 1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_33"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_write", + "parameters" : [ + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_33"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 146, + "column" : 8, + "source_fragment" : "seq_number.write(seq_number_idx, reg)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "seq_no"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ] + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "dqf"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "report_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 201, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "switch_id"] + }, + { + "type" : "runtime_data", + "value" : 3 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 202, + "column" : 8, + "source_fragment" : "hdr.common_report_header.switch_id = switch_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad1"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 203, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad1 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 204, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad2 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 205, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad3 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_eth_type", "value"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 207, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._int_mirror_type3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 125, + "column" : 39, + "source_fragment" : "0xBF04; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 218, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setValid()" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.do_local_report_encap_mpls", + "id" : 132, + "runtime_data" : [ + { + "name" : "src_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_port", + "bitwidth" : 16 + }, + { + "name" : "mon_label", + "bitwidth" : 20 + }, + { + "name" : "switch_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "modify_field_rng_uniform", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + }, + { + "type" : "hexstr", + "value" : "0xffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 195, + "column" : 8, + "source_fragment" : "random(hdr.report_ipv4.identification, 0, 0xffff)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 197, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.src_addr = src_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dst_addr = mon_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_udp", "dport"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 199, + "column" : 8, + "source_fragment" : "hdr.report_udp.dport = mon_port; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_34"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_read", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_34"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 143, + "column" : 8, + "source_fragment" : "seq_number.read(reg, seq_number_idx)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000001" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 144, + "column" : 8, + "source_fragment" : "reg = reg + 1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_35"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_write", + "parameters" : [ + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_35"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 146, + "column" : 8, + "source_fragment" : "seq_number.write(seq_number_idx, reg)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "seq_no"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ] + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "dqf"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "report_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 201, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "switch_id"] + }, + { + "type" : "runtime_data", + "value" : 4 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 202, + "column" : 8, + "source_fragment" : "hdr.common_report_header.switch_id = switch_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad1"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 203, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad1 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 204, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad2 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 205, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad3 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_eth_type", "value"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 207, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._int_mirror_type3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 125, + "column" : 39, + "source_fragment" : "0xBF04; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 218, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 126, + "column" : 39, + "source_fragment" : "0xBF05; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_mpls" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 226, + "column" : 8, + "source_fragment" : "hdr.report_mpls.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "tc"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 227, + "column" : 8, + "source_fragment" : "hdr.report_mpls.tc = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "bos"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 228, + "column" : 8, + "source_fragment" : "hdr.report_mpls.bos = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 149, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "label"] + }, + { + "type" : "runtime_data", + "value" : 3 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 230, + "column" : 8, + "source_fragment" : "hdr.report_mpls.label = mon_label" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.do_drop_report_encap", + "id" : 133, + "runtime_data" : [ + { + "name" : "src_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_port", + "bitwidth" : 16 + }, + { + "name" : "switch_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "modify_field_rng_uniform", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + }, + { + "type" : "hexstr", + "value" : "0xffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 195, + "column" : 8, + "source_fragment" : "random(hdr.report_ipv4.identification, 0, 0xffff)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 197, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.src_addr = src_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dst_addr = mon_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_udp", "dport"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 199, + "column" : 8, + "source_fragment" : "hdr.report_udp.dport = mon_port; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_36"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_read", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_36"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 143, + "column" : 8, + "source_fragment" : "seq_number.read(reg, seq_number_idx)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000001" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 144, + "column" : 8, + "source_fragment" : "reg = reg + 1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_37"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_write", + "parameters" : [ + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_37"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 146, + "column" : 8, + "source_fragment" : "seq_number.write(seq_number_idx, reg)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "seq_no"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ] + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "dqf"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "report_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 201, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "switch_id"] + }, + { + "type" : "runtime_data", + "value" : 3 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 202, + "column" : 8, + "source_fragment" : "hdr.common_report_header.switch_id = switch_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad1"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 203, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad1 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 204, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad2 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 205, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad3 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_eth_type", "value"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 207, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._int_mirror_type3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 125, + "column" : 39, + "source_fragment" : "0xBF04; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 202, + "column" : 44, + "source_fragment" : "1; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 238, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.setValid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 241, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_drop_report_header", "drop_reason"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_int_bmd_drop_reason23"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 243, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.drop_reason =" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.do_drop_report_encap_mpls", + "id" : 134, + "runtime_data" : [ + { + "name" : "src_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_port", + "bitwidth" : 16 + }, + { + "name" : "mon_label", + "bitwidth" : 20 + }, + { + "name" : "switch_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "modify_field_rng_uniform", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + }, + { + "type" : "hexstr", + "value" : "0xffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 195, + "column" : 8, + "source_fragment" : "random(hdr.report_ipv4.identification, 0, 0xffff)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 197, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.src_addr = src_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dst_addr = mon_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_udp", "dport"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 199, + "column" : 8, + "source_fragment" : "hdr.report_udp.dport = mon_port; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_38"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_read", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_38"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 143, + "column" : 8, + "source_fragment" : "seq_number.read(reg, seq_number_idx)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000001" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 144, + "column" : 8, + "source_fragment" : "reg = reg + 1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_39"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_write", + "parameters" : [ + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_39"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 146, + "column" : 8, + "source_fragment" : "seq_number.write(seq_number_idx, reg)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "seq_no"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ] + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "dqf"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "report_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 201, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "switch_id"] + }, + { + "type" : "runtime_data", + "value" : 4 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 202, + "column" : 8, + "source_fragment" : "hdr.common_report_header.switch_id = switch_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad1"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 203, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad1 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 204, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad2 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 205, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad3 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_eth_type", "value"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 207, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._int_mirror_type3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 125, + "column" : 39, + "source_fragment" : "0xBF04; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 202, + "column" : 44, + "source_fragment" : "1; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 238, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.setValid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 241, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_drop_report_header", "drop_reason"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_int_bmd_drop_reason23"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 243, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.drop_reason =" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 126, + "column" : 39, + "source_fragment" : "0xBF05; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_mpls" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 251, + "column" : 8, + "source_fragment" : "hdr.report_mpls.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "tc"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 252, + "column" : 8, + "source_fragment" : "hdr.report_mpls.tc = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "bos"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 253, + "column" : 8, + "source_fragment" : "hdr.report_mpls.bos = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 149, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "label"] + }, + { + "type" : "runtime_data", + "value" : 3 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 256, + "column" : 8, + "source_fragment" : "hdr.report_mpls.label = mon_label" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.init_int_metadata", + "id" : 135, + "runtime_data" : [ + { + "name" : "report_type", + "bitwidth" : 3 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_int_bmd_mirror_session_id22"] + }, + { + "type" : "hexstr", + "value" : "0x01fa" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 208, + "column" : 43, + "source_fragment" : "0x1FA; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_fabric_md_int_report_md" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 293, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._int_mirror_type3"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 179, + "column" : 17, + "source_fragment" : "1, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "bmd_type"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 167, + "column" : 20, + "source_fragment" : "2, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "mirror_type"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 179, + "column" : 17, + "source_fragment" : "1, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ig_port"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ig_port3"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 299, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.ig_port =" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "eg_port"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "egress_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 300, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.eg_port = (PortId_t)standard_md.egress_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "queue_id"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_egress_qid"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 301, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.queue_id = egress_qid" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "queue_occupancy"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "deq_qdepth"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 302, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.queue_occupancy = standard_md.deq_qdepth" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ig_tstamp"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 303, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "eg_tstamp"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_global_timestamp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 304, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.eg_tstamp = standard_md.egress_global_timestamp[31:0]" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ip_eth_type10"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 305, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.ip_eth_type =" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "flow_hash"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_inner_hash1"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 306, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.flow_hash =" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "report_type"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 309, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.report_type = report_type" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.adjust_ip_udp_len", + "id" : 136, + "runtime_data" : [ + { + "name" : "adjust_ip", + "bitwidth" : 16 + }, + { + "name" : "adjust_udp", + "bitwidth" : 16 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "total_len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_fabric_md_pkt_length"] + }, + "right" : { + "type" : "local", + "value" : 0 + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 342, + "column" : 8, + "source_fragment" : "hdr_v1model.ingress.ipv4.total_len = fabric_md.pkt_length + adjust_ip" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_fabric_md_pkt_length"] + }, + "right" : { + "type" : "local", + "value" : 1 + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 343, + "column" : 8, + "source_fragment" : "hdr_v1model.ingress.udp.len = fabric_md.pkt_length + adjust_udp" + } + } + ] + }, + { + "name" : "fabric_v1model136", + "id" : 137, + "runtime_data" : [], + "primitives" : [ + { + "op" : "exit", + "parameters" : [], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 136, + "column" : 12, + "source_fragment" : "exit" + } + } + ] + }, + { + "name" : "fabric_v1model133", + "id" : 138, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_cpu_port37"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 133, + "column" : 8, + "source_fragment" : "fabric_md.egress.cpu_port = 0" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator148", + "id" : 139, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ipv47" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 148, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.ipv4.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_tcp9" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 149, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.tcp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 150, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.udp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_icmp11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 151, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.icmp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vxlan15" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 153, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.vxlan.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ethernet16" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 154, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.inner_ethernet.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_eth_type17" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 155, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.inner_eth_type.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 157, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_options13" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 158, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu_options.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 159, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu_ext_psc.setInvalid()" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator14", + "id" : 140, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_drop_reason23"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 144, + "column" : 12, + "source_fragment" : "fabric_md.egress.bridged.int_bmd.drop_reason = fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_report_type21"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type47"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 145, + "column" : 12, + "source_fragment" : "fabric_md.egress.bridged.int_bmd.report_type = fabric_md" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + }, + { + "type" : "header", + "value" : "_egress_report_ethernet24" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + }, + { + "type" : "header", + "value" : "_egress_report_eth_type25" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + }, + { + "type" : "header", + "value" : "_egress_report_ipv427" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + }, + { + "type" : "header", + "value" : "_egress_report_udp28" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + }, + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + }, + { + "type" : "header", + "value" : "_egress_common_report_header30" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + }, + { + "type" : "header", + "value" : "_egress_local_report_header31" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + }, + { + "type" : "header", + "value" : "_egress_drop_report_header32" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_is_int_recirc45"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 134, + "column" : 32, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vlan_tag4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 140, + "column" : 8, + "source_fragment" : "hdr_v1model.ingress.vlan_tag.setInvalid()" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator166", + "id" : 141, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x3" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 166, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator169", + "id" : 142, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x1" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 169, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(PRESERVE_INT_MD)" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator173", + "id" : 143, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_ethernet24" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_eth_type25" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_ipv427" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_udp28" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_common_report_header30" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_local_report_header31" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_drop_report_header32" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + } + ] + }, + { + "name" : "int_tna_parser_emulator148_0", + "id" : 144, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ipv47" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 148, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.ipv4.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_tcp9" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 149, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.tcp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 150, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.udp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_icmp11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 151, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.icmp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vxlan15" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 153, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.vxlan.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ethernet16" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 154, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.inner_ethernet.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_eth_type17" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 155, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.inner_eth_type.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 157, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_options13" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 158, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu_options.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 159, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu_ext_psc.setInvalid()" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator14_0", + "id" : 145, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + }, + { + "type" : "header", + "value" : "_egress_report_ethernet24" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + }, + { + "type" : "header", + "value" : "_egress_report_eth_type25" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + }, + { + "type" : "header", + "value" : "_egress_report_ipv427" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + }, + { + "type" : "header", + "value" : "_egress_report_udp28" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + }, + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + }, + { + "type" : "header", + "value" : "_egress_common_report_header30" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + }, + { + "type" : "header", + "value" : "_egress_local_report_header31" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + }, + { + "type" : "header", + "value" : "_egress_drop_report_header32" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_is_int_recirc45"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 134, + "column" : 32, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vlan_tag4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 140, + "column" : 8, + "source_fragment" : "hdr_v1model.ingress.vlan_tag.setInvalid()" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator166_0", + "id" : 146, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 166, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator169_0", + "id" : 147, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x1" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 169, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(PRESERVE_INT_MD)" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator173_0", + "id" : 148, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_ethernet24" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_eth_type25" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_ipv427" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_udp28" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_common_report_header30" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_local_report_header31" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_drop_report_header32" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + } + ] + }, + { + "name" : "packetio51", + "id" : 149, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_packet_in1" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 51, + "column" : 12, + "source_fragment" : "hdr.packet_in.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_packet_in1", "ingress_port"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_ingress_port50"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 52, + "column" : 12, + "source_fragment" : "hdr.packet_in.ingress_port = preserved_ig_port; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_fake_ethernet2" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 53, + "column" : 12, + "source_fragment" : "hdr.fake_ethernet.setInvalid()" + } + }, + { + "op" : "exit", + "parameters" : [], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 54, + "column" : 12, + "source_fragment" : "exit" + } + } + ] + }, + { + "name" : "packetio60", + "id" : 150, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_pkt_length46"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "packet_length"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x0000ffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xfff2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 60, + "column" : 37, + "source_fragment" : "= (bit<16>)standard_md.packet_length - 14; ..." + } + } + ] + }, + { + "name" : "next283", + "id" : 151, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_report_type21"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 219, + "column" : 50, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 285, + "column" : 21, + "source_fragment" : "= 1; ..." + } + } + ] + }, + { + "name" : "next325", + "id" : 152, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 325, + "column" : 25, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + }, + { + "type" : "hexstr", + "value" : "0x83" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 258, + "column" : 32, + "source_fragment" : "131, ..." + } + } + ] + }, + { + "name" : "next323", + "id" : 153, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_mpls6", "ttl"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["_ingress_mpls6", "ttl"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 323, + "column" : 12, + "source_fragment" : "hdr.mpls.ttl = hdr.mpls.ttl - 1" + } + } + ] + }, + { + "name" : "next333", + "id" : 154, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 333, + "column" : 20, + "source_fragment" : "hdr.ipv4.ttl = hdr.ipv4.ttl - 1" + } + } + ] + }, + { + "name" : "next336", + "id" : 155, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 336, + "column" : 29, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + }, + { + "type" : "hexstr", + "value" : "0x1a" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 247, + "column" : 30, + "source_fragment" : "26, ..." + } + } + ] + }, + { + "name" : "next343", + "id" : 156, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv68", "hop_limit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv68", "hop_limit"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 343, + "column" : 20, + "source_fragment" : "hdr.ipv6.hop_limit = hdr.ipv6.hop_limit - 1" + } + } + ] + }, + { + "name" : "next346", + "id" : 157, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 346, + "column" : 29, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + }, + { + "type" : "hexstr", + "value" : "0x1a" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 247, + "column" : 30, + "source_fragment" : "26, ..." + } + } + ] + }, + { + "name" : "upf610", + "id" : 158, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_udp20" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 610, + "column" : 20, + "source_fragment" : "hdr.inner_udp.setValid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_udp20" + }, + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 611, + "column" : 34, + "source_fragment" : "= hdr.udp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 612, + "column" : 20, + "source_fragment" : "hdr.udp.setInvalid()" + } + } + ] + }, + { + "name" : "upf615", + "id" : 159, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 615, + "column" : 20, + "source_fragment" : "hdr.inner_tcp.setValid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + }, + { + "type" : "header", + "value" : "_ingress_tcp9" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 616, + "column" : 34, + "source_fragment" : "= hdr.tcp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_tcp9" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 617, + "column" : 20, + "source_fragment" : "hdr.tcp.setInvalid()" + } + } + ] + }, + { + "name" : "upf620", + "id" : 160, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 620, + "column" : 20, + "source_fragment" : "hdr.inner_icmp.setValid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + }, + { + "type" : "header", + "value" : "_ingress_icmp11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 621, + "column" : 35, + "source_fragment" : "= hdr.icmp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_icmp11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 622, + "column" : 20, + "source_fragment" : "hdr.icmp.setInvalid()" + } + } + ] + }, + { + "name" : "upf628", + "id" : 161, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_40"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_upf_ctr_id14"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 628, + "column" : 43, + "source_fragment" : "(bit<32>)fabric_md.bridged.upf.upf_ctr_id" + } + }, + { + "op" : "count", + "parameters" : [ + { + "type" : "counter_array", + "value" : "FabricEgress.upf.terminations_counter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_40"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 628, + "column" : 16, + "source_fragment" : "terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)" + } + } + ] + }, + { + "name" : "int128", + "id" : 162, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_eth_type" + }, + { + "type" : "header", + "value" : "_egress_report_eth_type25" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_mpls" + }, + { + "type" : "header", + "value" : "_egress_report_mpls26" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_ipv4" + }, + { + "type" : "header", + "value" : "_egress_report_ipv427" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_udp" + }, + { + "type" : "header", + "value" : "_egress_report_udp28" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_fixed_header" + }, + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_common_report_header" + }, + { + "type" : "header", + "value" : "_egress_common_report_header30" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + }, + { + "type" : "header", + "value" : "_egress_local_report_header31" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_drop_report_header" + }, + { + "type" : "header", + "value" : "_egress_drop_report_header32" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_eth_type" + }, + { + "type" : "header", + "value" : "_egress_eth_type35" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_fabric_md_bridged" + }, + { + "type" : "header", + "value" : "_egress_bridged36" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_fabric_md_int_report_md" + }, + { + "type" : "header", + "value" : "_egress_int_report_md39" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_hop_latency40"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_timestamp41"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "vlan_stripped"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_vlan_stripped42"] + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "queue_report"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_queue_report43"] + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_fabric_md_pkt_length"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_pkt_length46"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_egress_qid"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 135, + "column" : 4, + "source_fragment" : "QueueId_t egress_qid = 0;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "-", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_global_timestamp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 365, + "column" : 8, + "source_fragment" : "fabric_md.int_md.hop_latency = standard_md.egress_global_timestamp[31:0] - fabric_md.bridged.base.ig_tstamp[31:0]" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "egress_global_timestamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 366, + "column" : 8, + "source_fragment" : "fabric_md.int_md.timestamp = standard_md.egress_global_timestamp" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "key_0"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "-", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_global_timestamp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x10" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 166, + "column" : 12, + "source_fragment" : " fabric_md.int_md.hop_latency[31:16]: range @name(\\\"hop_latency_upper\\\");" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "key_1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "-", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_global_timestamp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 167, + "column" : 12, + "source_fragment" : " fabric_md.int_md.hop_latency[15:0]: range @name(\\\"hop_latency_lower\\\");" + } + } + ] + }, + { + "name" : "int383", + "id" : 163, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_41"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_int_bmd_mirror_session_id22"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 384, + "column" : 20, + "source_fragment" : "(bit<32>)fabric_md.bridged.int_bmd.mirror_session_id" + } + }, + { + "op" : "clone_egress_pkt_to_egress", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_41"] + }, + { + "type" : "hexstr", + "value" : "0x1" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 383, + "column" : 16, + "source_fragment" : "clone_preserving_field_list(CloneType.E2E, ..." + } + } + ] + }, + { + "name" : "int373", + "id" : 164, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "|", + "left" : { + "type" : "hexstr", + "value" : "0x00" + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x7" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x03" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 373, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.hw_id = 4w0 ++ standard_md.egress_spec[8:7]" + } + } + ] + }, + { + "name" : "slicing217", + "id" : 165, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + { + "type" : "field", + "value" : ["scalars", "dscp_rewriter_tmp_dscp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 217, + "column" : 16, + "source_fragment" : "hdr.ipv4.dscp = tmp_dscp" + } + } + ] + }, + { + "name" : "slicing189", + "id" : 166, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_bridged36" + }, + { + "type" : "header", + "value" : "int_egress_fabric_md_bridged" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 391, + "column" : 30, + "source_fragment" : "= fabric_md; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_int_report_md39" + }, + { + "type" : "header", + "value" : "int_egress_fabric_md_int_report_md" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 391, + "column" : 30, + "source_fragment" : "= fabric_md; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_hop_latency40"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 391, + "column" : 30, + "source_fragment" : "= fabric_md; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_timestamp41"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 391, + "column" : 30, + "source_fragment" : "= fabric_md; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_eth_type25" + }, + { + "type" : "header", + "value" : "int_egress_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_mpls26" + }, + { + "type" : "header", + "value" : "int_egress_hdr_report_mpls" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_ipv427" + }, + { + "type" : "header", + "value" : "int_egress_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_udp28" + }, + { + "type" : "header", + "value" : "int_egress_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + }, + { + "type" : "header", + "value" : "int_egress_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_common_report_header30" + }, + { + "type" : "header", + "value" : "int_egress_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_local_report_header31" + }, + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_drop_report_header32" + }, + { + "type" : "header", + "value" : "int_egress_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_eth_type35" + }, + { + "type" : "header", + "value" : "int_egress_hdr_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "dscp_rewriter_tmp_dscp"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_slice_tc12"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 189, + "column" : 4, + "source_fragment" : "bit<6> tmp_dscp = fabric_md.bridged.base.slice_tc;" + } + } + ] + }, + { + "name" : "fabric_v1model170", + "id" : 167, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x5" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 170, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + } + } + ] + }, + { + "name" : "fabric_v1model174", + "id" : 168, + "runtime_data" : [], + "primitives" : [ + { + "op" : "mark_to_drop", + "parameters" : [ + { + "type" : "header", + "value" : "standard_metadata" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 174, + "column" : 12, + "source_fragment" : "mark_to_drop(standard_md)" + } + } + ] + } + ], + "pipelines" : [ + { + "name" : "ingress", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 35, + "column" : 8, + "source_fragment" : "FabricIngress" + }, + "init_table" : "tbl_fabric_v1model61", + "tables" : [ + { + "name" : "tbl_fabric_v1model61", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "mark_to_drop(standard_md)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [73], + "actions" : ["fabric_v1model61"], + "base_default_next" : "node_3", + "next_tables" : { + "fabric_v1model61" : "node_3" + }, + "default_entry" : { + "action_id" : 73, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model64", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 64, + "column" : 12, + "source_fragment" : "exit" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [72], + "actions" : ["fabric_v1model64"], + "base_default_next" : "node_5", + "next_tables" : { + "fabric_v1model64" : "node_5" + }, + "default_entry" : { + "action_id" : 72, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model70", + "id" : 2, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 70, + "column" : 51, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [74], + "actions" : ["fabric_v1model70"], + "base_default_next" : "tbl_lookup_md_init15", + "next_tables" : { + "fabric_v1model70" : "tbl_lookup_md_init15" + }, + "default_entry" : { + "action_id" : 74, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init15", + "id" : 3, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 15, + "column" : 23, + "source_fragment" : "= hdr.ethernet.dst_addr; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [76], + "actions" : ["lookup_md_init15"], + "base_default_next" : "node_8", + "next_tables" : { + "lookup_md_init15" : "node_8" + }, + "default_entry" : { + "action_id" : 76, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init21", + "id" : 4, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 21, + "column" : 27, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [75], + "actions" : ["lookup_md_init21"], + "base_default_next" : "tbl_lookup_md_init24", + "next_tables" : { + "lookup_md_init21" : "tbl_lookup_md_init24" + }, + "default_entry" : { + "action_id" : 75, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init24", + "id" : 5, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 24, + "column" : 23, + "source_fragment" : "= false; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [85], + "actions" : ["lookup_md_init24"], + "base_default_next" : "node_11", + "next_tables" : { + "lookup_md_init24" : "node_11" + }, + "default_entry" : { + "action_id" : 85, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init33", + "id" : 6, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 33, + "column" : 27, + "source_fragment" : "= true; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [80], + "actions" : ["lookup_md_init33"], + "base_default_next" : "node_13", + "next_tables" : { + "lookup_md_init33" : "node_13" + }, + "default_entry" : { + "action_id" : 80, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init38", + "id" : 7, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 38, + "column" : 32, + "source_fragment" : "= hdr.inner_tcp.sport; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [77], + "actions" : ["lookup_md_init38"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init38" : "node_27" + }, + "default_entry" : { + "action_id" : 77, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init41", + "id" : 8, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 41, + "column" : 32, + "source_fragment" : "= hdr.inner_udp.sport; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [78], + "actions" : ["lookup_md_init41"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init41" : "node_27" + }, + "default_entry" : { + "action_id" : 78, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init44", + "id" : 9, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 44, + "column" : 33, + "source_fragment" : "= hdr.inner_icmp.icmp_type; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [79], + "actions" : ["lookup_md_init44"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init44" : "node_27" + }, + "default_entry" : { + "action_id" : 79, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init48", + "id" : 10, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 48, + "column" : 27, + "source_fragment" : "= true; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [84], + "actions" : ["lookup_md_init48"], + "base_default_next" : "node_21", + "next_tables" : { + "lookup_md_init48" : "node_21" + }, + "default_entry" : { + "action_id" : 84, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init53", + "id" : 11, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 53, + "column" : 32, + "source_fragment" : "= hdr.tcp.sport; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [81], + "actions" : ["lookup_md_init53"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init53" : "node_27" + }, + "default_entry" : { + "action_id" : 81, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init56", + "id" : 12, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 56, + "column" : 32, + "source_fragment" : "= hdr.udp.sport; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [82], + "actions" : ["lookup_md_init56"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init56" : "node_27" + }, + "default_entry" : { + "action_id" : 82, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init59", + "id" : 13, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 59, + "column" : 33, + "source_fragment" : "= hdr.icmp.icmp_type; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [83], + "actions" : ["lookup_md_init59"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init59" : "node_27" + }, + "default_entry" : { + "action_id" : 83, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_pkt_io_do_packet_out", + "id" : 14, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 25, + "column" : 12, + "source_fragment" : "do_packet_out()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [9], + "actions" : ["FabricIngress.pkt_io.do_packet_out"], + "base_default_next" : "FabricIngress.int_watchlist.watchlist", + "next_tables" : { + "FabricIngress.pkt_io.do_packet_out" : "FabricIngress.int_watchlist.watchlist" + }, + "default_entry" : { + "action_id" : 9, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.int_watchlist.watchlist", + "id" : 15, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 34, + "column" : 10, + "source_fragment" : "watchlist" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ipv4_valid", + "target" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_src", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ip_proto", + "target" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"], + "mask" : null + }, + { + "match_type" : "range", + "name" : "l4_sport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"], + "mask" : null + }, + { + "match_type" : "range", + "name" : "l4_dport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"], + "mask" : null + } + ], + "match_type" : "range", + "type" : "simple", + "max_size" : 64, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [68, 70, 69], + "actions" : ["FabricIngress.int_watchlist.mark_to_report", "FabricIngress.int_watchlist.no_report_collector", "FabricIngress.int_watchlist.no_report"], + "base_default_next" : "FabricIngress.stats.flows", + "next_tables" : { + "FabricIngress.int_watchlist.mark_to_report" : "FabricIngress.stats.flows", + "FabricIngress.int_watchlist.no_report_collector" : "FabricIngress.stats.flows", + "FabricIngress.int_watchlist.no_report" : "FabricIngress.stats.flows" + }, + "default_entry" : { + "action_id" : 69, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.stats.flows", + "id" : 16, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 21, + "column" : 10, + "source_fragment" : "flows" + }, + "key" : [ + { + "match_type" : "ternary", + "name" : "ipv4_src", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ip_proto", + "target" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_sport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_dport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "ig_port", + "target" : ["_ingress_bridged4", "_base_ig_port3"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [8], + "actions" : ["FabricIngress.stats.count"], + "base_default_next" : "FabricIngress.slice_tc_classifier.classifier", + "next_tables" : { + "FabricIngress.stats.count" : "FabricIngress.slice_tc_classifier.classifier" + }, + "default_entry" : { + "action_id" : 8, + "action_const" : true, + "action_data" : ["0x0"], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.slice_tc_classifier.classifier", + "id" : 17, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 44, + "column" : 10, + "source_fragment" : "classifier" + }, + "key" : [ + { + "match_type" : "ternary", + "name" : "ig_port", + "target" : ["_ingress_bridged4", "_base_ig_port3"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_src", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ip_proto", + "target" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_sport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_dport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 512, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [37, 39, 38], + "actions" : ["FabricIngress.slice_tc_classifier.set_slice_id_tc", "FabricIngress.slice_tc_classifier.trust_dscp", "FabricIngress.slice_tc_classifier.no_classification"], + "base_default_next" : "FabricIngress.filtering.ingress_port_vlan", + "next_tables" : { + "FabricIngress.slice_tc_classifier.set_slice_id_tc" : "FabricIngress.filtering.ingress_port_vlan", + "FabricIngress.slice_tc_classifier.trust_dscp" : "FabricIngress.filtering.ingress_port_vlan", + "FabricIngress.slice_tc_classifier.no_classification" : "FabricIngress.filtering.ingress_port_vlan" + }, + "default_entry" : { + "action_id" : 38, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.filtering.ingress_port_vlan", + "id" : 18, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 42, + "column" : 10, + "source_fragment" : "ingress_port_vlan" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ig_port", + "target" : ["_ingress_bridged4", "_base_ig_port3"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "vlan_is_valid", + "target" : ["_ingress_vlan_tag4", "$valid$"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "vlan_id", + "target" : ["_ingress_vlan_tag4", "vlan_id"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [10, 11, 12], + "actions" : ["FabricIngress.filtering.deny", "FabricIngress.filtering.permit", "FabricIngress.filtering.permit_with_internal_vlan"], + "base_default_next" : "FabricIngress.filtering.fwd_classifier", + "next_tables" : { + "FabricIngress.filtering.deny" : "FabricIngress.filtering.fwd_classifier", + "FabricIngress.filtering.permit" : "FabricIngress.filtering.fwd_classifier", + "FabricIngress.filtering.permit_with_internal_vlan" : "FabricIngress.filtering.fwd_classifier" + }, + "default_entry" : { + "action_id" : 10, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.filtering.fwd_classifier", + "id" : 19, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 80, + "column" : 10, + "source_fragment" : "fwd_classifier" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ig_port", + "target" : ["_ingress_bridged4", "_base_ig_port3"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_dst", + "target" : ["_ingress_ethernet3", "dst_addr"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_type", + "target" : ["_ingress_eth_type5", "value"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "ip_eth_type", + "target" : ["_ingress_bridged4", "_base_ip_eth_type10"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [13], + "actions" : ["FabricIngress.filtering.set_forwarding_type"], + "base_default_next" : "tbl_filtering100", + "next_tables" : { + "FabricIngress.filtering.set_forwarding_type" : "tbl_filtering100" + }, + "default_entry" : { + "action_id" : 13, + "action_const" : true, + "action_data" : ["0x0"], + "action_entry_const" : true + } + }, + { + "name" : "tbl_filtering100", + "id" : 20, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 100, + "column" : 8, + "source_fragment" : "fwd_type_counter.count((bit<32>)fabric_md.bridged.base.fwd_type)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [94], + "actions" : ["filtering100"], + "base_default_next" : "node_35", + "next_tables" : { + "filtering100" : "node_35" + }, + "default_entry" : { + "action_id" : 94, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf25", + "id" : 21, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 25, + "column" : 4, + "source_fragment" : "bool is_uplink = false; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [93], + "actions" : ["upf25"], + "base_default_next" : "node_37", + "next_tables" : { + "upf25" : "node_37" + }, + "default_entry" : { + "action_id" : 93, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.interfaces", + "id" : 22, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 107, + "column" : 10, + "source_fragment" : "interfaces" + }, + "key" : [ + { + "match_type" : "lpm", + "name" : "ipv4_dst_addr", + "target" : ["_ingress_ipv47", "dst_addr"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "gtpu_is_valid", + "target" : ["_ingress_gtpu12", "$valid$"], + "mask" : null + } + ], + "match_type" : "lpm", + "type" : "simple", + "max_size" : 64, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [45, 46, 47, 48], + "actions" : ["FabricIngress.upf.iface_access", "FabricIngress.upf.iface_core", "FabricIngress.upf.iface_dbuf", "FabricIngress.upf.iface_miss"], + "base_default_next" : "FabricIngress.upf.applications", + "next_tables" : { + "FabricIngress.upf.iface_access" : "tbl_upf409", + "FabricIngress.upf.iface_core" : "tbl_upf418", + "FabricIngress.upf.iface_dbuf" : "tbl_upf424", + "FabricIngress.upf.iface_miss" : "FabricIngress.upf.applications" + }, + "default_entry" : { + "action_id" : 48, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf409", + "id" : 23, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 409, + "column" : 30, + "source_fragment" : "= true; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [86], + "actions" : ["upf409"], + "base_default_next" : "node_40", + "next_tables" : { + "upf409" : "node_40" + }, + "default_entry" : { + "action_id" : 86, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.uplink_sessions", + "id" : 24, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 213, + "column" : 10, + "source_fragment" : "uplink_sessions" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "tunnel_ipv4_dst", + "target" : ["_ingress_ipv47", "dst_addr"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "teid", + "target" : ["_ingress_gtpu12", "teid"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 100000, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [56, 50, 49], + "actions" : ["FabricIngress.upf.set_uplink_session", "FabricIngress.upf.set_uplink_session_drop", "FabricIngress.upf.set_uplink_session_miss"], + "base_default_next" : "FabricIngress.upf.applications", + "next_tables" : { + "FabricIngress.upf.set_uplink_session" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_uplink_session_drop" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_uplink_session_miss" : "FabricIngress.upf.applications" + }, + "default_entry" : { + "action_id" : 49, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf418", + "id" : 25, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 418, + "column" : 34, + "source_fragment" : "= fabric_md.lkp.ipv4_src; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [87], + "actions" : ["upf418"], + "base_default_next" : "FabricIngress.upf.downlink_sessions", + "next_tables" : { + "upf418" : "FabricIngress.upf.downlink_sessions" + }, + "default_entry" : { + "action_id" : 87, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.downlink_sessions", + "id" : 26, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 198, + "column" : 10, + "source_fragment" : "downlink_sessions" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ue_addr", + "target" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 100000, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [53, 54, 55, 52, 51], + "actions" : ["FabricIngress.upf.set_downlink_session", "FabricIngress.upf.set_downlink_session_buf", "FabricIngress.upf.set_downlink_session_buf_drop", "FabricIngress.upf.set_downlink_session_drop", "FabricIngress.upf.set_downlink_session_miss"], + "base_default_next" : "FabricIngress.upf.applications", + "next_tables" : { + "FabricIngress.upf.set_downlink_session" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_downlink_session_buf" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_downlink_session_buf_drop" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_downlink_session_drop" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_downlink_session_miss" : "FabricIngress.upf.applications" + }, + "default_entry" : { + "action_id" : 51, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf424", + "id" : 27, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 424, + "column" : 34, + "source_fragment" : "= fabric_md.lkp.ipv4_src; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [88], + "actions" : ["upf424"], + "base_default_next" : "FabricIngress.upf.downlink_sessions", + "next_tables" : { + "upf424" : "FabricIngress.upf.downlink_sessions" + }, + "default_entry" : { + "action_id" : 88, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.applications", + "id" : 28, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 337, + "column" : 10, + "source_fragment" : "applications" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "slice_id", + "target" : ["scalars", "userMetadata._ingress_upf_slice_id30"], + "mask" : null + }, + { + "match_type" : "lpm", + "name" : "app_ipv4_addr", + "target" : ["scalars", "upf_app_ipv4_addr"], + "mask" : null + }, + { + "match_type" : "range", + "name" : "app_l4_port", + "target" : ["scalars", "upf_app_l4_port"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "app_ip_proto", + "target" : ["scalars", "upf_app_ip_proto"], + "mask" : null + } + ], + "match_type" : "range", + "type" : "simple", + "max_size" : 5, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [64, 5], + "actions" : ["FabricIngress.upf.set_app_id", "nop"], + "base_default_next" : "node_47", + "next_tables" : { + "FabricIngress.upf.set_app_id" : "node_47", + "nop" : "node_47" + }, + "default_entry" : { + "action_id" : 5, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.uplink_terminations", + "id" : 29, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 280, + "column" : 10, + "source_fragment" : "uplink_terminations" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ue_session_id", + "target" : ["scalars", "upf_ue_session_id"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "app_id", + "target" : ["scalars", "upf_internal_app_id"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 100000, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [61, 59, 57], + "actions" : ["FabricIngress.upf.app_fwd", "FabricIngress.upf.uplink_drop", "FabricIngress.upf.uplink_drop_miss"], + "base_default_next" : "FabricIngress.upf.uplink_recirc_rules", + "next_tables" : { + "FabricIngress.upf.app_fwd" : "FabricIngress.upf.uplink_recirc_rules", + "FabricIngress.upf.uplink_drop" : "FabricIngress.upf.uplink_recirc_rules", + "FabricIngress.upf.uplink_drop_miss" : "FabricIngress.upf.uplink_recirc_rules" + }, + "default_entry" : { + "action_id" : 57, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.uplink_recirc_rules", + "id" : 30, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 387, + "column" : 10, + "source_fragment" : "uplink_recirc_rules" + }, + "key" : [ + { + "match_type" : "ternary", + "name" : "ipv4_src", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 64, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [65, 66, 67], + "actions" : ["FabricIngress.upf.recirc_allow", "FabricIngress.upf.recirc_deny", "FabricIngress.upf.recirc_miss"], + "base_default_next" : "tbl_upf445", + "next_tables" : { + "FabricIngress.upf.recirc_allow" : "tbl_upf445", + "FabricIngress.upf.recirc_deny" : "tbl_upf445", + "FabricIngress.upf.recirc_miss" : "tbl_upf445" + }, + "default_entry" : { + "action_id" : 67, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.downlink_terminations", + "id" : 31, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 295, + "column" : 10, + "source_fragment" : "downlink_terminations" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ue_session_id", + "target" : ["scalars", "upf_ue_session_id"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "app_id", + "target" : ["scalars", "upf_internal_app_id"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 100000, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [62, 60, 58], + "actions" : ["FabricIngress.upf.downlink_fwd_encap", "FabricIngress.upf.downlink_drop", "FabricIngress.upf.downlink_drop_miss"], + "base_default_next" : "tbl_upf445", + "next_tables" : { + "FabricIngress.upf.downlink_fwd_encap" : "tbl_upf445", + "FabricIngress.upf.downlink_drop" : "tbl_upf445", + "FabricIngress.upf.downlink_drop_miss" : "tbl_upf445" + }, + "default_entry" : { + "action_id" : 58, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf443", + "id" : 32, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 443, + "column" : 58, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [89], + "actions" : ["upf443"], + "base_default_next" : "tbl_upf445", + "next_tables" : { + "upf443" : "tbl_upf445" + }, + "default_entry" : { + "action_id" : 89, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf445", + "id" : 33, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 445, + "column" : 12, + "source_fragment" : "app_meter.execute_meter((bit<32>) app_meter_idx_internal, fabric_md.upf_meter_color)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [91], + "actions" : ["upf445"], + "base_default_next" : "node_54", + "next_tables" : { + "upf445" : "node_54" + }, + "default_entry" : { + "action_id" : 91, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf448", + "id" : 34, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 448, + "column" : 16, + "source_fragment" : "session_meter.execute_meter((bit<32>) session_meter_idx_internal, fabric_md.upf_meter_color)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [90], + "actions" : ["upf448"], + "base_default_next" : "FabricIngress.upf.ig_tunnel_peers", + "next_tables" : { + "upf448" : "FabricIngress.upf.ig_tunnel_peers" + }, + "default_entry" : { + "action_id" : 90, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.ig_tunnel_peers", + "id" : 35, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 317, + "column" : 10, + "source_fragment" : "ig_tunnel_peers" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "tun_peer_id", + "target" : ["_ingress_bridged4", "_upf_tun_peer_id13"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 256, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [63, 4], + "actions" : ["FabricIngress.upf.set_routing_ipv4_dst", "nop"], + "base_default_next" : "node_57", + "next_tables" : { + "FabricIngress.upf.set_routing_ipv4_dst" : "node_57", + "nop" : "node_57" + }, + "default_entry" : { + "action_id" : 4, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf461", + "id" : 36, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 461, + "column" : 16, + "source_fragment" : "terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [92], + "actions" : ["upf461"], + "base_default_next" : "node_59", + "next_tables" : { + "upf461" : "node_59" + }, + "default_entry" : { + "action_id" : 92, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.forwarding.bridging", + "id" : 37, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 39, + "column" : 10, + "source_fragment" : "bridging" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "vlan_id", + "target" : ["_ingress_bridged4", "_base_vlan_id6"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_dst", + "target" : ["_ingress_ethernet3", "dst_addr"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [18, 14], + "actions" : ["FabricIngress.forwarding.set_next_id_bridging", "FabricIngress.forwarding.set_int_drop_reason"], + "base_default_next" : "tbl_hasher17", + "next_tables" : { + "FabricIngress.forwarding.set_next_id_bridging" : "tbl_hasher17", + "FabricIngress.forwarding.set_int_drop_reason" : "tbl_hasher17" + }, + "default_entry" : { + "action_id" : 14, + "action_const" : true, + "action_data" : ["0x59"], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.forwarding.mpls", + "id" : 38, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 74, + "column" : 10, + "source_fragment" : "mpls" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "mpls_label", + "target" : ["_ingress_bridged4", "_base_mpls_label2"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [19, 15], + "actions" : ["FabricIngress.forwarding.pop_mpls_and_next", "FabricIngress.forwarding.set_int_drop_reason"], + "base_default_next" : "tbl_hasher17", + "next_tables" : { + "FabricIngress.forwarding.pop_mpls_and_next" : "tbl_hasher17", + "FabricIngress.forwarding.set_int_drop_reason" : "tbl_hasher17" + }, + "default_entry" : { + "action_id" : 15, + "action_const" : true, + "action_data" : ["0x81"], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.forwarding.routing_v4", + "id" : 39, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 116, + "column" : 10, + "source_fragment" : "routing_v4" + }, + "key" : [ + { + "match_type" : "lpm", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"], + "mask" : null + } + ], + "match_type" : "lpm", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [20, 21, 22, 16], + "actions" : ["FabricIngress.forwarding.set_next_id_routing_v4", "FabricIngress.forwarding.nop_routing_v4", "FabricIngress.forwarding.drop_routing_v4", "FabricIngress.forwarding.set_int_drop_reason"], + "base_default_next" : "tbl_hasher17", + "next_tables" : { + "FabricIngress.forwarding.set_next_id_routing_v4" : "tbl_hasher17", + "FabricIngress.forwarding.nop_routing_v4" : "tbl_hasher17", + "FabricIngress.forwarding.drop_routing_v4" : "tbl_hasher17", + "FabricIngress.forwarding.set_int_drop_reason" : "tbl_hasher17" + }, + "default_entry" : { + "action_id" : 16, + "action_const" : false, + "action_data" : ["0x1d"], + "action_entry_const" : false + } + }, + { + "name" : "FabricIngress.forwarding.routing_v6", + "id" : 40, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 155, + "column" : 10, + "source_fragment" : "routing_v6" + }, + "key" : [ + { + "match_type" : "lpm", + "name" : "ipv6_dst", + "target" : ["_ingress_ipv68", "dst_addr"], + "mask" : null + } + ], + "match_type" : "lpm", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [23, 24, 17], + "actions" : ["FabricIngress.forwarding.set_next_id_routing_v6", "FabricIngress.forwarding.drop_routing_v6", "FabricIngress.forwarding.set_int_drop_reason"], + "base_default_next" : "tbl_hasher17", + "next_tables" : { + "FabricIngress.forwarding.set_next_id_routing_v6" : "tbl_hasher17", + "FabricIngress.forwarding.drop_routing_v6" : "tbl_hasher17", + "FabricIngress.forwarding.set_int_drop_reason" : "tbl_hasher17" + }, + "default_entry" : { + "action_id" : 17, + "action_const" : false, + "action_data" : ["0x1d"], + "action_entry_const" : false + } + }, + { + "name" : "tbl_hasher17", + "id" : 41, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "hash( ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [99], + "actions" : ["hasher17"], + "base_default_next" : "node_69", + "next_tables" : { + "hasher17" : "node_69" + }, + "default_entry" : { + "action_id" : 99, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_hasher28", + "id" : 42, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 28, + "column" : 12, + "source_fragment" : "hash( ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [95], + "actions" : ["hasher28"], + "base_default_next" : "node_76", + "next_tables" : { + "hasher28" : "node_76" + }, + "default_entry" : { + "action_id" : 95, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_hasher39", + "id" : 43, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 39, + "column" : 12, + "source_fragment" : "hash( ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [96], + "actions" : ["hasher39"], + "base_default_next" : "node_76", + "next_tables" : { + "hasher39" : "node_76" + }, + "default_entry" : { + "action_id" : 96, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_hasher50", + "id" : 44, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 50, + "column" : 32, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [97], + "actions" : ["hasher50"], + "base_default_next" : "node_76", + "next_tables" : { + "hasher50" : "node_76" + }, + "default_entry" : { + "action_id" : 97, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_hasher66", + "id" : 45, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 66, + "column" : 46, + "source_fragment" : "= 0; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [98], + "actions" : ["hasher66"], + "base_default_next" : "node_76", + "next_tables" : { + "hasher66" : "node_76" + }, + "default_entry" : { + "action_id" : 98, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.pre_next.next_mpls", + "id" : 46, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 22, + "column" : 10, + "source_fragment" : "next_mpls" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "next_id", + "target" : ["scalars", "userMetadata._ingress_next_id21"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [25, 0], + "actions" : ["FabricIngress.pre_next.set_mpls_label", "nop"], + "base_default_next" : "FabricIngress.pre_next.next_vlan", + "next_tables" : { + "FabricIngress.pre_next.set_mpls_label" : "FabricIngress.pre_next.next_vlan", + "nop" : "FabricIngress.pre_next.next_vlan" + }, + "default_entry" : { + "action_id" : 0, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.pre_next.next_vlan", + "id" : 47, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 54, + "column" : 10, + "source_fragment" : "next_vlan" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "next_id", + "target" : ["scalars", "userMetadata._ingress_next_id21"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [26, 1], + "actions" : ["FabricIngress.pre_next.set_vlan", "nop"], + "base_default_next" : "FabricIngress.acl.acl", + "next_tables" : { + "FabricIngress.pre_next.set_vlan" : "FabricIngress.acl.acl", + "nop" : "FabricIngress.acl.acl" + }, + "default_entry" : { + "action_id" : 1, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.acl.acl", + "id" : 48, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 74, + "column" : 10, + "source_fragment" : "acl" + }, + "key" : [ + { + "match_type" : "ternary", + "name" : "ig_port", + "target" : ["_ingress_bridged4", "_base_ig_port3"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_dst", + "target" : ["_ingress_ethernet3", "dst_addr"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_src", + "target" : ["_ingress_ethernet3", "src_addr"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "vlan_id", + "target" : ["scalars", "userMetadata._ingress_lkp_vlan_id9"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_type", + "target" : ["scalars", "userMetadata._ingress_lkp_eth_type8"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_src", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ip_proto", + "target" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "icmp_type", + "target" : ["scalars", "userMetadata._ingress_lkp_icmp_type16"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "icmp_code", + "target" : ["scalars", "userMetadata._ingress_lkp_icmp_code17"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_sport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_dport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ig_port_type", + "target" : ["scalars", "userMetadata._ingress_ig_port_type33"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [27, 29, 28, 30, 31, 32], + "actions" : ["FabricIngress.acl.set_next_id_acl", "FabricIngress.acl.punt_to_cpu", "FabricIngress.acl.copy_to_cpu", "FabricIngress.acl.drop", "FabricIngress.acl.set_output_port", "FabricIngress.acl.nop_acl"], + "base_default_next" : "node_80", + "next_tables" : { + "FabricIngress.acl.set_next_id_acl" : "node_80", + "FabricIngress.acl.punt_to_cpu" : "node_80", + "FabricIngress.acl.copy_to_cpu" : "node_80", + "FabricIngress.acl.drop" : "node_80", + "FabricIngress.acl.set_output_port" : "node_80", + "FabricIngress.acl.nop_acl" : "node_80" + }, + "default_entry" : { + "action_id" : 32, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.next.hashed", + "id" : 49, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 127, + "column" : 10, + "source_fragment" : "hashed" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "next_id", + "target" : ["scalars", "userMetadata._ingress_next_id21"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "indirect_ws", + "action_profile" : "FabricIngress.next.hashed_profile", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [33, 34, 2], + "actions" : ["FabricIngress.next.output_hashed", "FabricIngress.next.routing_hashed", "nop"], + "base_default_next" : "FabricIngress.next.multicast", + "next_tables" : { + "FabricIngress.next.output_hashed" : "FabricIngress.next.multicast", + "FabricIngress.next.routing_hashed" : "FabricIngress.next.multicast", + "nop" : "FabricIngress.next.multicast" + } + }, + { + "name" : "FabricIngress.next.multicast", + "id" : 50, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 161, + "column" : 10, + "source_fragment" : "multicast" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "next_id", + "target" : ["scalars", "userMetadata._ingress_next_id21"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [35, 36], + "actions" : ["FabricIngress.next.set_mcast_group_id", "FabricIngress.next.reset_mcast_group_id"], + "base_default_next" : "FabricIngress.qos.set_slice_tc", + "next_tables" : { + "FabricIngress.next.set_mcast_group_id" : "FabricIngress.qos.set_slice_tc", + "FabricIngress.next.reset_mcast_group_id" : "FabricIngress.qos.set_slice_tc" + }, + "default_entry" : { + "action_id" : 36, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.qos.set_slice_tc", + "id" : 51, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 91, + "column" : 10, + "source_fragment" : "set_slice_tc" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "fabric_md.is_upf_hit", + "target" : ["scalars", "userMetadata._ingress_is_upf_hit29"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 2, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [40, 41, 7], + "actions" : ["FabricIngress.qos.use_upf", "FabricIngress.qos.use_default", "NoAction"], + "base_default_next" : "FabricIngress.qos.default_tc", + "next_tables" : { + "FabricIngress.qos.use_upf" : "FabricIngress.qos.default_tc", + "FabricIngress.qos.use_default" : "FabricIngress.qos.default_tc", + "NoAction" : "FabricIngress.qos.default_tc" + }, + "default_entry" : { + "action_id" : 7, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + }, + "entries" : [ + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 96, + "column" : 12, + "source_fragment" : "true: use_upf" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + } + ], + "action_entry" : { + "action_id" : 40, + "action_data" : [] + }, + "priority" : 1 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 97, + "column" : 12, + "source_fragment" : "false: use_default" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x00" + } + ], + "action_entry" : { + "action_id" : 41, + "action_data" : [] + }, + "priority" : 2 + } + ] + }, + { + "name" : "FabricIngress.qos.default_tc", + "id" : 52, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 150, + "column" : 10, + "source_fragment" : "default_tc" + }, + "key" : [ + { + "match_type" : "ternary", + "name" : "slice_tc", + "target" : ["_ingress_bridged4", "_base_slice_tc12"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "tc_unknown", + "target" : ["scalars", "userMetadata._ingress_tc_unknown28"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 16, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [44, 3], + "actions" : ["FabricIngress.qos.set_default_tc", "nop"], + "base_default_next" : "node_85", + "next_tables" : { + "FabricIngress.qos.set_default_tc" : "node_85", + "nop" : "node_85" + }, + "default_entry" : { + "action_id" : 3, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_slicing174", + "id" : 53, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 174, + "column" : 12, + "source_fragment" : "slice_tc_meter.execute_meter((bit<32>) fabric_md.bridged.base.slice_tc, packet_color)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [100], + "actions" : ["slicing174"], + "base_default_next" : "FabricIngress.qos.queues", + "next_tables" : { + "slicing174" : "FabricIngress.qos.queues" + }, + "default_entry" : { + "action_id" : 100, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_slicing177", + "id" : 54, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 177, + "column" : 25, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [101], + "actions" : ["slicing177"], + "base_default_next" : "FabricIngress.qos.queues", + "next_tables" : { + "slicing177" : "FabricIngress.qos.queues" + }, + "default_entry" : { + "action_id" : 101, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.qos.queues", + "id" : 55, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 122, + "column" : 10, + "source_fragment" : "queues" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "slice_tc", + "target" : ["_ingress_bridged4", "_base_slice_tc12"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "color", + "target" : ["scalars", "qos_packet_color"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 128, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [42, 43], + "actions" : ["FabricIngress.qos.set_queue", "FabricIngress.qos.meter_drop"], + "base_default_next" : "tbl_int112", + "next_tables" : { + "FabricIngress.qos.set_queue" : "tbl_int112", + "FabricIngress.qos.meter_drop" : "tbl_int112" + }, + "default_entry" : { + "action_id" : 42, + "action_const" : true, + "action_data" : ["0x0"], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int112", + "id" : 56, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 112, + "column" : 46, + "source_fragment" : "= standard_md.egress_spec; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [102], + "actions" : ["int112"], + "base_default_next" : "FabricIngress.int_ingress.drop_report", + "next_tables" : { + "int112" : "FabricIngress.int_ingress.drop_report" + }, + "default_entry" : { + "action_id" : 102, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.int_ingress.drop_report", + "id" : 57, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 86, + "column" : 10, + "source_fragment" : "drop_report" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "int_report_type", + "target" : ["_ingress_bridged4", "_int_bmd_report_type21"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "drop_ctl", + "target" : ["scalars", "userMetadata._drop_ctl2"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "punt_to_cpu", + "target" : ["scalars", "userMetadata._ingress_punt_to_cpu23"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "egress_port_set", + "target" : ["scalars", "userMetadata._ingress_egress_port_set22"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "mcast_group_id", + "target" : ["standard_metadata", "mcast_grp"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 3, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [71, 6], + "actions" : ["FabricIngress.int_ingress.report_drop", "nop"], + "base_default_next" : "tbl_fabric_v1model106", + "next_tables" : { + "FabricIngress.int_ingress.report_drop" : "tbl_fabric_v1model106", + "nop" : "tbl_fabric_v1model106" + }, + "default_entry" : { + "action_id" : 6, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + }, + "entries" : [ + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 101, + "column" : 12, + "source_fragment" : "(INT_REPORT_TYPE_FLOW, 1, false, false, _): report_drop()" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "ternary", + "key" : "0x0000", + "mask" : "0x0000" + } + ], + "action_entry" : { + "action_id" : 71, + "action_data" : [] + }, + "priority" : 1 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 102, + "column" : 12, + "source_fragment" : "(INT_REPORT_TYPE_FLOW, 1, false, true, _): report_drop()" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "ternary", + "key" : "0x0000", + "mask" : "0x0000" + } + ], + "action_entry" : { + "action_id" : 71, + "action_data" : [] + }, + "priority" : 2 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 104, + "column" : 12, + "source_fragment" : "(INT_REPORT_TYPE_FLOW, 0, false, false, 0): report_drop()" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "ternary", + "key" : "0x0000", + "mask" : "0xffff" + } + ], + "action_entry" : { + "action_id" : 71, + "action_data" : [] + }, + "priority" : 3 + } + ] + }, + { + "name" : "tbl_fabric_v1model106", + "id" : 58, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 106, + "column" : 33, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [104], + "actions" : ["fabric_v1model106"], + "base_default_next" : "node_92", + "next_tables" : { + "fabric_v1model106" : "node_92" + }, + "default_entry" : { + "action_id" : 104, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model110", + "id" : 59, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 110, + "column" : 12, + "source_fragment" : "mark_to_drop(standard_md)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [103], + "actions" : ["fabric_v1model110"], + "base_default_next" : null, + "next_tables" : { + "fabric_v1model110" : null + }, + "default_entry" : { + "action_id" : 103, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + } + ], + "action_profiles" : [ + { + "name" : "FabricIngress.next.hashed_profile", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 112, + "column" : 15, + "source_fragment" : "hashed_profile" + }, + "max_size" : 16, + "selector" : { + "algo" : "crc16", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"] + } + ] + } + } + ], + "conditionals" : [ + { + "name" : "node_3", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 62, + "column" : 12, + "source_fragment" : "standard_md.parser_error == error.PacketRejectedByParser" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "parser_error"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x8" + } + } + }, + "true_next" : "tbl_fabric_v1model64", + "false_next" : "node_5" + }, + { + "name" : "node_5", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 67, + "column" : 13, + "source_fragment" : "standard_md.instance_type == 4" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "instance_type"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000004" + } + } + }, + "true_next" : "tbl_fabric_v1model70", + "false_next" : "tbl_lookup_md_init15" + }, + { + "name" : "node_8", + "id" : 2, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 20, + "column" : 12, + "source_fragment" : "hdr.vlan_tag.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_vlan_tag4", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init21", + "false_next" : "tbl_lookup_md_init24" + }, + { + "name" : "node_11", + "id" : 3, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 32, + "column" : 12, + "source_fragment" : "hdr.inner_ipv4.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init33", + "false_next" : "node_19" + }, + { + "name" : "node_13", + "id" : 4, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 37, + "column" : 16, + "source_fragment" : "hdr.inner_tcp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_tcp19", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init38", + "false_next" : "node_15" + }, + { + "name" : "node_15", + "id" : 5, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 40, + "column" : 23, + "source_fragment" : "hdr.inner_udp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_udp20", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init41", + "false_next" : "node_17" + }, + { + "name" : "node_17", + "id" : 6, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 43, + "column" : 23, + "source_fragment" : "hdr.inner_icmp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_icmp21", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init44", + "false_next" : "node_27" + }, + { + "name" : "node_19", + "id" : 7, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 47, + "column" : 19, + "source_fragment" : "hdr.ipv4.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init48", + "false_next" : "node_27" + }, + { + "name" : "node_21", + "id" : 8, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 52, + "column" : 16, + "source_fragment" : "hdr.tcp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_tcp9", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init53", + "false_next" : "node_23" + }, + { + "name" : "node_23", + "id" : 9, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 55, + "column" : 23, + "source_fragment" : "hdr.udp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_udp10", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init56", + "false_next" : "node_25" + }, + { + "name" : "node_25", + "id" : 10, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 58, + "column" : 23, + "source_fragment" : "hdr.icmp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_icmp11", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init59", + "false_next" : "node_27" + }, + { + "name" : "node_27", + "id" : 11, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 24, + "column" : 12, + "source_fragment" : "hdr.packet_out.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_packet_out0", "$valid$"] + } + } + }, + "true_next" : "tbl_pkt_io_do_packet_out", + "false_next" : "FabricIngress.int_watchlist.watchlist" + }, + { + "name" : "node_35", + "id" : 12, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 84, + "column" : 13, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + } + } + }, + "false_next" : "tbl_upf25", + "true_next" : "node_59" + }, + { + "name" : "node_37", + "id" : 13, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 406, + "column" : 12, + "source_fragment" : "hdr.ipv4.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + }, + "true_next" : "FabricIngress.upf.interfaces", + "false_next" : "node_59" + }, + { + "name" : "node_40", + "id" : 14, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 413, + "column" : 24, + "source_fragment" : "fabric_md.bridged.base.encap_presence != EncapPresence.NONE" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + }, + "true_next" : "FabricIngress.upf.uplink_sessions", + "false_next" : "FabricIngress.upf.applications" + }, + { + "name" : "node_47", + "id" : 15, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 433, + "column" : 16, + "source_fragment" : "sess_hit" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + } + } + }, + "true_next" : "node_48", + "false_next" : "tbl_upf443" + }, + { + "name" : "node_48", + "id" : 16, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 434, + "column" : 20, + "source_fragment" : "is_uplink" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "upf_is_uplink"] + } + } + }, + "true_next" : "FabricIngress.upf.uplink_terminations", + "false_next" : "FabricIngress.upf.downlink_terminations" + }, + { + "name" : "node_54", + "id" : 17, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 446, + "column" : 16, + "source_fragment" : "fabric_md.upf_meter_color != MeterColor_t.RED" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" + } + } + }, + "true_next" : "tbl_upf448", + "false_next" : "FabricIngress.upf.ig_tunnel_peers" + }, + { + "name" : "node_57", + "id" : 18, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 451, + "column" : 16, + "source_fragment" : "term_hit" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + } + } + }, + "true_next" : "tbl_upf461", + "false_next" : "node_59" + }, + { + "name" : "node_59", + "id" : 19, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 88, + "column" : 13, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + } + } + }, + "false_next" : "node_60", + "true_next" : "tbl_hasher17" + }, + { + "name" : "node_60", + "id" : 20, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 178, + "column" : 12, + "source_fragment" : "hdr.ethernet.isValid() && ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ethernet3", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + } + } + }, + "true_next" : "FabricIngress.forwarding.bridging", + "false_next" : "node_62" + }, + { + "name" : "node_62", + "id" : 21, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 181, + "column" : 19, + "source_fragment" : "hdr.mpls.isValid() && ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_mpls6", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + }, + "true_next" : "FabricIngress.forwarding.mpls", + "false_next" : "node_64" + }, + { + "name" : "node_64", + "id" : 22, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 184, + "column" : 19, + "source_fragment" : "fabric_md.lkp.is_ipv4 && ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "or", + "left" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x03" + } + } + } + } + } + } + }, + "true_next" : "FabricIngress.forwarding.routing_v4", + "false_next" : "node_66" + }, + { + "name" : "node_66", + "id" : 23, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 188, + "column" : 19, + "source_fragment" : "hdr.ipv6.isValid() && ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv68", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + } + } + }, + "true_next" : "FabricIngress.forwarding.routing_v6", + "false_next" : "tbl_hasher17" + }, + { + "name" : "node_69", + "id" : 24, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 27, + "column" : 12, + "source_fragment" : "fabric_md.bridged" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_needs_gtpu_encap16"] + } + } + }, + "true_next" : "tbl_hasher28", + "false_next" : "node_71" + }, + { + "name" : "node_71", + "id" : 25, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 38, + "column" : 12, + "source_fragment" : "hdr.gtpu.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_gtpu12", "$valid$"] + } + } + }, + "true_next" : "tbl_hasher39", + "false_next" : "node_73" + }, + { + "name" : "node_73", + "id" : 26, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"] + } + } + }, + "true_next" : "tbl_hasher50", + "false_next" : "tbl_hasher66" + }, + { + "name" : "node_76", + "id" : 27, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 92, + "column" : 13, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + } + } + }, + "false_next" : "FabricIngress.pre_next.next_mpls", + "true_next" : "FabricIngress.acl.acl" + }, + { + "name" : "node_80", + "id" : 28, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 96, + "column" : 13, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + } + } + }, + "false_next" : "FabricIngress.next.hashed", + "true_next" : "FabricIngress.qos.set_slice_tc" + }, + { + "name" : "node_85", + "id" : 29, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 173, + "column" : 12, + "source_fragment" : "fabric_md.upf_meter_color != MeterColor_t.RED" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" + } + } + }, + "true_next" : "tbl_slicing174", + "false_next" : "tbl_slicing177" + }, + { + "name" : "node_92", + "id" : 30, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 109, + "column" : 12, + "source_fragment" : "fabric_md.drop_ctl == 1" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + }, + "false_next" : null, + "true_next" : "tbl_fabric_v1model110" + } + ] + }, + { + "name" : "egress", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 115, + "column" : 8, + "source_fragment" : "FabricEgress" + }, + "init_table" : "tbl_fabric_v1model133", + "tables" : [ + { + "name" : "tbl_fabric_v1model133", + "id" : 60, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 133, + "column" : 34, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [138], + "actions" : ["fabric_v1model133"], + "base_default_next" : "node_97", + "next_tables" : { + "fabric_v1model133" : "node_97" + }, + "default_entry" : { + "action_id" : 138, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model136", + "id" : 61, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 136, + "column" : 12, + "source_fragment" : "exit" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [137], + "actions" : ["fabric_v1model136"], + "base_default_next" : "node_99", + "next_tables" : { + "fabric_v1model136" : "node_99" + }, + "default_entry" : { + "action_id" : 137, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator14", + "id" : 62, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [140], + "actions" : ["int_tna_parser_emulator14"], + "base_default_next" : "node_101", + "next_tables" : { + "int_tna_parser_emulator14" : "node_101" + }, + "default_entry" : { + "action_id" : 140, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator148", + "id" : 63, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 148, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.ipv4.setInvalid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [139], + "actions" : ["int_tna_parser_emulator148"], + "base_default_next" : "node_103", + "next_tables" : { + "int_tna_parser_emulator148" : "node_103" + }, + "default_entry" : { + "action_id" : 139, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_parser_emulator_parse_int_ingress_drop", + "id" : 64, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 165, + "column" : 12, + "source_fragment" : "parse_int_ingress_drop()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [124], + "actions" : ["FabricEgress.parser_emulator.parse_int_ingress_drop"], + "base_default_next" : "tbl_int_tna_parser_emulator166", + "next_tables" : { + "FabricEgress.parser_emulator.parse_int_ingress_drop" : "tbl_int_tna_parser_emulator166" + }, + "default_entry" : { + "action_id" : 124, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator166", + "id" : 65, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 166, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [141], + "actions" : ["int_tna_parser_emulator166"], + "base_default_next" : "tbl_int_tna_parser_emulator173", + "next_tables" : { + "int_tna_parser_emulator166" : "tbl_int_tna_parser_emulator173" + }, + "default_entry" : { + "action_id" : 141, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_parser_emulator_parse_int_report_mirror", + "id" : 66, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 168, + "column" : 12, + "source_fragment" : "parse_int_report_mirror()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [126], + "actions" : ["FabricEgress.parser_emulator.parse_int_report_mirror"], + "base_default_next" : "tbl_int_tna_parser_emulator169", + "next_tables" : { + "FabricEgress.parser_emulator.parse_int_report_mirror" : "tbl_int_tna_parser_emulator169" + }, + "default_entry" : { + "action_id" : 126, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator169", + "id" : 67, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 169, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(PRESERVE_INT_MD)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [142], + "actions" : ["int_tna_parser_emulator169"], + "base_default_next" : "tbl_int_tna_parser_emulator173", + "next_tables" : { + "int_tna_parser_emulator169" : "tbl_int_tna_parser_emulator173" + }, + "default_entry" : { + "action_id" : 142, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator173", + "id" : 68, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [143], + "actions" : ["int_tna_parser_emulator173"], + "base_default_next" : "node_109", + "next_tables" : { + "int_tna_parser_emulator173" : "node_109" + }, + "default_entry" : { + "action_id" : 143, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator14_0", + "id" : 69, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [145], + "actions" : ["int_tna_parser_emulator14_0"], + "base_default_next" : "node_111", + "next_tables" : { + "int_tna_parser_emulator14_0" : "node_111" + }, + "default_entry" : { + "action_id" : 145, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator148_0", + "id" : 70, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 148, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.ipv4.setInvalid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [144], + "actions" : ["int_tna_parser_emulator148_0"], + "base_default_next" : "node_113", + "next_tables" : { + "int_tna_parser_emulator148_0" : "node_113" + }, + "default_entry" : { + "action_id" : 144, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_parser_emulator_parse_int_ingress_drop_0", + "id" : 71, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 165, + "column" : 12, + "source_fragment" : "parse_int_ingress_drop()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [125], + "actions" : ["FabricEgress.parser_emulator.parse_int_ingress_drop"], + "base_default_next" : "tbl_int_tna_parser_emulator166_0", + "next_tables" : { + "FabricEgress.parser_emulator.parse_int_ingress_drop" : "tbl_int_tna_parser_emulator166_0" + }, + "default_entry" : { + "action_id" : 125, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator166_0", + "id" : 72, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 166, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [146], + "actions" : ["int_tna_parser_emulator166_0"], + "base_default_next" : "tbl_int_tna_parser_emulator173_0", + "next_tables" : { + "int_tna_parser_emulator166_0" : "tbl_int_tna_parser_emulator173_0" + }, + "default_entry" : { + "action_id" : 146, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_parser_emulator_parse_int_report_mirror_0", + "id" : 73, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 168, + "column" : 12, + "source_fragment" : "parse_int_report_mirror()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [127], + "actions" : ["FabricEgress.parser_emulator.parse_int_report_mirror"], + "base_default_next" : "tbl_int_tna_parser_emulator169_0", + "next_tables" : { + "FabricEgress.parser_emulator.parse_int_report_mirror" : "tbl_int_tna_parser_emulator169_0" + }, + "default_entry" : { + "action_id" : 127, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator169_0", + "id" : 74, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 169, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(PRESERVE_INT_MD)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [147], + "actions" : ["int_tna_parser_emulator169_0"], + "base_default_next" : "tbl_int_tna_parser_emulator173_0", + "next_tables" : { + "int_tna_parser_emulator169_0" : "tbl_int_tna_parser_emulator173_0" + }, + "default_entry" : { + "action_id" : 147, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator173_0", + "id" : 75, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [148], + "actions" : ["int_tna_parser_emulator173_0"], + "base_default_next" : "FabricEgress.pkt_io_egress.switch_info", + "next_tables" : { + "int_tna_parser_emulator173_0" : "FabricEgress.pkt_io_egress.switch_info" + }, + "default_entry" : { + "action_id" : 148, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.pkt_io_egress.switch_info", + "id" : 76, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 39, + "column" : 10, + "source_fragment" : "switch_info" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [113, 105], + "actions" : ["FabricEgress.pkt_io_egress.set_switch_info", "nop"], + "base_default_next" : "node_120", + "next_tables" : { + "FabricEgress.pkt_io_egress.set_switch_info" : "node_120", + "nop" : "node_120" + }, + "default_entry" : { + "action_id" : 105, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + } + }, + { + "name" : "tbl_packetio51", + "id" : 77, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 51, + "column" : 12, + "source_fragment" : "hdr.packet_in.setValid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [149], + "actions" : ["packetio51"], + "base_default_next" : "node_122", + "next_tables" : { + "packetio51" : "node_122" + }, + "default_entry" : { + "action_id" : 149, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_packetio60", + "id" : 78, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 60, + "column" : 37, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [150], + "actions" : ["packetio60"], + "base_default_next" : "node_124", + "next_tables" : { + "packetio60" : "node_124" + }, + "default_entry" : { + "action_id" : 150, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.stats.flows", + "id" : 79, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 53, + "column" : 10, + "source_fragment" : "flows" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "stats_flow_id", + "target" : ["_egress_bridged36", "_base_stats_flow_id11"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "eg_port", + "target" : ["standard_metadata", "egress_port"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [112], + "actions" : ["FabricEgress.stats.count"], + "base_default_next" : "node_126", + "next_tables" : { + "FabricEgress.stats.count" : "node_126" + }, + "default_entry" : { + "action_id" : 112, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next283", + "id" : 80, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 283, + "column" : 50, + "source_fragment" : "= INT_REPORT_TYPE_NO_REPORT; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [151], + "actions" : ["next283"], + "base_default_next" : "node_128", + "next_tables" : { + "next283" : "node_128" + }, + "default_entry" : { + "action_id" : 151, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_egress_next_pop_mpls_if_present", + "id" : 81, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 289, + "column" : 36, + "source_fragment" : "pop_mpls_if_present()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [114], + "actions" : ["FabricEgress.egress_next.pop_mpls_if_present"], + "base_default_next" : "node_132", + "next_tables" : { + "FabricEgress.egress_next.pop_mpls_if_present" : "node_132" + }, + "default_entry" : { + "action_id" : 114, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_egress_next_set_mpls", + "id" : 82, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 291, + "column" : 12, + "source_fragment" : "set_mpls()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [115], + "actions" : ["FabricEgress.egress_next.set_mpls"], + "base_default_next" : "node_132", + "next_tables" : { + "FabricEgress.egress_next.set_mpls" : "node_132" + }, + "default_entry" : { + "action_id" : 115, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.egress_next.egress_vlan", + "id" : 83, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 264, + "column" : 10, + "source_fragment" : "egress_vlan" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "vlan_id", + "target" : ["_egress_bridged36", "_base_vlan_id6"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "eg_port", + "target" : ["standard_metadata", "egress_port"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [116, 117, 118], + "actions" : ["FabricEgress.egress_next.push_vlan", "FabricEgress.egress_next.pop_vlan", "FabricEgress.egress_next.drop"], + "base_default_next" : "node_134", + "next_tables" : { + "FabricEgress.egress_next.push_vlan" : "node_134", + "FabricEgress.egress_next.pop_vlan" : "node_134", + "FabricEgress.egress_next.drop" : "node_134" + }, + "default_entry" : { + "action_id" : 118, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next323", + "id" : 84, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 323, + "column" : 25, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [153], + "actions" : ["next323"], + "base_default_next" : "node_136", + "next_tables" : { + "next323" : "node_136" + }, + "default_entry" : { + "action_id" : 153, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next325", + "id" : 85, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 325, + "column" : 25, + "source_fragment" : "= 1; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [152], + "actions" : ["next325"], + "base_default_next" : "node_148", + "next_tables" : { + "next325" : "node_148" + }, + "default_entry" : { + "action_id" : 152, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next333", + "id" : 86, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 333, + "column" : 33, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [154], + "actions" : ["next333"], + "base_default_next" : "node_141", + "next_tables" : { + "next333" : "node_141" + }, + "default_entry" : { + "action_id" : 154, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next336", + "id" : 87, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 336, + "column" : 29, + "source_fragment" : "= 1; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [155], + "actions" : ["next336"], + "base_default_next" : "node_148", + "next_tables" : { + "next336" : "node_148" + }, + "default_entry" : { + "action_id" : 155, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next343", + "id" : 88, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 343, + "column" : 39, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [156], + "actions" : ["next343"], + "base_default_next" : "node_146", + "next_tables" : { + "next343" : "node_146" + }, + "default_entry" : { + "action_id" : 156, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next346", + "id" : 89, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 346, + "column" : 29, + "source_fragment" : "= 1; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [157], + "actions" : ["next346"], + "base_default_next" : "node_148", + "next_tables" : { + "next346" : "node_148" + }, + "default_entry" : { + "action_id" : 157, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf610", + "id" : 90, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 610, + "column" : 20, + "source_fragment" : "hdr.inner_udp.setValid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [158], + "actions" : ["upf610"], + "base_default_next" : "node_152", + "next_tables" : { + "upf610" : "node_152" + }, + "default_entry" : { + "action_id" : 158, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf615", + "id" : 91, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 615, + "column" : 20, + "source_fragment" : "hdr.inner_tcp.setValid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [159], + "actions" : ["upf615"], + "base_default_next" : "node_154", + "next_tables" : { + "upf615" : "node_154" + }, + "default_entry" : { + "action_id" : 159, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf620", + "id" : 92, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 620, + "column" : 20, + "source_fragment" : "hdr.inner_icmp.setValid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [160], + "actions" : ["upf620"], + "base_default_next" : "FabricEgress.upf.gtpu_encap", + "next_tables" : { + "upf620" : "FabricEgress.upf.gtpu_encap" + }, + "default_entry" : { + "action_id" : 160, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.upf.gtpu_encap", + "id" : 93, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 597, + "column" : 10, + "source_fragment" : "gtpu_encap" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [122, 123], + "actions" : ["FabricEgress.upf.gtpu_only", "FabricEgress.upf.gtpu_with_psc"], + "base_default_next" : "FabricEgress.upf.eg_tunnel_peers", + "next_tables" : { + "FabricEgress.upf.gtpu_only" : "FabricEgress.upf.eg_tunnel_peers", + "FabricEgress.upf.gtpu_with_psc" : "FabricEgress.upf.eg_tunnel_peers" + }, + "default_entry" : { + "action_id" : 122, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + } + }, + { + "name" : "FabricEgress.upf.eg_tunnel_peers", + "id" : 94, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 491, + "column" : 10, + "source_fragment" : "eg_tunnel_peers" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "tun_peer_id", + "target" : ["_egress_bridged36", "_upf_tun_peer_id13"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 256, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [121, 107], + "actions" : ["FabricEgress.upf.load_tunnel_params", "nop"], + "base_default_next" : "node_158", + "next_tables" : { + "FabricEgress.upf.load_tunnel_params" : "node_158", + "nop" : "node_158" + }, + "default_entry" : { + "action_id" : 107, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf628", + "id" : 95, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 628, + "column" : 16, + "source_fragment" : "terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [161], + "actions" : ["upf628"], + "base_default_next" : "tbl_int128", + "next_tables" : { + "upf628" : "tbl_int128" + }, + "default_entry" : { + "action_id" : 161, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int128", + "id" : 96, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [162], + "actions" : ["int128"], + "base_default_next" : "FabricEgress.int_egress.queue_latency_thresholds", + "next_tables" : { + "int128" : "FabricEgress.int_egress.queue_latency_thresholds" + }, + "default_entry" : { + "action_id" : 162, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.int_egress.queue_latency_thresholds", + "id" : 97, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 159, + "column" : 10, + "source_fragment" : "queue_latency_thresholds" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "egress_qid", + "target" : ["scalars", "int_egress_egress_qid"], + "mask" : null + }, + { + "match_type" : "range", + "name" : "hop_latency_upper", + "target" : ["scalars", "key_0"], + "mask" : null + }, + { + "match_type" : "range", + "name" : "hop_latency_lower", + "target" : ["scalars", "key_1"], + "mask" : null + } + ], + "match_type" : "range", + "type" : "simple", + "max_size" : 128, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [128, 129, 108], + "actions" : ["FabricEgress.int_egress.check_quota", "FabricEgress.int_egress.reset_quota", "nop"], + "base_default_next" : "FabricEgress.int_egress.config", + "next_tables" : { + "FabricEgress.int_egress.check_quota" : "FabricEgress.int_egress.config", + "FabricEgress.int_egress.reset_quota" : "FabricEgress.int_egress.config", + "nop" : "FabricEgress.int_egress.config" + }, + "default_entry" : { + "action_id" : 108, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + } + }, + { + "name" : "FabricEgress.int_egress.config", + "id" : 98, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 183, + "column" : 10, + "source_fragment" : "config" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [130], + "actions" : ["FabricEgress.int_egress.set_config"], + "base_default_next" : "tbl_int373", + "next_tables" : { + "FabricEgress.int_egress.set_config" : "tbl_int373" + }, + "default_entry" : { + "action_id" : 130, + "action_const" : false, + "action_data" : ["0xffffff00", "0xffffc0000000"], + "action_entry_const" : false + } + }, + { + "name" : "tbl_int373", + "id" : 99, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 373, + "column" : 38, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [164], + "actions" : ["int373"], + "base_default_next" : "node_164", + "next_tables" : { + "int373" : "node_164" + }, + "default_entry" : { + "action_id" : 164, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.int_egress.report", + "id" : 100, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 260, + "column" : 10, + "source_fragment" : "report" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "bmd_type", + "target" : ["int_egress_fabric_md_int_report_md", "bmd_type"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "mirror_type", + "target" : ["int_egress_fabric_md_int_report_md", "mirror_type"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "int_report_type", + "target" : ["int_egress_fabric_md_int_report_md", "report_type"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 6, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [131, 132, 133, 134, 109], + "actions" : ["FabricEgress.int_egress.do_local_report_encap", "FabricEgress.int_egress.do_local_report_encap_mpls", "FabricEgress.int_egress.do_drop_report_encap", "FabricEgress.int_egress.do_drop_report_encap_mpls", "nop"], + "base_default_next" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "next_tables" : { + "FabricEgress.int_egress.do_local_report_encap" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "FabricEgress.int_egress.do_local_report_encap_mpls" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "FabricEgress.int_egress.do_drop_report_encap" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "FabricEgress.int_egress.do_drop_report_encap_mpls" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "nop" : "FabricEgress.int_egress.adjust_int_report_hdr_length" + }, + "default_entry" : { + "action_id" : 109, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + } + }, + { + "name" : "FabricEgress.int_egress.int_metadata", + "id" : 101, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 315, + "column" : 10, + "source_fragment" : "int_metadata" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "int_report_type", + "target" : ["_egress_bridged36", "_int_bmd_report_type21"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "drop_ctl", + "target" : ["scalars", "userMetadata._drop_ctl2"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "queue_report", + "target" : ["scalars", "userMetadata._egress_int_md_queue_report43"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 2, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [135, 110], + "actions" : ["FabricEgress.int_egress.init_int_metadata", "nop"], + "base_default_next" : null, + "next_tables" : { + "__HIT__" : "tbl_int383", + "__MISS__" : "FabricEgress.int_egress.adjust_int_report_hdr_length" + }, + "default_entry" : { + "action_id" : 110, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + }, + "entries" : [ + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 327, + "column" : 12, + "source_fragment" : "(INT_REPORT_TYPE_FLOW, 0, false): init_int_metadata(INT_REPORT_TYPE_FLOW)" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "exact", + "key" : "0x00" + } + ], + "action_entry" : { + "action_id" : 135, + "action_data" : ["0x1"] + }, + "priority" : 1 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 329, + "column" : 12, + "source_fragment" : "(INT_REPORT_TYPE_FLOW, 1, false): init_int_metadata(INT_REPORT_TYPE_DROP)" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x00" + } + ], + "action_entry" : { + "action_id" : 135, + "action_data" : ["0x4"] + }, + "priority" : 2 + } + ] + }, + { + "name" : "tbl_int383", + "id" : 102, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 383, + "column" : 16, + "source_fragment" : "clone_preserving_field_list(CloneType.E2E, ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [163], + "actions" : ["int383"], + "base_default_next" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "next_tables" : { + "int383" : "FabricEgress.int_egress.adjust_int_report_hdr_length" + }, + "default_entry" : { + "action_id" : 163, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "id" : 103, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 347, + "column" : 10, + "source_fragment" : "adjust_int_report_hdr_length" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "is_int_wip", + "target" : ["int_egress_fabric_md_bridged", "_int_bmd_wip_type26"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 2, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [111, 136], + "actions" : ["nop", "FabricEgress.int_egress.adjust_ip_udp_len"], + "base_default_next" : "tbl_slicing189", + "next_tables" : { + "nop" : "tbl_slicing189", + "FabricEgress.int_egress.adjust_ip_udp_len" : "tbl_slicing189" + }, + "default_entry" : { + "action_id" : 111, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + }, + "entries" : [ + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 358, + "column" : 12, + "source_fragment" : "INT_IS_WIP: adjust_ip_udp_len(INT_WIP_ADJUST_IP_BYTES, INT_WIP_ADJUST_UDP_BYTES)" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + } + ], + "action_entry" : { + "action_id" : 136, + "action_data" : ["0xfff2", "0xffde"] + }, + "priority" : 1 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 359, + "column" : 12, + "source_fragment" : "INT_IS_WIP_WITH_MPLS: adjust_ip_udp_len(INT_WIP_ADJUST_IP_MPLS_BYTES, INT_WIP_ADJUST_UDP_MPLS_BYTES)" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x02" + } + ], + "action_entry" : { + "action_id" : 136, + "action_data" : ["0xffee", "0xffda"] + }, + "priority" : 2 + } + ] + }, + { + "name" : "tbl_slicing189", + "id" : 104, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 189, + "column" : 4, + "source_fragment" : "bit<6> tmp_dscp = fabric_md.bridged.base.slice_tc; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [166], + "actions" : ["slicing189"], + "base_default_next" : "FabricEgress.dscp_rewriter.rewriter", + "next_tables" : { + "slicing189" : "FabricEgress.dscp_rewriter.rewriter" + }, + "default_entry" : { + "action_id" : 166, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.dscp_rewriter.rewriter", + "id" : 105, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 201, + "column" : 10, + "source_fragment" : "rewriter" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "eg_port", + "target" : ["standard_metadata", "egress_port"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 512, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [119, 120, 106], + "actions" : ["FabricEgress.dscp_rewriter.rewrite", "FabricEgress.dscp_rewriter.clear", "nop"], + "base_default_next" : null, + "next_tables" : { + "__HIT__" : "node_171", + "__MISS__" : "node_173" + }, + "default_entry" : { + "action_id" : 106, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_slicing217", + "id" : 106, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 217, + "column" : 30, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [165], + "actions" : ["slicing217"], + "base_default_next" : "node_173", + "next_tables" : { + "slicing217" : "node_173" + }, + "default_entry" : { + "action_id" : 165, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model170", + "id" : 107, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 170, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [167], + "actions" : ["fabric_v1model170"], + "base_default_next" : "node_175", + "next_tables" : { + "fabric_v1model170" : "node_175" + }, + "default_entry" : { + "action_id" : 167, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model174", + "id" : 108, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 174, + "column" : 12, + "source_fragment" : "mark_to_drop(standard_md)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [168], + "actions" : ["fabric_v1model174"], + "base_default_next" : null, + "next_tables" : { + "fabric_v1model174" : null + }, + "default_entry" : { + "action_id" : 168, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + } + ], + "action_profiles" : [], + "conditionals" : [ + { + "name" : "node_97", + "id" : 31, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 135, + "column" : 12, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._skip_egress0"] + } + } + }, + "true_next" : "tbl_fabric_v1model136", + "false_next" : "node_99" + }, + { + "name" : "node_99", + "id" : 32, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 140, + "column" : 13, + "source_fragment" : "standard_md.instance_type == 2" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "instance_type"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000002" + } + } + }, + "true_next" : "tbl_int_tna_parser_emulator14", + "false_next" : "node_109" + }, + { + "name" : "node_101", + "id" : 33, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 145, + "column" : 11, + "source_fragment" : "hdr_v1model.ingress.gtpu.isValid() || hdr_v1model.ingress.vxlan.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "or", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_gtpu12", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_vxlan15", "$valid$"] + } + } + } + } + }, + "true_next" : "tbl_int_tna_parser_emulator148", + "false_next" : "node_103" + }, + { + "name" : "node_103", + "id" : 34, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 164, + "column" : 12, + "source_fragment" : "(bit<8>)fabric_md.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type47"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + }, + "true_next" : "tbl_parser_emulator_parse_int_ingress_drop", + "false_next" : "tbl_parser_emulator_parse_int_report_mirror" + }, + { + "name" : "node_109", + "id" : 35, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 150, + "column" : 11, + "source_fragment" : "(bit<8>)fabric_md.egress.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_report_type21"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + }, + "true_next" : "tbl_int_tna_parser_emulator14_0", + "false_next" : "FabricEgress.pkt_io_egress.switch_info" + }, + { + "name" : "node_111", + "id" : 36, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 145, + "column" : 11, + "source_fragment" : "hdr_v1model.ingress.gtpu.isValid() || hdr_v1model.ingress.vxlan.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "or", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_gtpu12", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_vxlan15", "$valid$"] + } + } + } + } + }, + "true_next" : "tbl_int_tna_parser_emulator148_0", + "false_next" : "node_113" + }, + { + "name" : "node_113", + "id" : 37, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 164, + "column" : 12, + "source_fragment" : "(bit<8>)fabric_md.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_report_type21"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + }, + "true_next" : "tbl_parser_emulator_parse_int_ingress_drop_0", + "false_next" : "tbl_parser_emulator_parse_int_report_mirror_0" + }, + { + "name" : "node_120", + "id" : 38, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 50, + "column" : 12, + "source_fragment" : "standard_md.egress_port == fabric_md.cpu_port" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_port"] + }, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_cpu_port37"] + } + } + }, + "true_next" : "tbl_packetio51", + "false_next" : "node_122" + }, + { + "name" : "node_122", + "id" : 39, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 58, + "column" : 12, + "source_fragment" : "hdr.fake_ethernet.isValid() && ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_fake_ethernet2", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_fake_ethernet2", "ether_type"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xbf03" + } + } + } + } + }, + "true_next" : "tbl_packetio60", + "false_next" : "node_124" + }, + { + "name" : "node_124", + "id" : 40, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 67, + "column" : 12, + "source_fragment" : "bmd_type == BridgedMdType_t.INGRESS_TO_EGRESS" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + }, + "true_next" : "FabricEgress.stats.flows", + "false_next" : "node_126" + }, + { + "name" : "node_126", + "id" : 41, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 280, + "column" : 12, + "source_fragment" : "fabric_md.bridged.base.is_multicast ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_is_multicast4"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ig_port3"] + }, + "right" : { + "type" : "field", + "value" : ["standard_metadata", "egress_port"] + } + } + } + } + }, + "true_next" : "tbl_next283", + "false_next" : "node_128" + }, + { + "name" : "node_128", + "id" : 42, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 288, + "column" : 12, + "source_fragment" : "fabric_md.bridged.base.mpls_label == 0" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_mpls_label2"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x000000" + } + } + }, + "true_next" : "node_129", + "false_next" : "tbl_egress_next_set_mpls" + }, + { + "name" : "node_129", + "id" : 43, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 289, + "column" : 16, + "source_fragment" : "hdr.mpls.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_mpls6", "$valid$"] + } + } + }, + "true_next" : "tbl_egress_next_pop_mpls_if_present", + "false_next" : "node_132" + }, + { + "name" : "node_132", + "id" : 44, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 159, + "column" : 39, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_is_int_recirc45"] + } + } + }, + "false_next" : "FabricEgress.egress_next.egress_vlan", + "true_next" : "node_134" + }, + { + "name" : "node_134", + "id" : 45, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 322, + "column" : 12, + "source_fragment" : "hdr.mpls.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_mpls6", "$valid$"] + } + } + }, + "true_next" : "tbl_next323", + "false_next" : "node_138" + }, + { + "name" : "node_136", + "id" : 46, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 324, + "column" : 16, + "source_fragment" : "hdr.mpls.ttl == 0" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_mpls6", "ttl"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + }, + "true_next" : "tbl_next325", + "false_next" : "node_148" + }, + { + "name" : "node_138", + "id" : 47, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 331, + "column" : 16, + "source_fragment" : "hdr.ipv4.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + } + } + }, + "true_next" : "node_139", + "false_next" : "node_143" + }, + { + "name" : "node_139", + "id" : 48, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 319, + "column" : 28, + "source_fragment" : "(fabric_md.bridged.bmd_type == BridgedMdType_t.INT_INGRESS_DROP) || ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "or", + "left" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" + } + } + } + } + }, + "false_next" : "tbl_next333", + "true_next" : "node_141" + }, + { + "name" : "node_141", + "id" : 49, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 335, + "column" : 20, + "source_fragment" : "hdr.ipv4.ttl == 0" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + }, + "true_next" : "tbl_next336", + "false_next" : "node_148" + }, + { + "name" : "node_143", + "id" : 50, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 341, + "column" : 23, + "source_fragment" : "hdr.ipv6.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv68", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + } + } + }, + "true_next" : "node_144", + "false_next" : "node_148" + }, + { + "name" : "node_144", + "id" : 51, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 319, + "column" : 28, + "source_fragment" : "(fabric_md.bridged.bmd_type == BridgedMdType_t.INT_INGRESS_DROP) || ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "or", + "left" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" + } + } + } + } + }, + "false_next" : "tbl_next343", + "true_next" : "node_146" + }, + { + "name" : "node_146", + "id" : 52, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 345, + "column" : 20, + "source_fragment" : "hdr.ipv6.hop_limit == 0" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv68", "hop_limit"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + }, + "true_next" : "tbl_next346", + "false_next" : "node_148" + }, + { + "name" : "node_148", + "id" : 53, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 607, + "column" : 13, + "source_fragment" : "fabric_md.bridged" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_skip_upf17"] + } + } + }, + "false_next" : "node_149", + "true_next" : "tbl_int128" + }, + { + "name" : "node_149", + "id" : 54, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 608, + "column" : 16, + "source_fragment" : "fabric_md.bridged" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_needs_gtpu_encap16"] + } + } + }, + "true_next" : "node_150", + "false_next" : "node_158" + }, + { + "name" : "node_150", + "id" : 55, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 609, + "column" : 20, + "source_fragment" : "hdr.udp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_udp10", "$valid$"] + } + } + }, + "true_next" : "tbl_upf610", + "false_next" : "node_152" + }, + { + "name" : "node_152", + "id" : 56, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 614, + "column" : 20, + "source_fragment" : "hdr.tcp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_tcp9", "$valid$"] + } + } + }, + "true_next" : "tbl_upf615", + "false_next" : "node_154" + }, + { + "name" : "node_154", + "id" : 57, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 619, + "column" : 20, + "source_fragment" : "hdr.icmp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_icmp11", "$valid$"] + } + } + }, + "true_next" : "tbl_upf620", + "false_next" : "FabricEgress.upf.gtpu_encap" + }, + { + "name" : "node_158", + "id" : 58, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 627, + "column" : 17, + "source_fragment" : "fabric_md.bridged" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_skip_egress_upf_ctr18"] + } + } + }, + "false_next" : "tbl_upf628", + "true_next" : "tbl_int128" + }, + { + "name" : "node_164", + "id" : 59, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 375, + "column" : 12, + "source_fragment" : "fabric_md.int_report_md.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "$valid$"] + } + } + }, + "true_next" : "FabricEgress.int_egress.report", + "false_next" : "FabricEgress.int_egress.int_metadata" + }, + { + "name" : "node_171", + "id" : 60, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 216, + "column" : 16, + "source_fragment" : "hdr.ipv4.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + }, + "true_next" : "tbl_slicing217", + "false_next" : "node_173" + }, + { + "name" : "node_173", + "id" : 61, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 168, + "column" : 12, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._do_upf_uplink_recirc1"] + } + } + }, + "true_next" : "tbl_fabric_v1model170", + "false_next" : "node_175" + }, + { + "name" : "node_175", + "id" : 62, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 173, + "column" : 12, + "source_fragment" : "fabric_md.drop_ctl == 1" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + }, + "false_next" : null, + "true_next" : "tbl_fabric_v1model174" + } + ] + } + ], + "checksums" : [ + { + "name" : "cksum", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 55, + "column" : 8, + "source_fragment" : "update_checksum(hdr.ingress.ipv4.isValid(), ..." + }, + "target" : ["_ingress_ipv47", "hdr_checksum"], + "type" : "generic", + "calculation" : "calc_3", + "verify" : false, + "update" : true, + "if_cond" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + } + }, + { + "name" : "cksum_0", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 73, + "column" : 8, + "source_fragment" : "update_checksum(hdr.ingress.inner_ipv4.isValid(), ..." + }, + "target" : ["_ingress_inner_ipv418", "hdr_checksum"], + "type" : "generic", + "calculation" : "calc_4", + "verify" : false, + "update" : true, + "if_cond" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "$valid$"] + } + } + } + }, + { + "name" : "cksum_1", + "id" : 2, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 92, + "column" : 8, + "source_fragment" : "update_checksum(hdr.egress.report_ipv4.isValid(), ..." + }, + "target" : ["_egress_report_ipv427", "hdr_checksum"], + "type" : "generic", + "calculation" : "calc_5", + "verify" : false, + "update" : true, + "if_cond" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_egress_report_ipv427", "$valid$"] + } + } + } + }, + { + "name" : "cksum_2", + "id" : 3, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 13, + "column" : 8, + "source_fragment" : "verify_checksum(hdr.ingress.ipv4.isValid(), ..." + }, + "target" : ["_ingress_ipv47", "hdr_checksum"], + "type" : "generic", + "calculation" : "calc_6", + "verify" : true, + "update" : false, + "if_cond" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + } + }, + { + "name" : "cksum_3", + "id" : 4, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 31, + "column" : 8, + "source_fragment" : "verify_checksum(hdr.ingress.inner_ipv4.isValid(), ..." + }, + "target" : ["_ingress_inner_ipv418", "hdr_checksum"], + "type" : "generic", + "calculation" : "calc_7", + "verify" : true, + "update" : false, + "if_cond" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "$valid$"] + } + } + } + } + ], + "force_arith" : [], + "extern_instances" : [], + "field_aliases" : [ + [ + "queueing_metadata.enq_timestamp", + ["standard_metadata", "enq_timestamp"] + ], + [ + "queueing_metadata.enq_qdepth", + ["standard_metadata", "enq_qdepth"] + ], + [ + "queueing_metadata.deq_timedelta", + ["standard_metadata", "deq_timedelta"] + ], + [ + "queueing_metadata.deq_qdepth", + ["standard_metadata", "deq_qdepth"] + ], + [ + "intrinsic_metadata.ingress_global_timestamp", + ["standard_metadata", "ingress_global_timestamp"] + ], + [ + "intrinsic_metadata.egress_global_timestamp", + ["standard_metadata", "egress_global_timestamp"] + ], + [ + "intrinsic_metadata.mcast_grp", + ["standard_metadata", "mcast_grp"] + ], + [ + "intrinsic_metadata.egress_rid", + ["standard_metadata", "egress_rid"] + ], + [ + "intrinsic_metadata.priority", + ["standard_metadata", "priority"] + ] + ], + "program" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "__meta__" : { + "version" : [2, 23], + "compiler" : "https://github.com/p4lang/p4c" + } +} \ No newline at end of file diff --git a/src/tests/p4-sd-fabric-svc-connectivity/p4src/p4info.txt b/src/tests/p4-sd-fabric-svc-connectivity/p4src/p4info.txt new file mode 100644 index 0000000000000000000000000000000000000000..d502367c0c2acb101b7ea4c4df11837b0d8c3271 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/p4src/p4info.txt @@ -0,0 +1,2482 @@ +pkg_info { + arch: "v1model" +} +tables { + preamble { + id: 41243186 + name: "FabricIngress.stats.flows" + alias: "FabricIngress.stats.flows" + } + match_fields { + id: 1 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 2 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 3 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 4 + name: "l4_sport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 5 + name: "l4_dport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 6 + name: "ig_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 21929788 + } + const_default_action_id: 21929788 + direct_resource_ids: 333776332 + size: 1024 +} +tables { + preamble { + id: 43310977 + name: "FabricIngress.filtering.ingress_port_vlan" + alias: "ingress_port_vlan" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: EXACT + } + match_fields { + id: 2 + name: "vlan_is_valid" + bitwidth: 1 + match_type: EXACT + } + match_fields { + id: 3 + name: "vlan_id" + bitwidth: 12 + match_type: TERNARY + } + action_refs { + id: 17164167 + } + action_refs { + id: 24158268 + } + action_refs { + id: 24266015 + } + const_default_action_id: 17164167 + direct_resource_ids: 326221069 + size: 1024 +} +tables { + preamble { + id: 49718154 + name: "FabricIngress.filtering.fwd_classifier" + alias: "fwd_classifier" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: EXACT + } + match_fields { + id: 2 + name: "eth_dst" + bitwidth: 48 + match_type: TERNARY + } + match_fields { + id: 3 + name: "eth_type" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 4 + name: "ip_eth_type" + bitwidth: 16 + match_type: EXACT + } + action_refs { + id: 25032921 + } + const_default_action_id: 25032921 + direct_resource_ids: 335473470 + size: 1024 +} +tables { + preamble { + id: 43623757 + name: "FabricIngress.forwarding.bridging" + alias: "bridging" + } + match_fields { + id: 1 + name: "vlan_id" + bitwidth: 12 + match_type: EXACT + } + match_fields { + id: 2 + name: "eth_dst" + bitwidth: 48 + match_type: TERNARY + } + action_refs { + id: 21791748 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 29734112 + direct_resource_ids: 330959985 + size: 1024 +} +tables { + preamble { + id: 37768578 + name: "FabricIngress.forwarding.mpls" + alias: "mpls" + } + match_fields { + id: 1 + name: "mpls_label" + bitwidth: 20 + match_type: EXACT + } + action_refs { + id: 30066030 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 29734112 + direct_resource_ids: 318961579 + size: 1024 +} +tables { + preamble { + id: 41754650 + name: "FabricIngress.forwarding.routing_v4" + alias: "routing_v4" + } + match_fields { + id: 1 + name: "ipv4_dst" + bitwidth: 32 + match_type: LPM + } + action_refs { + id: 19792090 + } + action_refs { + id: 29124955 + } + action_refs { + id: 17639597 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + direct_resource_ids: 333425635 + size: 1024 +} +tables { + preamble { + id: 49342721 + name: "FabricIngress.forwarding.routing_v6" + alias: "routing_v6" + } + match_fields { + id: 1 + name: "ipv6_dst" + bitwidth: 128 + match_type: LPM + } + action_refs { + id: 21856023 + } + action_refs { + id: 24646532 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + direct_resource_ids: 324042090 + size: 1024 +} +tables { + preamble { + id: 36626242 + name: "FabricIngress.pre_next.next_mpls" + alias: "next_mpls" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 22765924 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + direct_resource_ids: 330020245 + size: 1024 +} +tables { + preamble { + id: 48011802 + name: "FabricIngress.pre_next.next_vlan" + alias: "next_vlan" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 33475378 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + direct_resource_ids: 333692067 + size: 1024 +} +tables { + preamble { + id: 44104738 + name: "FabricIngress.acl.acl" + alias: "acl" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: TERNARY + } + match_fields { + id: 2 + name: "eth_dst" + bitwidth: 48 + match_type: TERNARY + } + match_fields { + id: 3 + name: "eth_src" + bitwidth: 48 + match_type: TERNARY + } + match_fields { + id: 4 + name: "vlan_id" + bitwidth: 12 + match_type: TERNARY + } + match_fields { + id: 5 + name: "eth_type" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 6 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 7 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 8 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 9 + name: "icmp_type" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 10 + name: "icmp_code" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 11 + name: "l4_sport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 12 + name: "l4_dport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 13 + name: "ig_port_type" + bitwidth: 2 + match_type: TERNARY + } + action_refs { + id: 23623126 + } + action_refs { + id: 23579892 + } + action_refs { + id: 21161133 + } + action_refs { + id: 23570973 + } + action_refs { + id: 24507494 + } + action_refs { + id: 29607214 + } + const_default_action_id: 29607214 + direct_resource_ids: 319194241 + size: 1024 +} +tables { + preamble { + id: 47960972 + name: "FabricIngress.next.hashed" + alias: "hashed" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 27301117 + } + action_refs { + id: 20985706 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + implementation_id: 289544276 + direct_resource_ids: 322798228 + size: 1024 +} +tables { + preamble { + id: 40619180 + name: "FabricIngress.next.multicast" + alias: "multicast" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 21629581 + } + action_refs { + id: 23637707 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 23637707 + direct_resource_ids: 319194968 + size: 1024 +} +tables { + preamble { + id: 34606298 + name: "FabricIngress.slice_tc_classifier.classifier" + alias: "classifier" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: TERNARY + } + match_fields { + id: 2 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 3 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 4 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 5 + name: "l4_sport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 6 + name: "l4_dport" + bitwidth: 16 + match_type: TERNARY + } + action_refs { + id: 23786376 + } + action_refs { + id: 25983516 + } + action_refs { + id: 30111108 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 30111108 + direct_resource_ids: 334706097 + size: 512 +} +tables { + preamble { + id: 36435258 + name: "FabricIngress.qos.queues" + alias: "queues" + } + match_fields { + id: 1 + name: "slice_tc" + bitwidth: 6 + match_type: EXACT + } + match_fields { + id: 2 + name: "color" + bitwidth: 2 + match_type: TERNARY + } + action_refs { + id: 32116918 + } + action_refs { + id: 28214351 + } + const_default_action_id: 32116918 + direct_resource_ids: 327743278 + size: 128 +} +tables { + preamble { + id: 43965782 + name: "FabricIngress.qos.default_tc" + alias: "default_tc" + } + match_fields { + id: 1 + name: "slice_tc" + bitwidth: 6 + match_type: TERNARY + } + match_fields { + id: 2 + name: "tc_unknown" + bitwidth: 1 + match_type: EXACT + } + action_refs { + id: 23587909 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 16 +} +tables { + preamble { + id: 41155994 + name: "FabricIngress.upf.interfaces" + alias: "interfaces" + } + match_fields { + id: 1 + name: "ipv4_dst_addr" + bitwidth: 32 + match_type: LPM + } + match_fields { + id: 2 + name: "gtpu_is_valid" + bitwidth: 1 + match_type: EXACT + } + action_refs { + id: 30131500 + } + action_refs { + id: 19786139 + } + action_refs { + id: 19466514 + } + action_refs { + id: 30204657 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 30204657 + size: 64 +} +tables { + preamble { + id: 37952203 + name: "FabricIngress.upf.downlink_sessions" + alias: "downlink_sessions" + } + match_fields { + id: 1 + name: "ue_addr" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 16984383 + } + action_refs { + id: 31195396 + } + action_refs { + id: 21581660 + } + action_refs { + id: 24509779 + } + action_refs { + id: 32013192 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 32013192 + size: 100000 +} +tables { + preamble { + id: 45463032 + name: "FabricIngress.upf.uplink_sessions" + alias: "uplink_sessions" + } + match_fields { + id: 1 + name: "tunnel_ipv4_dst" + bitwidth: 32 + match_type: EXACT + } + match_fields { + id: 2 + name: "teid" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 31219743 + } + action_refs { + id: 24328070 + } + action_refs { + id: 20368148 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 20368148 + size: 100000 +} +tables { + preamble { + id: 50169666 + name: "FabricIngress.upf.uplink_terminations" + alias: "uplink_terminations" + } + match_fields { + id: 1 + name: "ue_session_id" + bitwidth: 32 + match_type: EXACT + } + match_fields { + id: 2 + name: "app_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 25805419 + } + action_refs { + id: 28764209 + } + action_refs { + id: 20624836 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 20624836 + size: 100000 +} +tables { + preamble { + id: 35221941 + name: "FabricIngress.upf.downlink_terminations" + alias: "downlink_terminations" + } + match_fields { + id: 1 + name: "ue_session_id" + bitwidth: 32 + match_type: EXACT + } + match_fields { + id: 2 + name: "app_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 23536134 + } + action_refs { + id: 30742995 + } + action_refs { + id: 26608757 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 26608757 + size: 100000 +} +tables { + preamble { + id: 48831175 + name: "FabricIngress.upf.ig_tunnel_peers" + alias: "ig_tunnel_peers" + } + match_fields { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 26011763 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 256 +} +tables { + preamble { + id: 46184415 + name: "FabricIngress.upf.applications" + alias: "applications" + } + match_fields { + id: 1 + name: "slice_id" + bitwidth: 4 + match_type: EXACT + } + match_fields { + id: 2 + name: "app_ipv4_addr" + bitwidth: 32 + match_type: LPM + } + match_fields { + id: 3 + name: "app_l4_port" + bitwidth: 16 + match_type: RANGE + } + match_fields { + id: 4 + name: "app_ip_proto" + bitwidth: 8 + match_type: TERNARY + } + action_refs { + id: 26631629 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 5 +} +tables { + preamble { + id: 34400315 + name: "FabricIngress.upf.uplink_recirc_rules" + alias: "uplink_recirc_rules" + } + match_fields { + id: 1 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 2 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + action_refs { + id: 28119063 + } + action_refs { + id: 19222227 + } + action_refs { + id: 29186084 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 29186084 + direct_resource_ids: 335275671 + size: 64 +} +tables { + preamble { + id: 40748488 + name: "FabricIngress.int_watchlist.watchlist" + alias: "watchlist" + } + match_fields { + id: 1 + name: "ipv4_valid" + bitwidth: 1 + match_type: EXACT + } + match_fields { + id: 2 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 3 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 4 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 5 + name: "l4_sport" + bitwidth: 16 + match_type: RANGE + } + match_fields { + id: 6 + name: "l4_dport" + bitwidth: 16 + match_type: RANGE + } + action_refs { + id: 25078550 + } + action_refs { + id: 20118842 + } + action_refs { + id: 28396787 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28396787 + direct_resource_ids: 328581521 + size: 64 +} +tables { + preamble { + id: 43851059 + name: "FabricEgress.stats.flows" + alias: "FabricEgress.stats.flows" + } + match_fields { + id: 1 + name: "stats_flow_id" + bitwidth: 10 + match_type: EXACT + } + match_fields { + id: 2 + name: "eg_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 26838724 + } + const_default_action_id: 26838724 + direct_resource_ids: 334508337 + size: 1024 +} +tables { + preamble { + id: 35217901 + name: "FabricEgress.pkt_io_egress.switch_info" + alias: "switch_info" + } + action_refs { + id: 32804382 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + size: 1 +} +tables { + preamble { + id: 49262446 + name: "FabricEgress.egress_next.egress_vlan" + alias: "egress_vlan" + } + match_fields { + id: 1 + name: "vlan_id" + bitwidth: 12 + match_type: EXACT + } + match_fields { + id: 2 + name: "eg_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 30307755 + } + action_refs { + id: 17183246 + } + action_refs { + id: 30812542 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 30812542 + direct_resource_ids: 318892680 + size: 1024 +} +tables { + preamble { + id: 49970092 + name: "FabricEgress.dscp_rewriter.rewriter" + alias: "rewriter" + } + match_fields { + id: 1 + name: "eg_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 27951287 + } + action_refs { + id: 24120545 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 512 +} +tables { + preamble { + id: 37756041 + name: "FabricEgress.upf.eg_tunnel_peers" + alias: "eg_tunnel_peers" + } + match_fields { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 28490145 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 256 +} +tables { + preamble { + id: 35202849 + name: "FabricEgress.upf.gtpu_encap" + alias: "gtpu_encap" + } + action_refs { + id: 18154440 + } + action_refs { + id: 25872588 + } + size: 1 +} +tables { + preamble { + id: 36860953 + name: "FabricEgress.int_egress.queue_latency_thresholds" + alias: "queue_latency_thresholds" + } + match_fields { + id: 1 + name: "egress_qid" + bitwidth: 5 + match_type: EXACT + } + match_fields { + id: 2 + name: "hop_latency_upper" + bitwidth: 16 + match_type: RANGE + } + match_fields { + id: 3 + name: "hop_latency_lower" + bitwidth: 16 + match_type: RANGE + } + action_refs { + id: 22415037 + } + action_refs { + id: 19702294 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + size: 128 +} +tables { + preamble { + id: 40475827 + name: "FabricEgress.int_egress.config" + alias: "config" + } + action_refs { + id: 22425991 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + size: 1 +} +tables { + preamble { + id: 46071383 + name: "FabricEgress.int_egress.report" + alias: "report" + } + match_fields { + id: 1 + name: "bmd_type" + bitwidth: 8 + match_type: EXACT + } + match_fields { + id: 2 + name: "mirror_type" + bitwidth: 3 + match_type: EXACT + } + match_fields { + id: 3 + name: "int_report_type" + bitwidth: 3 + match_type: EXACT + } + action_refs { + id: 30783845 + } + action_refs { + id: 22769901 + } + action_refs { + id: 32486459 + } + action_refs { + id: 25343592 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + direct_resource_ids: 325056546 + size: 6 +} +actions { + preamble { + id: 28485346 + name: "nop" + alias: "nop" + } +} +actions { + preamble { + id: 21257015 + name: "NoAction" + alias: "NoAction" + annotations: "@noWarn(\"unused\")" + } +} +actions { + preamble { + id: 21929788 + name: "FabricIngress.stats.count" + alias: "FabricIngress.stats.count" + } + params { + id: 1 + name: "flow_id" + bitwidth: 10 + } +} +actions { + preamble { + id: 17164167 + name: "FabricIngress.filtering.deny" + alias: "deny" + } +} +actions { + preamble { + id: 24158268 + name: "FabricIngress.filtering.permit" + alias: "permit" + } + params { + id: 1 + name: "port_type" + bitwidth: 2 + } +} +actions { + preamble { + id: 24266015 + name: "FabricIngress.filtering.permit_with_internal_vlan" + alias: "permit_with_internal_vlan" + } + params { + id: 1 + name: "vlan_id" + bitwidth: 12 + } + params { + id: 2 + name: "port_type" + bitwidth: 2 + } +} +actions { + preamble { + id: 25032921 + name: "FabricIngress.filtering.set_forwarding_type" + alias: "set_forwarding_type" + } + params { + id: 1 + name: "fwd_type" + bitwidth: 3 + } +} +actions { + preamble { + id: 29734112 + name: "FabricIngress.forwarding.set_int_drop_reason" + alias: "set_int_drop_reason" + } + params { + id: 1 + name: "drop_reason" + bitwidth: 8 + } +} +actions { + preamble { + id: 21791748 + name: "FabricIngress.forwarding.set_next_id_bridging" + alias: "set_next_id_bridging" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 30066030 + name: "FabricIngress.forwarding.pop_mpls_and_next" + alias: "pop_mpls_and_next" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 19792090 + name: "FabricIngress.forwarding.set_next_id_routing_v4" + alias: "set_next_id_routing_v4" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 29124955 + name: "FabricIngress.forwarding.nop_routing_v4" + alias: "nop_routing_v4" + } +} +actions { + preamble { + id: 17639597 + name: "FabricIngress.forwarding.drop_routing_v4" + alias: "drop_routing_v4" + } +} +actions { + preamble { + id: 21856023 + name: "FabricIngress.forwarding.set_next_id_routing_v6" + alias: "set_next_id_routing_v6" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 24646532 + name: "FabricIngress.forwarding.drop_routing_v6" + alias: "drop_routing_v6" + } +} +actions { + preamble { + id: 22765924 + name: "FabricIngress.pre_next.set_mpls_label" + alias: "set_mpls_label" + } + params { + id: 1 + name: "label" + bitwidth: 20 + } +} +actions { + preamble { + id: 33475378 + name: "FabricIngress.pre_next.set_vlan" + alias: "set_vlan" + } + params { + id: 1 + name: "vlan_id" + bitwidth: 12 + } +} +actions { + preamble { + id: 23623126 + name: "FabricIngress.acl.set_next_id_acl" + alias: "set_next_id_acl" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 21161133 + name: "FabricIngress.acl.copy_to_cpu" + alias: "copy_to_cpu" + } +} +actions { + preamble { + id: 23579892 + name: "FabricIngress.acl.punt_to_cpu" + alias: "punt_to_cpu" + } +} +actions { + preamble { + id: 23570973 + name: "FabricIngress.acl.drop" + alias: "acl.drop" + } +} +actions { + preamble { + id: 24507494 + name: "FabricIngress.acl.set_output_port" + alias: "set_output_port" + } + params { + id: 1 + name: "port_num" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } +} +actions { + preamble { + id: 29607214 + name: "FabricIngress.acl.nop_acl" + alias: "nop_acl" + } +} +actions { + preamble { + id: 27301117 + name: "FabricIngress.next.output_hashed" + alias: "output_hashed" + } + params { + id: 1 + name: "port_num" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } +} +actions { + preamble { + id: 20985706 + name: "FabricIngress.next.routing_hashed" + alias: "routing_hashed" + } + params { + id: 1 + name: "port_num" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + params { + id: 2 + name: "smac" + bitwidth: 48 + } + params { + id: 3 + name: "dmac" + bitwidth: 48 + } +} +actions { + preamble { + id: 21629581 + name: "FabricIngress.next.set_mcast_group_id" + alias: "set_mcast_group_id" + } + params { + id: 1 + name: "group_id" + bitwidth: 16 + } +} +actions { + preamble { + id: 23637707 + name: "FabricIngress.next.reset_mcast_group_id" + alias: "reset_mcast_group_id" + } +} +actions { + preamble { + id: 23786376 + name: "FabricIngress.slice_tc_classifier.set_slice_id_tc" + alias: "set_slice_id_tc" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } + params { + id: 2 + name: "tc" + bitwidth: 2 + } +} +actions { + preamble { + id: 30111108 + name: "FabricIngress.slice_tc_classifier.no_classification" + alias: "no_classification" + } +} +actions { + preamble { + id: 25983516 + name: "FabricIngress.slice_tc_classifier.trust_dscp" + alias: "trust_dscp" + } +} +actions { + preamble { + id: 32116918 + name: "FabricIngress.qos.set_queue" + alias: "set_queue" + } + params { + id: 1 + name: "qid" + bitwidth: 5 + } +} +actions { + preamble { + id: 28214351 + name: "FabricIngress.qos.meter_drop" + alias: "meter_drop" + } +} +actions { + preamble { + id: 23587909 + name: "FabricIngress.qos.set_default_tc" + alias: "set_default_tc" + } + params { + id: 1 + name: "tc" + bitwidth: 2 + } +} +actions { + preamble { + id: 30131500 + name: "FabricIngress.upf.iface_access" + alias: "iface_access" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } +} +actions { + preamble { + id: 19786139 + name: "FabricIngress.upf.iface_core" + alias: "iface_core" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } +} +actions { + preamble { + id: 19466514 + name: "FabricIngress.upf.iface_dbuf" + alias: "iface_dbuf" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } +} +actions { + preamble { + id: 30204657 + name: "FabricIngress.upf.iface_miss" + alias: "iface_miss" + } +} +actions { + preamble { + id: 20368148 + name: "FabricIngress.upf.set_uplink_session_miss" + alias: "set_uplink_session_miss" + } +} +actions { + preamble { + id: 24328070 + name: "FabricIngress.upf.set_uplink_session_drop" + alias: "set_uplink_session_drop" + } +} +actions { + preamble { + id: 32013192 + name: "FabricIngress.upf.set_downlink_session_miss" + alias: "set_downlink_session_miss" + } +} +actions { + preamble { + id: 24509779 + name: "FabricIngress.upf.set_downlink_session_drop" + alias: "set_downlink_session_drop" + } +} +actions { + preamble { + id: 16984383 + name: "FabricIngress.upf.set_downlink_session" + alias: "set_downlink_session" + } + params { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + } + params { + id: 2 + name: "session_meter_idx" + bitwidth: 15 + } +} +actions { + preamble { + id: 31195396 + name: "FabricIngress.upf.set_downlink_session_buf" + alias: "set_downlink_session_buf" + } + params { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + } + params { + id: 2 + name: "session_meter_idx" + bitwidth: 15 + } +} +actions { + preamble { + id: 21581660 + name: "FabricIngress.upf.set_downlink_session_buf_drop" + alias: "set_downlink_session_buf_drop" + } +} +actions { + preamble { + id: 31219743 + name: "FabricIngress.upf.set_uplink_session" + alias: "set_uplink_session" + } + params { + id: 1 + name: "session_meter_idx" + bitwidth: 15 + } +} +actions { + preamble { + id: 20624836 + name: "FabricIngress.upf.uplink_drop_miss" + alias: "uplink_drop_miss" + } +} +actions { + preamble { + id: 26608757 + name: "FabricIngress.upf.downlink_drop_miss" + alias: "downlink_drop_miss" + } +} +actions { + preamble { + id: 28764209 + name: "FabricIngress.upf.uplink_drop" + alias: "uplink_drop" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } +} +actions { + preamble { + id: 30742995 + name: "FabricIngress.upf.downlink_drop" + alias: "downlink_drop" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } +} +actions { + preamble { + id: 25805419 + name: "FabricIngress.upf.app_fwd" + alias: "app_fwd" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } + params { + id: 2 + name: "tc" + bitwidth: 2 + } + params { + id: 3 + name: "app_meter_idx" + bitwidth: 15 + } +} +actions { + preamble { + id: 23536134 + name: "FabricIngress.upf.downlink_fwd_encap" + alias: "downlink_fwd_encap" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } + params { + id: 2 + name: "tc" + bitwidth: 2 + } + params { + id: 3 + name: "teid" + bitwidth: 32 + } + params { + id: 4 + name: "qfi" + bitwidth: 6 + } + params { + id: 5 + name: "app_meter_idx" + bitwidth: 15 + } +} +actions { + preamble { + id: 26011763 + name: "FabricIngress.upf.set_routing_ipv4_dst" + alias: "set_routing_ipv4_dst" + } + params { + id: 1 + name: "tun_dst_addr" + bitwidth: 32 + } +} +actions { + preamble { + id: 26631629 + name: "FabricIngress.upf.set_app_id" + alias: "set_app_id" + } + params { + id: 1 + name: "app_id" + bitwidth: 8 + } +} +actions { + preamble { + id: 28119063 + name: "FabricIngress.upf.recirc_allow" + alias: "recirc_allow" + } +} +actions { + preamble { + id: 19222227 + name: "FabricIngress.upf.recirc_deny" + alias: "recirc_deny" + } +} +actions { + preamble { + id: 29186084 + name: "FabricIngress.upf.recirc_miss" + alias: "recirc_miss" + } +} +actions { + preamble { + id: 25078550 + name: "FabricIngress.int_watchlist.mark_to_report" + alias: "mark_to_report" + } +} +actions { + preamble { + id: 28396787 + name: "FabricIngress.int_watchlist.no_report" + alias: "no_report" + } +} +actions { + preamble { + id: 20118842 + name: "FabricIngress.int_watchlist.no_report_collector" + alias: "no_report_collector" + } +} +actions { + preamble { + id: 26838724 + name: "FabricEgress.stats.count" + alias: "FabricEgress.stats.count" + } +} +actions { + preamble { + id: 32804382 + name: "FabricEgress.pkt_io_egress.set_switch_info" + alias: "set_switch_info" + } + params { + id: 1 + name: "cpu_port" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } +} +actions { + preamble { + id: 30307755 + name: "FabricEgress.egress_next.push_vlan" + alias: "push_vlan" + } +} +actions { + preamble { + id: 17183246 + name: "FabricEgress.egress_next.pop_vlan" + alias: "pop_vlan" + } +} +actions { + preamble { + id: 30812542 + name: "FabricEgress.egress_next.drop" + alias: "egress_next.drop" + } +} +actions { + preamble { + id: 27951287 + name: "FabricEgress.dscp_rewriter.rewrite" + alias: "rewrite" + } +} +actions { + preamble { + id: 24120545 + name: "FabricEgress.dscp_rewriter.clear" + alias: "clear" + } +} +actions { + preamble { + id: 28490145 + name: "FabricEgress.upf.load_tunnel_params" + alias: "load_tunnel_params" + } + params { + id: 1 + name: "tunnel_src_port" + bitwidth: 16 + } + params { + id: 2 + name: "tunnel_src_addr" + bitwidth: 32 + } + params { + id: 3 + name: "tunnel_dst_addr" + bitwidth: 32 + } +} +actions { + preamble { + id: 18154440 + name: "FabricEgress.upf.gtpu_only" + alias: "gtpu_only" + } +} +actions { + preamble { + id: 25872588 + name: "FabricEgress.upf.gtpu_with_psc" + alias: "gtpu_with_psc" + } +} +actions { + preamble { + id: 22415037 + name: "FabricEgress.int_egress.check_quota" + alias: "check_quota" + } +} +actions { + preamble { + id: 19702294 + name: "FabricEgress.int_egress.reset_quota" + alias: "reset_quota" + } +} +actions { + preamble { + id: 22425991 + name: "FabricEgress.int_egress.set_config" + alias: "set_config" + } + params { + id: 1 + name: "hop_latency_mask" + bitwidth: 32 + } + params { + id: 2 + name: "timestamp_mask" + bitwidth: 48 + } +} +actions { + preamble { + id: 30783845 + name: "FabricEgress.int_egress.do_local_report_encap" + alias: "do_local_report_encap" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "switch_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 22769901 + name: "FabricEgress.int_egress.do_local_report_encap_mpls" + alias: "do_local_report_encap_mpls" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "mon_label" + bitwidth: 20 + } + params { + id: 5 + name: "switch_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 32486459 + name: "FabricEgress.int_egress.do_drop_report_encap" + alias: "do_drop_report_encap" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "switch_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 25343592 + name: "FabricEgress.int_egress.do_drop_report_encap_mpls" + alias: "do_drop_report_encap_mpls" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "mon_label" + bitwidth: 20 + } + params { + id: 5 + name: "switch_id" + bitwidth: 32 + } +} +action_profiles { + preamble { + id: 289544276 + name: "FabricIngress.next.hashed_profile" + alias: "hashed_profile" + } + table_ids: 47960972 + with_selector: true + size: 16 + max_group_size: 16 +} +counters { + preamble { + id: 309010261 + name: "FabricIngress.filtering.fwd_type_counter" + alias: "fwd_type_counter" + } + spec { + unit: BOTH + } + size: 8 +} +counters { + preamble { + id: 316677328 + name: "FabricIngress.upf.terminations_counter" + alias: "FabricIngress.upf.terminations_counter" + } + spec { + unit: BOTH + } + size: 4096 +} +counters { + preamble { + id: 314209362 + name: "FabricEgress.upf.terminations_counter" + alias: "FabricEgress.upf.terminations_counter" + } + spec { + unit: BOTH + } + size: 4096 +} +direct_counters { + preamble { + id: 333776332 + name: "FabricIngress.stats.flow_counter" + alias: "FabricIngress.stats.flow_counter" + } + spec { + unit: BOTH + } + direct_table_id: 41243186 +} +direct_counters { + preamble { + id: 326221069 + name: "FabricIngress.filtering.ingress_port_vlan_counter" + alias: "ingress_port_vlan_counter" + } + spec { + unit: BOTH + } + direct_table_id: 43310977 +} +direct_counters { + preamble { + id: 335473470 + name: "FabricIngress.filtering.fwd_classifier_counter" + alias: "fwd_classifier_counter" + } + spec { + unit: BOTH + } + direct_table_id: 49718154 +} +direct_counters { + preamble { + id: 330959985 + name: "FabricIngress.forwarding.bridging_counter" + alias: "bridging_counter" + } + spec { + unit: BOTH + } + direct_table_id: 43623757 +} +direct_counters { + preamble { + id: 318961579 + name: "FabricIngress.forwarding.mpls_counter" + alias: "mpls_counter" + } + spec { + unit: BOTH + } + direct_table_id: 37768578 +} +direct_counters { + preamble { + id: 333425635 + name: "FabricIngress.forwarding.routing_v4_counter" + alias: "routing_v4_counter" + } + spec { + unit: BOTH + } + direct_table_id: 41754650 +} +direct_counters { + preamble { + id: 324042090 + name: "FabricIngress.forwarding.routing_v6_counter" + alias: "routing_v6_counter" + } + spec { + unit: BOTH + } + direct_table_id: 49342721 +} +direct_counters { + preamble { + id: 330020245 + name: "FabricIngress.pre_next.next_mpls_counter" + alias: "next_mpls_counter" + } + spec { + unit: BOTH + } + direct_table_id: 36626242 +} +direct_counters { + preamble { + id: 333692067 + name: "FabricIngress.pre_next.next_vlan_counter" + alias: "next_vlan_counter" + } + spec { + unit: BOTH + } + direct_table_id: 48011802 +} +direct_counters { + preamble { + id: 319194241 + name: "FabricIngress.acl.acl_counter" + alias: "acl_counter" + } + spec { + unit: BOTH + } + direct_table_id: 44104738 +} +direct_counters { + preamble { + id: 322798228 + name: "FabricIngress.next.hashed_counter" + alias: "hashed_counter" + } + spec { + unit: BOTH + } + direct_table_id: 47960972 +} +direct_counters { + preamble { + id: 319194968 + name: "FabricIngress.next.multicast_counter" + alias: "multicast_counter" + } + spec { + unit: BOTH + } + direct_table_id: 40619180 +} +direct_counters { + preamble { + id: 334706097 + name: "FabricIngress.slice_tc_classifier.classifier_stats" + alias: "classifier_stats" + } + spec { + unit: PACKETS + } + direct_table_id: 34606298 +} +direct_counters { + preamble { + id: 327743278 + name: "FabricIngress.qos.queues_stats" + alias: "queues_stats" + } + spec { + unit: PACKETS + } + direct_table_id: 36435258 +} +direct_counters { + preamble { + id: 335275671 + name: "FabricIngress.upf.recirc_stats" + alias: "recirc_stats" + } + spec { + unit: PACKETS + } + direct_table_id: 34400315 +} +direct_counters { + preamble { + id: 328581521 + name: "FabricIngress.int_watchlist.watchlist_counter" + alias: "watchlist_counter" + } + spec { + unit: BOTH + } + direct_table_id: 40748488 +} +direct_counters { + preamble { + id: 334508337 + name: "FabricEgress.stats.flow_counter" + alias: "FabricEgress.stats.flow_counter" + } + spec { + unit: BOTH + } + direct_table_id: 43851059 +} +direct_counters { + preamble { + id: 318892680 + name: "FabricEgress.egress_next.egress_vlan_counter" + alias: "egress_vlan_counter" + } + spec { + unit: BOTH + } + direct_table_id: 49262446 +} +direct_counters { + preamble { + id: 325056546 + name: "FabricEgress.int_egress.report_counter" + alias: "report_counter" + } + spec { + unit: BOTH + } + direct_table_id: 46071383 +} +meters { + preamble { + id: 348573637 + name: "FabricIngress.qos.slice_tc_meter" + alias: "slice_tc_meter" + } + spec { + unit: BYTES + } + size: 64 +} +meters { + preamble { + id: 345152250 + name: "FabricIngress.upf.session_meter" + alias: "session_meter" + } + spec { + unit: BYTES + } + size: 20000 +} +meters { + preamble { + id: 343216442 + name: "FabricIngress.upf.app_meter" + alias: "app_meter" + } + spec { + unit: BYTES + } + size: 20000 +} +controller_packet_metadata { + preamble { + id: 81826293 + name: "packet_in" + alias: "packet_in" + annotations: "@controller_header(\"packet_in\")" + } + metadata { + id: 1 + name: "ingress_port" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + metadata { + id: 2 + name: "_pad0" + bitwidth: 7 + } +} +controller_packet_metadata { + preamble { + id: 76689799 + name: "packet_out" + alias: "packet_out" + annotations: "@controller_header(\"packet_out\")" + } + metadata { + id: 1 + name: "pad0" + annotations: "@padding" + bitwidth: 7 + } + metadata { + id: 2 + name: "egress_port" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + metadata { + id: 3 + name: "pad1" + annotations: "@padding" + bitwidth: 3 + } + metadata { + id: 4 + name: "queue_id" + bitwidth: 5 + } + metadata { + id: 5 + name: "pad2" + annotations: "@padding" + bitwidth: 5 + } + metadata { + id: 6 + name: "cpu_loopback_mode" + bitwidth: 2 + } + metadata { + id: 7 + name: "do_forwarding" + bitwidth: 1 + } + metadata { + id: 8 + name: "pad3" + annotations: "@padding" + bitwidth: 16 + } + metadata { + id: 9 + name: "pad4" + annotations: "@padding" + bitwidth: 48 + } + metadata { + id: 10 + name: "ether_type" + bitwidth: 16 + } +} +registers { + preamble { + id: 376533241 + name: "FabricEgress.int_egress.seq_number" + alias: "seq_number" + annotations: "@hidden" + } + type_spec { + bitstring { + bit { + bitwidth: 32 + } + } + } + size: 1024 +} +type_info { + serializable_enums { + key: "BridgedMdType_t" + value { + underlying_type { + bitwidth: 8 + } + members { + name: "INVALID" + value: "\000" + } + members { + name: "INGRESS_TO_EGRESS" + value: "\001" + } + members { + name: "EGRESS_MIRROR" + value: "\002" + } + members { + name: "INGRESS_MIRROR" + value: "\003" + } + members { + name: "INT_INGRESS_DROP" + value: "\004" + } + members { + name: "DEFLECTED" + value: "\005" + } + } + } + serializable_enums { + key: "CpuLoopbackMode_t" + value { + underlying_type { + bitwidth: 2 + } + members { + name: "DISABLED" + value: "\000" + } + members { + name: "DIRECT" + value: "\001" + } + members { + name: "INGRESS" + value: "\002" + } + } + } + serializable_enums { + key: "FabricMirrorType_t" + value { + underlying_type { + bitwidth: 3 + } + members { + name: "INVALID" + value: "\000" + } + members { + name: "INT_REPORT" + value: "\001" + } + members { + name: "PACKET_IN" + value: "\002" + } + } + } + serializable_enums { + key: "PortType_t" + value { + underlying_type { + bitwidth: 2 + } + members { + name: "UNKNOWN" + value: "\000" + } + members { + name: "EDGE" + value: "\001" + } + members { + name: "INFRA" + value: "\002" + } + members { + name: "INTERNAL" + value: "\003" + } + } + } + new_types { + key: "FabricPortId_t" + value { + original_type { + bitstring { + bit { + bitwidth: 9 + } + } + } + } + } +} diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_grafana_dashboard.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_grafana_dashboard.sh new file mode 100644 index 0000000000000000000000000000000000000000..f537e5a463b6ee97ebbaa4c0b201a33956259beb --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_grafana_dashboard.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +# ----------------------------------- +# CONFIGURATION +# ----------------------------------- + +GRAFANA_URL="http://localhost:80/grafana" # Your Grafana URL +GRAFANA_USERNAME="admin" +GRAFANA_PASSWORD="admin" + +DATASOURCE_NAME="Prometheus" +DASHBOARD_FILE="/home/ubuntu/tfs-ctrl/src/tests/p4-sd-fabric-svc-connectivity/descriptors/grafana-latency.json" # Path to your dashboard JSON + +# ----------------------------------- +# READ DASHBOARD JSON +# ----------------------------------- +if [ ! -f "$DASHBOARD_FILE" ]; then + echo "[ERROR] Dashboard file not found: $DASHBOARD_FILE" + exit 1 +fi + +DASHBOARD_JSON=$(cat "$DASHBOARD_FILE") + +# --------------------------------------- +# 1. Get the datasource UID +# --------------------------------------- + +PROM_UID=$(curl -s \ + -u "${GRAFANA_USERNAME}:${GRAFANA_PASSWORD}" \ + "${GRAFANA_URL}/api/datasources/name/${DATASOURCE_NAME}" \ + | jq -r '.uid') + +if [ -z "$PROM_UID" ] || [ "$PROM_UID" == "null" ]; then + echo "ERROR: Could not retrieve datasource UID. Check datasource name/auth." + exit 1 +fi + +echo "Found datasource UID: $PROM_UID" + +# --------------------------------------- +# 2. Inject the UID into dashboard JSON +# --------------------------------------- + +DASHBOARD_JSON=$(jq --arg uid "$PROM_UID" ' + walk( + if type == "object" and has("datasource") then + .datasource |= + (if type == "object" then .uid = $uid else $uid end) + else . + end + ) +' "$DASHBOARD_FILE") + +# --------------------------------------- +# 3. Wrap in Grafana API import format +# --------------------------------------- + +read -r -d '' IMPORT_JSON << EOF +{ + "dashboard": ${DASHBOARD_JSON}, + "overwrite": true, + "folderId": 0, + "message": "Imported via API" +} +EOF + +# ----------------------------------- +# 4. Import dashboard using API +# ----------------------------------- + +echo "Importing dashboard into Grafana..." + +curl -X POST "${GRAFANA_URL}/api/dashboards/db" \ + -H "Content-Type: application/json" \ + -u "${GRAFANA_USERNAME}:${GRAFANA_PASSWORD}" \ + -d "${IMPORT_JSON}" + +echo +echo "Done" diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_grafana_datasources.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_grafana_datasources.sh new file mode 100644 index 0000000000000000000000000000000000000000..2e82eebe5d4187d0e0adc6f90d73e6bf95ea6ebb --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_grafana_datasources.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +# --------------------------- +# CONFIGURATION +# --------------------------- + +TFS_IP="192.168.5.137" + +GRAFANA_URL="http://localhost:80/grafana" # Your Grafana URL +GRAFANA_USERNAME="admin" +GRAFANA_PASSWORD="admin" + +DATASOURCE_NAME="Prometheus" +PROMETHEUS_URL="http://${TFS_IP}:30090/" # URL of your Prometheus server + +# --------------------------- +# CREATE DATA SOURCE PAYLOAD +# --------------------------- + +read -r -d '' DATA_SOURCE_JSON << EOF +{ + "name": "${DATASOURCE_NAME}", + "type": "prometheus", + "access": "proxy", + "url": "${PROMETHEUS_URL}", + "basicAuth": false, + "isDefault": true, + "editable": true +} +EOF + +# --------------------------- +# SEND REQUEST (with username/password) +# --------------------------- + +echo "Creating Prometheus datasource in Grafana..." + +curl -X POST "${GRAFANA_URL}/api/datasources" \ + -H "Content-Type: application/json" \ + -u "${GRAFANA_USERNAME}:${GRAFANA_PASSWORD}" \ + -d "${DATA_SOURCE_JSON}" + +echo +echo "Done" diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_test_01_bootstrap.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_01_bootstrap.sh new file mode 100755 index 0000000000000000000000000000000000000000..3e7f22b90e529408778503f054bda739b13dbf2f --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_01_bootstrap.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# Copyright 2022-2026 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. + +# make sure to source the following scripts: +# - my_deploy.sh +# - tfs_runtime_env_vars.sh + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_bootstrap.py diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_test_02_service_provision_int.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_02_service_provision_int.sh new file mode 100755 index 0000000000000000000000000000000000000000..6d33f8a9b28117194f7c1f4eaefcdb4fa0ec2e95 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_02_service_provision_int.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2026 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. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_int.py diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_test_03_service_provision_l2.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_03_service_provision_l2.sh new file mode 100755 index 0000000000000000000000000000000000000000..f5d4c814cd33f602969dde6e22e6dcbd177d5875 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_03_service_provision_l2.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2026 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. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l2.py diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_test_04_service_provision_l3.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_04_service_provision_l3.sh new file mode 100755 index 0000000000000000000000000000000000000000..1b27756809f06ceb0c6d3130b60c3494cc91cccd --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_04_service_provision_l3.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2026 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. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l3.py diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_test_05_service_provision_acl.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_05_service_provision_acl.sh new file mode 100755 index 0000000000000000000000000000000000000000..fc95c0d61f95f3fd6145f0bf5358f13572e6dc70 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_05_service_provision_acl.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2026 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. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_acl.py diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_test_06_service_deprovision_int.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_06_service_deprovision_int.sh new file mode 100755 index 0000000000000000000000000000000000000000..035353e196da2f935600dae88f0547924bb44e4b --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_06_service_deprovision_int.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2026 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. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_int.py diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_test_07_service_deprovision_l2.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_07_service_deprovision_l2.sh new file mode 100755 index 0000000000000000000000000000000000000000..fb60d0eba92ae0d56f2167d2f4099684ef58301d --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_07_service_deprovision_l2.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2026 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. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l2.py diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_test_08_service_deprovision_l3.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_08_service_deprovision_l3.sh new file mode 100755 index 0000000000000000000000000000000000000000..6c14c8ab9564f3787fc7a5c37d8d7c61b0178a22 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_08_service_deprovision_l3.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2026 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. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l3.py diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_test_09_service_deprovision_acl.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_09_service_deprovision_acl.sh new file mode 100755 index 0000000000000000000000000000000000000000..1e3bd5b09ebe7d6e078e073139d3f8951f5d13d0 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_09_service_deprovision_acl.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2026 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. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_acl.py diff --git a/src/tests/p4-fabric-tna/run_test_04a_service_provision_l3.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_10_cleanup.sh similarity index 77% rename from src/tests/p4-fabric-tna/run_test_04a_service_provision_l3.sh rename to src/tests/p4-sd-fabric-svc-connectivity/run_test_10_cleanup.sh index 6bec4a8929394ed7526dee1c840c3cb46efbcce2..558bf7e322310c21fa9a6550ffb11714ca61bddf 100755 --- a/src/tests/p4-fabric-tna/run_test_04a_service_provision_l3.sh +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_10_cleanup.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2026 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. @@ -14,4 +14,4 @@ # limitations under the License. source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_l3.py +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_cleanup.py diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_test_11_purge.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_11_purge.sh new file mode 100755 index 0000000000000000000000000000000000000000..02e500f88a508650e91621c2df28a84da8a4b5f6 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_11_purge.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2026 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. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_purge.py diff --git a/src/tests/p4-sd-fabric-svc-connectivity/setup.sh b/src/tests/p4-sd-fabric-svc-connectivity/setup.sh new file mode 100755 index 0000000000000000000000000000000000000000..5a1daf120010addbece095303d7a673934c9b822 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/setup.sh @@ -0,0 +1,22 @@ +#! /bin/bash +# Copyright 2022-2026 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. + + +export POD_NAME=$(kubectl get pods -n=tfs | grep device | awk '{print $1}') + +kubectl exec ${POD_NAME} -n=tfs -c=server -- mkdir -p /root/p4 + +kubectl cp src/tests/p4-sd-fabric-svc-connectivity/p4src/p4info.txt tfs/${POD_NAME}:/root/p4 -c=server +kubectl cp src/tests/p4-sd-fabric-svc-connectivity/p4src/bmv2.json tfs/${POD_NAME}:/root/p4 -c=server diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-service/Fixtures.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/Fixtures.py new file mode 100644 index 0000000000000000000000000000000000000000..cf77538f9d3860c1a45c56038288b87b08b8fd01 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/Fixtures.py @@ -0,0 +1,39 @@ +# Copyright 2022-2026 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 context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient + + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def service_client(): + _client = ServiceClient() + yield _client + _client.close() diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-service/__init__.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..b53987a4eae1aed245eba5c7ddd8cd10e35919c2 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2026 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/p4-fabric-tna/tests-service/test_functional_service_deprovision_acl.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_acl.py similarity index 88% rename from src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_acl.py rename to src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_acl.py index fa8f313976680dc3ffe8a1ed27f118903223f64b..d18d4e583bcd9625cf50fc50b58542d12ae1bbdb 100644 --- a/src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_acl.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_acl.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2026 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. @@ -13,23 +13,26 @@ # limitations under the License. import logging -from common.proto.context_pb2 import ServiceId, ServiceStatusEnum, ServiceTypeEnum + +from common.proto.context_pb2 import ( + ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, service_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ( - ADMIN_CONTEXT_ID, - DEV_NB, - P4_DEV_NB, - ACL_RULES, - identify_number_of_p4_devices, - get_number_of_rules, - verify_active_service_type +from tests.tools.test_tools_p4 import * + +from .Fixtures import ( # pylint: disable=unused-import + context_client, service_client, ) +DEV_NB = 4 +P4_DEV_NB = 1 + +ACL_RULES = 1 + LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_int.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_int.py similarity index 88% rename from src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_int.py rename to src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_int.py index fe73810c085082a5cb798bb761397d2fabe9a4f0..541f4253abc053d3be77d1f5aae641e5c4935fb6 100644 --- a/src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_int.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_int.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2026 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. @@ -13,23 +13,26 @@ # limitations under the License. import logging -from common.proto.context_pb2 import ServiceId, ServiceStatusEnum, ServiceTypeEnum + +from common.proto.context_pb2 import ( + ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, service_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ( - ADMIN_CONTEXT_ID, - DEV_NB, - P4_DEV_NB, - INT_RULES, - identify_number_of_p4_devices, - get_number_of_rules, - verify_active_service_type +from tests.tools.test_tools_p4 import * + +from .Fixtures import ( # pylint: disable=unused-import + context_client, service_client, ) +DEV_NB = 4 +P4_DEV_NB = 1 + +INT_RULES = 19 + LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_l2.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l2.py similarity index 88% rename from src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_l2.py rename to src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l2.py index bd1d740b92460e218ee0006ed9ce5ec1751e257d..001bd1b689246b136cbb5fae57e9dc601ab0bb41 100644 --- a/src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_l2.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l2.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2026 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. @@ -13,23 +13,26 @@ # limitations under the License. import logging -from common.proto.context_pb2 import ServiceId, ServiceStatusEnum, ServiceTypeEnum + +from common.proto.context_pb2 import ( + ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, service_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ( - ADMIN_CONTEXT_ID, - DEV_NB, - P4_DEV_NB, - L2_RULES, - identify_number_of_p4_devices, - get_number_of_rules, - verify_active_service_type +from tests.tools.test_tools_p4 import * + +from .Fixtures import ( # pylint: disable=unused-import + context_client, service_client, ) +DEV_NB = 4 +P4_DEV_NB = 1 + +L2_RULES = 12 + LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_l3.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l3.py similarity index 88% rename from src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_l3.py rename to src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l3.py index 7f669fbe3c56b3d04b52e0c7f640d09ab45c739a..c5bbe1d142e37365455b26e9b36f2953881b2d0d 100644 --- a/src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_l3.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l3.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2026 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. @@ -13,23 +13,26 @@ # limitations under the License. import logging -from common.proto.context_pb2 import ServiceId, ServiceStatusEnum, ServiceTypeEnum + +from common.proto.context_pb2 import ( + ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, service_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ( - ADMIN_CONTEXT_ID, - DEV_NB, - P4_DEV_NB, - L3_RULES, - identify_number_of_p4_devices, - get_number_of_rules, - verify_active_service_type +from tests.tools.test_tools_p4 import * + +from .Fixtures import ( # pylint: disable=unused-import + context_client, service_client, ) +DEV_NB = 4 +P4_DEV_NB = 1 + +L3_RULES = 14 + LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_acl.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_acl.py similarity index 78% rename from src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_acl.py rename to src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_acl.py index d9da5d3814a006552254adf3cd28ed9588548d2a..14d8c04a863a5f1ddeaff4a70a1748d30b9a94eb 100644 --- a/src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_acl.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_acl.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2026 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. @@ -13,24 +13,37 @@ # limitations under the License. import logging -from common.proto.context_pb2 import ServiceStatusEnum, ServiceTypeEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +import os + +from common.proto.context_pb2 import ServiceTypeEnum +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ( - ADMIN_CONTEXT_ID, - DESC_FILE_SERVICE_P4_ACL, - DEV_NB, - P4_DEV_NB, - ACL_RULES, - identify_number_of_p4_devices, - get_number_of_rules, - verify_active_service_type +from tests.tools.test_tools_p4 import * + +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, service_client, ) +DEV_NB = 4 +P4_DEV_NB = 1 + +ACL_RULES = 1 + +TEST_PATH = os.path.join( + os.path.dirname(os.path.dirname( + os.path.abspath(__file__) + )) + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to tests" + +# Topology descriptor +DESC_FILE_SERVICE_P4_ACL = os.path.join(TEST_PATH, 'service-p4-acl.json') +assert os.path.exists(DESC_FILE_SERVICE_P4_ACL), "Invalid path to the ACL service descriptor" + LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_int.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_int.py similarity index 79% rename from src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_int.py rename to src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_int.py index 13ae470c8cb447a55aa0ff75511253190c2c0419..795b12725d82c4592734048828ac94563505d1f7 100644 --- a/src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_int.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_int.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2026 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. @@ -13,24 +13,37 @@ # limitations under the License. import logging +import os + from common.proto.context_pb2 import ServiceTypeEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ( - ADMIN_CONTEXT_ID, - DESC_FILE_SERVICE_P4_INT, - DEV_NB, - P4_DEV_NB, - INT_RULES, - identify_number_of_p4_devices, - get_number_of_rules, - verify_active_service_type +from tests.tools.test_tools_p4 import * + +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, service_client, ) +DEV_NB = 4 +P4_DEV_NB = 1 + +INT_RULES = 19 + +TEST_PATH = os.path.join( + os.path.dirname(os.path.dirname( + os.path.abspath(__file__) + )) + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to tests" + +# Topology descriptor +DESC_FILE_SERVICE_P4_INT = os.path.join(TEST_PATH, 'service-p4-int.json') +assert os.path.exists(DESC_FILE_SERVICE_P4_INT), "Invalid path to the INT service descriptor" + LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_l2.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l2.py similarity index 77% rename from src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_l2.py rename to src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l2.py index 5de0d511f3fdc354e1b649254e24d84547122e7b..46a314ed5e3f25f9114b1aa8ce741095e6b0ba54 100644 --- a/src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_l2.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l2.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2026 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. @@ -13,24 +13,37 @@ # limitations under the License. import logging -from common.proto.context_pb2 import ServiceStatusEnum, ServiceTypeEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +import os + +from common.proto.context_pb2 import ServiceTypeEnum +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ( - ADMIN_CONTEXT_ID, - DESC_FILE_SERVICE_P4_L2_SIMPLE, - DEV_NB, - P4_DEV_NB, - L2_RULES, - identify_number_of_p4_devices, - get_number_of_rules, - verify_active_service_type +from tests.tools.test_tools_p4 import * + +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, service_client, ) +DEV_NB = 4 +P4_DEV_NB = 1 + +L2_RULES = 12 + +TEST_PATH = os.path.join( + os.path.dirname(os.path.dirname( + os.path.abspath(__file__) + )) + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to tests" + +# Topology descriptor +DESC_FILE_SERVICE_P4_L2 = os.path.join(TEST_PATH, 'service-p4-l2.json') +assert os.path.exists(DESC_FILE_SERVICE_P4_L2), "Invalid path to the L2 service descriptor" + LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -60,7 +73,7 @@ def test_service_creation_l2( # Load service descriptor_loader = DescriptorLoader( - descriptors_file=DESC_FILE_SERVICE_P4_L2_SIMPLE, + descriptors_file=DESC_FILE_SERVICE_P4_L2, context_client=context_client, device_client=device_client, service_client=service_client ) results = descriptor_loader.process() diff --git a/src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_l3.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l3.py similarity index 78% rename from src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_l3.py rename to src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l3.py index 2bd6731440ff439a0def44bf26e290ba516da69c..9a8eba1caa2526e35ff00d634049c8f285abea8b 100644 --- a/src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_l3.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l3.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2026 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. @@ -13,24 +13,37 @@ # limitations under the License. import logging -from common.proto.context_pb2 import ServiceStatusEnum, ServiceTypeEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +import os + +from common.proto.context_pb2 import ServiceTypeEnum +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ( - ADMIN_CONTEXT_ID, - DESC_FILE_SERVICE_P4_L3, - DEV_NB, - P4_DEV_NB, - L3_RULES, - identify_number_of_p4_devices, - get_number_of_rules, - verify_active_service_type +from tests.tools.test_tools_p4 import * + +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, service_client, ) +DEV_NB = 4 +P4_DEV_NB = 1 + +L3_RULES = 14 + +TEST_PATH = os.path.join( + os.path.dirname(os.path.dirname( + os.path.abspath(__file__) + )) + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to tests" + +# Topology descriptor +DESC_FILE_SERVICE_P4_L3 = os.path.join(TEST_PATH, 'service-p4-l3.json') +assert os.path.exists(DESC_FILE_SERVICE_P4_L3), "Invalid path to the L3 service descriptor" + LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/Fixtures.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/Fixtures.py new file mode 100644 index 0000000000000000000000000000000000000000..cf77538f9d3860c1a45c56038288b87b08b8fd01 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/Fixtures.py @@ -0,0 +1,39 @@ +# Copyright 2022-2026 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 context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient + + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def service_client(): + _client = ServiceClient() + yield _client + _client.close() diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/__init__.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..b53987a4eae1aed245eba5c7ddd8cd10e35919c2 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2026 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/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_bootstrap.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_bootstrap.py new file mode 100644 index 0000000000000000000000000000000000000000..0f60221ff6497ab1bfef1b41dfa0419ebaeb4c0d --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_bootstrap.py @@ -0,0 +1,85 @@ +# Copyright 2022-2026 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, os, time + +from common.proto.context_pb2 import DeviceOperationalStatusEnum, Empty +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID + +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, +) + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +TEST_PATH = os.path.join( + os.path.dirname(os.path.dirname( + os.path.abspath(__file__) + )) + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to tests" + +# Topology descriptor +DESC_TOPOLOGY = os.path.join(TEST_PATH, 'topology.json') +assert os.path.exists(DESC_TOPOLOGY), "Invalid path to the topology descriptor" + +def test_scenario_bootstrap( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient # pylint: disable=redefined-outer-name +) -> None: + """ + This test assumes that the environment is in a clean state (empty) + before bootstrapping the P4 topology. + It loads the topology descriptor and verifies that no other services + or slices are created. + """ + validate_empty_scenario(context_client) + + descriptor_loader = DescriptorLoader( + descriptors_file=DESC_TOPOLOGY, context_client=context_client, device_client=device_client) + results = descriptor_loader.process() + check_descriptor_load_results(results, descriptor_loader) + descriptor_loader.validate() + + # Verify the scenario has no services/slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 0 + assert len(response.slice_ids) == 0 + +def test_scenario_devices_enabled( + context_client : ContextClient # pylint: disable=redefined-outer-name +) -> None: + """ + This test validates that the devices are enabled. + """ + DEVICE_OP_STATUS_ENABLED = DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_ENABLED + + num_devices = -1 + num_devices_enabled, num_retry = 0, 0 + while (num_devices != num_devices_enabled) and (num_retry < 10): + time.sleep(1.0) + response = context_client.ListDevices(Empty()) + num_devices = len(response.devices) + num_devices_enabled = 0 + for device in response.devices: + if device.device_operational_status != DEVICE_OP_STATUS_ENABLED: continue + num_devices_enabled += 1 + LOGGER.info('Num Devices enabled: {:d}/{:d}'.format(num_devices_enabled, num_devices)) + num_retry += 1 + assert num_devices_enabled == num_devices diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_cleanup.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_cleanup.py new file mode 100644 index 0000000000000000000000000000000000000000..ca303173f198515e85370ca41c4a12a0519c0077 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_cleanup.py @@ -0,0 +1,55 @@ +# Copyright 2022-2026 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, os + +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID + +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, +) + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +TEST_PATH = os.path.join( + os.path.dirname(os.path.dirname( + os.path.abspath(__file__) + )) + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to tests" + +# Topology descriptor +DESC_TOPOLOGY = os.path.join(TEST_PATH, 'topology.json') +assert os.path.exists(DESC_TOPOLOGY), "Invalid path to the topology descriptor" + +def test_scenario_cleanup( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient # pylint: disable=redefined-outer-name +) -> None: + # Verify the scenario has no services/slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 0 + assert len(response.slice_ids) == 0 + + # Unload topology and validate empty scenario + descriptor_loader = DescriptorLoader( + descriptors_file=DESC_TOPOLOGY, context_client=context_client, device_client=device_client) + descriptor_loader.validate() + descriptor_loader.unload() + validate_empty_scenario(context_client) diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_purge.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_purge.py new file mode 100644 index 0000000000000000000000000000000000000000..07c77266690511c6cc963c2ec6908a1d3061f2c8 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_purge.py @@ -0,0 +1,89 @@ +# Copyright 2022-2026 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 common.proto.context_pb2 import ( + DeviceId, LinkId, ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.object_factory.Context import json_context_id +from common.tools.object_factory.Device import json_device_id +from common.tools.object_factory.Service import json_service_id +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient +from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID + +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, service_client, +) + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +def test_clean_services( + context_client : ContextClient, # pylint: disable=redefined-outer-name + service_client : ServiceClient # pylint: disable=redefined-outer-name +) -> None: + response = context_client.ListServices(ADMIN_CONTEXT_ID) + LOGGER.warning('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) + + for service in response.services: + service_id = service.service_id + assert service_id + + service_uuid = service_id.service_uuid.uuid + context_uuid = service_id.context_id.context_uuid.uuid + assert service.service_status.service_status == ServiceStatusEnum.SERVICESTATUS_ACTIVE + + # Delete service + service_client.DeleteService(ServiceId(**json_service_id(service_uuid, json_context_id(context_uuid)))) + +def test_clean_links( + context_client : ContextClient, # pylint: disable=redefined-outer-name +) -> None: + response = context_client.ListLinks(ADMIN_CONTEXT_ID) + + for link in response.links: + link_id = link.link_id + + # Delete link + context_client.RemoveLink(LinkId(**link_id)) + +def test_clean_devices( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient # pylint: disable=redefined-outer-name +) -> None: + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response))) + + for device in response.devices: + device_uuid = device.device_id.device_uuid.uuid + device_json = json_device_id(device_uuid) + + # Delete device + device_client.DeleteDevice(DeviceId(**device_json)) + +def test_clean_context( + context_client : ContextClient # pylint: disable=redefined-outer-name +) -> None: + # Verify the scenario has no services/slices + response = context_client.ListTopologies(ADMIN_CONTEXT_ID) + + for topology in response.topologies: + topology_id = topology.topology_id + response = context_client.RemoveTopology(topology_id) + + response = context_client.RemoveContext(ADMIN_CONTEXT_ID) diff --git a/src/tests/p4-sd-fabric-svc-upf/README.md b/src/tests/p4-sd-fabric-svc-upf/README.md new file mode 100644 index 0000000000000000000000000000000000000000..2a9eff3044a05e1f982f63e6edd08daac0446d2d --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/README.md @@ -0,0 +1,158 @@ +# Tests for TFS Ecosystem Days #7 - PoC#1 + +This directory contains the necessary scripts and configurations to run tests atop a Stratum-based P4 switch that acts as a 5G UPF. +The P4 data plane is based on ONF's SD-Fabric implementation, titled [fabric-tna](https://github.com/stratum/fabric-tna) + +## Prerequisites + +You need Python3, which should already be installed while preparing for a TFS build. +Additionally, `pytest` is also mandatory as it is used by our tests below. +Aliasing python with python3 will also help bridging issues between older and newer python versions. + +```shell +alias python='python3' +pip3 install pytest +pip3 install grpclib protobuf +pip3 install grpcio-tools +``` + +The versions used for this test are: + +- `protobuf` 3.20.3 +- `grpclib` 0.4.4 +- `grpcio` 1.47.5 +- `grpcio-tools` 1.47.5 + +After the installation of `grpclib`, protoc-gen-grpclib_python binary is in /home/$USER/.local/bin/ +First we copy it to /usr/local/bin/: + +```shell + sudo cp /home/$USER/.local/bin/protoc-gen-grpclib_python /usr/local/bin/ +``` + +Then, we include this path to the PYTHONPATH: + +```shell +export PYTHONPATH="${PYTHONPATH}:/usr/local/bin/protoc-gen-grpclib_python" +``` + +You need to build and deploy a software-based Stratum switch, before being able to use TFS to control it. +To do so, follow the instructions in the `./topology` folder. + +## Steps to setup and run a TFS program atop Stratum + +To conduct this test, follow the steps below. + +### Deploy TFS + +Go to the TFS parent folder. + +```shell +cd ~/tfs-ctrl/ +``` + +Edit `my_deploy.sh` to include the following TFS components and then source the file. + +```shell +nano my_deploy.sh +`export TFS_COMPONENTS="context device pathcomp service nbi webui"` +``` + +```shell +source my_deploy.sh && source tfs_runtime_env_vars.sh +``` + +Now deploy TFS: + +```shell +./deploy/all.sh +``` + +When deployed, execute the following command to ensure that the above components are all in place and in a running state: + +```shell +./deploy/show.sh +``` + +### Path setup + +Ensure that `PATH` variable contains the parent project directory, e.g., "home/$USER/tfs-ctrl". + +Ensure that `PYTHONPATH` variable contains the source code directory of TFS, e.g., "home/$USER/tfs-ctrl/src" + +## Topology setup + +Open `topology/README.md` and follow the instructions on how to install a Stratum switch in a Linux namespace. + +## P4 artifacts + +In the `./p4src/` directory there are compiled P4 artifacts of the pipeline that will be pushed to the P4 switch, along with the P4-runtime definitions. +The `./setup.sh` script copies from this directory. If you need to change the P4 program, make sure to put the compiled artifacts there. + +## Tests + +A set of tests is implemented, each focusing on different aspects of TFS. +For each of these tests, an auxiliary bash script allows to run it with less typing. + +| Bash Runner | Purpose | +| --------------------------------------------- | --------------------------------------------------------------------------- | +| setup.sh | Copy P4 artifacts into the SBI pod | +| run_test_01_bootstrap.sh | Connect TFS to the P4 switch | +| run_test_02_service_provision_upf.sh | Install UPF forwarding rules via a dedicated P4 UPF service handler | +| run_test_03_service_deprovision_upf.sh | Uninstall UPF forwarding rules via a dedicated P4 PF service handler | +| run_test_04_cleanup.sh | Clean-up context and topology and disconnect TFS from the P4 switch | + +Each of the tests above is described in detail below. + +### Step 0: Copy the necessary P4 artifacts into the TFS SBI service pod + +The setup script copies the necessary artifacts to the SBI service pod. +It should be run just once, after a fresh install of TFS. +If you `deploy/all.sh` again, you need to repeat this step. + +```shell +cd ~/tfs-ctrl/ +source my_deploy.sh && source tfs_runtime_env_vars.sh +bash src/tests/p4-sd-fabric-svc-upf/setup.sh +``` + +### Step 1: Bootstrap topology + +The bootstrap script registers the context, topology, links, and devices to TFS. + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-svc-upf/run_test_01_bootstrap.sh +``` + +### Step 2: Provision UPF via the Service API + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-svc-upf/run_test_02_service_provision_upf.sh +``` + +### Step 3: Deprovision UPF via the Service API + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-svc-upf/run_test_03_service_deprovision_upf.sh +``` + +### Step 4: Deprovision topology + +Delete all the objects (context, topology, links, devices) from TFS: + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-svc-upf/run_test_04_cleanup.sh +``` + +### Step 5: Purge context and topology (if needed) + +Alternatively, a purge test is implemented; this test removes services, links, devices, topology, and context in this order. + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-svc-upf/run_test_05_purge.sh +``` diff --git a/src/tests/p4-sd-fabric-svc-upf/__init__.py b/src/tests/p4-sd-fabric-svc-upf/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..023830645e0fcb60e3f8583674a954810af222f2 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/__init__.py @@ -0,0 +1,13 @@ +# 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. diff --git a/src/tests/p4-sd-fabric-svc-upf/descriptors/all.json b/src/tests/p4-sd-fabric-svc-upf/descriptors/all.json new file mode 100644 index 0000000000000000000000000000000000000000..cebb197a40f9351b84abab1e14f7b212ab01db0e --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/descriptors/all.json @@ -0,0 +1,134 @@ +{ + "contexts": [ + {"context_id": {"context_uuid": {"uuid": "admin"}}} + ], + "topologies": [ + {"topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}} + } + ], + "devices": [ + { + "device_id": {"device_uuid": {"uuid": "tfs-sdn-controller"}}, + "name": "tfs-sdn-controller", + "device_type": "teraflowsdn", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_operational_status": "DEVICEOPERATIONALSTATUS_UNDEFINED", + "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "mgmt", "name": "mgmt", "type": "mgmt-int"}] + }}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "5gc"}}, + "device_type": "oran-cn", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "mgmt", "name": "mgmt", "type": "mgmt-int"}] + }}} + ] + } + }, + { + "device_id": {"device_uuid": {"uuid": "5g-gNb"}}, + "device_type": "emu-packet-radio-router", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "eth1", "name": "eth1", "type": "copper"}] + }}} + ] + } + }, + { + "device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, + "device_type": "p4-switch", + "device_drivers": ["DEVICEDRIVER_P4"], + "device_operational_status": "DEVICEOPERATIONALSTATUS_DISABLED", + "name": "sw1-5g-upf", + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "192.168.7.56"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "50001"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "id": 1, + "name": "sw1-5g-upf", + "vendor": "Open Networking Foundation", + "hw_ver": "BMv2 simple_switch", + "sw_ver": "Stratum", + "timeout": 60, + "p4bin": "/root/p4/bmv2.json", + "p4info": "/root/p4/p4info.txt", + "endpoints": [ + {"uuid": "sw1-1", "name": "1", "type": "port-dp-net-access"}, + {"uuid": "sw1-2", "name": "2", "type": "port-dp-net-core"}, + {"uuid": "sw1-3", "name": "3", "type": "port-cp-5gc"}, + {"uuid": "sw1-4", "name": "4", "type": "port-cp-sdn"} + ] + }}} + ] + } + }, + { + "device_id": {"device_uuid": {"uuid": "data-network"}}, + "device_type": "network", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "eth1", "name": "eth1", "type": "copper"}] + }}} + ] + } + } + ], + "links": [ + { + "link_id": {"link_uuid": {"uuid": "5g-gNb/eth1==sw1-5g-upf/sw1-1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "5g-gNb"}}, "endpoint_uuid": {"uuid": "eth1"}}, + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "sw1-5g-upf/sw1-1==5g-gNb/eth1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-1"}}, + {"device_id": {"device_uuid": {"uuid": "5g-gNb"}}, "endpoint_uuid": {"uuid": "eth1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "sw1-5g-upf/sw1-2==data-network/eth1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-2"}}, + {"device_id": {"device_uuid": {"uuid": "data-network"}}, "endpoint_uuid": {"uuid": "eth1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "data-network/eth1==sw1-5g-upf/sw1-2"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "data-network"}}, "endpoint_uuid": {"uuid": "eth1"}}, + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-2"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "sw1-5g-upf/sw1-3==5gc/mgmt"}}, "link_type": "LINKTYPE_MANAGEMENT", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-3"}}, + {"device_id": {"device_uuid": {"uuid": "5gc"}}, "endpoint_uuid": {"uuid": "mgmt"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "sw1-5g-upf/sw1-4==tfs-sdn-controller/mgmt"}}, "link_type": "LINKTYPE_MANAGEMENT", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-4"}}, + {"device_id": {"device_uuid": {"uuid": "tfs-sdn-controller"}}, "endpoint_uuid": {"uuid": "mgmt"}} + ] + } + ] +} diff --git a/src/tests/p4-sd-fabric-svc-upf/descriptors/context.json b/src/tests/p4-sd-fabric-svc-upf/descriptors/context.json new file mode 100644 index 0000000000000000000000000000000000000000..08e617ba5f9a2d1c839d1d17d1fcae9d9659f89e --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/descriptors/context.json @@ -0,0 +1,5 @@ +{ + "contexts": [ + {"context_id": {"context_uuid": {"uuid": "admin"}}} + ] +} diff --git a/src/tests/p4-sd-fabric-svc-upf/descriptors/devices.json b/src/tests/p4-sd-fabric-svc-upf/descriptors/devices.json new file mode 100644 index 0000000000000000000000000000000000000000..c537ead3c7418da7673581111ced38f8443952d2 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/descriptors/devices.json @@ -0,0 +1,89 @@ +{ + "devices": [ + { + "device_id": {"device_uuid": {"uuid": "tfs-sdn-controller"}}, + "name": "tfs-sdn-controller", + "device_type": "teraflowsdn", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_operational_status": "DEVICEOPERATIONALSTATUS_UNDEFINED", + "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "mgmt", "name": "mgmt", "type": "mgmt-int"}] + }}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "5gc"}}, + "device_type": "oran-cn", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "mgmt", "name": "mgmt", "type": "mgmt-int"}] + }}} + ] + } + }, + { + "device_id": {"device_uuid": {"uuid": "5g-gNb"}}, + "device_type": "emu-packet-radio-router", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "eth1", "name": "eth1", "type": "copper"}] + }}} + ] + } + }, + { + "device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, + "device_type": "p4-switch", + "device_drivers": ["DEVICEDRIVER_P4"], + "device_operational_status": "DEVICEOPERATIONALSTATUS_DISABLED", + "name": "sw1-5g-upf", + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "192.168.7.56"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "50001"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "id": 1, + "name": "sw1-5g-upf", + "vendor": "Open Networking Foundation", + "hw_ver": "BMv2 simple_switch", + "sw_ver": "Stratum", + "timeout": 60, + "p4bin": "/root/p4/bmv2.json", + "p4info": "/root/p4/p4info.txt", + "endpoints": [ + {"uuid": "sw1-1", "name": "1", "type": "port-dp-net-access"}, + {"uuid": "sw1-2", "name": "2", "type": "port-dp-net-core"}, + {"uuid": "sw1-3", "name": "3", "type": "port-cp-5gc"}, + {"uuid": "sw1-4", "name": "4", "type": "port-cp-sdn"} + ] + }}} + ] + } + }, + { + "device_id": {"device_uuid": {"uuid": "data-network"}}, + "device_type": "network", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "eth1", "name": "eth1", "type": "copper"}] + }}} + ] + } + } + ] +} diff --git a/src/tests/p4-sd-fabric-svc-upf/descriptors/links.json b/src/tests/p4-sd-fabric-svc-upf/descriptors/links.json new file mode 100644 index 0000000000000000000000000000000000000000..ea28f012b1169abad388bff5ca3cfa914aa62927 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/descriptors/links.json @@ -0,0 +1,40 @@ +{ + "links": [ + { + "link_id": {"link_uuid": {"uuid": "5g-gNb/eth1==sw1-5g-upf/sw1-1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "5g-gNb"}}, "endpoint_uuid": {"uuid": "eth1"}}, + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "sw1-5g-upf/sw1-1==5g-gNb/eth1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-1"}}, + {"device_id": {"device_uuid": {"uuid": "5g-gNb"}}, "endpoint_uuid": {"uuid": "eth1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "sw1-5g-upf/sw1-2==data-network/eth1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-2"}}, + {"device_id": {"device_uuid": {"uuid": "data-network"}}, "endpoint_uuid": {"uuid": "eth1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "data-network/eth1==sw1-5g-upf/sw1-2"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "data-network"}}, "endpoint_uuid": {"uuid": "eth1"}}, + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-2"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "sw1-5g-upf/sw1-3==5gc/mgmt"}}, "link_type": "LINKTYPE_MANAGEMENT", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-3"}}, + {"device_id": {"device_uuid": {"uuid": "5gc"}}, "endpoint_uuid": {"uuid": "mgmt"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "sw1-5g-upf/sw1-4==tfs-sdn-controller/mgmt"}}, "link_type": "LINKTYPE_MANAGEMENT", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-4"}}, + {"device_id": {"device_uuid": {"uuid": "tfs-sdn-controller"}}, "endpoint_uuid": {"uuid": "mgmt"}} + ] + } + ] +} diff --git a/src/tests/p4-sd-fabric-svc-upf/descriptors/send_descriptors_service.sh b/src/tests/p4-sd-fabric-svc-upf/descriptors/send_descriptors_service.sh new file mode 100644 index 0000000000000000000000000000000000000000..97a7895defe3762cc09cbec48b490525633dc89a --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/descriptors/send_descriptors_service.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +CREDENTIALS="admin:admin" +CONTEXT="admin" +TFS_IP="192.168.5.137" +HEADER="Content-Type: application/json" + +##### Raw HTTP requests to provision the UPF TFS service +# curl -X PUT --header "Content-Type: application/json" --data @service-upf.json --user "admin:admin" http://192.168.5.137/tfs-api/context/admin/service/p4-service-upf + +curl -X PUT --header "${HEADER}" --data @service-upf.json --user ${CREDENTIALS} http://${TFS_IP}/tfs-api/context/${CONTEXT}/service/p4-service-upf diff --git a/src/tests/p4-sd-fabric-svc-upf/descriptors/send_descriptors_topo.sh b/src/tests/p4-sd-fabric-svc-upf/descriptors/send_descriptors_topo.sh new file mode 100644 index 0000000000000000000000000000000000000000..80fa2a24f40ad688d91850bce16bbca604942e86 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/descriptors/send_descriptors_topo.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +CREDENTIALS="admin:admin" +CONTEXT="admin" +TFS_IP="192.168.5.137" +HEADER="Content-Type: application/json" + +###### Disclaimer: Currently TFS does not possess a single NBI endpoint where all context, topologies, devices, and links can be given at once. +# For this reason, you need to issue 4 different requests to 4 different NBI endpoints as follows. + +# curl -X POST --header "Content-Type: application/json" --data @context.json --user "admin:admin" http://192.168.5.137/tfs-api/contexts +# curl -X POST --header "Content-Type: application/json" --data @topologies.json --user "admin:admin" http://192.168.5.137/tfs-api/context/admin/topologies +# curl -X POST --header "Content-Type: application/json" --data @devices.json --user "admin:admin" http://192.168.5.137/tfs-api/devices +# curl -X POST --header "Content-Type: application/json" --data @links.json --user "admin:admin" http://192.168.5.137/tfs-api/links + +dispatch() { + echo "Onboarding topology" + curl -X POST --header "${HEADER}" --data @context.json --user ${CREDENTIALS} http://${TFS_IP}/tfs-api/contexts + curl -X POST --header "${HEADER}" --data @topologies.json --user ${CREDENTIALS} http://${TFS_IP}/tfs-api/context/${CONTEXT}/topologies + curl -X POST --header "${HEADER}" --data @devices.json --user ${CREDENTIALS} http://${TFS_IP}/tfs-api/devices + curl -X POST --header "${HEADER}" --data @links.json --user ${CREDENTIALS} http://${TFS_IP}/tfs-api/links +} + +dispatch + +exit 0 diff --git a/src/tests/p4-sd-fabric-svc-upf/descriptors/service-upf-ui.json b/src/tests/p4-sd-fabric-svc-upf/descriptors/service-upf-ui.json new file mode 100644 index 0000000000000000000000000000000000000000..d031de781d1ad05be84fc1c27121279e4fc03d66 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/descriptors/service-upf-ui.json @@ -0,0 +1,144 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "p4-service-upf"} + }, + "name": "p4-service-upf", + "service_type": "SERVICETYPE_UPF", + "service_endpoint_ids": [ + { + "device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, + "endpoint_uuid": {"uuid": "sw1-1"} + }, + { + "device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, + "endpoint_uuid": {"uuid": "sw1-2"} + } + ], + "service_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/settings", + "resource_value": { + "switch_info": [ + { + "sw1-5g-upf": { + "arch": "v1model", + "dpid": 1, + "port_list": [ + { + "port_id": 1, + "port_type": "host", + "vlan_id": 4094 + }, + { + "port_id": 2, + "port_type": "host", + "vlan_id": 4094 + } + ], + "fwd_list": [ + { + "port_id": 1, + "host_mac": "50:3e:aa:85:89:09", + "host_label": "N3 - 5G gNB" + }, + { + "port_id": 2, + "host_mac": "50:3e:aa:52:3e:38", + "host_label": "N3 - 5G UPF" + }, + { + "port_id": 1, + "host_mac": "18:a6:f7:0e:73:e5", + "host_label": "N6 - 5G UPF" + }, + { + "port_id": 2, + "host_mac": "50:3e:aa:96:ba:dd", + "host_label": "N6 - Data Network" + } + ], + "routing_list": [ + { + "port_id": 1, + "ipv4_dst": "10.10.2.2", + "ipv4_prefix_len": 32, + "mac_src": "18:a6:f7:0e:73:e5", + "mac_dst": "50:3e:aa:96:ba:dd" + }, + { + "port_id": 2, + "ipv4_dst": "12.1.1.0", + "ipv4_prefix_len": 24, + "mac_src": "50:3e:aa:52:3e:38", + "mac_dst": "50:3e:aa:85:89:09" + } + ], + "upf": { + "uplink_port": 1, + "uplink_ip": "10.10.1.1", + "uplink_mac": "50:3e:aa:52:3e:38", + + "downlink_port": 2, + "downlink_ip": "10.10.2.1", + "downlink_mac": "18:a6:f7:0e:73:e5", + + "slice_id": 0, + "teid": 1, + "app_id": 0, + "app_meter_id": 0, + "ctr_id": 401, + "tc_id": 3, + "tunnel_peer_id": 1 + }, + "gnb": { + "ip": "10.10.1.2", + "mac": "50:3e:aa:85:89:09" + }, + "ue_list": [ + { + "ue_id": "UE 1", + "ue_ip": "12.1.1.51", + "pdu_sessions": [ + { + "pdu_session_id": 0, + "dnn": "Data Network 1", + "pdu_session_type": "0x0800", + "gtpu_tunnel": { + "uplink": { + "src": "10.10.1.2", + "dst": "10.10.1.1" + }, + "downlink": { + "src": "10.10.1.1", + "dst": "10.10.1.2" + } + } + } + ], + "qos_flows": [ + { + "qfi": 0, + "5qi": 9, + "qos_type": "Non-GBR" + } + ] + } + ] + } + } + ] + } + } + } + ] + }, + "service_constraints": [] + } + ] +} diff --git a/src/tests/p4-sd-fabric-svc-upf/descriptors/service-upf.json b/src/tests/p4-sd-fabric-svc-upf/descriptors/service-upf.json new file mode 100644 index 0000000000000000000000000000000000000000..e1437ca2f3861f03a4815e688b33d157a143a3b0 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/descriptors/service-upf.json @@ -0,0 +1,140 @@ +{ + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "p4-service-upf"} + }, + "name": "p4-service-upf", + "service_type": "SERVICETYPE_UPF", + "service_endpoint_ids": [ + { + "device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, + "endpoint_uuid": {"uuid": "sw1-1"} + }, + { + "device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, + "endpoint_uuid": {"uuid": "sw1-2"} + } + ], + "service_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/settings", + "resource_value": { + "switch_info": [ + { + "sw1-5g-upf": { + "arch": "v1model", + "dpid": 1, + "port_list": [ + { + "port_id": 1, + "port_type": "host", + "vlan_id": 4094 + }, + { + "port_id": 2, + "port_type": "host", + "vlan_id": 4094 + } + ], + "fwd_list": [ + { + "port_id": 1, + "host_mac": "50:3e:aa:85:89:09", + "host_label": "N3 - 5G gNB" + }, + { + "port_id": 2, + "host_mac": "50:3e:aa:52:3e:38", + "host_label": "N3 - 5G UPF" + }, + { + "port_id": 1, + "host_mac": "18:a6:f7:0e:73:e5", + "host_label": "N6 - 5G UPF" + }, + { + "port_id": 2, + "host_mac": "50:3e:aa:96:ba:dd", + "host_label": "N6 - Data Network" + } + ], + "routing_list": [ + { + "port_id": 1, + "ipv4_dst": "10.10.2.2", + "ipv4_prefix_len": 32, + "mac_src": "18:a6:f7:0e:73:e5", + "mac_dst": "50:3e:aa:96:ba:dd" + }, + { + "port_id": 2, + "ipv4_dst": "12.1.1.0", + "ipv4_prefix_len": 24, + "mac_src": "50:3e:aa:52:3e:38", + "mac_dst": "50:3e:aa:85:89:09" + } + ], + "upf": { + "uplink_port": 1, + "uplink_ip": "10.10.1.1", + "uplink_mac": "50:3e:aa:52:3e:38", + + "downlink_port": 2, + "downlink_ip": "10.10.2.1", + "downlink_mac": "18:a6:f7:0e:73:e5", + + "slice_id": 0, + "teid": 1, + "app_id": 0, + "app_meter_id": 0, + "ctr_id": 401, + "tc_id": 3, + "tunnel_peer_id": 1 + }, + "gnb": { + "ip": "10.10.1.2", + "mac": "50:3e:aa:85:89:09" + }, + "ue_list": [ + { + "ue_id": "UE 1", + "ue_ip": "12.1.1.51", + "pdu_sessions": [ + { + "pdu_session_id": 0, + "dnn": "Data Network 1", + "pdu_session_type": "0x0800", + "gtpu_tunnel": { + "uplink": { + "src": "10.10.1.2", + "dst": "10.10.1.1" + }, + "downlink": { + "src": "10.10.1.1", + "dst": "10.10.1.2" + } + } + } + ], + "qos_flows": [ + { + "qfi": 0, + "5qi": 9, + "qos_type": "Non-GBR" + } + ] + } + ] + } + } + ] + } + } + } + ] + }, + "service_constraints": [] +} diff --git a/src/tests/p4-sd-fabric-svc-upf/descriptors/topologies.json b/src/tests/p4-sd-fabric-svc-upf/descriptors/topologies.json new file mode 100644 index 0000000000000000000000000000000000000000..a38381fb7f5f17a21e36bab67d7622ec485eb600 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/descriptors/topologies.json @@ -0,0 +1,6 @@ +{ + "topologies": [ + {"topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}} + } + ] +} diff --git a/src/tests/p4-sd-fabric-svc-upf/p4src/README.md b/src/tests/p4-sd-fabric-svc-upf/p4src/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e17d044fb6100c13e47f1dffb779f4800c59b9d3 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/p4src/README.md @@ -0,0 +1,24 @@ +# P4 Sources + +We employ the P4 sources from the [fabric-tna](https://github.com/stratum/fabric-tna/tree/main) project. + +To compile a relevant P4 target binary and P4 info file, do: + +```shell +git clone https://github.com/stratum/fabric-tna.git + +cd ./fabric-tna + +make fabric-upf-int-v1model +``` + +At this point, a relevant `build.sh` script is being run and a P4 program is being compiled. + +After a successful compilation, some artifacts (p4info.txt, bmv2.json) will be generated and placed into `build` sub-folder. + +```shell +ls build/fabric-int/bmv2 +_pp.p4 bmv2.json p4info.txt +``` + +These artefacts are now moved into this repository. diff --git a/src/tests/p4-sd-fabric-svc-upf/p4src/_pp.p4 b/src/tests/p4-sd-fabric-svc-upf/p4src/_pp.p4 new file mode 100644 index 0000000000000000000000000000000000000000..870509db7f530c7bf9070e4c24b5b546a2a3441d --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/p4src/_pp.p4 @@ -0,0 +1,2452 @@ +error { + PacketRejectedByParser +} +#include +#define V1MODEL_VERSION 20180101 +#include + +typedef bit<9> PortId_t; +typedef bit<16> MulticastGroupId_t; +typedef bit<5> QueueId_t; +typedef bit<10> MirrorId_t; +typedef bit<16> ReplicationId_t; +enum bit<2> MeterColor_t { + GREEN = 0, + YELLOW = 1, + RED = 2 +} + +typedef bit<1> BOOL; +typedef bit<8> FieldListIndex_t; +const PortId_t BMV2_DROP_PORT = 511; +const PortId_t FAKE_V1MODEL_RECIRC_PORT = 510; +const FieldListIndex_t PRESERVE_INT_MD = 241; +const FieldListIndex_t PRESERVE_INGRESS_PORT = 231; +const FieldListIndex_t NO_PRESERVATION = 0; +typedef bit<3> fwd_type_t; +typedef bit<32> next_id_t; +typedef bit<20> mpls_label_t; +typedef bit<48> mac_addr_t; +typedef bit<12> vlan_id_t; +typedef bit<32> ipv4_addr_t; +typedef bit<16> l4_port_t; +typedef bit<32> flow_hash_t; +typedef bit<4> slice_id_t; +typedef bit<2> tc_t; +typedef bit<(4 + 2)> slice_tc_t; +type bit<9> FabricPortId_t; +const bit<8> DEFAULT_APP_ID = 0; +const slice_id_t DEFAULT_SLICE_ID = 0; +const tc_t DEFAULT_TC = 0; +const QueueId_t QUEUE_ID_BEST_EFFORT = 0; +typedef bit<32> teid_t; +typedef bit<12> upf_ctr_idx_t; +typedef bit<8> tun_peer_id_t; +typedef bit<32> ue_session_id_t; +typedef bit<15> session_meter_idx_t; +typedef bit<15> app_meter_idx_t; +const session_meter_idx_t DEFAULT_SESSION_METER_IDX = 0; +const app_meter_idx_t DEFAULT_APP_METER_IDX = 0; +enum bit<2> EncapPresence { + NONE = 0x0, + GTPU_ONLY = 0x1, + GTPU_WITH_PSC = 0x2, + VXLAN = 0x3 +} + +const bit<16> GTPU_UDP_PORT = 2152; +const bit<3> GTP_V1 = 3w1; +const bit<8> GTPU_GPDU = 0xff; +const bit<1> GTP_PROTOCOL_TYPE_GTP = 1w1; +const bit<8> GTPU_NEXT_EXT_NONE = 0x0; +const bit<8> GTPU_NEXT_EXT_PSC = 0x85; +const bit<4> GTPU_EXT_PSC_TYPE_DL = 4w0; +const bit<4> GTPU_EXT_PSC_TYPE_UL = 4w1; +const bit<8> GTPU_EXT_PSC_LEN = 8w1; +enum bit<2> PortType_t { + UNKNOWN = 0x0, + EDGE = 0x1, + INFRA = 0x2, + INTERNAL = 0x3 +} + +const bit<16> ETHERTYPE_QINQ = 0x88a8; +const bit<16> ETHERTYPE_QINQ_NON_STD = 0x9100; +const bit<16> ETHERTYPE_VLAN = 0x8100; +const bit<16> ETHERTYPE_MPLS = 0x8847; +const bit<16> ETHERTYPE_MPLS_MULTICAST = 0x8848; +const bit<16> ETHERTYPE_IPV4 = 0x800; +const bit<16> ETHERTYPE_IPV6 = 0x86dd; +const bit<16> ETHERTYPE_ARP = 0x806; +const bit<16> ETHERTYPE_PPPOED = 0x8863; +const bit<16> ETHERTYPE_PPPOES = 0x8864; +const bit<16> ETHERTYPE_PACKET_OUT = 0xbf01; +const bit<16> ETHERTYPE_CPU_LOOPBACK_INGRESS = 0xbf02; +const bit<16> ETHERTYPE_CPU_LOOPBACK_EGRESS = 0xbf03; +const bit<16> ETHERTYPE_INT_WIP_IPV4 = 0xbf04; +const bit<16> ETHERTYPE_INT_WIP_MPLS = 0xbf05; +const bit<16> PPPOE_PROTOCOL_IP4 = 0x21; +const bit<16> PPPOE_PROTOCOL_IP6 = 0x57; +const bit<16> PPPOE_PROTOCOL_MPLS = 0x281; +const bit<8> PROTO_ICMP = 1; +const bit<8> PROTO_TCP = 6; +const bit<8> PROTO_UDP = 17; +const bit<8> PROTO_ICMPV6 = 58; +const bit<4> IPV4_MIN_IHL = 5; +const fwd_type_t FWD_BRIDGING = 0; +const fwd_type_t FWD_MPLS = 1; +const fwd_type_t FWD_IPV4_UNICAST = 2; +const fwd_type_t FWD_IPV4_MULTICAST = 3; +const fwd_type_t FWD_IPV6_UNICAST = 4; +const fwd_type_t FWD_IPV6_MULTICAST = 5; +const fwd_type_t FWD_UNKNOWN = 7; +const vlan_id_t DEFAULT_VLAN_ID = 12w4094; +const bit<8> DEFAULT_MPLS_TTL = 64; +const bit<8> DEFAULT_IPV4_TTL = 64; +const bit<16> VXLAN_UDP_PORT = 4789; +const bit<7> RECIRC_PORT_NUMBER = 7w68; +action nop() { + NoAction(); +} +enum bit<8> BridgedMdType_t { + INVALID = 0, + INGRESS_TO_EGRESS = 1, + EGRESS_MIRROR = 2, + INGRESS_MIRROR = 3, + INT_INGRESS_DROP = 4, + DEFLECTED = 5 +} + +enum bit<3> FabricMirrorType_t { + INVALID = 0, + INT_REPORT = 1, + PACKET_IN = 2 +} + +const MirrorId_t PACKET_IN_MIRROR_SESSION_ID = 0x1ff; +enum bit<2> CpuLoopbackMode_t { + DISABLED = 0, + DIRECT = 1, + INGRESS = 2 +} + +const bit<4> NPROTO_ETHERNET = 0; +const bit<4> NPROTO_TELEMETRY_DROP_HEADER = 1; +const bit<4> NPROTO_TELEMETRY_SWITCH_LOCAL_HEADER = 2; +const bit<16> REPORT_FIXED_HEADER_BYTES = 12; +const bit<16> DROP_REPORT_HEADER_BYTES = 12; +const bit<16> LOCAL_REPORT_HEADER_BYTES = 16; +const bit<8> INT_MIRROR_SESSION_BASE = 0x80; +const bit<10> V1MODEL_INT_MIRROR_SESSION = 0x1fa; +typedef bit<16> flow_report_filter_index_t; +typedef bit<16> drop_report_filter_index_t; +typedef bit<12> queue_report_filter_index_t; +typedef bit<16> queue_report_quota_t; +typedef bit<3> IntReportType_t; +const IntReportType_t INT_REPORT_TYPE_NO_REPORT = 0; +const IntReportType_t INT_REPORT_TYPE_DROP = 4; +const IntReportType_t INT_REPORT_TYPE_QUEUE = 2; +const IntReportType_t INT_REPORT_TYPE_FLOW = 1; +typedef bit<8> IntWipType_t; +const IntWipType_t INT_IS_NOT_WIP = 0; +const IntWipType_t INT_IS_WIP = 1; +const IntWipType_t INT_IS_WIP_WITH_MPLS = 2; +const bit<16> INT_WIP_ADJUST_IP_BYTES = 14 - 1 ^ 0xffff; +const bit<16> INT_WIP_ADJUST_UDP_BYTES = INT_WIP_ADJUST_IP_BYTES - 20; +const bit<16> INT_WIP_ADJUST_IP_MPLS_BYTES = INT_WIP_ADJUST_IP_BYTES - 4; +const bit<16> INT_WIP_ADJUST_UDP_MPLS_BYTES = INT_WIP_ADJUST_UDP_BYTES - 4; +enum bit<8> IntDropReason_t { + DROP_REASON_UNKNOWN = 0, + DROP_REASON_IP_TTL_ZERO = 26, + DROP_REASON_ROUTING_V4_MISS = 29, + DROP_REASON_ROUTING_V6_MISS = 29, + DROP_REASON_PORT_VLAN_MAPPING_MISS = 55, + DROP_REASON_TRAFFIC_MANAGER = 71, + DROP_REASON_ACL_DENY = 80, + DROP_REASON_BRIDGING_MISS = 89, + DROP_REASON_NEXT_ID_MISS = 128, + DROP_REASON_MPLS_MISS = 129, + DROP_REASON_EGRESS_NEXT_MISS = 130, + DROP_REASON_MPLS_TTL_ZERO = 131, + DROP_REASON_UPF_DL_SESSION_MISS = 132, + DROP_REASON_UPF_DL_SESSION_DROP = 133, + DROP_REASON_UPF_UL_SESSION_MISS = 134, + DROP_REASON_UPF_UL_SESSION_DROP = 135, + DROP_REASON_UPF_DL_SESSION_DROP_BUFF = 136, + DROP_REASON_UPF_DL_TERMINATION_MISS = 137, + DROP_REASON_UPF_DL_TERMINATION_DROP = 138, + DROP_REASON_UPF_UL_TERMINATION_MISS = 139, + DROP_REASON_UPF_UL_TERMINATION_DROP = 140, + DROP_REASON_UPF_UPLINK_RECIRC_DENY = 150, + DROP_REASON_INGRESS_QOS_METER = 160, + DROP_REASON_ROUTING_V4_DROP = 170, + DROP_REASON_ROUTING_V6_DROP = 171 +} + +@controller_header("packet_in") header packet_in_header_t { + FabricPortId_t ingress_port; + bit<7> _pad0; +} + +@controller_header("packet_out") header packet_out_header_t { + @padding + bit<7> pad0; + FabricPortId_t egress_port; + @padding + bit<3> pad1; + QueueId_t queue_id; + @padding + bit<5> pad2; + CpuLoopbackMode_t cpu_loopback_mode; + bit<1> do_forwarding; + @padding + bit<16> pad3; + @padding + bit<48> pad4; + bit<16> ether_type; +} + +header ethernet_t { + mac_addr_t dst_addr; + mac_addr_t src_addr; +} + +header eth_type_t { + bit<16> value; +} + +header vlan_tag_t { + bit<16> eth_type; + bit<3> pri; + bit<1> cfi; + vlan_id_t vlan_id; +} + +header mpls_t { + mpls_label_t label; + bit<3> tc; + bit<1> bos; + bit<8> ttl; +} + +header pppoe_t { + bit<4> version; + bit<4> type_id; + bit<8> code; + bit<16> session_id; + bit<16> length; + bit<16> protocol; +} + +header ipv4_t { + bit<4> version; + bit<4> ihl; + bit<6> dscp; + bit<2> ecn; + bit<16> total_len; + bit<16> identification; + bit<3> flags; + bit<13> frag_offset; + bit<8> ttl; + bit<8> protocol; + bit<16> hdr_checksum; + bit<32> src_addr; + bit<32> dst_addr; +} + +header ipv6_t { + bit<4> version; + bit<8> traffic_class; + bit<20> flow_label; + bit<16> payload_len; + bit<8> next_hdr; + bit<8> hop_limit; + bit<128> src_addr; + bit<128> dst_addr; +} + +header tcp_t { + bit<16> sport; + bit<16> dport; +} + +@pa_container_size("egress" , "hdr.outer_udp.sport" , 16) @pa_container_size("egress" , "hdr.outer_udp.dport" , 16) header udp_t { + bit<16> sport; + bit<16> dport; + bit<16> len; + bit<16> checksum; +} + +header icmp_t { + bit<8> icmp_type; + bit<8> icmp_code; +} + +header vxlan_t { + bit<8> flags; + bit<24> reserved; + bit<24> vni; + bit<8> reserved_2; +} + +header gtpu_t { + bit<3> version; + bit<1> pt; + bit<1> spare; + bit<1> ex_flag; + bit<1> seq_flag; + bit<1> npdu_flag; + bit<8> msgtype; + bit<16> msglen; + teid_t teid; +} + +header gtpu_options_t { + bit<16> seq_num; + bit<8> n_pdu_num; + bit<8> next_ext; +} + +header gtpu_ext_psc_t { + bit<8> len; + bit<4> type; + bit<4> spare0; + bit<1> ppp; + bit<1> rqi; + bit<6> qfi; + bit<8> next_ext; +} + +@flexible struct upf_bridged_metadata_t { + tun_peer_id_t tun_peer_id; + upf_ctr_idx_t upf_ctr_id; + bit<6> qfi; + bool needs_gtpu_encap; + bool skip_upf; + bool skip_egress_upf_ctr; + teid_t teid; + bit<4> _pad; +} + +@pa_no_overlay("egress" , "hdr.report_fixed_header.rsvd") header report_fixed_header_t { + bit<4> ver; + bit<4> nproto; + bit<3> dqf; + bit<15> rsvd; + bit<6> hw_id; + bit<32> seq_no; + bit<32> ig_tstamp; +} + +@pa_container_size("egress" , "hdr.common_report_header.queue_id" , 8) @pa_container_size("egress" , "hdr.common_report_header.ig_port" , 16) @pa_container_size("egress" , "hdr.common_report_header.eg_port" , 16) @pa_no_overlay("egress" , "hdr.common_report_header.queue_id") @pa_no_overlay("egress" , "hdr.common_report_header.eg_port") header common_report_header_t { + bit<32> switch_id; + bit<7> pad1; + bit<9> ig_port; + bit<7> pad2; + bit<9> eg_port; + bit<3> pad3; + bit<5> queue_id; +} + +header drop_report_header_t { + bit<8> drop_reason; + @padding + bit<16> pad; +} + +header local_report_header_t { + bit<5> pad1; + bit<19> queue_occupancy; + bit<32> eg_tstamp; +} + +@pa_no_overlay("egress" , "fabric_md.int_report_md.bmd_type") @pa_no_overlay("egress" , "fabric_md.int_report_md.mirror_type") @pa_no_overlay("egress" , "fabric_md.int_report_md.ig_port") @pa_no_overlay("egress" , "fabric_md.int_report_md.eg_port") @pa_no_overlay("egress" , "fabric_md.int_report_md.queue_id") @pa_no_overlay("egress" , "fabric_md.int_report_md.queue_occupancy") @pa_no_overlay("egress" , "fabric_md.int_report_md.ig_tstamp") @pa_no_overlay("egress" , "fabric_md.int_report_md.eg_tstamp") @pa_no_overlay("egress" , "fabric_md.int_report_md.drop_reason") @pa_no_overlay("egress" , "fabric_md.int_report_md.ip_eth_type") @pa_no_overlay("egress" , "fabric_md.int_report_md.report_type") @pa_no_overlay("egress" , "fabric_md.int_report_md.flow_hash") @pa_no_overlay("egress" , "fabric_md.int_report_md.encap_presence") header int_report_metadata_t { + BridgedMdType_t bmd_type; + @padding + bit<5> _pad0; + FabricMirrorType_t mirror_type; + @padding + bit<7> _pad1; + bit<9> ig_port; + @padding + bit<7> _pad2; + bit<9> eg_port; + @padding + bit<3> _pad3; + bit<5> queue_id; + @padding + bit<5> _pad4; + bit<19> queue_occupancy; + bit<32> ig_tstamp; + bit<32> eg_tstamp; + bit<8> drop_reason; + bit<16> ip_eth_type; + @padding + bit<6> _pad5; + EncapPresence encap_presence; + bit<3> report_type; + @padding + bit<5> _pad6; + flow_hash_t flow_hash; +} + +@flexible struct int_bridged_metadata_t { + bit<3> report_type; + MirrorId_t mirror_session_id; + IntDropReason_t drop_reason; + QueueId_t queue_id; + PortId_t egress_port; + IntWipType_t wip_type; +} + +struct int_metadata_t { + bit<32> hop_latency; + bit<48> timestamp; + bool vlan_stripped; + bool queue_report; +} + +@flexible struct bridged_metadata_base_t { + flow_hash_t inner_hash; + mpls_label_t mpls_label; + PortId_t ig_port; + bool is_multicast; + fwd_type_t fwd_type; + vlan_id_t vlan_id; + EncapPresence encap_presence; + bit<8> mpls_ttl; + bit<48> ig_tstamp; + bit<16> ip_eth_type; + bit<10> stats_flow_id; + slice_tc_t slice_tc; +} + +header bridged_metadata_t { + BridgedMdType_t bmd_type; + bridged_metadata_base_t base; + upf_bridged_metadata_t upf; + int_bridged_metadata_t int_bmd; + bit<1> _pad0; + bit<7> _pad1; + bit<5> _pad2; +} + +struct lookup_metadata_t { + mac_addr_t eth_dst; + mac_addr_t eth_src; + bit<16> eth_type; + vlan_id_t vlan_id; + bool is_ipv4; + bit<32> ipv4_src; + bit<32> ipv4_dst; + bit<8> ip_proto; + l4_port_t l4_sport; + l4_port_t l4_dport; + bit<8> icmp_type; + bit<8> icmp_code; +} + +struct common_mirror_metadata_t { + MirrorId_t mirror_session_id; + BridgedMdType_t bmd_type; +} + +@pa_auto_init_metadata struct fabric_ingress_metadata_t { + bridged_metadata_t bridged; + flow_hash_t ecmp_hash; + lookup_metadata_t lkp; + bit<32> routing_ipv4_dst; + bool skip_forwarding; + bool skip_next; + next_id_t next_id; + bool egress_port_set; + bool punt_to_cpu; + bool ipv4_checksum_err; + bool inner_ipv4_checksum_err; + slice_id_t slice_id; + tc_t tc; + bool tc_unknown; + bool is_upf_hit; + slice_id_t upf_slice_id; + tc_t upf_tc; + MeterColor_t upf_meter_color; + PortType_t ig_port_type; + common_mirror_metadata_t mirror; +} + +header common_egress_metadata_t { + BridgedMdType_t bmd_type; + @padding + bit<5> _pad; + FabricMirrorType_t mirror_type; +} + +header packet_in_mirror_metadata_t { + BridgedMdType_t bmd_type; + @padding + bit<5> _pad0; + FabricMirrorType_t mirror_type; + @padding + bit<7> _pad1; + PortId_t ingress_port; +} + +@pa_auto_init_metadata struct fabric_egress_metadata_t { + bridged_metadata_t bridged; + PortId_t cpu_port; + bool inner_ipv4_checksum_err; + int_report_metadata_t int_report_md; + int_metadata_t int_md; + bit<16> int_ipv4_len; + bool is_int_recirc; + bit<16> pkt_length; +} + +header fake_ethernet_t { + @padding + bit<48> _pad0; + @padding + bit<48> _pad1; + bit<16> ether_type; +} + +struct ingress_headers_t { + packet_out_header_t packet_out; + packet_in_header_t packet_in; + fake_ethernet_t fake_ethernet; + ethernet_t ethernet; + vlan_tag_t vlan_tag; + eth_type_t eth_type; + mpls_t mpls; + ipv4_t ipv4; + ipv6_t ipv6; + tcp_t tcp; + udp_t udp; + icmp_t icmp; + gtpu_t gtpu; + gtpu_options_t gtpu_options; + gtpu_ext_psc_t gtpu_ext_psc; + vxlan_t vxlan; + ethernet_t inner_ethernet; + eth_type_t inner_eth_type; + ipv4_t inner_ipv4; + tcp_t inner_tcp; + udp_t inner_udp; + icmp_t inner_icmp; +} + +struct egress_headers_t { + packet_in_header_t packet_in; + fake_ethernet_t fake_ethernet; + ethernet_t report_ethernet; + eth_type_t report_eth_type; + mpls_t report_mpls; + ipv4_t report_ipv4; + udp_t report_udp; + report_fixed_header_t report_fixed_header; + common_report_header_t common_report_header; + local_report_header_t local_report_header; + drop_report_header_t drop_report_header; + ethernet_t ethernet; + vlan_tag_t vlan_tag; + eth_type_t eth_type; + mpls_t mpls; + ipv4_t outer_ipv4; + udp_t outer_udp; + gtpu_t outer_gtpu; + gtpu_options_t outer_gtpu_options; + gtpu_ext_psc_t outer_gtpu_ext_psc; + ipv4_t ipv4; + ipv6_t ipv6; + udp_t udp; +} + +struct fabric_v1model_metadata_t { + bool skip_egress; + bool do_upf_uplink_recirc; + bit<1> drop_ctl; + IntReportType_t int_mirror_type; + fabric_ingress_metadata_t ingress; + fabric_egress_metadata_t egress; + @field_list(PRESERVE_INT_MD) + IntReportType_t recirc_preserved_report_type; + @field_list(PRESERVE_INT_MD) + FabricPortId_t recirc_preserved_egress_port; + @field_list(PRESERVE_INT_MD) + IntDropReason_t recirc_preserved_drop_reason; + @field_list(PRESERVE_INGRESS_PORT) + FabricPortId_t recirc_preserved_ingress_port; +} + +struct v1model_header_t { + ingress_headers_t ingress; + egress_headers_t egress; +} + +parser FabricParser(packet_in packet, out v1model_header_t hdr, inout fabric_v1model_metadata_t fabric_md, inout standard_metadata_t standard_md) { + state start { + fabric_md.egress.pkt_length = (bit<16>)standard_md.packet_length; + fabric_md.ingress.bridged.setValid(); + fabric_md.ingress.bridged.bmd_type = BridgedMdType_t.INGRESS_TO_EGRESS; + fabric_md.ingress.bridged.base.ig_port = standard_md.ingress_port; + fabric_md.recirc_preserved_ingress_port = (FabricPortId_t)standard_md.ingress_port; + fabric_md.ingress.bridged.base.ig_tstamp = standard_md.ingress_global_timestamp; + fabric_md.ingress.egress_port_set = false; + fabric_md.ingress.punt_to_cpu = false; + fabric_md.ingress.bridged.base.ip_eth_type = 0; + fabric_md.ingress.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UNKNOWN; + fabric_md.ingress.bridged.int_bmd.wip_type = INT_IS_NOT_WIP; + fabric_md.ingress.bridged.base.encap_presence = EncapPresence.NONE; + fabric_md.ingress.upf_meter_color = MeterColor_t.GREEN; + transition check_ethernet; + } + state check_ethernet { + fake_ethernet_t tmp = packet.lookahead(); + transition select(tmp.ether_type) { + ETHERTYPE_CPU_LOOPBACK_INGRESS: parse_fake_ethernet; + ETHERTYPE_CPU_LOOPBACK_EGRESS: parse_fake_ethernet_and_accept; + ETHERTYPE_PACKET_OUT: check_packet_out; + ETHERTYPE_INT_WIP_IPV4: parse_int_wip_ipv4; + ETHERTYPE_INT_WIP_MPLS: parse_int_wip_mpls; + default: parse_ethernet; + } + } + state check_packet_out { + packet_out_header_t tmp = packet.lookahead(); + transition select(tmp.do_forwarding) { + 0: parse_packet_out_and_accept; + default: strip_packet_out; + } + } + state parse_int_wip_ipv4 { + hdr.ingress.ethernet.setValid(); + hdr.ingress.eth_type.setValid(); + hdr.ingress.eth_type.value = ETHERTYPE_IPV4; + fabric_md.ingress.bridged.int_bmd.wip_type = INT_IS_WIP; + fabric_md.ingress.bridged.base.mpls_label = 0; + fabric_md.ingress.bridged.base.mpls_ttl = DEFAULT_MPLS_TTL + 1; + packet.advance(14 * 8); + transition parse_ipv4; + } + state parse_int_wip_mpls { + hdr.ingress.ethernet.setValid(); + hdr.ingress.eth_type.setValid(); + hdr.ingress.eth_type.value = ETHERTYPE_MPLS; + fabric_md.ingress.bridged.int_bmd.wip_type = INT_IS_WIP_WITH_MPLS; + packet.advance(14 * 8); + transition parse_mpls; + } + state parse_packet_out_and_accept { + packet.extract(hdr.ingress.packet_out); + transition accept; + } + state strip_packet_out { + packet.advance(14 * 8); + transition parse_ethernet; + } + state parse_fake_ethernet { + packet.extract(hdr.ingress.fake_ethernet); + fake_ethernet_t tmp = packet.lookahead(); + transition select(tmp.ether_type) { + ETHERTYPE_INT_WIP_IPV4: parse_int_wip_ipv4; + ETHERTYPE_INT_WIP_MPLS: parse_int_wip_mpls; + default: parse_ethernet; + } + } + state parse_fake_ethernet_and_accept { + packet.extract(hdr.ingress.fake_ethernet); + transition accept; + } + state parse_ethernet { + packet.extract(hdr.ingress.ethernet); + transition select(packet.lookahead>()) { + ETHERTYPE_QINQ: parse_vlan_tag; + ETHERTYPE_VLAN &&& 0xefff: parse_vlan_tag; + default: parse_untagged; + } + } + state parse_vlan_tag { + packet.extract(hdr.ingress.vlan_tag); + fabric_md.ingress.bridged.base.vlan_id = hdr.ingress.vlan_tag.vlan_id; + transition select(packet.lookahead>()) { + default: parse_eth_type; + } + } + state parse_untagged { + fabric_md.ingress.bridged.base.vlan_id = DEFAULT_VLAN_ID; + transition parse_eth_type; + } + state parse_eth_type { + packet.extract(hdr.ingress.eth_type); + transition select(hdr.ingress.eth_type.value) { + ETHERTYPE_MPLS: parse_mpls; + ETHERTYPE_IPV4: parse_non_mpls; + ETHERTYPE_IPV6: parse_non_mpls; + default: accept; + } + } + state parse_mpls { + packet.extract(hdr.ingress.mpls); + fabric_md.ingress.bridged.base.mpls_label = hdr.ingress.mpls.label; + fabric_md.ingress.bridged.base.mpls_ttl = hdr.ingress.mpls.ttl; + transition select(packet.lookahead>()) { + 4: parse_ipv4; + 6: parse_ipv6; + default: reject_packet; + } + } + state reject_packet { + verify(false, error.PacketRejectedByParser); + transition accept; + } + state parse_non_mpls { + fabric_md.ingress.bridged.base.mpls_label = 0; + fabric_md.ingress.bridged.base.mpls_ttl = DEFAULT_MPLS_TTL + 1; + transition select(hdr.ingress.eth_type.value) { + ETHERTYPE_IPV4: parse_ipv4; + ETHERTYPE_IPV6: parse_ipv6; + default: accept; + } + } + state parse_ipv4 { + packet.extract(hdr.ingress.ipv4); + fabric_md.ingress.routing_ipv4_dst = hdr.ingress.ipv4.dst_addr; + fabric_md.ingress.bridged.base.ip_eth_type = ETHERTYPE_IPV4; + transition select(hdr.ingress.ipv4.protocol) { + PROTO_TCP: parse_tcp; + PROTO_UDP: parse_udp; + PROTO_ICMP: parse_icmp; + default: accept; + } + } + state parse_ipv6 { + packet.extract(hdr.ingress.ipv6); + fabric_md.ingress.bridged.base.ip_eth_type = ETHERTYPE_IPV6; + transition select(hdr.ingress.ipv6.next_hdr) { + PROTO_TCP: parse_tcp; + PROTO_UDP: parse_udp; + PROTO_ICMPV6: parse_icmp; + default: accept; + } + } + state parse_icmp { + packet.extract(hdr.ingress.icmp); + transition accept; + } + state parse_tcp { + packet.extract(hdr.ingress.tcp); + transition accept; + } + state parse_udp { + packet.extract(hdr.ingress.udp); + gtpu_t gtpu = packet.lookahead(); + transition select(hdr.ingress.udp.dport, gtpu.version, gtpu.msgtype) { + (GTPU_UDP_PORT, GTP_V1, GTPU_GPDU): parse_gtpu; + (VXLAN_UDP_PORT, default, default): parse_vxlan; + default: accept; + } + } + state parse_gtpu { + packet.extract(hdr.ingress.gtpu); + transition select(hdr.ingress.gtpu.ex_flag, hdr.ingress.gtpu.seq_flag, hdr.ingress.gtpu.npdu_flag) { + (0, 0, 0): set_gtpu_only; + default: parse_gtpu_options; + } + } + state set_gtpu_only { + fabric_md.ingress.bridged.base.encap_presence = EncapPresence.GTPU_ONLY; + transition parse_inner_ipv4; + } + state parse_gtpu_options { + packet.extract(hdr.ingress.gtpu_options); + bit<8> gtpu_ext_len = packet.lookahead>(); + transition select(hdr.ingress.gtpu_options.next_ext, gtpu_ext_len) { + (GTPU_NEXT_EXT_PSC, GTPU_EXT_PSC_LEN): parse_gtpu_ext_psc; + default: accept; + } + } + state parse_gtpu_ext_psc { + packet.extract(hdr.ingress.gtpu_ext_psc); + fabric_md.ingress.bridged.base.encap_presence = EncapPresence.GTPU_WITH_PSC; + transition select(hdr.ingress.gtpu_ext_psc.next_ext) { + GTPU_NEXT_EXT_NONE: parse_inner_ipv4; + default: accept; + } + } + state parse_vxlan { + packet.extract(hdr.ingress.vxlan); + fabric_md.ingress.bridged.base.encap_presence = EncapPresence.VXLAN; + transition parse_inner_ethernet; + } + state parse_inner_ethernet { + packet.extract(hdr.ingress.inner_ethernet); + packet.extract(hdr.ingress.inner_eth_type); + transition select(hdr.ingress.inner_eth_type.value) { + ETHERTYPE_IPV4: parse_inner_ipv4; + default: accept; + } + } + state parse_inner_ipv4 { + packet.extract(hdr.ingress.inner_ipv4); + transition select(hdr.ingress.inner_ipv4.protocol) { + PROTO_TCP: parse_inner_tcp; + PROTO_UDP: parse_inner_udp; + PROTO_ICMP: parse_inner_icmp; + default: accept; + } + } + state parse_inner_tcp { + packet.extract(hdr.ingress.inner_tcp); + transition accept; + } + state parse_inner_udp { + packet.extract(hdr.ingress.inner_udp); + transition accept; + } + state parse_inner_icmp { + packet.extract(hdr.ingress.inner_icmp); + transition accept; + } +} + +control FabricDeparser(packet_out packet, in v1model_header_t hdr) { + apply { + packet.emit(hdr.ingress.fake_ethernet); + packet.emit(hdr.ingress.packet_in); + packet.emit(hdr.egress.report_ethernet); + packet.emit(hdr.egress.report_eth_type); + packet.emit(hdr.egress.report_mpls); + packet.emit(hdr.egress.report_ipv4); + packet.emit(hdr.egress.report_udp); + packet.emit(hdr.egress.report_fixed_header); + packet.emit(hdr.egress.common_report_header); + packet.emit(hdr.egress.local_report_header); + packet.emit(hdr.egress.drop_report_header); + packet.emit(hdr.ingress.ethernet); + packet.emit(hdr.ingress.vlan_tag); + packet.emit(hdr.ingress.eth_type); + packet.emit(hdr.ingress.mpls); + packet.emit(hdr.ingress.ipv4); + packet.emit(hdr.ingress.ipv6); + packet.emit(hdr.ingress.tcp); + packet.emit(hdr.ingress.udp); + packet.emit(hdr.ingress.icmp); + packet.emit(hdr.ingress.gtpu); + packet.emit(hdr.ingress.gtpu_options); + packet.emit(hdr.ingress.gtpu_ext_psc); + packet.emit(hdr.ingress.vxlan); + packet.emit(hdr.ingress.inner_ethernet); + packet.emit(hdr.ingress.inner_eth_type); + packet.emit(hdr.ingress.inner_ipv4); + packet.emit(hdr.ingress.inner_tcp); + packet.emit(hdr.ingress.inner_udp); + packet.emit(hdr.ingress.inner_icmp); + } +} + +control Acl(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout FabricPortId_t recirc_preserved_egress_port, inout bit<1> drop_ctl) { + direct_counter(CounterType.packets_and_bytes) acl_counter; + action set_next_id_acl(next_id_t next_id) { + fabric_md.next_id = next_id; + acl_counter.count(); + fabric_md.skip_next = false; + drop_ctl = 0; + } + action copy_to_cpu() { + clone_preserving_field_list(CloneType.I2E, (bit<32>)PACKET_IN_MIRROR_SESSION_ID, PRESERVE_INGRESS_PORT); + acl_counter.count(); + } + action punt_to_cpu() { + copy_to_cpu(); + fabric_md.skip_next = true; + fabric_md.punt_to_cpu = true; + drop_ctl = 1; + } + action drop() { + drop_ctl = 1; + fabric_md.skip_next = true; + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_ACL_DENY; + acl_counter.count(); + } + action set_output_port(FabricPortId_t port_num) { + standard_md.egress_spec = (PortId_t)port_num; + recirc_preserved_egress_port = port_num; + fabric_md.egress_port_set = true; + fabric_md.skip_next = true; + drop_ctl = 0; + acl_counter.count(); + } + action nop_acl() { + acl_counter.count(); + } + table acl { + key = { + fabric_md.bridged.base.ig_port: ternary @name("ig_port") ; + fabric_md.lkp.eth_dst : ternary @name("eth_dst") ; + fabric_md.lkp.eth_src : ternary @name("eth_src") ; + fabric_md.lkp.vlan_id : ternary @name("vlan_id") ; + fabric_md.lkp.eth_type : ternary @name("eth_type") ; + fabric_md.lkp.ipv4_src : ternary @name("ipv4_src") ; + fabric_md.lkp.ipv4_dst : ternary @name("ipv4_dst") ; + fabric_md.lkp.ip_proto : ternary @name("ip_proto") ; + fabric_md.lkp.icmp_type : ternary @name("icmp_type") ; + fabric_md.lkp.icmp_code : ternary @name("icmp_code") ; + fabric_md.lkp.l4_sport : ternary @name("l4_sport") ; + fabric_md.lkp.l4_dport : ternary @name("l4_dport") ; + fabric_md.ig_port_type : ternary @name("ig_port_type") ; + } + actions = { + set_next_id_acl; + punt_to_cpu; + copy_to_cpu; + drop; + set_output_port; + nop_acl; + } + const default_action = nop_acl(); + size = 1024; + counters = acl_counter; + } + apply { + acl.apply(); + } +} + +control Next(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout FabricPortId_t recirc_preserved_egress_port) { + @hidden action output(FabricPortId_t port_num) { + standard_md.egress_spec = (PortId_t)port_num; + recirc_preserved_egress_port = port_num; + fabric_md.egress_port_set = true; + } + @hidden action rewrite_smac(mac_addr_t smac) { + hdr.ethernet.src_addr = smac; + } + @hidden action rewrite_dmac(mac_addr_t dmac) { + hdr.ethernet.dst_addr = dmac; + } + @hidden action routing(FabricPortId_t port_num, mac_addr_t smac, mac_addr_t dmac) { + rewrite_smac(smac); + rewrite_dmac(dmac); + output(port_num); + } + @max_group_size(32w16) action_selector(HashAlgorithm.crc16, 32w16, 32w16) hashed_profile; + direct_counter(CounterType.packets_and_bytes) hashed_counter; + action output_hashed(FabricPortId_t port_num) { + output(port_num); + hashed_counter.count(); + } + action routing_hashed(FabricPortId_t port_num, mac_addr_t smac, mac_addr_t dmac) { + routing(port_num, smac, dmac); + hashed_counter.count(); + } + table hashed { + key = { + fabric_md.next_id : exact @name("next_id") ; + fabric_md.ecmp_hash: selector; + } + actions = { + output_hashed; + routing_hashed; + @defaultonly nop; + } + implementation = hashed_profile; + counters = hashed_counter; + const default_action = nop(); + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) multicast_counter; + action set_mcast_group_id(MulticastGroupId_t group_id) { + standard_md.mcast_grp = group_id; + fabric_md.bridged.base.is_multicast = true; + multicast_counter.count(); + } + action reset_mcast_group_id() { + standard_md.mcast_grp = 0; + fabric_md.bridged.base.is_multicast = false; + } + table multicast { + key = { + fabric_md.next_id: exact @name("next_id") ; + } + actions = { + set_mcast_group_id; + @defaultonly reset_mcast_group_id; + } + counters = multicast_counter; + const default_action = reset_mcast_group_id(); + size = 1024; + } + apply { + hashed.apply(); + multicast.apply(); + } +} + +control EgressNextControl(inout ingress_headers_t hdr, inout fabric_egress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout IntDropReason_t recirc_preserved_drop_reason, inout bit<1> drop_ctl) { + @hidden action pop_mpls_if_present() { + hdr.mpls.setInvalid(); + hdr.eth_type.value = fabric_md.bridged.base.ip_eth_type; + } + @hidden action set_mpls() { + hdr.mpls.setValid(); + hdr.mpls.label = fabric_md.bridged.base.mpls_label; + hdr.mpls.tc = 3w0; + hdr.mpls.bos = 1w1; + hdr.mpls.ttl = fabric_md.bridged.base.mpls_ttl; + hdr.eth_type.value = ETHERTYPE_MPLS; + } + @hidden action push_outer_vlan() { + hdr.vlan_tag.setValid(); + hdr.vlan_tag.eth_type = ETHERTYPE_VLAN; + hdr.vlan_tag.vlan_id = fabric_md.bridged.base.vlan_id; + } + direct_counter(CounterType.packets_and_bytes) egress_vlan_counter; + action push_vlan() { + push_outer_vlan(); + egress_vlan_counter.count(); + } + action pop_vlan() { + hdr.vlan_tag.setInvalid(); + egress_vlan_counter.count(); + } + action drop() { + drop_ctl = 1; + egress_vlan_counter.count(); + recirc_preserved_drop_reason = IntDropReason_t.DROP_REASON_EGRESS_NEXT_MISS; + } + table egress_vlan { + key = { + fabric_md.bridged.base.vlan_id: exact @name("vlan_id") ; + standard_md.egress_port : exact @name("eg_port") ; + } + actions = { + push_vlan; + pop_vlan; + @defaultonly drop; + } + const default_action = drop(); + counters = egress_vlan_counter; + size = 1024; + } + apply { + if (fabric_md.bridged.base.is_multicast && fabric_md.bridged.base.ig_port == standard_md.egress_port) { + fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_NO_REPORT; + drop_ctl = 1; + } + if (fabric_md.bridged.base.mpls_label == 0) { + if (hdr.mpls.isValid()) { + pop_mpls_if_present(); + } + } else { + set_mpls(); + } + if (!fabric_md.is_int_recirc) { + egress_vlan.apply(); + } + bool regular_packet = true; + regular_packet = !(fabric_md.bridged.bmd_type == BridgedMdType_t.INT_INGRESS_DROP || fabric_md.bridged.bmd_type == BridgedMdType_t.EGRESS_MIRROR); + if (hdr.mpls.isValid()) { + hdr.mpls.ttl = hdr.mpls.ttl - 1; + if (hdr.mpls.ttl == 0) { + drop_ctl = 1; + recirc_preserved_drop_reason = IntDropReason_t.DROP_REASON_MPLS_TTL_ZERO; + } + } else { + if (hdr.ipv4.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING) { + if (regular_packet) { + hdr.ipv4.ttl = hdr.ipv4.ttl - 1; + } + if (hdr.ipv4.ttl == 0) { + drop_ctl = 1; + recirc_preserved_drop_reason = IntDropReason_t.DROP_REASON_IP_TTL_ZERO; + } + } else if (hdr.ipv6.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING) { + if (regular_packet) { + hdr.ipv6.hop_limit = hdr.ipv6.hop_limit - 1; + } + if (hdr.ipv6.hop_limit == 0) { + drop_ctl = 1; + recirc_preserved_drop_reason = IntDropReason_t.DROP_REASON_IP_TTL_ZERO; + } + } + } + } +} + +const bit<10> UNSET_FLOW_ID = 0; +control StatsIngress(in lookup_metadata_t lkp, in PortId_t ig_port, out bit<10> stats_flow_id) { + direct_counter(CounterType.packets_and_bytes) flow_counter; + action count(bit<10> flow_id) { + stats_flow_id = flow_id; + flow_counter.count(); + } + table flows { + key = { + lkp.ipv4_src: ternary @name("ipv4_src") ; + lkp.ipv4_dst: ternary @name("ipv4_dst") ; + lkp.ip_proto: ternary @name("ip_proto") ; + lkp.l4_sport: ternary @name("l4_sport") ; + lkp.l4_dport: ternary @name("l4_dport") ; + ig_port : exact @name("ig_port") ; + } + actions = { + count; + } + const default_action = count(UNSET_FLOW_ID); + const size = 1 << 10; + counters = flow_counter; + } + apply { + flows.apply(); + } +} + +control StatsEgress(in bit<10> stats_flow_id, in PortId_t eg_port, in BridgedMdType_t bmd_type) { + direct_counter(CounterType.packets_and_bytes) flow_counter; + action count() { + flow_counter.count(); + } + table flows { + key = { + stats_flow_id: exact @name("stats_flow_id") ; + eg_port : exact @name("eg_port") ; + } + actions = { + count; + } + const default_action = count; + const size = 1 << 10; + counters = flow_counter; + } + apply { + if (bmd_type == BridgedMdType_t.INGRESS_TO_EGRESS) { + flows.apply(); + } + } +} + +control Hasher(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md) { + flow_hash_t max = 0xffffffff; + flow_hash_t base = 0; + apply { + hash(fabric_md.bridged.base.inner_hash, HashAlgorithm.crc32, base, { fabric_md.lkp.ipv4_src, fabric_md.lkp.ipv4_dst, fabric_md.lkp.ip_proto, fabric_md.lkp.l4_sport, fabric_md.lkp.l4_dport }, max); + if (fabric_md.bridged.upf.needs_gtpu_encap) { + hash(fabric_md.ecmp_hash, HashAlgorithm.crc32, base, { fabric_md.bridged.upf.tun_peer_id, fabric_md.bridged.upf.teid }, max); + } else if (hdr.gtpu.isValid()) { + hash(fabric_md.ecmp_hash, HashAlgorithm.crc32, base, { hdr.ipv4.src_addr, hdr.ipv4.dst_addr, hdr.gtpu.teid }, max); + } else if (fabric_md.lkp.is_ipv4) { + fabric_md.ecmp_hash = fabric_md.bridged.base.inner_hash; + } else { + fabric_md.bridged.base.inner_hash = 0; + hash(fabric_md.ecmp_hash, HashAlgorithm.crc32, base, { hdr.ethernet.dst_addr, hdr.ethernet.src_addr, hdr.eth_type.value }, max); + } + } +} + +control IngressSliceTcClassifier(inout ingress_headers_t hdr, inout standard_metadata_t standard_md, inout fabric_ingress_metadata_t fabric_md) { + direct_counter(CounterType.packets) classifier_stats; + action set_slice_id_tc(slice_id_t slice_id, tc_t tc) { + fabric_md.slice_id = slice_id; + fabric_md.tc = tc; + fabric_md.tc_unknown = false; + classifier_stats.count(); + } + action no_classification() { + set_slice_id_tc(DEFAULT_SLICE_ID, DEFAULT_TC); + fabric_md.tc_unknown = true; + } + action trust_dscp() { + fabric_md.slice_id = hdr.ipv4.dscp[4 + 2 - 1:2]; + fabric_md.tc = hdr.ipv4.dscp[2 - 1:0]; + fabric_md.tc_unknown = false; + classifier_stats.count(); + } + table classifier { + key = { + fabric_md.bridged.base.ig_port: ternary @name("ig_port") ; + fabric_md.lkp.ipv4_src : ternary @name("ipv4_src") ; + fabric_md.lkp.ipv4_dst : ternary @name("ipv4_dst") ; + fabric_md.lkp.ip_proto : ternary @name("ip_proto") ; + fabric_md.lkp.l4_sport : ternary @name("l4_sport") ; + fabric_md.lkp.l4_dport : ternary @name("l4_dport") ; + } + actions = { + set_slice_id_tc; + trust_dscp; + @defaultonly no_classification; + } + const default_action = no_classification(); + counters = classifier_stats; + size = 512; + } + apply { + classifier.apply(); + } +} + +control IngressQos(inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout bit<1> drop_ctl) { + bit<2> packet_color = 2w0; + @hidden action use_upf() { + fabric_md.bridged.base.slice_tc = fabric_md.upf_slice_id ++ fabric_md.upf_tc; + } + @hidden action use_default() { + fabric_md.bridged.base.slice_tc = fabric_md.slice_id ++ fabric_md.tc; + } + @hidden table set_slice_tc { + key = { + fabric_md.is_upf_hit: exact; + } + actions = { + use_upf; + use_default; + } + const size = 2; + const entries = { + true : use_upf; + false : use_default; + } + } + meter(1 << 4 + 2, MeterType.bytes) slice_tc_meter; + direct_counter(CounterType.packets) queues_stats; + action set_queue(QueueId_t qid) { + queues_stats.count(); + } + action meter_drop() { + drop_ctl = 1; + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_INGRESS_QOS_METER; + queues_stats.count(); + } + table queues { + key = { + fabric_md.bridged.base.slice_tc: exact @name("slice_tc") ; + packet_color : ternary @name("color") ; + } + actions = { + set_queue; + meter_drop; + } + const default_action = set_queue(QUEUE_ID_BEST_EFFORT); + counters = queues_stats; + size = 1 << 4 + 2 + 1; + } + action set_default_tc(tc_t tc) { + fabric_md.bridged.base.slice_tc = fabric_md.bridged.base.slice_tc[4 + 2 - 1:2] ++ tc; + } + table default_tc { + key = { + fabric_md.bridged.base.slice_tc: ternary @name("slice_tc") ; + fabric_md.tc_unknown : exact @name("tc_unknown") ; + } + actions = { + set_default_tc; + @defaultonly nop; + } + const default_action = nop; + size = 1 << 4; + } + apply { + set_slice_tc.apply(); + default_tc.apply(); + if (fabric_md.upf_meter_color != MeterColor_t.RED) { + slice_tc_meter.execute_meter((bit<32>)fabric_md.bridged.base.slice_tc, packet_color); + } else { + packet_color = MeterColor_t.RED; + } + queues.apply(); + } +} + +control EgressDscpRewriter(inout fabric_egress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout ingress_headers_t hdr) { + bit<6> tmp_dscp = fabric_md.bridged.base.slice_tc; + action rewrite() { + } + action clear() { + tmp_dscp = 0; + } + table rewriter { + key = { + standard_md.egress_port: exact @name("eg_port") ; + } + actions = { + rewrite; + clear; + @defaultonly nop; + } + const default_action = nop; + size = 512; + } + apply { + if (rewriter.apply().hit) { + if (hdr.ipv4.isValid()) { + hdr.ipv4.dscp = tmp_dscp; + } + } + } +} + +control FabricVerifyChecksum(inout v1model_header_t hdr, inout fabric_v1model_metadata_t meta) { + apply { + verify_checksum(hdr.ingress.ipv4.isValid(), { hdr.ingress.ipv4.version, hdr.ingress.ipv4.ihl, hdr.ingress.ipv4.dscp, hdr.ingress.ipv4.ecn, hdr.ingress.ipv4.total_len, hdr.ingress.ipv4.identification, hdr.ingress.ipv4.flags, hdr.ingress.ipv4.frag_offset, hdr.ingress.ipv4.ttl, hdr.ingress.ipv4.protocol, hdr.ingress.ipv4.src_addr, hdr.ingress.ipv4.dst_addr }, hdr.ingress.ipv4.hdr_checksum, HashAlgorithm.csum16); + verify_checksum(hdr.ingress.inner_ipv4.isValid(), { hdr.ingress.inner_ipv4.version, hdr.ingress.inner_ipv4.ihl, hdr.ingress.inner_ipv4.dscp, hdr.ingress.inner_ipv4.ecn, hdr.ingress.inner_ipv4.total_len, hdr.ingress.inner_ipv4.identification, hdr.ingress.inner_ipv4.flags, hdr.ingress.inner_ipv4.frag_offset, hdr.ingress.inner_ipv4.ttl, hdr.ingress.inner_ipv4.protocol, hdr.ingress.inner_ipv4.src_addr, hdr.ingress.inner_ipv4.dst_addr }, hdr.ingress.inner_ipv4.hdr_checksum, HashAlgorithm.csum16); + } +} + +control FabricComputeChecksum(inout v1model_header_t hdr, inout fabric_v1model_metadata_t fabric_md) { + apply { + update_checksum(hdr.ingress.ipv4.isValid(), { hdr.ingress.ipv4.version, hdr.ingress.ipv4.ihl, hdr.ingress.ipv4.dscp, hdr.ingress.ipv4.ecn, hdr.ingress.ipv4.total_len, hdr.ingress.ipv4.identification, hdr.ingress.ipv4.flags, hdr.ingress.ipv4.frag_offset, hdr.ingress.ipv4.ttl, hdr.ingress.ipv4.protocol, hdr.ingress.ipv4.src_addr, hdr.ingress.ipv4.dst_addr }, hdr.ingress.ipv4.hdr_checksum, HashAlgorithm.csum16); + update_checksum(hdr.ingress.inner_ipv4.isValid(), { hdr.ingress.inner_ipv4.version, hdr.ingress.inner_ipv4.ihl, hdr.ingress.inner_ipv4.dscp, hdr.ingress.inner_ipv4.ecn, hdr.ingress.inner_ipv4.total_len, hdr.ingress.inner_ipv4.identification, hdr.ingress.inner_ipv4.flags, hdr.ingress.inner_ipv4.frag_offset, hdr.ingress.inner_ipv4.ttl, hdr.ingress.inner_ipv4.protocol, hdr.ingress.inner_ipv4.src_addr, hdr.ingress.inner_ipv4.dst_addr }, hdr.ingress.inner_ipv4.hdr_checksum, HashAlgorithm.csum16); + update_checksum(hdr.egress.report_ipv4.isValid(), { hdr.egress.report_ipv4.version, hdr.egress.report_ipv4.ihl, hdr.egress.report_ipv4.dscp, hdr.egress.report_ipv4.ecn, hdr.egress.report_ipv4.total_len, hdr.egress.report_ipv4.identification, hdr.egress.report_ipv4.flags, hdr.egress.report_ipv4.frag_offset, hdr.egress.report_ipv4.ttl, hdr.egress.report_ipv4.protocol, hdr.egress.report_ipv4.src_addr, hdr.egress.report_ipv4.dst_addr }, hdr.egress.report_ipv4.hdr_checksum, HashAlgorithm.csum16); + } +} + +control PacketIoIngress(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout bool skip_egress, inout standard_metadata_t standard_md, inout FabricPortId_t recirc_preserved_egress_port) { + @hidden action do_packet_out() { + standard_md.egress_spec = (PortId_t)hdr.packet_out.egress_port; + recirc_preserved_egress_port = hdr.packet_out.egress_port; + fabric_md.egress_port_set = true; + hdr.packet_out.setInvalid(); + skip_egress = true; + fabric_md.bridged.setInvalid(); + exit; + } + apply { + if (hdr.packet_out.isValid()) { + do_packet_out(); + } + } +} + +control PacketIoEgress(inout ingress_headers_t hdr, inout fabric_egress_metadata_t fabric_md, inout standard_metadata_t standard_md, in FabricPortId_t preserved_ig_port) { + action set_switch_info(FabricPortId_t cpu_port) { + fabric_md.cpu_port = (PortId_t)cpu_port; + } + table switch_info { + actions = { + set_switch_info; + @defaultonly nop; + } + default_action = nop; + const size = 1; + } + apply { + switch_info.apply(); + if (standard_md.egress_port == fabric_md.cpu_port) { + hdr.packet_in.setValid(); + hdr.packet_in.ingress_port = preserved_ig_port; + hdr.fake_ethernet.setInvalid(); + exit; + } + if (hdr.fake_ethernet.isValid() && hdr.fake_ethernet.ether_type == ETHERTYPE_CPU_LOOPBACK_EGRESS) { + fabric_md.pkt_length = (bit<16>)standard_md.packet_length - 14; + } + } +} + +control PreNext(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md) { + direct_counter(CounterType.packets_and_bytes) next_mpls_counter; + action set_mpls_label(mpls_label_t label) { + fabric_md.bridged.base.mpls_label = label; + next_mpls_counter.count(); + } + table next_mpls { + key = { + fabric_md.next_id: exact @name("next_id") ; + } + actions = { + set_mpls_label; + @defaultonly nop; + } + const default_action = nop(); + counters = next_mpls_counter; + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) next_vlan_counter; + action set_vlan(vlan_id_t vlan_id) { + fabric_md.bridged.base.vlan_id = vlan_id; + next_vlan_counter.count(); + } + table next_vlan { + key = { + fabric_md.next_id: exact @name("next_id") ; + } + actions = { + set_vlan; + @defaultonly nop; + } + const default_action = nop(); + counters = next_vlan_counter; + size = 1024; + } + apply { + next_mpls.apply(); + next_vlan.apply(); + } +} + +control Filtering(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md) { + direct_counter(CounterType.packets_and_bytes) ingress_port_vlan_counter; + action deny() { + fabric_md.skip_forwarding = true; + fabric_md.skip_next = true; + fabric_md.ig_port_type = PortType_t.UNKNOWN; + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_PORT_VLAN_MAPPING_MISS; + ingress_port_vlan_counter.count(); + } + action permit(PortType_t port_type) { + fabric_md.ig_port_type = port_type; + ingress_port_vlan_counter.count(); + } + action permit_with_internal_vlan(vlan_id_t vlan_id, PortType_t port_type) { + fabric_md.bridged.base.vlan_id = vlan_id; + permit(port_type); + } + table ingress_port_vlan { + key = { + fabric_md.bridged.base.ig_port: exact @name("ig_port") ; + hdr.vlan_tag.isValid() : exact @name("vlan_is_valid") ; + hdr.vlan_tag.vlan_id : ternary @name("vlan_id") ; + } + actions = { + deny(); + permit(); + permit_with_internal_vlan(); + } + const default_action = deny(); + counters = ingress_port_vlan_counter; + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) fwd_classifier_counter; + action set_forwarding_type(fwd_type_t fwd_type) { + fabric_md.bridged.base.fwd_type = fwd_type; + fwd_classifier_counter.count(); + } + counter(8, CounterType.packets_and_bytes) fwd_type_counter; + table fwd_classifier { + key = { + fabric_md.bridged.base.ig_port : exact @name("ig_port") ; + fabric_md.lkp.eth_dst : ternary @name("eth_dst") ; + fabric_md.lkp.eth_type : ternary @name("eth_type") ; + fabric_md.bridged.base.ip_eth_type: exact @name("ip_eth_type") ; + } + actions = { + set_forwarding_type; + } + const default_action = set_forwarding_type(FWD_BRIDGING); + counters = fwd_classifier_counter; + size = 1024; + } + apply { + ingress_port_vlan.apply(); + fwd_classifier.apply(); + fwd_type_counter.count((bit<32>)fabric_md.bridged.base.fwd_type); + } +} + +control Forwarding(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout bit<1> drop_ctl) { + action set_int_drop_reason(bit<8> drop_reason) { + fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason; + } + @hidden action set_next_id(next_id_t next_id) { + fabric_md.next_id = next_id; + } + direct_counter(CounterType.packets_and_bytes) bridging_counter; + action set_next_id_bridging(next_id_t next_id) { + set_next_id(next_id); + bridging_counter.count(); + } + table bridging { + key = { + fabric_md.bridged.base.vlan_id: exact @name("vlan_id") ; + hdr.ethernet.dst_addr : ternary @name("eth_dst") ; + } + actions = { + set_next_id_bridging; + @defaultonly set_int_drop_reason; + } + const default_action = set_int_drop_reason(IntDropReason_t.DROP_REASON_BRIDGING_MISS); + counters = bridging_counter; + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) mpls_counter; + action pop_mpls_and_next(next_id_t next_id) { + hdr.mpls.setInvalid(); + hdr.eth_type.value = fabric_md.bridged.base.ip_eth_type; + fabric_md.bridged.base.mpls_label = 0; + set_next_id(next_id); + mpls_counter.count(); + } + table mpls { + key = { + fabric_md.bridged.base.mpls_label: exact @name("mpls_label") ; + } + actions = { + pop_mpls_and_next; + @defaultonly set_int_drop_reason; + } + const default_action = set_int_drop_reason(IntDropReason_t.DROP_REASON_MPLS_MISS); + counters = mpls_counter; + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) routing_v4_counter; + action set_next_id_routing_v4(next_id_t next_id) { + set_next_id(next_id); + routing_v4_counter.count(); + } + action nop_routing_v4() { + routing_v4_counter.count(); + } + action drop_routing_v4() { + fabric_md.skip_next = true; + routing_v4_counter.count(); + drop_ctl = 1; + } + table routing_v4 { + key = { + fabric_md.routing_ipv4_dst: lpm @name("ipv4_dst") ; + } + actions = { + set_next_id_routing_v4; + nop_routing_v4; + drop_routing_v4; + @defaultonly set_int_drop_reason; + } + default_action = set_int_drop_reason(IntDropReason_t.DROP_REASON_ROUTING_V4_MISS); + counters = routing_v4_counter; + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) routing_v6_counter; + action set_next_id_routing_v6(next_id_t next_id) { + set_next_id(next_id); + routing_v6_counter.count(); + } + action drop_routing_v6() { + fabric_md.skip_next = true; + routing_v6_counter.count(); + drop_ctl = 1; + } + table routing_v6 { + key = { + hdr.ipv6.dst_addr: lpm @name("ipv6_dst") ; + } + actions = { + set_next_id_routing_v6; + drop_routing_v6; + @defaultonly set_int_drop_reason; + } + default_action = set_int_drop_reason(IntDropReason_t.DROP_REASON_ROUTING_V6_MISS); + counters = routing_v6_counter; + size = 1024; + } + apply { + if (hdr.ethernet.isValid() && fabric_md.bridged.base.fwd_type == FWD_BRIDGING) { + bridging.apply(); + } else if (hdr.mpls.isValid() && fabric_md.bridged.base.fwd_type == FWD_MPLS) { + mpls.apply(); + } else if (fabric_md.lkp.is_ipv4 && (fabric_md.bridged.base.fwd_type == FWD_IPV4_UNICAST || fabric_md.bridged.base.fwd_type == FWD_IPV4_MULTICAST)) { + routing_v4.apply(); + } else if (hdr.ipv6.isValid() && fabric_md.bridged.base.fwd_type == FWD_IPV6_UNICAST) { + routing_v6.apply(); + } + } +} + +control LookupMdInit(in ingress_headers_t hdr, out lookup_metadata_t lkp_md) { + apply { + lkp_md.eth_dst = hdr.ethernet.dst_addr; + lkp_md.eth_src = hdr.ethernet.src_addr; + lkp_md.eth_type = hdr.eth_type.value; + lkp_md.vlan_id = 0; + if (hdr.vlan_tag.isValid()) { + lkp_md.vlan_id = hdr.vlan_tag.vlan_id; + } + lkp_md.is_ipv4 = false; + lkp_md.ipv4_src = 0; + lkp_md.ipv4_dst = 0; + lkp_md.ip_proto = 0; + lkp_md.l4_sport = 0; + lkp_md.l4_dport = 0; + lkp_md.icmp_type = 0; + lkp_md.icmp_code = 0; + if (hdr.inner_ipv4.isValid()) { + lkp_md.is_ipv4 = true; + lkp_md.ipv4_src = hdr.inner_ipv4.src_addr; + lkp_md.ipv4_dst = hdr.inner_ipv4.dst_addr; + lkp_md.ip_proto = hdr.inner_ipv4.protocol; + if (hdr.inner_tcp.isValid()) { + lkp_md.l4_sport = hdr.inner_tcp.sport; + lkp_md.l4_dport = hdr.inner_tcp.dport; + } else if (hdr.inner_udp.isValid()) { + lkp_md.l4_sport = hdr.inner_udp.sport; + lkp_md.l4_dport = hdr.inner_udp.dport; + } else if (hdr.inner_icmp.isValid()) { + lkp_md.icmp_type = hdr.inner_icmp.icmp_type; + lkp_md.icmp_code = hdr.inner_icmp.icmp_code; + } + } else if (hdr.ipv4.isValid()) { + lkp_md.is_ipv4 = true; + lkp_md.ipv4_src = hdr.ipv4.src_addr; + lkp_md.ipv4_dst = hdr.ipv4.dst_addr; + lkp_md.ip_proto = hdr.ipv4.protocol; + if (hdr.tcp.isValid()) { + lkp_md.l4_sport = hdr.tcp.sport; + lkp_md.l4_dport = hdr.tcp.dport; + } else if (hdr.udp.isValid()) { + lkp_md.l4_sport = hdr.udp.sport; + lkp_md.l4_dport = hdr.udp.dport; + } else if (hdr.icmp.isValid()) { + lkp_md.icmp_type = hdr.icmp.icmp_type; + lkp_md.icmp_code = hdr.icmp.icmp_code; + } + } + } +} + +control UpfIngress(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout bool do_upf_uplink_recirc, inout bit<1> drop_ctl) { + counter(4096, CounterType.packets_and_bytes) terminations_counter; + meter(20000, MeterType.bytes) session_meter; + meter(20000, MeterType.bytes) app_meter; + bool is_uplink = false; + bool term_hit = false; + bool sess_hit = false; + bit<32> app_ipv4_addr = 0; + l4_port_t app_l4_port = 0; + bit<8> app_ip_proto = 0; + bit<8> internal_app_id = DEFAULT_APP_ID; + ue_session_id_t ue_session_id = 0; + session_meter_idx_t session_meter_idx_internal = DEFAULT_SESSION_METER_IDX; + app_meter_idx_t app_meter_idx_internal = DEFAULT_APP_METER_IDX; + @hidden action _drop_common() { + drop_ctl = 1; + fabric_md.skip_forwarding = true; + fabric_md.skip_next = true; + } + @hidden action _term_hit(upf_ctr_idx_t ctr_id) { + fabric_md.bridged.upf.upf_ctr_id = ctr_id; + term_hit = true; + } + @hidden action _set_field_encap(teid_t teid, bit<6> qfi) { + fabric_md.bridged.upf.needs_gtpu_encap = true; + fabric_md.bridged.upf.teid = teid; + fabric_md.bridged.upf.qfi = qfi; + } + @hidden action _gtpu_decap() { + fabric_md.bridged.base.ip_eth_type = ETHERTYPE_IPV4; + fabric_md.routing_ipv4_dst = hdr.inner_ipv4.dst_addr; + hdr.ipv4 = hdr.inner_ipv4; + hdr.inner_ipv4.setInvalid(); + hdr.udp = hdr.inner_udp; + hdr.inner_udp.setInvalid(); + hdr.tcp = hdr.inner_tcp; + hdr.inner_tcp.setInvalid(); + hdr.icmp = hdr.inner_icmp; + hdr.inner_icmp.setInvalid(); + hdr.gtpu.setInvalid(); + hdr.gtpu_options.setInvalid(); + hdr.gtpu_ext_psc.setInvalid(); + fabric_md.bridged.base.encap_presence = EncapPresence.NONE; + } + @hidden action _iface_common(slice_id_t slice_id) { + fabric_md.bridged.upf.skip_upf = false; + fabric_md.is_upf_hit = true; + fabric_md.upf_slice_id = slice_id; + } + action iface_access(slice_id_t slice_id) { + _iface_common(slice_id); + } + action iface_core(slice_id_t slice_id) { + _iface_common(slice_id); + } + action iface_dbuf(slice_id_t slice_id) { + _iface_common(slice_id); + _gtpu_decap(); + } + action iface_miss() { + fabric_md.bridged.upf.skip_upf = true; + } + table interfaces { + key = { + hdr.ipv4.dst_addr : lpm @name("ipv4_dst_addr") ; + hdr.gtpu.isValid(): exact @name("gtpu_is_valid") ; + } + actions = { + iface_access; + iface_core; + iface_dbuf; + @defaultonly iface_miss; + } + const default_action = iface_miss(); + const size = 64; + } + action set_uplink_session_miss() { + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_UL_SESSION_MISS; + } + action set_uplink_session_drop() { + sess_hit = true; + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_UL_SESSION_DROP; + } + action set_downlink_session_miss() { + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_DL_SESSION_MISS; + } + action set_downlink_session_drop() { + sess_hit = true; + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_DL_SESSION_DROP; + } + action set_downlink_session(tun_peer_id_t tun_peer_id, session_meter_idx_t session_meter_idx) { + sess_hit = true; + ue_session_id = fabric_md.routing_ipv4_dst; + session_meter_idx_internal = session_meter_idx; + fabric_md.bridged.upf.tun_peer_id = tun_peer_id; + } + action set_downlink_session_buf(tun_peer_id_t tun_peer_id, session_meter_idx_t session_meter_idx) { + sess_hit = true; + ue_session_id = fabric_md.routing_ipv4_dst; + session_meter_idx_internal = session_meter_idx; + fabric_md.bridged.upf.tun_peer_id = tun_peer_id; + fabric_md.bridged.upf.skip_egress_upf_ctr = true; + } + action set_downlink_session_buf_drop() { + sess_hit = true; + ue_session_id = fabric_md.routing_ipv4_dst; + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_DL_SESSION_DROP_BUFF; + } + action set_uplink_session(session_meter_idx_t session_meter_idx) { + sess_hit = true; + ue_session_id = fabric_md.lkp.ipv4_src; + session_meter_idx_internal = session_meter_idx; + _gtpu_decap(); + } + table downlink_sessions { + key = { + fabric_md.routing_ipv4_dst: exact @name("ue_addr") ; + } + actions = { + set_downlink_session; + set_downlink_session_buf; + set_downlink_session_buf_drop; + set_downlink_session_drop; + @defaultonly set_downlink_session_miss; + } + size = 100000; + const default_action = set_downlink_session_miss(); + } + table uplink_sessions { + key = { + hdr.ipv4.dst_addr: exact @name("tunnel_ipv4_dst") ; + hdr.gtpu.teid : exact @name("teid") ; + } + actions = { + set_uplink_session; + set_uplink_session_drop; + @defaultonly set_uplink_session_miss; + } + size = 100000 * 1; + const default_action = set_uplink_session_miss(); + } + action uplink_drop_miss() { + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_UL_TERMINATION_MISS; + } + action downlink_drop_miss() { + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_DL_TERMINATION_MISS; + } + action uplink_drop(upf_ctr_idx_t ctr_id) { + _drop_common(); + _term_hit(ctr_id); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_UL_TERMINATION_DROP; + } + action downlink_drop(upf_ctr_idx_t ctr_id) { + _drop_common(); + _term_hit(ctr_id); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_DL_TERMINATION_DROP; + } + action app_fwd(upf_ctr_idx_t ctr_id, tc_t tc, app_meter_idx_t app_meter_idx) { + _term_hit(ctr_id); + fabric_md.upf_tc = tc; + app_meter_idx_internal = app_meter_idx; + fabric_md.tc_unknown = false; + } + action downlink_fwd_encap(upf_ctr_idx_t ctr_id, tc_t tc, teid_t teid, bit<6> qfi, app_meter_idx_t app_meter_idx) { + app_fwd(ctr_id, tc, app_meter_idx); + _set_field_encap(teid, qfi); + } + table uplink_terminations { + key = { + ue_session_id : exact @name("ue_session_id") ; + internal_app_id: exact @name("app_id") ; + } + actions = { + app_fwd; + uplink_drop; + @defaultonly uplink_drop_miss; + } + const default_action = uplink_drop_miss(); + const size = 100000; + } + table downlink_terminations { + key = { + ue_session_id : exact @name("ue_session_id") ; + internal_app_id: exact @name("app_id") ; + } + actions = { + downlink_fwd_encap; + downlink_drop; + @defaultonly downlink_drop_miss; + } + const default_action = downlink_drop_miss(); + const size = 100000; + } + action set_routing_ipv4_dst(ipv4_addr_t tun_dst_addr) { + fabric_md.routing_ipv4_dst = tun_dst_addr; + } + table ig_tunnel_peers { + key = { + fabric_md.bridged.upf.tun_peer_id: exact @name("tun_peer_id") ; + } + actions = { + set_routing_ipv4_dst; + @defaultonly nop; + } + const default_action = nop(); + const size = 256; + } + action set_app_id(bit<8> app_id) { + internal_app_id = app_id; + } + table applications { + key = { + fabric_md.upf_slice_id: exact @name("slice_id") ; + app_ipv4_addr : lpm @name("app_ipv4_addr") ; + app_l4_port : range @name("app_l4_port") ; + app_ip_proto : ternary @name("app_ip_proto") ; + } + actions = { + set_app_id; + @defaultonly nop; + } + const default_action = nop(); + size = 5 * 1; + } + direct_counter(CounterType.packets) recirc_stats; + action recirc_allow() { + standard_md.egress_spec = FAKE_V1MODEL_RECIRC_PORT; + fabric_md.bridged.base.vlan_id = DEFAULT_VLAN_ID; + do_upf_uplink_recirc = true; + fabric_md.egress_port_set = true; + fabric_md.skip_forwarding = true; + fabric_md.skip_next = true; + recirc_stats.count(); + } + action recirc_deny() { + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_UPLINK_RECIRC_DENY; + do_upf_uplink_recirc = false; + fabric_md.skip_forwarding = true; + fabric_md.skip_next = true; + recirc_stats.count(); + } + action recirc_miss() { + recirc_stats.count(); + } + table uplink_recirc_rules { + key = { + fabric_md.lkp.ipv4_src: ternary @name("ipv4_src") ; + fabric_md.lkp.ipv4_dst: ternary @name("ipv4_dst") ; + } + actions = { + recirc_allow; + recirc_deny; + @defaultonly recirc_miss; + } + const default_action = recirc_miss; + size = 64; + counters = recirc_stats; + } + apply { + if (hdr.ipv4.isValid()) { + switch (interfaces.apply().action_run) { + iface_access: { + is_uplink = true; + app_ipv4_addr = fabric_md.lkp.ipv4_dst; + app_l4_port = fabric_md.lkp.l4_dport; + app_ip_proto = fabric_md.lkp.ip_proto; + if (fabric_md.bridged.base.encap_presence != EncapPresence.NONE) { + uplink_sessions.apply(); + } + } + iface_core: { + app_ipv4_addr = fabric_md.lkp.ipv4_src; + app_l4_port = fabric_md.lkp.l4_sport; + app_ip_proto = fabric_md.lkp.ip_proto; + downlink_sessions.apply(); + } + iface_dbuf: { + app_ipv4_addr = fabric_md.lkp.ipv4_src; + app_l4_port = fabric_md.lkp.l4_sport; + app_ip_proto = fabric_md.lkp.ip_proto; + downlink_sessions.apply(); + } + } + applications.apply(); + if (sess_hit) { + if (is_uplink) { + uplink_terminations.apply(); + uplink_recirc_rules.apply(); + } else { + downlink_terminations.apply(); + } + } else { + fabric_md.bridged.upf.skip_egress_upf_ctr = true; + } + app_meter.execute_meter((bit<32>)app_meter_idx_internal, fabric_md.upf_meter_color); + if (fabric_md.upf_meter_color != MeterColor_t.RED) { + session_meter.execute_meter((bit<32>)session_meter_idx_internal, fabric_md.upf_meter_color); + } + ig_tunnel_peers.apply(); + if (term_hit) { + terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id); + } + } + } +} + +control UpfEgress(inout ingress_headers_t hdr, inout fabric_egress_metadata_t fabric_md) { + counter(4096, CounterType.packets_and_bytes) terminations_counter; + action load_tunnel_params(l4_port_t tunnel_src_port, ipv4_addr_t tunnel_src_addr, ipv4_addr_t tunnel_dst_addr) { + hdr.ipv4.src_addr = tunnel_src_addr; + hdr.ipv4.dst_addr = tunnel_dst_addr; + hdr.udp.sport = tunnel_src_port; + } + table eg_tunnel_peers { + key = { + fabric_md.bridged.upf.tun_peer_id: exact @name("tun_peer_id") ; + } + actions = { + load_tunnel_params; + @defaultonly nop; + } + const default_action = nop(); + const size = 256; + } + @hidden action _encap_initialize() { + hdr.ipv4.version = 4w4; + hdr.ipv4.ihl = 4w5; + hdr.ipv4.dscp = 0; + hdr.ipv4.ecn = 0; + hdr.ipv4.identification = 0x1513; + hdr.ipv4.flags = 0; + hdr.ipv4.frag_offset = 0; + hdr.ipv4.ttl = DEFAULT_IPV4_TTL; + hdr.ipv4.protocol = PROTO_UDP; + hdr.udp.dport = GTPU_UDP_PORT; + hdr.gtpu.version = GTP_V1; + hdr.gtpu.pt = GTP_PROTOCOL_TYPE_GTP; + hdr.gtpu.spare = 0; + hdr.gtpu.seq_flag = 0; + hdr.gtpu.npdu_flag = 0; + hdr.gtpu.msgtype = GTPU_GPDU; + hdr.gtpu.teid = fabric_md.bridged.upf.teid; + hdr.gtpu_options.seq_num = 0; + hdr.gtpu_options.n_pdu_num = 0; + hdr.gtpu_options.next_ext = GTPU_NEXT_EXT_PSC; + hdr.gtpu_ext_psc.len = GTPU_EXT_PSC_LEN; + hdr.gtpu_ext_psc.type = GTPU_EXT_PSC_TYPE_DL; + hdr.gtpu_ext_psc.spare0 = 0; + hdr.gtpu_ext_psc.ppp = 0; + hdr.gtpu_ext_psc.rqi = 0; + hdr.gtpu_ext_psc.next_ext = GTPU_NEXT_EXT_NONE; + } + @hidden action _encap_common() { + hdr.inner_ipv4.setValid(); + hdr.inner_ipv4 = hdr.ipv4; + hdr.udp.setValid(); + hdr.gtpu.setValid(); + _encap_initialize(); + } + action gtpu_only() { + _encap_common(); + hdr.ipv4.total_len = 20 + 8 + 8 + hdr.inner_ipv4.total_len; + hdr.udp.len = 8 + 8 + hdr.inner_ipv4.total_len; + hdr.gtpu.msglen = hdr.inner_ipv4.total_len; + fabric_md.int_report_md.encap_presence = EncapPresence.GTPU_ONLY; + } + action gtpu_with_psc() { + hdr.gtpu_options.setValid(); + hdr.gtpu_ext_psc.setValid(); + _encap_common(); + hdr.ipv4.total_len = 20 + 8 + 8 + 4 + 4 + hdr.inner_ipv4.total_len; + hdr.udp.len = 8 + 8 + 4 + 4 + hdr.inner_ipv4.total_len; + hdr.gtpu.msglen = 4 + 4 + hdr.inner_ipv4.total_len; + hdr.gtpu.ex_flag = 1; + hdr.gtpu_ext_psc.qfi = fabric_md.bridged.upf.qfi; + fabric_md.int_report_md.encap_presence = EncapPresence.GTPU_WITH_PSC; + } + table gtpu_encap { + actions = { + gtpu_only; + gtpu_with_psc; + } + default_action = gtpu_only(); + const size = 1; + } + apply { + if (!fabric_md.bridged.upf.skip_upf) { + if (fabric_md.bridged.upf.needs_gtpu_encap) { + if (hdr.udp.isValid()) { + hdr.inner_udp.setValid(); + hdr.inner_udp = hdr.udp; + hdr.udp.setInvalid(); + } + if (hdr.tcp.isValid()) { + hdr.inner_tcp.setValid(); + hdr.inner_tcp = hdr.tcp; + hdr.tcp.setInvalid(); + } + if (hdr.icmp.isValid()) { + hdr.inner_icmp.setValid(); + hdr.inner_icmp = hdr.icmp; + hdr.icmp.setInvalid(); + } + gtpu_encap.apply(); + eg_tunnel_peers.apply(); + } + if (!fabric_md.bridged.upf.skip_egress_upf_ctr) { + terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id); + } + } + } +} + +control IntWatchlist(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout IntReportType_t recirc_preserved_report_type) { + direct_counter(CounterType.packets_and_bytes) watchlist_counter; + action mark_to_report() { + fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_FLOW; + recirc_preserved_report_type = INT_REPORT_TYPE_FLOW; + watchlist_counter.count(); + } + action no_report() { + fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_NO_REPORT; + recirc_preserved_report_type = INT_REPORT_TYPE_NO_REPORT; + } + action no_report_collector() { + fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_NO_REPORT; + } + table watchlist { + key = { + fabric_md.lkp.is_ipv4 : exact @name("ipv4_valid") ; + fabric_md.lkp.ipv4_src: ternary @name("ipv4_src") ; + fabric_md.lkp.ipv4_dst: ternary @name("ipv4_dst") ; + fabric_md.lkp.ip_proto: ternary @name("ip_proto") ; + fabric_md.lkp.l4_sport: range @name("l4_sport") ; + fabric_md.lkp.l4_dport: range @name("l4_dport") ; + } + actions = { + mark_to_report; + no_report_collector; + @defaultonly no_report(); + } + const default_action = no_report(); + const size = 64; + counters = watchlist_counter; + } + apply { + watchlist.apply(); + } +} + +control IntIngress(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout bit<1> drop_ctl) { + direct_counter(CounterType.packets_and_bytes) drop_report_counter; + @hidden action report_drop() { + fabric_md.bridged.bmd_type = BridgedMdType_t.INT_INGRESS_DROP; + fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_DROP; + fabric_md.bridged.base.vlan_id = DEFAULT_VLAN_ID; + fabric_md.bridged.base.mpls_label = 0; + fabric_md.bridged.upf.skip_upf = true; + drop_ctl = 0; + standard_md.egress_spec = FAKE_V1MODEL_RECIRC_PORT; + drop_report_counter.count(); + } + @hidden table drop_report { + key = { + fabric_md.bridged.int_bmd.report_type: exact @name("int_report_type") ; + drop_ctl : exact @name("drop_ctl") ; + fabric_md.punt_to_cpu : exact @name("punt_to_cpu") ; + fabric_md.egress_port_set : exact @name("egress_port_set") ; + standard_md.mcast_grp : ternary @name("mcast_group_id") ; + } + actions = { + report_drop; + @defaultonly nop; + } + const entries = { + (INT_REPORT_TYPE_FLOW, 1, false, false, default) : report_drop(); + (INT_REPORT_TYPE_FLOW, 1, false, true, default) : report_drop(); + (INT_REPORT_TYPE_FLOW, 0, false, false, 0) : report_drop(); + } + const default_action = nop(); + counters = drop_report_counter; + } + apply { + fabric_md.bridged.int_bmd.egress_port = standard_md.egress_spec; + fabric_md.bridged.int_bmd.queue_id = 0; + drop_report.apply(); + } +} + +control IntEgress(inout v1model_header_t hdr_v1model, inout fabric_v1model_metadata_t fabric_v1model, inout standard_metadata_t standard_md) { + const bit<48> DEFAULT_TIMESTAMP_MASK = 0xffffc0000000; + const bit<32> DEFAULT_HOP_LATENCY_MASK = 0xffffff00; + egress_headers_t hdr = hdr_v1model.egress; + fabric_egress_metadata_t fabric_md = fabric_v1model.egress; + direct_counter(CounterType.packets_and_bytes) report_counter; + direct_counter(CounterType.packets_and_bytes) int_metadata_counter; + QueueId_t egress_qid = 0; + @hidden register>(1024) seq_number; + @hidden action get_seq_number(in bit<32> seq_number_idx, out bit<32> result) { + bit<32> reg = 0; + seq_number.read(reg, seq_number_idx); + reg = reg + 1; + result = reg; + seq_number.write(seq_number_idx, reg); + } + action check_quota() { + } + action reset_quota() { + } + table queue_latency_thresholds { + key = { + egress_qid : exact @name("egress_qid") ; + fabric_md.int_md.hop_latency[31:16]: range @name("hop_latency_upper") ; + fabric_md.int_md.hop_latency[15:0] : range @name("hop_latency_lower") ; + } + actions = { + check_quota; + reset_quota; + @defaultonly nop; + } + default_action = nop(); + const size = 32 * 4; + } + action set_config(bit<32> hop_latency_mask, bit<48> timestamp_mask) { + fabric_md.int_md.hop_latency = fabric_md.int_md.hop_latency & hop_latency_mask; + fabric_md.int_md.timestamp = fabric_md.int_md.timestamp & timestamp_mask; + } + table config { + actions = { + @defaultonly set_config; + } + default_action = set_config(DEFAULT_HOP_LATENCY_MASK, DEFAULT_TIMESTAMP_MASK); + const size = 1; + } + @hidden action _report_encap_common(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, bit<32> switch_id) { + random(hdr.report_ipv4.identification, 0, 0xffff); + hdr.report_ipv4.src_addr = src_ip; + hdr.report_ipv4.dst_addr = mon_ip; + hdr.report_udp.dport = mon_port; + get_seq_number((bit<32>)hdr.report_fixed_header.hw_id, hdr.report_fixed_header.seq_no); + hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type; + hdr.common_report_header.switch_id = switch_id; + hdr.common_report_header.pad1 = 0; + hdr.common_report_header.pad2 = 0; + hdr.common_report_header.pad3 = 0; + hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type; + fabric_v1model.int_mirror_type = (bit<3>)FabricMirrorType_t.INVALID; + report_counter.count(); + } + action do_local_report_encap(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, bit<32> switch_id) { + _report_encap_common(src_ip, mon_ip, mon_port, switch_id); + hdr.report_eth_type.value = ETHERTYPE_INT_WIP_IPV4; + hdr.report_fixed_header.nproto = NPROTO_TELEMETRY_SWITCH_LOCAL_HEADER; + hdr.local_report_header.setValid(); + } + action do_local_report_encap_mpls(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, mpls_label_t mon_label, bit<32> switch_id) { + do_local_report_encap(src_ip, mon_ip, mon_port, switch_id); + hdr.report_eth_type.value = ETHERTYPE_INT_WIP_MPLS; + hdr.report_mpls.setValid(); + hdr.report_mpls.tc = 0; + hdr.report_mpls.bos = 0; + hdr.report_mpls.ttl = DEFAULT_MPLS_TTL; + hdr.report_mpls.label = mon_label; + } + action do_drop_report_encap(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, bit<32> switch_id) { + _report_encap_common(src_ip, mon_ip, mon_port, switch_id); + hdr.report_eth_type.value = ETHERTYPE_INT_WIP_IPV4; + hdr.report_fixed_header.nproto = NPROTO_TELEMETRY_DROP_HEADER; + hdr.drop_report_header.setValid(); + hdr.local_report_header.setInvalid(); + hdr.drop_report_header.drop_reason = fabric_md.bridged.int_bmd.drop_reason; + } + action do_drop_report_encap_mpls(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, mpls_label_t mon_label, bit<32> switch_id) { + do_drop_report_encap(src_ip, mon_ip, mon_port, switch_id); + hdr.report_eth_type.value = ETHERTYPE_INT_WIP_MPLS; + hdr.report_mpls.setValid(); + hdr.report_mpls.tc = 0; + hdr.report_mpls.bos = 0; + hdr.report_mpls.ttl = DEFAULT_MPLS_TTL; + hdr.report_mpls.label = mon_label; + hdr.report_mpls.label = mon_label; + } + table report { + key = { + fabric_md.int_report_md.bmd_type : exact @name("bmd_type") ; + fabric_md.int_report_md.mirror_type: exact @name("mirror_type") ; + fabric_md.int_report_md.report_type: exact @name("int_report_type") ; + } + actions = { + do_local_report_encap; + do_local_report_encap_mpls; + do_drop_report_encap; + do_drop_report_encap_mpls; + @defaultonly nop(); + } + default_action = nop; + const size = 6; + counters = report_counter; + } + @hidden action init_int_metadata(bit<3> report_type) { + fabric_md.bridged.int_bmd.mirror_session_id = V1MODEL_INT_MIRROR_SESSION; + fabric_md.int_report_md.setValid(); + fabric_v1model.int_mirror_type = (bit<3>)FabricMirrorType_t.INT_REPORT; + fabric_md.int_report_md.bmd_type = BridgedMdType_t.EGRESS_MIRROR; + fabric_md.int_report_md.mirror_type = FabricMirrorType_t.INT_REPORT; + fabric_md.int_report_md.report_type = fabric_md.bridged.int_bmd.report_type; + fabric_md.int_report_md.ig_port = fabric_md.bridged.base.ig_port; + fabric_md.int_report_md.eg_port = (PortId_t)standard_md.egress_port; + fabric_md.int_report_md.queue_id = egress_qid; + fabric_md.int_report_md.queue_occupancy = standard_md.deq_qdepth; + fabric_md.int_report_md.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]; + fabric_md.int_report_md.eg_tstamp = standard_md.egress_global_timestamp[31:0]; + fabric_md.int_report_md.ip_eth_type = fabric_md.bridged.base.ip_eth_type; + fabric_md.int_report_md.flow_hash = fabric_md.bridged.base.inner_hash; + fabric_md.int_report_md.report_type = report_type; + int_metadata_counter.count(); + } + @hidden table int_metadata { + key = { + fabric_md.bridged.int_bmd.report_type: exact @name("int_report_type") ; + fabric_v1model.drop_ctl : exact @name("drop_ctl") ; + fabric_md.int_md.queue_report : exact @name("queue_report") ; + } + actions = { + init_int_metadata; + @defaultonly nop(); + } + const default_action = nop(); + const entries = { + (INT_REPORT_TYPE_FLOW, 0, false) : init_int_metadata(INT_REPORT_TYPE_FLOW); + (INT_REPORT_TYPE_FLOW, 1, false) : init_int_metadata(INT_REPORT_TYPE_DROP); + } + counters = int_metadata_counter; + } + @hidden action adjust_ip_udp_len(bit<16> adjust_ip, bit<16> adjust_udp) { + hdr_v1model.ingress.ipv4.total_len = fabric_md.pkt_length + adjust_ip; + hdr_v1model.ingress.udp.len = fabric_md.pkt_length + adjust_udp; + } + @hidden table adjust_int_report_hdr_length { + key = { + fabric_md.bridged.int_bmd.wip_type: exact @name("is_int_wip") ; + } + actions = { + @defaultonly nop(); + adjust_ip_udp_len; + } + const default_action = nop(); + const entries = { + INT_IS_WIP : adjust_ip_udp_len(INT_WIP_ADJUST_IP_BYTES, INT_WIP_ADJUST_UDP_BYTES); + INT_IS_WIP_WITH_MPLS : adjust_ip_udp_len(INT_WIP_ADJUST_IP_MPLS_BYTES, INT_WIP_ADJUST_UDP_MPLS_BYTES); + } + } + apply { + fabric_md.int_md.hop_latency = standard_md.egress_global_timestamp[31:0] - fabric_md.bridged.base.ig_tstamp[31:0]; + fabric_md.int_md.timestamp = standard_md.egress_global_timestamp; + queue_latency_thresholds.apply(); + config.apply(); + hdr.report_fixed_header.hw_id = 4w0 ++ standard_md.egress_spec[8:7]; + if (fabric_md.int_report_md.isValid()) { + report.apply(); + } else { + if (int_metadata.apply().hit) { + clone_preserving_field_list(CloneType.E2E, (bit<32>)fabric_md.bridged.int_bmd.mirror_session_id, PRESERVE_INT_MD); + } + } + adjust_int_report_hdr_length.apply(); + fabric_v1model.egress = fabric_md; + hdr_v1model.egress = hdr; + } +} + +control IntTnaEgressParserEmulator(inout v1model_header_t hdr_v1model, inout fabric_egress_metadata_t fabric_md, inout standard_metadata_t standard_md) { + egress_headers_t hdr = hdr_v1model.egress; + @hidden action set_common_int_headers() { + hdr.report_ethernet.setValid(); + hdr.report_eth_type.setValid(); + hdr.report_ipv4.setValid(); + hdr.report_ipv4.version = 4w4; + hdr.report_ipv4.ihl = 4w5; + hdr.report_ipv4.dscp = 0; + hdr.report_ipv4.ecn = 2w0; + hdr.report_ipv4.flags = 0; + hdr.report_ipv4.frag_offset = 0; + hdr.report_ipv4.ttl = DEFAULT_IPV4_TTL; + hdr.report_ipv4.protocol = PROTO_UDP; + hdr.report_udp.setValid(); + hdr.report_udp.sport = 0; + hdr.report_fixed_header.setValid(); + hdr.report_fixed_header.ver = 0; + hdr.report_fixed_header.nproto = NPROTO_TELEMETRY_SWITCH_LOCAL_HEADER; + hdr.report_fixed_header.rsvd = 0; + hdr.common_report_header.setValid(); + } + @hidden action set_common_int_drop_headers() { + set_common_int_headers(); + fabric_md.int_report_md.setValid(); + fabric_md.int_report_md.ip_eth_type = ETHERTYPE_IPV4; + fabric_md.int_report_md.report_type = INT_REPORT_TYPE_DROP; + fabric_md.int_report_md.mirror_type = FabricMirrorType_t.INVALID; + hdr.drop_report_header.setValid(); + } + @hidden action parse_int_ingress_drop() { + set_common_int_drop_headers(); + fabric_md.int_report_md.bmd_type = BridgedMdType_t.INT_INGRESS_DROP; + fabric_md.int_report_md.encap_presence = fabric_md.bridged.base.encap_presence; + fabric_md.int_report_md.flow_hash = fabric_md.bridged.base.inner_hash; + hdr.drop_report_header.drop_reason = fabric_md.bridged.int_bmd.drop_reason; + hdr.report_fixed_header.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]; + hdr.common_report_header.ig_port = fabric_md.bridged.base.ig_port; + hdr.common_report_header.eg_port = 0; + hdr.common_report_header.queue_id = 0; + } + @hidden action parse_int_report_mirror() { + set_common_int_headers(); + fabric_md.bridged.bmd_type = fabric_md.int_report_md.bmd_type; + fabric_md.bridged.base.vlan_id = DEFAULT_VLAN_ID; + fabric_md.bridged.base.mpls_label = 0; + fabric_md.bridged.upf.skip_upf = true; + hdr.report_fixed_header.ig_tstamp = fabric_md.int_report_md.ig_tstamp; + hdr.common_report_header.ig_port = fabric_md.int_report_md.ig_port; + hdr.common_report_header.eg_port = fabric_md.int_report_md.eg_port; + hdr.common_report_header.queue_id = fabric_md.int_report_md.queue_id; + hdr.local_report_header.setValid(); + hdr.local_report_header.queue_occupancy = fabric_md.int_report_md.queue_occupancy; + hdr.local_report_header.eg_tstamp = fabric_md.int_report_md.eg_tstamp; + } + apply { + fabric_md.is_int_recirc = true; + hdr_v1model.ingress.vlan_tag.setInvalid(); + if (hdr_v1model.ingress.gtpu.isValid() || hdr_v1model.ingress.vxlan.isValid()) { + hdr_v1model.ingress.ipv4.setInvalid(); + hdr_v1model.ingress.tcp.setInvalid(); + hdr_v1model.ingress.udp.setInvalid(); + hdr_v1model.ingress.icmp.setInvalid(); + hdr_v1model.ingress.vxlan.setInvalid(); + hdr_v1model.ingress.inner_ethernet.setInvalid(); + hdr_v1model.ingress.inner_eth_type.setInvalid(); + hdr_v1model.ingress.gtpu.setInvalid(); + hdr_v1model.ingress.gtpu_options.setInvalid(); + hdr_v1model.ingress.gtpu_ext_psc.setInvalid(); + } + if ((bit<8>)fabric_md.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP) { + parse_int_ingress_drop(); + recirculate_preserving_field_list(NO_PRESERVATION); + } else { + parse_int_report_mirror(); + recirculate_preserving_field_list(PRESERVE_INT_MD); + } + hdr_v1model.egress = hdr; + } +} + +control FabricIngress(inout v1model_header_t hdr, inout fabric_v1model_metadata_t fabric_md, inout standard_metadata_t standard_md) { + LookupMdInit() lkp_md_init; + StatsIngress() stats; + PacketIoIngress() pkt_io; + Filtering() filtering; + Forwarding() forwarding; + PreNext() pre_next; + Acl() acl; + Next() next; + Hasher() hasher; + IngressSliceTcClassifier() slice_tc_classifier; + IngressQos() qos; + UpfIngress() upf; + IntWatchlist() int_watchlist; + IntIngress() int_ingress; + apply { + mark_to_drop(standard_md); + if (standard_md.parser_error == error.PacketRejectedByParser) { + exit; + } + if (standard_md.instance_type == 4) { + fabric_md.ingress.bridged.base.ig_port = FAKE_V1MODEL_RECIRC_PORT; + } + lkp_md_init.apply(hdr.ingress, fabric_md.ingress.lkp); + pkt_io.apply(hdr.ingress, fabric_md.ingress, fabric_md.skip_egress, standard_md, fabric_md.recirc_preserved_egress_port); + int_watchlist.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.recirc_preserved_report_type); + stats.apply(fabric_md.ingress.lkp, fabric_md.ingress.bridged.base.ig_port, fabric_md.ingress.bridged.base.stats_flow_id); + slice_tc_classifier.apply(hdr.ingress, standard_md, fabric_md.ingress); + filtering.apply(hdr.ingress, fabric_md.ingress, standard_md); + if (!fabric_md.ingress.skip_forwarding) { + upf.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.do_upf_uplink_recirc, fabric_md.drop_ctl); + } + if (!fabric_md.ingress.skip_forwarding) { + forwarding.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.drop_ctl); + } + hasher.apply(hdr.ingress, fabric_md.ingress); + if (!fabric_md.ingress.skip_next) { + pre_next.apply(hdr.ingress, fabric_md.ingress); + } + acl.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.recirc_preserved_egress_port, fabric_md.drop_ctl); + if (!fabric_md.ingress.skip_next) { + next.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.recirc_preserved_egress_port); + } + qos.apply(fabric_md.ingress, standard_md, fabric_md.drop_ctl); + int_ingress.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.drop_ctl); + fabric_md.egress.bridged = fabric_md.ingress.bridged; + if (fabric_md.drop_ctl == 1) { + mark_to_drop(standard_md); + } + } +} + +control FabricEgress(inout v1model_header_t hdr, inout fabric_v1model_metadata_t fabric_md, inout standard_metadata_t standard_md) { + StatsEgress() stats; + PacketIoEgress() pkt_io_egress; + EgressNextControl() egress_next; + EgressDscpRewriter() dscp_rewriter; + UpfEgress() upf; + IntTnaEgressParserEmulator() parser_emulator; + IntEgress() int_egress; + apply { + fabric_md.egress.cpu_port = 0; + if (fabric_md.skip_egress) { + exit; + } + if (standard_md.instance_type == 2) { + fabric_md.egress.bridged.int_bmd.drop_reason = fabric_md.recirc_preserved_drop_reason; + fabric_md.egress.bridged.int_bmd.report_type = fabric_md.recirc_preserved_report_type; + parser_emulator.apply(hdr, fabric_md.egress, standard_md); + } + if ((bit<8>)fabric_md.egress.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP) { + parser_emulator.apply(hdr, fabric_md.egress, standard_md); + } + pkt_io_egress.apply(hdr.ingress, fabric_md.egress, standard_md, fabric_md.recirc_preserved_ingress_port); + stats.apply(fabric_md.egress.bridged.base.stats_flow_id, standard_md.egress_port, fabric_md.egress.bridged.bmd_type); + egress_next.apply(hdr.ingress, fabric_md.egress, standard_md, fabric_md.recirc_preserved_drop_reason, fabric_md.drop_ctl); + upf.apply(hdr.ingress, fabric_md.egress); + int_egress.apply(hdr, fabric_md, standard_md); + dscp_rewriter.apply(fabric_md.egress, standard_md, hdr.ingress); + if (fabric_md.do_upf_uplink_recirc) { + recirculate_preserving_field_list(NO_PRESERVATION); + } + if (fabric_md.drop_ctl == 1) { + mark_to_drop(standard_md); + } + } +} + +V1Switch(FabricParser(), FabricVerifyChecksum(), FabricIngress(), FabricEgress(), FabricComputeChecksum(), FabricDeparser()) main; + diff --git a/src/tests/p4-sd-fabric-svc-upf/p4src/bmv2.json b/src/tests/p4-sd-fabric-svc-upf/p4src/bmv2.json new file mode 100644 index 0000000000000000000000000000000000000000..fe66f93e4c95c397fca7f6d5251802c7a8858a0e --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/p4src/bmv2.json @@ -0,0 +1,28235 @@ +{ + "header_types" : [ + { + "name" : "scalars_0", + "id" : 0, + "fields" : [ + ["tmp_2", 16, false], + ["tmp_4", 1, false], + ["tmp_6", 16, false], + ["tmp_12", 3, false], + ["tmp_13", 8, false], + ["gtpu_ext_len_0", 8, false], + ["tmp_3", 16, false], + ["tmp_5", 16, false], + ["tmp_7", 4, false], + ["tmp_8", 112, false], + ["tmp_9", 112, false], + ["tmp_10", 112, false], + ["tmp_11", 64, false], + ["tmp_14", 32, false], + ["tmp_15", 32, false], + ["tmp_16", 32, false], + ["tmp_17", 32, false], + ["tmp_18", 8, false], + ["tmp_19", 32, false], + ["tmp_20", 32, false], + ["tmp_21", 32, false], + ["tmp_22", 32, false], + ["tmp_23", 48, false], + ["tmp_24", 48, false], + ["tmp_25", 16, false], + ["tmp_26", 32, false], + ["tmp_27", 32, false], + ["tmp_28", 8, false], + ["tmp_29", 16, false], + ["tmp_30", 16, false], + ["tmp_31", 32, false], + ["qos_packet_color", 2, false], + ["upf_is_uplink", 1, false], + ["upf_term_hit", 1, false], + ["upf_sess_hit", 1, false], + ["upf_app_ipv4_addr", 32, false], + ["upf_app_l4_port", 16, false], + ["upf_app_ip_proto", 8, false], + ["upf_internal_app_id", 8, false], + ["upf_ue_session_id", 32, false], + ["upf_session_meter_idx_internal", 15, false], + ["upf_app_meter_idx_internal", 15, false], + ["tmp_32", 32, false], + ["tmp_33", 32, false], + ["tmp_34", 32, false], + ["tmp_35", 32, false], + ["tmp_36", 32, false], + ["tmp_37", 32, false], + ["tmp_38", 32, false], + ["tmp_39", 32, false], + ["tmp_40", 32, false], + ["tmp_41", 32, false], + ["dscp_rewriter_tmp_dscp", 6, false], + ["int_egress_fabric_md_pkt_length", 16, false], + ["int_egress_egress_qid", 5, false], + ["int_egress_reg", 32, false], + ["key_0", 16, false], + ["key_1", 16, false], + ["userMetadata._skip_egress0", 1, false], + ["userMetadata._do_upf_uplink_recirc1", 1, false], + ["userMetadata._drop_ctl2", 1, false], + ["userMetadata._int_mirror_type3", 3, false], + ["userMetadata._ingress_ecmp_hash5", 32, false], + ["userMetadata._ingress_lkp_eth_dst6", 48, false], + ["userMetadata._ingress_lkp_eth_src7", 48, false], + ["userMetadata._ingress_lkp_eth_type8", 16, false], + ["userMetadata._ingress_lkp_vlan_id9", 12, false], + ["userMetadata._ingress_lkp_is_ipv410", 1, false], + ["userMetadata._ingress_lkp_ipv4_src11", 32, false], + ["userMetadata._ingress_lkp_ipv4_dst12", 32, false], + ["userMetadata._ingress_lkp_ip_proto13", 8, false], + ["userMetadata._ingress_lkp_l4_sport14", 16, false], + ["userMetadata._ingress_lkp_l4_dport15", 16, false], + ["userMetadata._ingress_lkp_icmp_type16", 8, false], + ["userMetadata._ingress_lkp_icmp_code17", 8, false], + ["userMetadata._ingress_routing_ipv4_dst18", 32, false], + ["userMetadata._ingress_skip_forwarding19", 1, false], + ["userMetadata._ingress_skip_next20", 1, false], + ["userMetadata._ingress_next_id21", 32, false], + ["userMetadata._ingress_egress_port_set22", 1, false], + ["userMetadata._ingress_punt_to_cpu23", 1, false], + ["userMetadata._ingress_ipv4_checksum_err24", 1, false], + ["userMetadata._ingress_inner_ipv4_checksum_err25", 1, false], + ["userMetadata._ingress_slice_id26", 4, false], + ["userMetadata._ingress_tc27", 2, false], + ["userMetadata._ingress_tc_unknown28", 1, false], + ["userMetadata._ingress_is_upf_hit29", 1, false], + ["userMetadata._ingress_upf_slice_id30", 4, false], + ["userMetadata._ingress_upf_tc31", 2, false], + ["userMetadata._ingress_upf_meter_color32", 2, false], + ["userMetadata._ingress_ig_port_type33", 2, false], + ["userMetadata._ingress_mirror_mirror_session_id34", 10, false], + ["userMetadata._ingress_mirror_bmd_type35", 8, false], + ["userMetadata._egress_cpu_port37", 9, false], + ["userMetadata._egress_inner_ipv4_checksum_err38", 1, false], + ["userMetadata._egress_int_md_hop_latency40", 32, false], + ["userMetadata._egress_int_md_timestamp41", 48, false], + ["userMetadata._egress_int_md_vlan_stripped42", 1, false], + ["userMetadata._egress_int_md_queue_report43", 1, false], + ["userMetadata._egress_int_ipv4_len44", 16, false], + ["userMetadata._egress_is_int_recirc45", 1, false], + ["userMetadata._egress_pkt_length46", 16, false], + ["userMetadata._recirc_preserved_report_type47", 3, false], + ["userMetadata._recirc_preserved_egress_port48", 9, false], + ["userMetadata._recirc_preserved_drop_reason49", 8, false], + ["userMetadata._recirc_preserved_ingress_port50", 9, false], + ["_padding_1", 3, false] + ] + }, + { + "name" : "fake_ethernet_t", + "id" : 1, + "fields" : [ + ["_pad0", 48, false], + ["_pad1", 48, false], + ["ether_type", 16, false] + ] + }, + { + "name" : "packet_out_header_t", + "id" : 2, + "fields" : [ + ["pad0", 7, false], + ["egress_port", 9, false], + ["pad1", 3, false], + ["queue_id", 5, false], + ["pad2", 5, false], + ["cpu_loopback_mode", 2, false], + ["do_forwarding", 1, false], + ["pad3", 16, false], + ["pad4", 48, false], + ["ether_type", 16, false] + ] + }, + { + "name" : "gtpu_t", + "id" : 3, + "fields" : [ + ["version", 3, false], + ["pt", 1, false], + ["spare", 1, false], + ["ex_flag", 1, false], + ["seq_flag", 1, false], + ["npdu_flag", 1, false], + ["msgtype", 8, false], + ["msglen", 16, false], + ["teid", 32, false] + ] + }, + { + "name" : "ethernet_t", + "id" : 4, + "fields" : [ + ["dst_addr", 48, false], + ["src_addr", 48, false] + ] + }, + { + "name" : "eth_type_t", + "id" : 5, + "fields" : [ + ["value", 16, false] + ] + }, + { + "name" : "ipv4_t", + "id" : 6, + "fields" : [ + ["version", 4, false], + ["ihl", 4, false], + ["dscp", 6, false], + ["ecn", 2, false], + ["total_len", 16, false], + ["identification", 16, false], + ["flags", 3, false], + ["frag_offset", 13, false], + ["ttl", 8, false], + ["protocol", 8, false], + ["hdr_checksum", 16, false], + ["src_addr", 32, false], + ["dst_addr", 32, false] + ] + }, + { + "name" : "udp_t", + "id" : 7, + "fields" : [ + ["sport", 16, false], + ["dport", 16, false], + ["len", 16, false], + ["checksum", 16, false] + ] + }, + { + "name" : "report_fixed_header_t", + "id" : 8, + "fields" : [ + ["ver", 4, false], + ["nproto", 4, false], + ["dqf", 3, false], + ["rsvd", 15, false], + ["hw_id", 6, false], + ["seq_no", 32, false], + ["ig_tstamp", 32, false] + ] + }, + { + "name" : "common_report_header_t", + "id" : 9, + "fields" : [ + ["switch_id", 32, false], + ["pad1", 7, false], + ["ig_port", 9, false], + ["pad2", 7, false], + ["eg_port", 9, false], + ["pad3", 3, false], + ["queue_id", 5, false] + ] + }, + { + "name" : "local_report_header_t", + "id" : 10, + "fields" : [ + ["pad1", 5, false], + ["queue_occupancy", 19, false], + ["eg_tstamp", 32, false] + ] + }, + { + "name" : "drop_report_header_t", + "id" : 11, + "fields" : [ + ["drop_reason", 8, false], + ["pad", 16, false] + ] + }, + { + "name" : "mpls_t", + "id" : 12, + "fields" : [ + ["label", 20, false], + ["tc", 3, false], + ["bos", 1, false], + ["ttl", 8, false] + ] + }, + { + "name" : "bridged_metadata_t", + "id" : 13, + "fields" : [ + ["_bmd_type0", 8, false], + ["_base_inner_hash1", 32, false], + ["_base_mpls_label2", 20, false], + ["_base_ig_port3", 9, false], + ["_base_is_multicast4", 1, 0], + ["_base_fwd_type5", 3, false], + ["_base_vlan_id6", 12, false], + ["_base_encap_presence7", 2, false], + ["_base_mpls_ttl8", 8, false], + ["_base_ig_tstamp9", 48, false], + ["_base_ip_eth_type10", 16, false], + ["_base_stats_flow_id11", 10, false], + ["_base_slice_tc12", 6, false], + ["_upf_tun_peer_id13", 8, false], + ["_upf_upf_ctr_id14", 12, false], + ["_upf_qfi15", 6, false], + ["_upf_needs_gtpu_encap16", 1, 0], + ["_upf_skip_upf17", 1, 0], + ["_upf_skip_egress_upf_ctr18", 1, 0], + ["_upf_teid19", 32, false], + ["_upf__pad20", 4, false], + ["_int_bmd_report_type21", 3, false], + ["_int_bmd_mirror_session_id22", 10, false], + ["_int_bmd_drop_reason23", 8, false], + ["_int_bmd_queue_id24", 5, false], + ["_int_bmd_egress_port25", 9, false], + ["_int_bmd_wip_type26", 8, false], + ["__pad027", 1, false], + ["__pad128", 7, false], + ["__pad229", 5, false] + ] + }, + { + "name" : "int_report_metadata_t", + "id" : 14, + "fields" : [ + ["bmd_type", 8, false], + ["_pad0", 5, false], + ["mirror_type", 3, false], + ["_pad1", 7, false], + ["ig_port", 9, false], + ["_pad2", 7, false], + ["eg_port", 9, false], + ["_pad3", 3, false], + ["queue_id", 5, false], + ["_pad4", 5, false], + ["queue_occupancy", 19, false], + ["ig_tstamp", 32, false], + ["eg_tstamp", 32, false], + ["drop_reason", 8, false], + ["ip_eth_type", 16, false], + ["_pad5", 6, false], + ["encap_presence", 2, false], + ["report_type", 3, false], + ["_pad6", 5, false], + ["flow_hash", 32, false] + ] + }, + { + "name" : "int_metadata_t", + "id" : 15, + "fields" : [ + ["hop_latency", 32, false], + ["timestamp", 48, false], + ["vlan_stripped", 1, 0], + ["queue_report", 1, 0], + ["_padding", 6, false] + ] + }, + { + "name" : "standard_metadata", + "id" : 16, + "fields" : [ + ["ingress_port", 9, false], + ["egress_spec", 9, false], + ["egress_port", 9, false], + ["instance_type", 32, false], + ["packet_length", 32, false], + ["enq_timestamp", 32, false], + ["enq_qdepth", 19, false], + ["deq_timedelta", 32, false], + ["deq_qdepth", 19, false], + ["ingress_global_timestamp", 48, false], + ["egress_global_timestamp", 48, false], + ["mcast_grp", 16, false], + ["egress_rid", 16, false], + ["checksum_error", 1, false], + ["parser_error", 32, false], + ["priority", 3, false], + ["_padding_0", 3, false] + ] + }, + { + "name" : "packet_in_header_t", + "id" : 17, + "fields" : [ + ["ingress_port", 9, false], + ["_pad0", 7, false] + ] + }, + { + "name" : "vlan_tag_t", + "id" : 18, + "fields" : [ + ["eth_type", 16, false], + ["pri", 3, false], + ["cfi", 1, false], + ["vlan_id", 12, false] + ] + }, + { + "name" : "ipv6_t", + "id" : 19, + "fields" : [ + ["version", 4, false], + ["traffic_class", 8, false], + ["flow_label", 20, false], + ["payload_len", 16, false], + ["next_hdr", 8, false], + ["hop_limit", 8, false], + ["src_addr", 128, false], + ["dst_addr", 128, false] + ] + }, + { + "name" : "tcp_t", + "id" : 20, + "fields" : [ + ["sport", 16, false], + ["dport", 16, false] + ] + }, + { + "name" : "icmp_t", + "id" : 21, + "fields" : [ + ["icmp_type", 8, false], + ["icmp_code", 8, false] + ] + }, + { + "name" : "gtpu_options_t", + "id" : 22, + "fields" : [ + ["seq_num", 16, false], + ["n_pdu_num", 8, false], + ["next_ext", 8, false] + ] + }, + { + "name" : "gtpu_ext_psc_t", + "id" : 23, + "fields" : [ + ["len", 8, false], + ["type", 4, false], + ["spare0", 4, false], + ["ppp", 1, false], + ["rqi", 1, false], + ["qfi", 6, false], + ["next_ext", 8, false] + ] + }, + { + "name" : "vxlan_t", + "id" : 24, + "fields" : [ + ["flags", 8, false], + ["reserved", 24, false], + ["vni", 24, false], + ["reserved_2", 8, false] + ] + } + ], + "headers" : [ + { + "name" : "tmp", + "id" : 0, + "header_type" : "fake_ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "tmp_0", + "id" : 1, + "header_type" : "packet_out_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "tmp_1", + "id" : 2, + "header_type" : "fake_ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "gtpu_0", + "id" : 3, + "header_type" : "gtpu_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_report_ethernet", + "id" : 4, + "header_type" : "ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_report_eth_type", + "id" : 5, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_report_ipv4", + "id" : 6, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_report_udp", + "id" : 7, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_report_fixed_header", + "id" : 8, + "header_type" : "report_fixed_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_common_report_header", + "id" : 9, + "header_type" : "common_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_local_report_header", + "id" : 10, + "header_type" : "local_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_drop_report_header", + "id" : 11, + "header_type" : "drop_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_report_eth_type", + "id" : 12, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_report_mpls", + "id" : 13, + "header_type" : "mpls_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_report_ipv4", + "id" : 14, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_report_udp", + "id" : 15, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_report_fixed_header", + "id" : 16, + "header_type" : "report_fixed_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_common_report_header", + "id" : 17, + "header_type" : "common_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_local_report_header", + "id" : 18, + "header_type" : "local_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_drop_report_header", + "id" : 19, + "header_type" : "drop_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_eth_type", + "id" : 20, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_fabric_md_bridged", + "id" : 21, + "header_type" : "bridged_metadata_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_fabric_md_int_report_md", + "id" : 22, + "header_type" : "int_report_metadata_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_fabric_md_int_md", + "id" : 23, + "header_type" : "int_metadata_t", + "metadata" : true, + "pi_omit" : true + }, + { + "name" : "scalars", + "id" : 24, + "header_type" : "scalars_0", + "metadata" : true, + "pi_omit" : true + }, + { + "name" : "standard_metadata", + "id" : 25, + "header_type" : "standard_metadata", + "metadata" : true, + "pi_omit" : true + }, + { + "name" : "_ingress_packet_out0", + "id" : 26, + "header_type" : "packet_out_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_packet_in1", + "id" : 27, + "header_type" : "packet_in_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_fake_ethernet2", + "id" : 28, + "header_type" : "fake_ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_ethernet3", + "id" : 29, + "header_type" : "ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_vlan_tag4", + "id" : 30, + "header_type" : "vlan_tag_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_eth_type5", + "id" : 31, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_mpls6", + "id" : 32, + "header_type" : "mpls_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_ipv47", + "id" : 33, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_ipv68", + "id" : 34, + "header_type" : "ipv6_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_tcp9", + "id" : 35, + "header_type" : "tcp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_udp10", + "id" : 36, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_icmp11", + "id" : 37, + "header_type" : "icmp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_gtpu12", + "id" : 38, + "header_type" : "gtpu_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_gtpu_options13", + "id" : 39, + "header_type" : "gtpu_options_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_gtpu_ext_psc14", + "id" : 40, + "header_type" : "gtpu_ext_psc_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_vxlan15", + "id" : 41, + "header_type" : "vxlan_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_ethernet16", + "id" : 42, + "header_type" : "ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_eth_type17", + "id" : 43, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_ipv418", + "id" : 44, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_tcp19", + "id" : 45, + "header_type" : "tcp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_udp20", + "id" : 46, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_icmp21", + "id" : 47, + "header_type" : "icmp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_packet_in22", + "id" : 48, + "header_type" : "packet_in_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_fake_ethernet23", + "id" : 49, + "header_type" : "fake_ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_ethernet24", + "id" : 50, + "header_type" : "ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_eth_type25", + "id" : 51, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_mpls26", + "id" : 52, + "header_type" : "mpls_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_ipv427", + "id" : 53, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_udp28", + "id" : 54, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_fixed_header29", + "id" : 55, + "header_type" : "report_fixed_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_common_report_header30", + "id" : 56, + "header_type" : "common_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_local_report_header31", + "id" : 57, + "header_type" : "local_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_drop_report_header32", + "id" : 58, + "header_type" : "drop_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_ethernet33", + "id" : 59, + "header_type" : "ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_vlan_tag34", + "id" : 60, + "header_type" : "vlan_tag_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_eth_type35", + "id" : 61, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_mpls36", + "id" : 62, + "header_type" : "mpls_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_outer_ipv437", + "id" : 63, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_outer_udp38", + "id" : 64, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_outer_gtpu39", + "id" : 65, + "header_type" : "gtpu_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_outer_gtpu_options40", + "id" : 66, + "header_type" : "gtpu_options_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_outer_gtpu_ext_psc41", + "id" : 67, + "header_type" : "gtpu_ext_psc_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_ipv442", + "id" : 68, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_ipv643", + "id" : 69, + "header_type" : "ipv6_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_udp44", + "id" : 70, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_bridged4", + "id" : 71, + "header_type" : "bridged_metadata_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_bridged36", + "id" : 72, + "header_type" : "bridged_metadata_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_int_report_md39", + "id" : 73, + "header_type" : "int_report_metadata_t", + "metadata" : false, + "pi_omit" : true + } + ], + "header_stacks" : [], + "header_union_types" : [], + "header_unions" : [], + "header_union_stacks" : [], + "field_lists" : [ + { + "id" : 1, + "name" : "field_list241", + "elements" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type47"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port48"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + } + ] + }, + { + "id" : 2, + "name" : "field_list231", + "elements" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_ingress_port50"] + } + ] + }, + { + "id" : 3, + "name" : "empty", + "elements" : [] + }, + { + "id" : 4, + "name" : "empty_0", + "elements" : [] + }, + { + "id" : 5, + "name" : "empty_1", + "elements" : [] + } + ], + "errors" : [ + ["NoError", 1], + ["PacketTooShort", 2], + ["NoMatch", 3], + ["StackOutOfBounds", 4], + ["HeaderTooShort", 5], + ["ParserTimeout", 6], + ["ParserInvalidArgument", 7], + ["PacketRejectedByParser", 8] + ], + "enums" : [], + "parsers" : [ + { + "name" : "parser", + "id" : 0, + "init_state" : "start", + "parse_states" : [ + { + "name" : "start", + "id" : 0, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_pkt_length46"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "packet_length"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x0000ffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_bridged4" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_bmd_type0"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ig_port3"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "ingress_port"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_ingress_port50"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "ingress_port"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ig_tstamp9"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "ingress_global_timestamp"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_punt_to_cpu23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_wip_type26"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_8"] + }, + { + "type" : "lookahead", + "value" : [0, 112] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "tmp" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp", "_pad0"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_8"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x40" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp", "_pad1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_8"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x10" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp", "ether_type"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_8"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_2"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_8"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0xbf02", + "mask" : null, + "next_state" : "parse_fake_ethernet" + }, + { + "type" : "hexstr", + "value" : "0xbf03", + "mask" : null, + "next_state" : "parse_fake_ethernet_and_accept" + }, + { + "type" : "hexstr", + "value" : "0xbf01", + "mask" : null, + "next_state" : "check_packet_out" + }, + { + "type" : "hexstr", + "value" : "0xbf04", + "mask" : null, + "next_state" : "parse_int_wip_ipv4" + }, + { + "type" : "hexstr", + "value" : "0xbf05", + "mask" : null, + "next_state" : "parse_int_wip_mpls" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_ethernet" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_2"] + } + ] + }, + { + "name" : "check_packet_out", + "id" : 1, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + { + "type" : "lookahead", + "value" : [0, 112] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "tmp_0" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "pad0"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x69" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x7f" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "egress_port"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x60" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "pad1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x5d" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "queue_id"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x58" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x1f" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "pad2"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x53" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x1f" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "cpu_loopback_mode"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x51" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x03" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "do_forwarding"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x50" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "pad3"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x40" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "pad4"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x10" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "ether_type"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_4"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x50" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x00", + "mask" : null, + "next_state" : "parse_packet_out_and_accept" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "strip_packet_out" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_4"] + } + ] + }, + { + "name" : "parse_int_wip_ipv4", + "id" : 2, + "parser_ops" : [ + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ethernet3" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_eth_type5" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_wip_type26"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_ttl8"] + }, + { + "type" : "hexstr", + "value" : "0x41" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x00000070" + } + ], + "op" : "advance" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_ipv4" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_int_wip_mpls", + "id" : 3, + "parser_ops" : [ + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ethernet3" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_eth_type5" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + }, + { + "type" : "hexstr", + "value" : "0x8847" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_wip_type26"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x00000070" + } + ], + "op" : "advance" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_mpls" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_packet_out_and_accept", + "id" : 4, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_packet_out0" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "strip_packet_out", + "id" : 5, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x00000070" + } + ], + "op" : "advance" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_ethernet" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_fake_ethernet", + "id" : 6, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_fake_ethernet2" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_10"] + }, + { + "type" : "lookahead", + "value" : [0, 112] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "tmp_1" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_1", "_pad0"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_10"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x40" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_1", "_pad1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_10"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x10" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_1", "ether_type"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_10"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_6"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_10"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0xbf04", + "mask" : null, + "next_state" : "parse_int_wip_ipv4" + }, + { + "type" : "hexstr", + "value" : "0xbf05", + "mask" : null, + "next_state" : "parse_int_wip_mpls" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_ethernet" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_6"] + } + ] + }, + { + "name" : "parse_fake_ethernet_and_accept", + "id" : 7, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_fake_ethernet2" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_ethernet", + "id" : 8, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_ethernet3" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_3"] + }, + { + "type" : "lookahead", + "value" : [0, 16] + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x88a8", + "mask" : null, + "next_state" : "parse_vlan_tag" + }, + { + "type" : "hexstr", + "value" : "0x8100", + "mask" : "0xefff", + "next_state" : "parse_vlan_tag" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_untagged" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_3"] + } + ] + }, + { + "name" : "parse_vlan_tag", + "id" : 9, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_vlan_tag4" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "field", + "value" : ["_ingress_vlan_tag4", "vlan_id"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_5"] + }, + { + "type" : "lookahead", + "value" : [0, 16] + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_eth_type" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_5"] + } + ] + }, + { + "name" : "parse_untagged", + "id" : 10, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "hexstr", + "value" : "0x0ffe" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_eth_type" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_eth_type", + "id" : 11, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_eth_type5" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x8847", + "mask" : null, + "next_state" : "parse_mpls" + }, + { + "type" : "hexstr", + "value" : "0x0800", + "mask" : null, + "next_state" : "parse_non_mpls" + }, + { + "type" : "hexstr", + "value" : "0x86dd", + "mask" : null, + "next_state" : "parse_non_mpls" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + } + ] + }, + { + "name" : "parse_mpls", + "id" : 12, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_mpls6" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "field", + "value" : ["_ingress_mpls6", "label"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_ttl8"] + }, + { + "type" : "field", + "value" : ["_ingress_mpls6", "ttl"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_7"] + }, + { + "type" : "lookahead", + "value" : [0, 4] + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x04", + "mask" : null, + "next_state" : "parse_ipv4" + }, + { + "type" : "hexstr", + "value" : "0x06", + "mask" : null, + "next_state" : "parse_ipv6" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "reject_packet" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_7"] + } + ] + }, + { + "name" : "reject_packet", + "id" : 13, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "bool", + "value" : false + }, + { + "type" : "hexstr", + "value" : "0x8" + } + ], + "op" : "verify" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_non_mpls", + "id" : 14, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_ttl8"] + }, + { + "type" : "hexstr", + "value" : "0x41" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x0800", + "mask" : null, + "next_state" : "parse_ipv4" + }, + { + "type" : "hexstr", + "value" : "0x86dd", + "mask" : null, + "next_state" : "parse_ipv6" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + } + ] + }, + { + "name" : "parse_ipv4", + "id" : 15, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_ipv47" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x06", + "mask" : null, + "next_state" : "parse_tcp" + }, + { + "type" : "hexstr", + "value" : "0x11", + "mask" : null, + "next_state" : "parse_udp" + }, + { + "type" : "hexstr", + "value" : "0x01", + "mask" : null, + "next_state" : "parse_icmp" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + } + ] + }, + { + "name" : "parse_ipv6", + "id" : 16, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_ipv68" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + }, + { + "type" : "hexstr", + "value" : "0x86dd" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x06", + "mask" : null, + "next_state" : "parse_tcp" + }, + { + "type" : "hexstr", + "value" : "0x11", + "mask" : null, + "next_state" : "parse_udp" + }, + { + "type" : "hexstr", + "value" : "0x3a", + "mask" : null, + "next_state" : "parse_icmp" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_ipv68", "next_hdr"] + } + ] + }, + { + "name" : "parse_icmp", + "id" : 17, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_icmp11" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_tcp", + "id" : 18, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_tcp9" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_udp", + "id" : 19, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_udp10" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + { + "type" : "lookahead", + "value" : [0, 64] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "gtpu_0" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "version"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3d" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "pt"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3c" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "spare"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3b" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "ex_flag"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3a" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "seq_flag"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x39" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "npdu_flag"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x38" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "msgtype"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x30" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "msglen"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x20" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "teid"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_12"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3d" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_13"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x30" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x086801ff", + "mask" : null, + "next_state" : "parse_gtpu" + }, + { + "type" : "hexstr", + "value" : "0x12b50000", + "mask" : "0xffff0000", + "next_state" : "parse_vxlan" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "dport"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_12"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_13"] + } + ] + }, + { + "name" : "parse_gtpu", + "id" : 20, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_gtpu12" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x000000", + "mask" : null, + "next_state" : "set_gtpu_only" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_gtpu_options" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "ex_flag"] + }, + { + "type" : "field", + "value" : ["_ingress_gtpu12", "seq_flag"] + }, + { + "type" : "field", + "value" : ["_ingress_gtpu12", "npdu_flag"] + } + ] + }, + { + "name" : "set_gtpu_only", + "id" : 21, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_inner_ipv4" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_gtpu_options", + "id" : 22, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_gtpu_options13" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "gtpu_ext_len_0"] + }, + { + "type" : "lookahead", + "value" : [0, 8] + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x8501", + "mask" : null, + "next_state" : "parse_gtpu_ext_psc" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "next_ext"] + }, + { + "type" : "field", + "value" : ["scalars", "gtpu_ext_len_0"] + } + ] + }, + { + "name" : "parse_gtpu_ext_psc", + "id" : 23, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x00", + "mask" : null, + "next_state" : "parse_inner_ipv4" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "next_ext"] + } + ] + }, + { + "name" : "parse_vxlan", + "id" : 24, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_vxlan15" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x03" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_ethernet16" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_eth_type17" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x0800", + "mask" : null, + "next_state" : "parse_inner_ipv4" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_inner_eth_type17", "value"] + } + ] + }, + { + "name" : "parse_inner_ipv4", + "id" : 25, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_ipv418" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x06", + "mask" : null, + "next_state" : "parse_inner_tcp" + }, + { + "type" : "hexstr", + "value" : "0x11", + "mask" : null, + "next_state" : "parse_inner_udp" + }, + { + "type" : "hexstr", + "value" : "0x01", + "mask" : null, + "next_state" : "parse_inner_icmp" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "protocol"] + } + ] + }, + { + "name" : "parse_inner_tcp", + "id" : 26, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_tcp19" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_inner_udp", + "id" : 27, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_udp20" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_inner_icmp", + "id" : 28, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_icmp21" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + } + ] + } + ], + "parse_vsets" : [], + "deparsers" : [ + { + "name" : "deparser", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/parser.p4", + "line" : 321, + "column" : 8, + "source_fragment" : "FabricDeparser" + }, + "order" : ["_ingress_fake_ethernet2", "_ingress_packet_in1", "_egress_report_ethernet24", "_egress_report_eth_type25", "_egress_report_mpls26", "_egress_report_ipv427", "_egress_report_udp28", "_egress_report_fixed_header29", "_egress_common_report_header30", "_egress_local_report_header31", "_egress_drop_report_header32", "_ingress_ethernet3", "_ingress_vlan_tag4", "_ingress_eth_type5", "_ingress_mpls6", "_ingress_ipv47", "_ingress_ipv68", "_ingress_tcp9", "_ingress_udp10", "_ingress_icmp11", "_ingress_gtpu12", "_ingress_gtpu_options13", "_ingress_gtpu_ext_psc14", "_ingress_vxlan15", "_ingress_inner_ethernet16", "_ingress_inner_eth_type17", "_ingress_inner_ipv418", "_ingress_inner_tcp19", "_ingress_inner_udp20", "_ingress_inner_icmp21"], + "primitives" : [] + } + ], + "meter_arrays" : [ + { + "name" : "FabricIngress.qos.slice_tc_meter", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 104, + "column" : 41, + "source_fragment" : "slice_tc_meter" + }, + "is_direct" : false, + "size" : 64, + "rate_count" : 2, + "type" : "bytes" + }, + { + "name" : "FabricIngress.upf.session_meter", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 22, + "column" : 34, + "source_fragment" : "session_meter" + }, + "is_direct" : false, + "size" : 20000, + "rate_count" : 2, + "type" : "bytes" + }, + { + "name" : "FabricIngress.upf.app_meter", + "id" : 2, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 23, + "column" : 34, + "source_fragment" : "app_meter" + }, + "is_direct" : false, + "size" : 20000, + "rate_count" : 2, + "type" : "bytes" + } + ], + "counter_arrays" : [ + { + "name" : "FabricIngress.stats.flow_counter", + "id" : 0, + "is_direct" : true, + "binding" : "FabricIngress.stats.flows", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 14, + "column" : 50, + "source_fragment" : "flow_counter" + } + }, + { + "name" : "FabricIngress.filtering.ingress_port_vlan_counter", + "id" : 1, + "is_direct" : true, + "binding" : "FabricIngress.filtering.ingress_port_vlan", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 17, + "column" : 50, + "source_fragment" : "ingress_port_vlan_counter" + } + }, + { + "name" : "FabricIngress.filtering.fwd_classifier_counter", + "id" : 2, + "is_direct" : true, + "binding" : "FabricIngress.filtering.fwd_classifier", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 71, + "column" : 50, + "source_fragment" : "fwd_classifier_counter" + } + }, + { + "name" : "FabricIngress.filtering.fwd_type_counter", + "id" : 3, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 78, + "column" : 46, + "source_fragment" : "fwd_type_counter" + }, + "size" : 8, + "is_direct" : false + }, + { + "name" : "FabricIngress.forwarding.bridging_counter", + "id" : 4, + "is_direct" : true, + "binding" : "FabricIngress.forwarding.bridging", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 29, + "column" : 50, + "source_fragment" : "bridging_counter" + } + }, + { + "name" : "FabricIngress.forwarding.mpls_counter", + "id" : 5, + "is_direct" : true, + "binding" : "FabricIngress.forwarding.mpls", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 64, + "column" : 50, + "source_fragment" : "mpls_counter" + } + }, + { + "name" : "FabricIngress.forwarding.routing_v4_counter", + "id" : 6, + "is_direct" : true, + "binding" : "FabricIngress.forwarding.routing_v4", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 98, + "column" : 50, + "source_fragment" : "routing_v4_counter" + } + }, + { + "name" : "FabricIngress.forwarding.routing_v6_counter", + "id" : 7, + "is_direct" : true, + "binding" : "FabricIngress.forwarding.routing_v6", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 142, + "column" : 50, + "source_fragment" : "routing_v6_counter" + } + }, + { + "name" : "FabricIngress.pre_next.next_mpls_counter", + "id" : 8, + "is_direct" : true, + "binding" : "FabricIngress.pre_next.next_mpls", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 15, + "column" : 50, + "source_fragment" : "next_mpls_counter" + } + }, + { + "name" : "FabricIngress.pre_next.next_vlan_counter", + "id" : 9, + "is_direct" : true, + "binding" : "FabricIngress.pre_next.next_vlan", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 39, + "column" : 50, + "source_fragment" : "next_vlan_counter" + } + }, + { + "name" : "FabricIngress.acl.acl_counter", + "id" : 10, + "is_direct" : true, + "binding" : "FabricIngress.acl.acl", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 19, + "column" : 50, + "source_fragment" : "acl_counter" + } + }, + { + "name" : "FabricIngress.next.hashed_counter", + "id" : 11, + "is_direct" : true, + "binding" : "FabricIngress.next.hashed", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 115, + "column" : 50, + "source_fragment" : "hashed_counter" + } + }, + { + "name" : "FabricIngress.next.multicast_counter", + "id" : 12, + "is_direct" : true, + "binding" : "FabricIngress.next.multicast", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 148, + "column" : 50, + "source_fragment" : "multicast_counter" + } + }, + { + "name" : "FabricIngress.slice_tc_classifier.classifier_stats", + "id" : 13, + "is_direct" : true, + "binding" : "FabricIngress.slice_tc_classifier.classifier", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 20, + "column" : 40, + "source_fragment" : "classifier_stats" + } + }, + { + "name" : "FabricIngress.qos.queues_stats", + "id" : 14, + "is_direct" : true, + "binding" : "FabricIngress.qos.queues", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 106, + "column" : 40, + "source_fragment" : "queues_stats" + } + }, + { + "name" : "FabricIngress.upf.terminations_counter", + "id" : 15, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 20, + "column" : 49, + "source_fragment" : "terminations_counter" + }, + "size" : 4096, + "is_direct" : false + }, + { + "name" : "FabricIngress.upf.recirc_stats", + "id" : 16, + "is_direct" : true, + "binding" : "FabricIngress.upf.uplink_recirc_rules", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 356, + "column" : 40, + "source_fragment" : "recirc_stats" + } + }, + { + "name" : "FabricIngress.int_watchlist.watchlist_counter", + "id" : 17, + "is_direct" : true, + "binding" : "FabricIngress.int_watchlist.watchlist", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 15, + "column" : 50, + "source_fragment" : "watchlist_counter" + } + }, + { + "name" : "FabricIngress.int_ingress.drop_report_counter", + "id" : 18, + "is_direct" : true, + "binding" : "FabricIngress.int_ingress.drop_report", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 64, + "column" : 50, + "source_fragment" : "drop_report_counter" + } + }, + { + "name" : "FabricEgress.stats.flow_counter", + "id" : 19, + "is_direct" : true, + "binding" : "FabricEgress.stats.flows", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 47, + "column" : 50, + "source_fragment" : "flow_counter" + } + }, + { + "name" : "FabricEgress.egress_next.egress_vlan_counter", + "id" : 20, + "is_direct" : true, + "binding" : "FabricEgress.egress_next.egress_vlan", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 241, + "column" : 50, + "source_fragment" : "egress_vlan_counter" + } + }, + { + "name" : "FabricEgress.upf.terminations_counter", + "id" : 21, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 477, + "column" : 49, + "source_fragment" : "terminations_counter" + }, + "size" : 4096, + "is_direct" : false + }, + { + "name" : "FabricEgress.int_egress.report_counter", + "id" : 22, + "is_direct" : true, + "binding" : "FabricEgress.int_egress.report", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 131, + "column" : 50, + "source_fragment" : "report_counter" + } + }, + { + "name" : "FabricEgress.int_egress.int_metadata_counter", + "id" : 23, + "is_direct" : true, + "binding" : "FabricEgress.int_egress.int_metadata", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 132, + "column" : 50, + "source_fragment" : "int_metadata_counter" + } + } + ], + "register_arrays" : [ + { + "name" : "FabricEgress.int_egress.seq_number", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 138, + "column" : 28, + "source_fragment" : "seq_number" + }, + "size" : 1024, + "bitwidth" : 32 + } + ], + "calculations" : [ + { + "name" : "calc", + "id" : 0, + "algo" : "crc32", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_18"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_19"] + } + ] + }, + { + "name" : "calc_0", + "id" : 1, + "algo" : "crc32", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_20"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_21"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_22"] + } + ] + }, + { + "name" : "calc_1", + "id" : 2, + "algo" : "crc32", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_23"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_24"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_25"] + } + ] + }, + { + "name" : "calc_2", + "id" : 3, + "algo" : "crc32", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_26"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_27"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_28"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_29"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_30"] + } + ] + }, + { + "name" : "calc_3", + "id" : 4, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 55, + "column" : 8, + "source_fragment" : "update_checksum(hdr.ingress.ipv4.isValid(), ..." + }, + "algo" : "csum16", + "input" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "version"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ihl"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ecn"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "total_len"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "identification"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "flags"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "frag_offset"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ] + }, + { + "name" : "calc_4", + "id" : 5, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 73, + "column" : 8, + "source_fragment" : "update_checksum(hdr.ingress.inner_ipv4.isValid(), ..." + }, + "algo" : "csum16", + "input" : [ + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "version"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ihl"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dscp"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ecn"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "identification"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "flags"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "frag_offset"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ttl"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "protocol"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "src_addr"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dst_addr"] + } + ] + }, + { + "name" : "calc_5", + "id" : 6, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 92, + "column" : 8, + "source_fragment" : "update_checksum(hdr.egress.report_ipv4.isValid(), ..." + }, + "algo" : "csum16", + "input" : [ + { + "type" : "field", + "value" : ["_egress_report_ipv427", "version"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "ihl"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "dscp"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "ecn"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "total_len"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "identification"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "flags"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "frag_offset"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "ttl"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "protocol"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "src_addr"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "dst_addr"] + } + ] + }, + { + "name" : "calc_6", + "id" : 7, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 13, + "column" : 8, + "source_fragment" : "verify_checksum(hdr.ingress.ipv4.isValid(), ..." + }, + "algo" : "csum16", + "input" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "version"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ihl"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ecn"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "total_len"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "identification"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "flags"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "frag_offset"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ] + }, + { + "name" : "calc_7", + "id" : 8, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 31, + "column" : 8, + "source_fragment" : "verify_checksum(hdr.ingress.inner_ipv4.isValid(), ..." + }, + "algo" : "csum16", + "input" : [ + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "version"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ihl"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dscp"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ecn"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "identification"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "flags"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "frag_offset"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ttl"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "protocol"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "src_addr"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dst_addr"] + } + ] + } + ], + "learn_lists" : [], + "actions" : [ + { + "name" : "nop", + "id" : 0, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 1, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 2, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 3, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 4, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 5, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 6, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "NoAction", + "id" : 7, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricIngress.stats.count", + "id" : 8, + "runtime_data" : [ + { + "name" : "flow_id", + "bitwidth" : 10 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_stats_flow_id11"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 17, + "column" : 22, + "source_fragment" : "= flow_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.pkt_io.do_packet_out", + "id" : 9, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_ingress_packet_out0", "egress_port"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 13, + "column" : 8, + "source_fragment" : "standard_md.egress_spec = (PortId_t)hdr.packet_out.egress_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port48"] + }, + { + "type" : "field", + "value" : ["_ingress_packet_out0", "egress_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 14, + "column" : 37, + "source_fragment" : "= hdr.packet_out.egress_port; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 15, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_packet_out0" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 16, + "column" : 8, + "source_fragment" : "hdr.packet_out.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._skip_egress0"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 17, + "column" : 20, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_bridged4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 19, + "column" : 8, + "source_fragment" : "fabric_md.bridged.setInvalid()" + } + }, + { + "op" : "exit", + "parameters" : [], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "exit" + } + } + ] + }, + { + "name" : "FabricIngress.filtering.deny", + "id" : 10, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 22, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 23, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ig_port_type33"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 100, + "column" : 14, + "source_fragment" : "0x0, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x37" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 250, + "column" : 41, + "source_fragment" : "55, ..." + } + } + ] + }, + { + "name" : "FabricIngress.filtering.permit", + "id" : 11, + "runtime_data" : [ + { + "name" : "port_type", + "bitwidth" : 2 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ig_port_type33"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 33, + "column" : 31, + "source_fragment" : "= port_type; ..." + } + } + ] + }, + { + "name" : "FabricIngress.filtering.permit_with_internal_vlan", + "id" : 12, + "runtime_data" : [ + { + "name" : "vlan_id", + "bitwidth" : 12 + }, + { + "name" : "port_type", + "bitwidth" : 2 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.vlan_id = vlan_id" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ig_port_type33"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 33, + "column" : 31, + "source_fragment" : "= port_type; ..." + } + } + ] + }, + { + "name" : "FabricIngress.filtering.set_forwarding_type", + "id" : 13, + "runtime_data" : [ + { + "name" : "fwd_type", + "bitwidth" : 3 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 74, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.fwd_type = fwd_type" + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_int_drop_reason", + "id" : 14, + "runtime_data" : [ + { + "name" : "drop_reason", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason" + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_int_drop_reason", + "id" : 15, + "runtime_data" : [ + { + "name" : "drop_reason", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason" + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_int_drop_reason", + "id" : 16, + "runtime_data" : [ + { + "name" : "drop_reason", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason" + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_int_drop_reason", + "id" : 17, + "runtime_data" : [ + { + "name" : "drop_reason", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason" + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_next_id_bridging", + "id" : 18, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_next_id21"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 23, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.pop_mpls_and_next", + "id" : 19, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_mpls6" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 67, + "column" : 8, + "source_fragment" : "hdr.mpls.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + }, + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 68, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 69, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.mpls_label = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_next_id21"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 23, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_next_id_routing_v4", + "id" : 20, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_next_id21"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 23, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.nop_routing_v4", + "id" : 21, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricIngress.forwarding.drop_routing_v4", + "id" : 22, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 111, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 113, + "column" : 17, + "source_fragment" : "= 1; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_next_id_routing_v6", + "id" : 23, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_next_id21"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 23, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.drop_routing_v6", + "id" : 24, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 150, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 152, + "column" : 17, + "source_fragment" : "= 1; ..." + } + } + ] + }, + { + "name" : "FabricIngress.pre_next.set_mpls_label", + "id" : 25, + "runtime_data" : [ + { + "name" : "label", + "bitwidth" : 20 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 18, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.mpls_label = label" + } + } + ] + }, + { + "name" : "FabricIngress.pre_next.set_vlan", + "id" : 26, + "runtime_data" : [ + { + "name" : "vlan_id", + "bitwidth" : 12 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 42, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.vlan_id = vlan_id" + } + } + ] + }, + { + "name" : "FabricIngress.acl.set_next_id_acl", + "id" : 27, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_next_id21"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 22, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 26, + "column" : 28, + "source_fragment" : "= false; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 27, + "column" : 17, + "source_fragment" : "= 0; ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.copy_to_cpu", + "id" : 28, + "runtime_data" : [], + "primitives" : [ + { + "op" : "clone_ingress_pkt_to_egress", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x000001ff" + }, + { + "type" : "hexstr", + "value" : "0x2" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 31, + "column" : 8, + "source_fragment" : "clone_preserving_field_list(CloneType.I2E, ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.punt_to_cpu", + "id" : 29, + "runtime_data" : [], + "primitives" : [ + { + "op" : "clone_ingress_pkt_to_egress", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x000001ff" + }, + { + "type" : "hexstr", + "value" : "0x2" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 31, + "column" : 8, + "source_fragment" : "clone_preserving_field_list(CloneType.I2E, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 40, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_punt_to_cpu23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 41, + "column" : 30, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 42, + "column" : 17, + "source_fragment" : "= 1; ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.drop", + "id" : 30, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 46, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 47, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x50" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 252, + "column" : 27, + "source_fragment" : "80, ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.set_output_port", + "id" : 31, + "runtime_data" : [ + { + "name" : "port_num", + "bitwidth" : 9 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 62, + "column" : 8, + "source_fragment" : "standard_md.egress_spec = (PortId_t) port_num" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port48"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 63, + "column" : 37, + "source_fragment" : "= port_num; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 64, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 65, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 66, + "column" : 17, + "source_fragment" : "= 0; ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.nop_acl", + "id" : 32, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricIngress.next.output_hashed", + "id" : 33, + "runtime_data" : [ + { + "name" : "port_num", + "bitwidth" : 9 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 16, + "column" : 8, + "source_fragment" : "standard_md.egress_spec = (PortId_t)port_num" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port48"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 17, + "column" : 37, + "source_fragment" : "= port_num; // Needed by INT. ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 18, + "column" : 34, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.next.routing_hashed", + "id" : 34, + "runtime_data" : [ + { + "name" : "port_num", + "bitwidth" : 9 + }, + { + "name" : "smac", + "bitwidth" : 48 + }, + { + "name" : "dmac", + "bitwidth" : 48 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ethernet3", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 23, + "column" : 8, + "source_fragment" : "hdr.ethernet.src_addr = smac; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ethernet3", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 28, + "column" : 8, + "source_fragment" : "hdr.ethernet.dst_addr = dmac; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 16, + "column" : 8, + "source_fragment" : "standard_md.egress_spec = (PortId_t)port_num" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port48"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 17, + "column" : 37, + "source_fragment" : "= port_num; // Needed by INT. ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 18, + "column" : 34, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.next.set_mcast_group_id", + "id" : 35, + "runtime_data" : [ + { + "name" : "group_id", + "bitwidth" : 16 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "mcast_grp"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 151, + "column" : 8, + "source_fragment" : "standard_md.mcast_grp = group_id" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_is_multicast4"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 152, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.is_multicast = true" + } + } + ] + }, + { + "name" : "FabricIngress.next.reset_mcast_group_id", + "id" : 36, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "mcast_grp"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 157, + "column" : 8, + "source_fragment" : "standard_md.mcast_grp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_is_multicast4"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 158, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.is_multicast = false" + } + } + ] + }, + { + "name" : "FabricIngress.slice_tc_classifier.set_slice_id_tc", + "id" : 37, + "runtime_data" : [ + { + "name" : "slice_id", + "bitwidth" : 4 + }, + { + "name" : "tc", + "bitwidth" : 2 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_slice_id26"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 23, + "column" : 27, + "source_fragment" : "= slice_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc27"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 24, + "column" : 21, + "source_fragment" : "= tc; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 25, + "column" : 29, + "source_fragment" : "= false; ..." + } + } + ] + }, + { + "name" : "FabricIngress.slice_tc_classifier.no_classification", + "id" : 38, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_slice_id26"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 57, + "column" : 36, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc27"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 58, + "column" : 24, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 25, + "column" : 29, + "source_fragment" : "= false; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 31, + "column" : 29, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.slice_tc_classifier.trust_dscp", + "id" : 39, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_slice_id26"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x0f" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 38, + "column" : 27, + "source_fragment" : "= hdr.ipv4.dscp[4 +2 -1:2]; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc27"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x03" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 39, + "column" : 21, + "source_fragment" : "= hdr.ipv4.dscp[2 -1:0]; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 40, + "column" : 29, + "source_fragment" : "= false; ..." + } + } + ] + }, + { + "name" : "FabricIngress.qos.use_upf", + "id" : 40, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_slice_tc12"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "|", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "<<", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_slice_id30"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_tc31"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 81, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.slice_tc = fabric_md.upf_slice_id++fabric_md.upf_tc" + } + } + ] + }, + { + "name" : "FabricIngress.qos.use_default", + "id" : 41, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_slice_tc12"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "|", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "<<", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_slice_id26"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc27"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 86, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.slice_tc = fabric_md.slice_id++fabric_md.tc" + } + } + ] + }, + { + "name" : "FabricIngress.qos.set_queue", + "id" : 42, + "runtime_data" : [ + { + "name" : "qid", + "bitwidth" : 5 + } + ], + "primitives" : [] + }, + { + "name" : "FabricIngress.qos.meter_drop", + "id" : 43, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 115, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0xa0" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 269, + "column" : 36, + "source_fragment" : "160, ..." + } + } + ] + }, + { + "name" : "FabricIngress.qos.set_default_tc", + "id" : 44, + "runtime_data" : [ + { + "name" : "tc", + "bitwidth" : 2 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_slice_tc12"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "|", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "<<", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_slice_tc12"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x0f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 146, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.slice_tc = fabric_md.bridged.base.slice_tc[4 +2 -1:2]++tc" + } + } + ] + }, + { + "name" : "FabricIngress.upf.iface_access", + "id" : 45, + "runtime_data" : [ + { + "name" : "slice_id", + "bitwidth" : 4 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 85, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = false" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_is_upf_hit29"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 86, + "column" : 29, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_slice_id30"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 87, + "column" : 31, + "source_fragment" : "= slice_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.iface_core", + "id" : 46, + "runtime_data" : [ + { + "name" : "slice_id", + "bitwidth" : 4 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 85, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = false" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_is_upf_hit29"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 86, + "column" : 29, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_slice_id30"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 87, + "column" : 31, + "source_fragment" : "= slice_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.iface_dbuf", + "id" : 47, + "runtime_data" : [ + { + "name" : "slice_id", + "bitwidth" : 4 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 85, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = false" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_is_upf_hit29"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 86, + "column" : 29, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_slice_id30"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 87, + "column" : 31, + "source_fragment" : "= slice_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 114, + "column" : 31, + "source_fragment" : "0x0800; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 62, + "column" : 35, + "source_fragment" : "= hdr.inner_ipv4.dst_addr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ipv47" + }, + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 64, + "column" : 17, + "source_fragment" : "= hdr.inner_ipv4; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 65, + "column" : 8, + "source_fragment" : "hdr.inner_ipv4.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + }, + { + "type" : "header", + "value" : "_ingress_inner_udp20" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 66, + "column" : 16, + "source_fragment" : "= hdr.inner_udp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_udp20" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 67, + "column" : 8, + "source_fragment" : "hdr.inner_udp.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_tcp9" + }, + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 68, + "column" : 16, + "source_fragment" : "= hdr.inner_tcp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 69, + "column" : 8, + "source_fragment" : "hdr.inner_tcp.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_icmp11" + }, + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 70, + "column" : 17, + "source_fragment" : "= hdr.inner_icmp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.inner_icmp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 72, + "column" : 8, + "source_fragment" : "hdr.gtpu.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_options13" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 73, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 74, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 80, + "column" : 11, + "source_fragment" : "0x0, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.iface_miss", + "id" : 48, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 104, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = true" + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_uplink_session_miss", + "id" : 49, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x86" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 261, + "column" : 38, + "source_fragment" : "134, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_uplink_session_drop", + "id" : 50, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 136, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x87" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 262, + "column" : 38, + "source_fragment" : "135, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_downlink_session_miss", + "id" : 51, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x84" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 259, + "column" : 38, + "source_fragment" : "132, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_downlink_session_drop", + "id" : 52, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 151, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x85" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 260, + "column" : 38, + "source_fragment" : "133, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_downlink_session", + "id" : 53, + "runtime_data" : [ + { + "name" : "tun_peer_id", + "bitwidth" : 8 + }, + { + "name" : "session_meter_idx", + "bitwidth" : 15 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 159, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_ue_session_id"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 161, + "column" : 8, + "source_fragment" : "ue_session_id = fabric_md.routing_ipv4_dst; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_session_meter_idx_internal"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 162, + "column" : 8, + "source_fragment" : "session_meter_idx_internal = session_meter_idx" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_tun_peer_id13"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 163, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.tun_peer_id = tun_peer_id" + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_downlink_session_buf", + "id" : 54, + "runtime_data" : [ + { + "name" : "tun_peer_id", + "bitwidth" : 8 + }, + { + "name" : "session_meter_idx", + "bitwidth" : 15 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 167, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_ue_session_id"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 169, + "column" : 8, + "source_fragment" : "ue_session_id = fabric_md.routing_ipv4_dst; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_session_meter_idx_internal"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 170, + "column" : 8, + "source_fragment" : "session_meter_idx_internal = session_meter_idx" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_tun_peer_id13"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 171, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.tun_peer_id = tun_peer_id" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_egress_upf_ctr18"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 175, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_egress_upf_ctr = true" + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_downlink_session_buf_drop", + "id" : 55, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 179, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_ue_session_id"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 182, + "column" : 8, + "source_fragment" : "ue_session_id = fabric_md.routing_ipv4_dst; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x88" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 263, + "column" : 43, + "source_fragment" : "136, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_uplink_session", + "id" : 56, + "runtime_data" : [ + { + "name" : "session_meter_idx", + "bitwidth" : 15 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 190, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_ue_session_id"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 192, + "column" : 8, + "source_fragment" : "ue_session_id = fabric_md.lkp.ipv4_src; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_session_meter_idx_internal"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 193, + "column" : 8, + "source_fragment" : "session_meter_idx_internal = session_meter_idx" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 114, + "column" : 31, + "source_fragment" : "0x0800; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 62, + "column" : 35, + "source_fragment" : "= hdr.inner_ipv4.dst_addr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ipv47" + }, + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 64, + "column" : 17, + "source_fragment" : "= hdr.inner_ipv4; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 65, + "column" : 8, + "source_fragment" : "hdr.inner_ipv4.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + }, + { + "type" : "header", + "value" : "_ingress_inner_udp20" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 66, + "column" : 16, + "source_fragment" : "= hdr.inner_udp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_udp20" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 67, + "column" : 8, + "source_fragment" : "hdr.inner_udp.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_tcp9" + }, + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 68, + "column" : 16, + "source_fragment" : "= hdr.inner_tcp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 69, + "column" : 8, + "source_fragment" : "hdr.inner_tcp.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_icmp11" + }, + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 70, + "column" : 17, + "source_fragment" : "= hdr.inner_icmp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.inner_icmp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 72, + "column" : 8, + "source_fragment" : "hdr.gtpu.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_options13" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 73, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 74, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 80, + "column" : 11, + "source_fragment" : "0x0, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.uplink_drop_miss", + "id" : 57, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x8b" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 266, + "column" : 42, + "source_fragment" : "139, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.downlink_drop_miss", + "id" : 58, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x89" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 264, + "column" : 42, + "source_fragment" : "137, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.uplink_drop", + "id" : 59, + "runtime_data" : [ + { + "name" : "ctr_id", + "bitwidth" : 12 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_upf_ctr_id14"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 46, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.upf_ctr_id = ctr_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 47, + "column" : 8, + "source_fragment" : "term_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x8c" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 267, + "column" : 42, + "source_fragment" : "140, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.downlink_drop", + "id" : 60, + "runtime_data" : [ + { + "name" : "ctr_id", + "bitwidth" : 12 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_upf_ctr_id14"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 46, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.upf_ctr_id = ctr_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 47, + "column" : 8, + "source_fragment" : "term_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x8a" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 265, + "column" : 42, + "source_fragment" : "138, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.app_fwd", + "id" : 61, + "runtime_data" : [ + { + "name" : "ctr_id", + "bitwidth" : 12 + }, + { + "name" : "tc", + "bitwidth" : 2 + }, + { + "name" : "app_meter_idx", + "bitwidth" : 15 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_upf_ctr_id14"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 46, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.upf_ctr_id = ctr_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 47, + "column" : 8, + "source_fragment" : "term_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_tc31"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 265, + "column" : 25, + "source_fragment" : "= tc; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_meter_idx_internal"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 266, + "column" : 8, + "source_fragment" : "app_meter_idx_internal = app_meter_idx" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 267, + "column" : 29, + "source_fragment" : "= false; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.downlink_fwd_encap", + "id" : 62, + "runtime_data" : [ + { + "name" : "ctr_id", + "bitwidth" : 12 + }, + { + "name" : "tc", + "bitwidth" : 2 + }, + { + "name" : "teid", + "bitwidth" : 32 + }, + { + "name" : "qfi", + "bitwidth" : 6 + }, + { + "name" : "app_meter_idx", + "bitwidth" : 15 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_upf_ctr_id14"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 46, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.upf_ctr_id = ctr_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 47, + "column" : 8, + "source_fragment" : "term_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_tc31"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 265, + "column" : 25, + "source_fragment" : "= tc; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_meter_idx_internal"] + }, + { + "type" : "runtime_data", + "value" : 4 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 266, + "column" : 8, + "source_fragment" : "app_meter_idx_internal = app_meter_idx; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 267, + "column" : 29, + "source_fragment" : "= false; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_needs_gtpu_encap16"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 54, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.needs_gtpu_encap = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_teid19"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 55, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.teid = teid; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_qfi15"] + }, + { + "type" : "runtime_data", + "value" : 3 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 56, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.qfi = qfi; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_routing_ipv4_dst", + "id" : 63, + "runtime_data" : [ + { + "name" : "tun_dst_addr", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 314, + "column" : 35, + "source_fragment" : "= tun_dst_addr; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_app_id", + "id" : 64, + "runtime_data" : [ + { + "name" : "app_id", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_internal_app_id"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 334, + "column" : 8, + "source_fragment" : "internal_app_id = app_id" + } + } + ] + }, + { + "name" : "FabricIngress.upf.recirc_allow", + "id" : 65, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "hexstr", + "value" : "0x01fe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4", + "line" : 36, + "column" : 42, + "source_fragment" : "510; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "hexstr", + "value" : "0x0ffe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 147, + "column" : 34, + "source_fragment" : "12w4094; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._do_upf_uplink_recirc1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 364, + "column" : 29, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 365, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 366, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 367, + "column" : 28, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.recirc_deny", + "id" : 66, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x96" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 268, + "column" : 41, + "source_fragment" : "150, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._do_upf_uplink_recirc1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 375, + "column" : 29, + "source_fragment" : "= false; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 376, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 377, + "column" : 28, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.recirc_miss", + "id" : 67, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricIngress.int_watchlist.mark_to_report", + "id" : 68, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_report_type21"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 223, + "column" : 45, + "source_fragment" : "1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type47"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 223, + "column" : 45, + "source_fragment" : "1; ..." + } + } + ] + }, + { + "name" : "FabricIngress.int_watchlist.no_report", + "id" : 69, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_report_type21"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 219, + "column" : 50, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type47"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 219, + "column" : 50, + "source_fragment" : "0; ..." + } + } + ] + }, + { + "name" : "FabricIngress.int_watchlist.no_report_collector", + "id" : 70, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_report_type21"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 219, + "column" : 50, + "source_fragment" : "0; ..." + } + } + ] + }, + { + "name" : "FabricIngress.int_ingress.report_drop", + "id" : 71, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_bmd_type0"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 169, + "column" : 23, + "source_fragment" : "4, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_report_type21"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 221, + "column" : 45, + "source_fragment" : "4; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "hexstr", + "value" : "0x0ffe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 147, + "column" : 34, + "source_fragment" : "12w4094; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.mpls_label = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 73, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 79, + "column" : 17, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "hexstr", + "value" : "0x01fe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4", + "line" : 36, + "column" : 42, + "source_fragment" : "510; ..." + } + } + ] + }, + { + "name" : "fabric_v1model64", + "id" : 72, + "runtime_data" : [], + "primitives" : [ + { + "op" : "exit", + "parameters" : [], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 64, + "column" : 12, + "source_fragment" : "exit" + } + } + ] + }, + { + "name" : "fabric_v1model61", + "id" : 73, + "runtime_data" : [], + "primitives" : [ + { + "op" : "mark_to_drop", + "parameters" : [ + { + "type" : "header", + "value" : "standard_metadata" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "mark_to_drop(standard_md)" + } + } + ] + }, + { + "name" : "fabric_v1model70", + "id" : 74, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ig_port3"] + }, + { + "type" : "hexstr", + "value" : "0x01fe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4", + "line" : 36, + "column" : 42, + "source_fragment" : "510; ..." + } + } + ] + }, + { + "name" : "lookup_md_init21", + "id" : 75, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_vlan_id9"] + }, + { + "type" : "field", + "value" : ["_ingress_vlan_tag4", "vlan_id"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 21, + "column" : 27, + "source_fragment" : "= hdr.vlan_tag.vlan_id; ..." + } + } + ] + }, + { + "name" : "lookup_md_init15", + "id" : 76, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_eth_dst6"] + }, + { + "type" : "field", + "value" : ["_ingress_ethernet3", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 15, + "column" : 23, + "source_fragment" : "= hdr.ethernet.dst_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_eth_src7"] + }, + { + "type" : "field", + "value" : ["_ingress_ethernet3", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 16, + "column" : 23, + "source_fragment" : "= hdr.ethernet.src_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_eth_type8"] + }, + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 17, + "column" : 24, + "source_fragment" : "= hdr.eth_type.value; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_vlan_id9"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 19, + "column" : 23, + "source_fragment" : "= 0; ..." + } + } + ] + }, + { + "name" : "lookup_md_init38", + "id" : 77, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_tcp19", "sport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 38, + "column" : 32, + "source_fragment" : "= hdr.inner_tcp.sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_tcp19", "dport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 39, + "column" : 32, + "source_fragment" : "= hdr.inner_tcp.dport; ..." + } + } + ] + }, + { + "name" : "lookup_md_init41", + "id" : 78, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_udp20", "sport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 41, + "column" : 32, + "source_fragment" : "= hdr.inner_udp.sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_udp20", "dport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 42, + "column" : 32, + "source_fragment" : "= hdr.inner_udp.dport; ..." + } + } + ] + }, + { + "name" : "lookup_md_init44", + "id" : 79, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_type16"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_icmp21", "icmp_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 44, + "column" : 33, + "source_fragment" : "= hdr.inner_icmp.icmp_type; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_code17"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_icmp21", "icmp_code"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 45, + "column" : 33, + "source_fragment" : "= hdr.inner_icmp.icmp_code; ..." + } + } + ] + }, + { + "name" : "lookup_md_init33", + "id" : 80, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 33, + "column" : 27, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 34, + "column" : 28, + "source_fragment" : "= hdr.inner_ipv4.src_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 35, + "column" : 28, + "source_fragment" : "= hdr.inner_ipv4.dst_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "protocol"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 36, + "column" : 28, + "source_fragment" : "= hdr.inner_ipv4.protocol; ..." + } + } + ] + }, + { + "name" : "lookup_md_init53", + "id" : 81, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + }, + { + "type" : "field", + "value" : ["_ingress_tcp9", "sport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 53, + "column" : 32, + "source_fragment" : "= hdr.tcp.sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + }, + { + "type" : "field", + "value" : ["_ingress_tcp9", "dport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 54, + "column" : 32, + "source_fragment" : "= hdr.tcp.dport; ..." + } + } + ] + }, + { + "name" : "lookup_md_init56", + "id" : 82, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + }, + { + "type" : "field", + "value" : ["_ingress_udp10", "sport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 56, + "column" : 32, + "source_fragment" : "= hdr.udp.sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + }, + { + "type" : "field", + "value" : ["_ingress_udp10", "dport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 57, + "column" : 32, + "source_fragment" : "= hdr.udp.dport; ..." + } + } + ] + }, + { + "name" : "lookup_md_init59", + "id" : 83, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_type16"] + }, + { + "type" : "field", + "value" : ["_ingress_icmp11", "icmp_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 59, + "column" : 33, + "source_fragment" : "= hdr.icmp.icmp_type; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_code17"] + }, + { + "type" : "field", + "value" : ["_ingress_icmp11", "icmp_code"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 60, + "column" : 33, + "source_fragment" : "= hdr.icmp.icmp_code; ..." + } + } + ] + }, + { + "name" : "lookup_md_init48", + "id" : 84, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 48, + "column" : 27, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 49, + "column" : 28, + "source_fragment" : "= hdr.ipv4.src_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 50, + "column" : 28, + "source_fragment" : "= hdr.ipv4.dst_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 51, + "column" : 28, + "source_fragment" : "= hdr.ipv4.protocol; ..." + } + } + ] + }, + { + "name" : "lookup_md_init24", + "id" : 85, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 24, + "column" : 23, + "source_fragment" : "= false; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 25, + "column" : 24, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 26, + "column" : 24, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 27, + "column" : 24, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 28, + "column" : 24, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 29, + "column" : 24, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_type16"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 30, + "column" : 25, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_code17"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 31, + "column" : 25, + "source_fragment" : "= 0; ..." + } + } + ] + }, + { + "name" : "upf409", + "id" : 86, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_is_uplink"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 409, + "column" : 20, + "source_fragment" : "is_uplink = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ipv4_addr"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 410, + "column" : 20, + "source_fragment" : "app_ipv4_addr = fabric_md.lkp.ipv4_dst; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_l4_port"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 411, + "column" : 20, + "source_fragment" : "app_l4_port = fabric_md.lkp.l4_dport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ip_proto"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 412, + "column" : 20, + "source_fragment" : "app_ip_proto = fabric_md.lkp.ip_proto; ..." + } + } + ] + }, + { + "name" : "upf418", + "id" : 87, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ipv4_addr"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 418, + "column" : 20, + "source_fragment" : "app_ipv4_addr = fabric_md.lkp.ipv4_src; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_l4_port"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 419, + "column" : 20, + "source_fragment" : "app_l4_port = fabric_md.lkp.l4_sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ip_proto"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 420, + "column" : 20, + "source_fragment" : "app_ip_proto = fabric_md.lkp.ip_proto; ..." + } + } + ] + }, + { + "name" : "upf424", + "id" : 88, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ipv4_addr"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 424, + "column" : 20, + "source_fragment" : "app_ipv4_addr = fabric_md.lkp.ipv4_src; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_l4_port"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 425, + "column" : 20, + "source_fragment" : "app_l4_port = fabric_md.lkp.l4_sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ip_proto"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 426, + "column" : 20, + "source_fragment" : "app_ip_proto = fabric_md.lkp.ip_proto; ..." + } + } + ] + }, + { + "name" : "upf443", + "id" : 89, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_egress_upf_ctr18"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 443, + "column" : 16, + "source_fragment" : "fabric_md.bridged.upf.skip_egress_upf_ctr = true" + } + } + ] + }, + { + "name" : "upf448", + "id" : 90, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_14"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "upf_session_meter_idx_internal"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 448, + "column" : 44, + "source_fragment" : "(bit<32>) session_meter_idx_internal" + } + }, + { + "op" : "execute_meter", + "parameters" : [ + { + "type" : "meter_array", + "value" : "FabricIngress.upf.session_meter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_14"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 448, + "column" : 16, + "source_fragment" : "session_meter.execute_meter((bit<32>) session_meter_idx_internal, fabric_md.upf_meter_color)" + } + } + ] + }, + { + "name" : "upf445", + "id" : 91, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_15"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "upf_app_meter_idx_internal"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 445, + "column" : 36, + "source_fragment" : "(bit<32>) app_meter_idx_internal" + } + }, + { + "op" : "execute_meter", + "parameters" : [ + { + "type" : "meter_array", + "value" : "FabricIngress.upf.app_meter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_15"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 445, + "column" : 12, + "source_fragment" : "app_meter.execute_meter((bit<32>) app_meter_idx_internal, fabric_md.upf_meter_color)" + } + } + ] + }, + { + "name" : "upf461", + "id" : 92, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_16"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_upf_ctr_id14"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 461, + "column" : 43, + "source_fragment" : "(bit<32>)fabric_md.bridged.upf.upf_ctr_id" + } + }, + { + "op" : "count", + "parameters" : [ + { + "type" : "counter_array", + "value" : "FabricIngress.upf.terminations_counter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_16"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 461, + "column" : 16, + "source_fragment" : "terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)" + } + } + ] + }, + { + "name" : "upf25", + "id" : 93, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_is_uplink"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 25, + "column" : 4, + "source_fragment" : "bool is_uplink = false;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 26, + "column" : 4, + "source_fragment" : "bool term_hit = false;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 27, + "column" : 4, + "source_fragment" : "bool sess_hit = false;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ipv4_addr"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 28, + "column" : 4, + "source_fragment" : "bit<32> app_ipv4_addr = 0;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_l4_port"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 29, + "column" : 4, + "source_fragment" : "l4_port_t app_l4_port = 0;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ip_proto"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 30, + "column" : 4, + "source_fragment" : "bit<8> app_ip_proto = 0;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_internal_app_id"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 55, + "column" : 30, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_ue_session_id"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 32, + "column" : 4, + "source_fragment" : "ue_session_id_t ue_session_id = 0;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_session_meter_idx_internal"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 72, + "column" : 54, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_meter_idx_internal"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 73, + "column" : 46, + "source_fragment" : "0; ..." + } + } + ] + }, + { + "name" : "filtering100", + "id" : 94, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 100, + "column" : 31, + "source_fragment" : "(bit<32>)fabric_md.bridged.base.fwd_type" + } + }, + { + "op" : "count", + "parameters" : [ + { + "type" : "counter_array", + "value" : "FabricIngress.filtering.fwd_type_counter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_17"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 100, + "column" : 8, + "source_fragment" : "fwd_type_counter.count((bit<32>)fabric_md.bridged.base.fwd_type)" + } + } + ] + }, + { + "name" : "hasher28", + "id" : 95, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_18"] + }, + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_tun_peer_id13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 32, + "column" : 17, + "source_fragment" : "fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_19"] + }, + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_teid19"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 32, + "column" : 52, + "source_fragment" : "fabric_md.bridged" + } + }, + { + "op" : "modify_field_with_hash_based_offset", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + }, + { + "type" : "calculation", + "value" : "calc" + }, + { + "type" : "hexstr", + "value" : "0xffffffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 28, + "column" : 12, + "source_fragment" : "hash( ..." + } + } + ] + }, + { + "name" : "hasher39", + "id" : 96, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_20"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 43, + "column" : 17, + "source_fragment" : "hdr.ipv4.src_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_21"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 43, + "column" : 36, + "source_fragment" : "hdr.ipv4.dst_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_22"] + }, + { + "type" : "field", + "value" : ["_ingress_gtpu12", "teid"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 43, + "column" : 55, + "source_fragment" : "hdr.gtpu.teid" + } + }, + { + "op" : "modify_field_with_hash_based_offset", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + }, + { + "type" : "calculation", + "value" : "calc_0" + }, + { + "type" : "hexstr", + "value" : "0xffffffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 39, + "column" : 12, + "source_fragment" : "hash( ..." + } + } + ] + }, + { + "name" : "hasher50", + "id" : 97, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"] + }, + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_inner_hash1"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 50, + "column" : 32, + "source_fragment" : "= fabric_md.bridged.base.inner_hash; ..." + } + } + ] + }, + { + "name" : "hasher66", + "id" : 98, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_inner_hash1"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 66, + "column" : 12, + "source_fragment" : "fabric_md.bridged.base.inner_hash = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_23"] + }, + { + "type" : "field", + "value" : ["_ingress_ethernet3", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 71, + "column" : 17, + "source_fragment" : "hdr.ethernet.dst_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_24"] + }, + { + "type" : "field", + "value" : ["_ingress_ethernet3", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 71, + "column" : 40, + "source_fragment" : "hdr.ethernet.src_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_25"] + }, + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 71, + "column" : 63, + "source_fragment" : "hdr.eth_type.value" + } + }, + { + "op" : "modify_field_with_hash_based_offset", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + }, + { + "type" : "calculation", + "value" : "calc_1" + }, + { + "type" : "hexstr", + "value" : "0xffffffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 67, + "column" : 12, + "source_fragment" : "hash( ..." + } + } + ] + }, + { + "name" : "hasher17", + "id" : 99, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_26"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_27"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_28"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_29"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_30"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "modify_field_with_hash_based_offset", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_inner_hash1"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + }, + { + "type" : "calculation", + "value" : "calc_2" + }, + { + "type" : "hexstr", + "value" : "0xffffffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "hash( ..." + } + } + ] + }, + { + "name" : "slicing174", + "id" : 100, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_31"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_slice_tc12"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 174, + "column" : 41, + "source_fragment" : "(bit<32>) fabric_md.bridged.base.slice_tc" + } + }, + { + "op" : "execute_meter", + "parameters" : [ + { + "type" : "meter_array", + "value" : "FabricIngress.qos.slice_tc_meter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_31"] + }, + { + "type" : "field", + "value" : ["scalars", "qos_packet_color"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 174, + "column" : 12, + "source_fragment" : "slice_tc_meter.execute_meter((bit<32>) fabric_md.bridged.base.slice_tc, packet_color)" + } + } + ] + }, + { + "name" : "slicing177", + "id" : 101, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "qos_packet_color"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4", + "line" : 25, + "column" : 10, + "source_fragment" : "2 ..." + } + } + ] + }, + { + "name" : "int112", + "id" : 102, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_egress_port25"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 112, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.egress_port = standard_md.egress_spec" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_queue_id24"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 113, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.queue_id = 0" + } + } + ] + }, + { + "name" : "fabric_v1model110", + "id" : 103, + "runtime_data" : [], + "primitives" : [ + { + "op" : "mark_to_drop", + "parameters" : [ + { + "type" : "header", + "value" : "standard_metadata" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 110, + "column" : 12, + "source_fragment" : "mark_to_drop(standard_md)" + } + } + ] + }, + { + "name" : "fabric_v1model106", + "id" : 104, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_bridged36" + }, + { + "type" : "header", + "value" : "_ingress_bridged4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 106, + "column" : 8, + "source_fragment" : "fabric_md.egress.bridged = fabric_md" + } + } + ] + }, + { + "name" : "nop", + "id" : 105, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 106, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 107, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 108, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 109, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 110, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 111, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.stats.count", + "id" : 112, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.pkt_io_egress.set_switch_info", + "id" : 113, + "runtime_data" : [ + { + "name" : "cpu_port", + "bitwidth" : 9 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_cpu_port37"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 36, + "column" : 27, + "source_fragment" : "= (PortId_t)cpu_port; ..." + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.pop_mpls_if_present", + "id" : 114, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_mpls6" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "hdr.mpls.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ip_eth_type10"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 200, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.bridged" + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.set_mpls", + "id" : 115, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_mpls6" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 205, + "column" : 8, + "source_fragment" : "hdr.mpls.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_mpls6", "label"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_mpls_label2"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 206, + "column" : 8, + "source_fragment" : "hdr.mpls.label = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_mpls6", "tc"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 207, + "column" : 8, + "source_fragment" : "hdr.mpls.tc = 3w0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_mpls6", "bos"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 208, + "column" : 8, + "source_fragment" : "hdr.mpls.bos = 1w1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_mpls6", "ttl"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_mpls_ttl8"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 209, + "column" : 8, + "source_fragment" : "hdr.mpls.ttl = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + }, + { + "type" : "hexstr", + "value" : "0x8847" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 112, + "column" : 31, + "source_fragment" : "0x8847; ..." + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.push_vlan", + "id" : 116, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vlan_tag4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 217, + "column" : 8, + "source_fragment" : "hdr.vlan_tag.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_vlan_tag4", "eth_type"] + }, + { + "type" : "hexstr", + "value" : "0x8100" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 111, + "column" : 31, + "source_fragment" : "0x8100; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_vlan_tag4", "vlan_id"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_vlan_id6"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 221, + "column" : 8, + "source_fragment" : "hdr.vlan_tag.vlan_id = fabric_md.bridged" + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.pop_vlan", + "id" : 117, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vlan_tag4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 249, + "column" : 8, + "source_fragment" : "hdr.vlan_tag.setInvalid()" + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.drop", + "id" : 118, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 254, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + }, + { + "type" : "hexstr", + "value" : "0x82" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 257, + "column" : 35, + "source_fragment" : "130, ..." + } + } + ] + }, + { + "name" : "FabricEgress.dscp_rewriter.rewrite", + "id" : 119, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.dscp_rewriter.clear", + "id" : 120, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "dscp_rewriter_tmp_dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "tmp_dscp = 0" + } + } + ] + }, + { + "name" : "FabricEgress.upf.load_tunnel_params", + "id" : 121, + "runtime_data" : [ + { + "name" : "tunnel_src_port", + "bitwidth" : 16 + }, + { + "name" : "tunnel_src_addr", + "bitwidth" : 32 + }, + { + "name" : "tunnel_dst_addr", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 486, + "column" : 8, + "source_fragment" : "hdr.ipv4.src_addr = tunnel_src_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 487, + "column" : 8, + "source_fragment" : "hdr.ipv4.dst_addr = tunnel_dst_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "sport"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 488, + "column" : 8, + "source_fragment" : "hdr.udp.sport = tunnel_src_port" + } + } + ] + }, + { + "name" : "FabricEgress.upf.gtpu_only", + "id" : 122, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 551, + "column" : 8, + "source_fragment" : "hdr.inner_ipv4.setValid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + }, + { + "type" : "header", + "value" : "_ingress_ipv47" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 552, + "column" : 23, + "source_fragment" : "= hdr.ipv4; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 553, + "column" : 8, + "source_fragment" : "hdr.udp.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 554, + "column" : 8, + "source_fragment" : "hdr.gtpu.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 506, + "column" : 8, + "source_fragment" : "hdr.ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 507, + "column" : 8, + "source_fragment" : "hdr.ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 508, + "column" : 8, + "source_fragment" : "hdr.ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 509, + "column" : 8, + "source_fragment" : "hdr.ipv4.ecn = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x1513" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 511, + "column" : 8, + "source_fragment" : "hdr.ipv4.identification = 0x1513" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 512, + "column" : 8, + "source_fragment" : "hdr.ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 513, + "column" : 8, + "source_fragment" : "hdr.ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "dport"] + }, + { + "type" : "hexstr", + "value" : "0x0868" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 86, + "column" : 30, + "source_fragment" : "2152; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "version"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 87, + "column" : 22, + "source_fragment" : "3w1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "pt"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 89, + "column" : 37, + "source_fragment" : "1w1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "spare"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 527, + "column" : 8, + "source_fragment" : "hdr.gtpu.spare = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "seq_flag"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 529, + "column" : 8, + "source_fragment" : "hdr.gtpu.seq_flag = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "npdu_flag"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 530, + "column" : 8, + "source_fragment" : "hdr.gtpu.npdu_flag = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "msgtype"] + }, + { + "type" : "hexstr", + "value" : "0xff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 88, + "column" : 25, + "source_fragment" : "0xff; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "teid"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_teid19"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 533, + "column" : 8, + "source_fragment" : "hdr.gtpu.teid = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "seq_num"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 535, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.seq_num = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "n_pdu_num"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 536, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.n_pdu_num = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "next_ext"] + }, + { + "type" : "hexstr", + "value" : "0x85" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 91, + "column" : 33, + "source_fragment" : "0x85; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "len"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 94, + "column" : 32, + "source_fragment" : "8w1; // 1*4-octets ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "type"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 92, + "column" : 36, + "source_fragment" : "4w0; // Downlink ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "spare0"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 541, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.spare0 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "ppp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 542, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.ppp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "rqi"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 543, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.rqi = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "next_ext"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 90, + "column" : 34, + "source_fragment" : "0x0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "total_len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "hexstr", + "value" : "0x0024" + }, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 563, + "column" : 8, + "source_fragment" : "hdr.ipv4.total_len = 20 + 8 + 8 ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "hexstr", + "value" : "0x0010" + }, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 565, + "column" : 8, + "source_fragment" : "hdr.udp.len = 8 + 8 ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "msglen"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 567, + "column" : 8, + "source_fragment" : "hdr.gtpu.msglen = hdr.inner_ipv4.total_len" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "encap_presence"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 81, + "column" : 16, + "source_fragment" : "0x1, ..." + } + } + ] + }, + { + "name" : "FabricEgress.upf.gtpu_with_psc", + "id" : 123, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_options13" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 577, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 578, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 551, + "column" : 8, + "source_fragment" : "hdr.inner_ipv4.setValid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + }, + { + "type" : "header", + "value" : "_ingress_ipv47" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 552, + "column" : 23, + "source_fragment" : "= hdr.ipv4; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 553, + "column" : 8, + "source_fragment" : "hdr.udp.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 554, + "column" : 8, + "source_fragment" : "hdr.gtpu.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 506, + "column" : 8, + "source_fragment" : "hdr.ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 507, + "column" : 8, + "source_fragment" : "hdr.ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 508, + "column" : 8, + "source_fragment" : "hdr.ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 509, + "column" : 8, + "source_fragment" : "hdr.ipv4.ecn = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x1513" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 511, + "column" : 8, + "source_fragment" : "hdr.ipv4.identification = 0x1513" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 512, + "column" : 8, + "source_fragment" : "hdr.ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 513, + "column" : 8, + "source_fragment" : "hdr.ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "dport"] + }, + { + "type" : "hexstr", + "value" : "0x0868" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 86, + "column" : 30, + "source_fragment" : "2152; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "version"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 87, + "column" : 22, + "source_fragment" : "3w1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "pt"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 89, + "column" : 37, + "source_fragment" : "1w1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "spare"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 527, + "column" : 8, + "source_fragment" : "hdr.gtpu.spare = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "seq_flag"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 529, + "column" : 8, + "source_fragment" : "hdr.gtpu.seq_flag = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "npdu_flag"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 530, + "column" : 8, + "source_fragment" : "hdr.gtpu.npdu_flag = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "msgtype"] + }, + { + "type" : "hexstr", + "value" : "0xff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 88, + "column" : 25, + "source_fragment" : "0xff; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "teid"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_teid19"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 533, + "column" : 8, + "source_fragment" : "hdr.gtpu.teid = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "seq_num"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 535, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.seq_num = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "n_pdu_num"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 536, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.n_pdu_num = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "next_ext"] + }, + { + "type" : "hexstr", + "value" : "0x85" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 91, + "column" : 33, + "source_fragment" : "0x85; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "len"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 94, + "column" : 32, + "source_fragment" : "8w1; // 1*4-octets ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "type"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 92, + "column" : 36, + "source_fragment" : "4w0; // Downlink ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "spare0"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 541, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.spare0 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "ppp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 542, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.ppp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "rqi"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 543, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.rqi = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "next_ext"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 90, + "column" : 34, + "source_fragment" : "0x0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "total_len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "hexstr", + "value" : "0x002c" + }, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 580, + "column" : 8, + "source_fragment" : "hdr.ipv4.total_len = 20 + 8 + 8 ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "hexstr", + "value" : "0x0018" + }, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 583, + "column" : 8, + "source_fragment" : "hdr.udp.len = 8 + 8 ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "msglen"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "hexstr", + "value" : "0x0008" + }, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 586, + "column" : 8, + "source_fragment" : "hdr.gtpu.msglen = 4 + 4 ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "ex_flag"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 588, + "column" : 8, + "source_fragment" : "hdr.gtpu.ex_flag = 1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "qfi"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_qfi15"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 589, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.qfi = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "encap_presence"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 82, + "column" : 20, + "source_fragment" : "0x2, ..." + } + } + ] + }, + { + "name" : "FabricEgress.parser_emulator.parse_int_ingress_drop", + "id" : 124, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "hdr.report_ethernet.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 25, + "column" : 8, + "source_fragment" : "hdr.report_eth_type.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 37, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 39, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 40, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 41, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ecn = 2w0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 44, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 45, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 53, + "column" : 8, + "source_fragment" : "hdr.report_udp.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_udp", "sport"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 54, + "column" : 8, + "source_fragment" : "hdr.report_udp.sport = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 60, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ver"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ver = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "rsvd"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 66, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.rsvd = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.common_report_header.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_int_report_md39" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 79, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ip_eth_type"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 114, + "column" : 31, + "source_fragment" : "0x0800; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "report_type"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 221, + "column" : 45, + "source_fragment" : "4; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "mirror_type"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 85, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "bmd_type"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 169, + "column" : 23, + "source_fragment" : "4, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "encap_presence"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_encap_presence7"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 93, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.encap_presence = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "flow_hash"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_inner_hash1"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 94, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.flow_hash = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_drop_report_header", "drop_reason"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_drop_reason23"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 97, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.drop_reason = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 99, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "ig_port"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ig_port3"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 101, + "column" : 8, + "source_fragment" : "hdr.common_report_header.ig_port = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "eg_port"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 102, + "column" : 8, + "source_fragment" : "hdr.common_report_header.eg_port = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "queue_id"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 103, + "column" : 8, + "source_fragment" : "hdr.common_report_header.queue_id = 0" + } + } + ] + }, + { + "name" : "FabricEgress.parser_emulator.parse_int_ingress_drop", + "id" : 125, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "hdr.report_ethernet.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 25, + "column" : 8, + "source_fragment" : "hdr.report_eth_type.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 37, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 39, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 40, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 41, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ecn = 2w0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 44, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 45, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 53, + "column" : 8, + "source_fragment" : "hdr.report_udp.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_udp", "sport"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 54, + "column" : 8, + "source_fragment" : "hdr.report_udp.sport = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 60, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ver"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ver = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "rsvd"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 66, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.rsvd = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.common_report_header.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_int_report_md39" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 79, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ip_eth_type"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 114, + "column" : 31, + "source_fragment" : "0x0800; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "report_type"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 221, + "column" : 45, + "source_fragment" : "4; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "mirror_type"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 85, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "bmd_type"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 169, + "column" : 23, + "source_fragment" : "4, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "encap_presence"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_encap_presence7"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 93, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.encap_presence = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "flow_hash"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_inner_hash1"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 94, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.flow_hash = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_drop_report_header", "drop_reason"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_drop_reason23"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 97, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.drop_reason = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 99, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "ig_port"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ig_port3"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 101, + "column" : 8, + "source_fragment" : "hdr.common_report_header.ig_port = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "eg_port"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 102, + "column" : 8, + "source_fragment" : "hdr.common_report_header.eg_port = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "queue_id"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 103, + "column" : 8, + "source_fragment" : "hdr.common_report_header.queue_id = 0" + } + } + ] + }, + { + "name" : "FabricEgress.parser_emulator.parse_int_report_mirror", + "id" : 126, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "hdr.report_ethernet.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 25, + "column" : 8, + "source_fragment" : "hdr.report_eth_type.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 37, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 39, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 40, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 41, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ecn = 2w0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 44, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 45, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 53, + "column" : 8, + "source_fragment" : "hdr.report_udp.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_udp", "sport"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 54, + "column" : 8, + "source_fragment" : "hdr.report_udp.sport = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 60, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ver"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ver = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "rsvd"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 66, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.rsvd = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.common_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "bmd_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 110, + "column" : 8, + "source_fragment" : "fabric_md.bridged.bmd_type = fabric_md.int_report_md.bmd_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_vlan_id6"] + }, + { + "type" : "hexstr", + "value" : "0x0ffe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 147, + "column" : 34, + "source_fragment" : "12w4094; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 112, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.mpls_label = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 114, + "column" : 12, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ig_tstamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 118, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ig_tstamp = fabric_md.int_report_md.ig_tstamp" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "ig_port"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ig_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 121, + "column" : 8, + "source_fragment" : "hdr.common_report_header.ig_port = fabric_md.int_report_md.ig_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "eg_port"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "eg_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 122, + "column" : 8, + "source_fragment" : "hdr.common_report_header.eg_port = fabric_md.int_report_md.eg_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "queue_id"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "queue_id"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 123, + "column" : 8, + "source_fragment" : "hdr.common_report_header.queue_id = fabric_md.int_report_md.queue_id" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 126, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_local_report_header", "queue_occupancy"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "queue_occupancy"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 127, + "column" : 8, + "source_fragment" : "hdr.local_report_header.queue_occupancy = fabric_md.int_report_md.queue_occupancy" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_local_report_header", "eg_tstamp"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "eg_tstamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 128, + "column" : 8, + "source_fragment" : "hdr.local_report_header.eg_tstamp = fabric_md.int_report_md.eg_tstamp" + } + } + ] + }, + { + "name" : "FabricEgress.parser_emulator.parse_int_report_mirror", + "id" : 127, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "hdr.report_ethernet.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 25, + "column" : 8, + "source_fragment" : "hdr.report_eth_type.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 37, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 39, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 40, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 41, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ecn = 2w0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 44, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 45, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 53, + "column" : 8, + "source_fragment" : "hdr.report_udp.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_udp", "sport"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 54, + "column" : 8, + "source_fragment" : "hdr.report_udp.sport = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 60, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ver"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ver = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "rsvd"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 66, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.rsvd = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.common_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "bmd_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 110, + "column" : 8, + "source_fragment" : "fabric_md.bridged.bmd_type = fabric_md.int_report_md.bmd_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_vlan_id6"] + }, + { + "type" : "hexstr", + "value" : "0x0ffe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 147, + "column" : 34, + "source_fragment" : "12w4094; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 112, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.mpls_label = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 114, + "column" : 12, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ig_tstamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 118, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ig_tstamp = fabric_md.int_report_md.ig_tstamp" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "ig_port"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ig_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 121, + "column" : 8, + "source_fragment" : "hdr.common_report_header.ig_port = fabric_md.int_report_md.ig_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "eg_port"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "eg_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 122, + "column" : 8, + "source_fragment" : "hdr.common_report_header.eg_port = fabric_md.int_report_md.eg_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "queue_id"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "queue_id"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 123, + "column" : 8, + "source_fragment" : "hdr.common_report_header.queue_id = fabric_md.int_report_md.queue_id" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 126, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_local_report_header", "queue_occupancy"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "queue_occupancy"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 127, + "column" : 8, + "source_fragment" : "hdr.local_report_header.queue_occupancy = fabric_md.int_report_md.queue_occupancy" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_local_report_header", "eg_tstamp"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "eg_tstamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 128, + "column" : 8, + "source_fragment" : "hdr.local_report_header.eg_tstamp = fabric_md.int_report_md.eg_tstamp" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.check_quota", + "id" : 128, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.int_egress.reset_quota", + "id" : 129, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.int_egress.set_config", + "id" : 130, + "runtime_data" : [ + { + "name" : "hop_latency_mask", + "bitwidth" : 32 + }, + { + "name" : "timestamp_mask", + "bitwidth" : 48 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + }, + "right" : { + "type" : "local", + "value" : 0 + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 179, + "column" : 8, + "source_fragment" : "fabric_md.int_md.hop_latency = fabric_md.int_md.hop_latency & hop_latency_mask" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + }, + "right" : { + "type" : "local", + "value" : 1 + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 180, + "column" : 8, + "source_fragment" : "fabric_md.int_md.timestamp = fabric_md.int_md.timestamp & timestamp_mask" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.do_local_report_encap", + "id" : 131, + "runtime_data" : [ + { + "name" : "src_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_port", + "bitwidth" : 16 + }, + { + "name" : "switch_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "modify_field_rng_uniform", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + }, + { + "type" : "hexstr", + "value" : "0xffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 195, + "column" : 8, + "source_fragment" : "random(hdr.report_ipv4.identification, 0, 0xffff)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 197, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.src_addr = src_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dst_addr = mon_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_udp", "dport"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 199, + "column" : 8, + "source_fragment" : "hdr.report_udp.dport = mon_port; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_32"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_read", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_32"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 143, + "column" : 8, + "source_fragment" : "seq_number.read(reg, seq_number_idx)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000001" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 144, + "column" : 8, + "source_fragment" : "reg = reg + 1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_33"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_write", + "parameters" : [ + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_33"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 146, + "column" : 8, + "source_fragment" : "seq_number.write(seq_number_idx, reg)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "seq_no"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ] + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "dqf"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "report_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 201, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "switch_id"] + }, + { + "type" : "runtime_data", + "value" : 3 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 202, + "column" : 8, + "source_fragment" : "hdr.common_report_header.switch_id = switch_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad1"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 203, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad1 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 204, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad2 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 205, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad3 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_eth_type", "value"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 207, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._int_mirror_type3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 125, + "column" : 39, + "source_fragment" : "0xBF04; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 218, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setValid()" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.do_local_report_encap_mpls", + "id" : 132, + "runtime_data" : [ + { + "name" : "src_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_port", + "bitwidth" : 16 + }, + { + "name" : "mon_label", + "bitwidth" : 20 + }, + { + "name" : "switch_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "modify_field_rng_uniform", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + }, + { + "type" : "hexstr", + "value" : "0xffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 195, + "column" : 8, + "source_fragment" : "random(hdr.report_ipv4.identification, 0, 0xffff)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 197, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.src_addr = src_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dst_addr = mon_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_udp", "dport"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 199, + "column" : 8, + "source_fragment" : "hdr.report_udp.dport = mon_port; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_34"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_read", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_34"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 143, + "column" : 8, + "source_fragment" : "seq_number.read(reg, seq_number_idx)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000001" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 144, + "column" : 8, + "source_fragment" : "reg = reg + 1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_35"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_write", + "parameters" : [ + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_35"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 146, + "column" : 8, + "source_fragment" : "seq_number.write(seq_number_idx, reg)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "seq_no"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ] + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "dqf"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "report_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 201, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "switch_id"] + }, + { + "type" : "runtime_data", + "value" : 4 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 202, + "column" : 8, + "source_fragment" : "hdr.common_report_header.switch_id = switch_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad1"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 203, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad1 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 204, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad2 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 205, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad3 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_eth_type", "value"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 207, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._int_mirror_type3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 125, + "column" : 39, + "source_fragment" : "0xBF04; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 218, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 126, + "column" : 39, + "source_fragment" : "0xBF05; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_mpls" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 226, + "column" : 8, + "source_fragment" : "hdr.report_mpls.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "tc"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 227, + "column" : 8, + "source_fragment" : "hdr.report_mpls.tc = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "bos"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 228, + "column" : 8, + "source_fragment" : "hdr.report_mpls.bos = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 149, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "label"] + }, + { + "type" : "runtime_data", + "value" : 3 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 230, + "column" : 8, + "source_fragment" : "hdr.report_mpls.label = mon_label" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.do_drop_report_encap", + "id" : 133, + "runtime_data" : [ + { + "name" : "src_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_port", + "bitwidth" : 16 + }, + { + "name" : "switch_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "modify_field_rng_uniform", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + }, + { + "type" : "hexstr", + "value" : "0xffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 195, + "column" : 8, + "source_fragment" : "random(hdr.report_ipv4.identification, 0, 0xffff)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 197, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.src_addr = src_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dst_addr = mon_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_udp", "dport"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 199, + "column" : 8, + "source_fragment" : "hdr.report_udp.dport = mon_port; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_36"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_read", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_36"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 143, + "column" : 8, + "source_fragment" : "seq_number.read(reg, seq_number_idx)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000001" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 144, + "column" : 8, + "source_fragment" : "reg = reg + 1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_37"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_write", + "parameters" : [ + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_37"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 146, + "column" : 8, + "source_fragment" : "seq_number.write(seq_number_idx, reg)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "seq_no"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ] + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "dqf"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "report_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 201, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "switch_id"] + }, + { + "type" : "runtime_data", + "value" : 3 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 202, + "column" : 8, + "source_fragment" : "hdr.common_report_header.switch_id = switch_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad1"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 203, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad1 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 204, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad2 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 205, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad3 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_eth_type", "value"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 207, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._int_mirror_type3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 125, + "column" : 39, + "source_fragment" : "0xBF04; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 202, + "column" : 44, + "source_fragment" : "1; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 238, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.setValid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 241, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_drop_report_header", "drop_reason"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_int_bmd_drop_reason23"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 243, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.drop_reason =" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.do_drop_report_encap_mpls", + "id" : 134, + "runtime_data" : [ + { + "name" : "src_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_port", + "bitwidth" : 16 + }, + { + "name" : "mon_label", + "bitwidth" : 20 + }, + { + "name" : "switch_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "modify_field_rng_uniform", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + }, + { + "type" : "hexstr", + "value" : "0xffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 195, + "column" : 8, + "source_fragment" : "random(hdr.report_ipv4.identification, 0, 0xffff)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 197, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.src_addr = src_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dst_addr = mon_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_udp", "dport"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 199, + "column" : 8, + "source_fragment" : "hdr.report_udp.dport = mon_port; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_38"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_read", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_38"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 143, + "column" : 8, + "source_fragment" : "seq_number.read(reg, seq_number_idx)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000001" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 144, + "column" : 8, + "source_fragment" : "reg = reg + 1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_39"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_write", + "parameters" : [ + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_39"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 146, + "column" : 8, + "source_fragment" : "seq_number.write(seq_number_idx, reg)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "seq_no"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ] + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "dqf"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "report_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 201, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "switch_id"] + }, + { + "type" : "runtime_data", + "value" : 4 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 202, + "column" : 8, + "source_fragment" : "hdr.common_report_header.switch_id = switch_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad1"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 203, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad1 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 204, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad2 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 205, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad3 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_eth_type", "value"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 207, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._int_mirror_type3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 125, + "column" : 39, + "source_fragment" : "0xBF04; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 202, + "column" : 44, + "source_fragment" : "1; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 238, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.setValid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 241, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_drop_report_header", "drop_reason"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_int_bmd_drop_reason23"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 243, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.drop_reason =" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 126, + "column" : 39, + "source_fragment" : "0xBF05; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_mpls" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 251, + "column" : 8, + "source_fragment" : "hdr.report_mpls.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "tc"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 252, + "column" : 8, + "source_fragment" : "hdr.report_mpls.tc = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "bos"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 253, + "column" : 8, + "source_fragment" : "hdr.report_mpls.bos = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 149, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "label"] + }, + { + "type" : "runtime_data", + "value" : 3 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 256, + "column" : 8, + "source_fragment" : "hdr.report_mpls.label = mon_label" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.init_int_metadata", + "id" : 135, + "runtime_data" : [ + { + "name" : "report_type", + "bitwidth" : 3 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_int_bmd_mirror_session_id22"] + }, + { + "type" : "hexstr", + "value" : "0x01fa" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 208, + "column" : 43, + "source_fragment" : "0x1FA; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_fabric_md_int_report_md" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 293, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._int_mirror_type3"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 179, + "column" : 17, + "source_fragment" : "1, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "bmd_type"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 167, + "column" : 20, + "source_fragment" : "2, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "mirror_type"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 179, + "column" : 17, + "source_fragment" : "1, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ig_port"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ig_port3"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 299, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.ig_port =" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "eg_port"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "egress_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 300, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.eg_port = (PortId_t)standard_md.egress_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "queue_id"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_egress_qid"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 301, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.queue_id = egress_qid" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "queue_occupancy"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "deq_qdepth"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 302, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.queue_occupancy = standard_md.deq_qdepth" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ig_tstamp"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 303, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "eg_tstamp"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_global_timestamp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 304, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.eg_tstamp = standard_md.egress_global_timestamp[31:0]" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ip_eth_type10"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 305, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.ip_eth_type =" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "flow_hash"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_inner_hash1"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 306, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.flow_hash =" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "report_type"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 309, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.report_type = report_type" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.adjust_ip_udp_len", + "id" : 136, + "runtime_data" : [ + { + "name" : "adjust_ip", + "bitwidth" : 16 + }, + { + "name" : "adjust_udp", + "bitwidth" : 16 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "total_len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_fabric_md_pkt_length"] + }, + "right" : { + "type" : "local", + "value" : 0 + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 342, + "column" : 8, + "source_fragment" : "hdr_v1model.ingress.ipv4.total_len = fabric_md.pkt_length + adjust_ip" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_fabric_md_pkt_length"] + }, + "right" : { + "type" : "local", + "value" : 1 + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 343, + "column" : 8, + "source_fragment" : "hdr_v1model.ingress.udp.len = fabric_md.pkt_length + adjust_udp" + } + } + ] + }, + { + "name" : "fabric_v1model136", + "id" : 137, + "runtime_data" : [], + "primitives" : [ + { + "op" : "exit", + "parameters" : [], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 136, + "column" : 12, + "source_fragment" : "exit" + } + } + ] + }, + { + "name" : "fabric_v1model133", + "id" : 138, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_cpu_port37"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 133, + "column" : 8, + "source_fragment" : "fabric_md.egress.cpu_port = 0" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator148", + "id" : 139, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ipv47" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 148, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.ipv4.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_tcp9" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 149, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.tcp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 150, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.udp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_icmp11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 151, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.icmp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vxlan15" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 153, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.vxlan.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ethernet16" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 154, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.inner_ethernet.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_eth_type17" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 155, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.inner_eth_type.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 157, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_options13" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 158, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu_options.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 159, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu_ext_psc.setInvalid()" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator14", + "id" : 140, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_drop_reason23"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 144, + "column" : 12, + "source_fragment" : "fabric_md.egress.bridged.int_bmd.drop_reason = fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_report_type21"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type47"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 145, + "column" : 12, + "source_fragment" : "fabric_md.egress.bridged.int_bmd.report_type = fabric_md" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + }, + { + "type" : "header", + "value" : "_egress_report_ethernet24" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + }, + { + "type" : "header", + "value" : "_egress_report_eth_type25" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + }, + { + "type" : "header", + "value" : "_egress_report_ipv427" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + }, + { + "type" : "header", + "value" : "_egress_report_udp28" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + }, + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + }, + { + "type" : "header", + "value" : "_egress_common_report_header30" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + }, + { + "type" : "header", + "value" : "_egress_local_report_header31" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + }, + { + "type" : "header", + "value" : "_egress_drop_report_header32" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_is_int_recirc45"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 134, + "column" : 32, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vlan_tag4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 140, + "column" : 8, + "source_fragment" : "hdr_v1model.ingress.vlan_tag.setInvalid()" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator166", + "id" : 141, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x3" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 166, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator169", + "id" : 142, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x1" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 169, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(PRESERVE_INT_MD)" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator173", + "id" : 143, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_ethernet24" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_eth_type25" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_ipv427" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_udp28" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_common_report_header30" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_local_report_header31" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_drop_report_header32" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + } + ] + }, + { + "name" : "int_tna_parser_emulator148_0", + "id" : 144, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ipv47" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 148, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.ipv4.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_tcp9" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 149, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.tcp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 150, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.udp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_icmp11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 151, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.icmp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vxlan15" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 153, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.vxlan.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ethernet16" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 154, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.inner_ethernet.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_eth_type17" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 155, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.inner_eth_type.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 157, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_options13" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 158, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu_options.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 159, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu_ext_psc.setInvalid()" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator14_0", + "id" : 145, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + }, + { + "type" : "header", + "value" : "_egress_report_ethernet24" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + }, + { + "type" : "header", + "value" : "_egress_report_eth_type25" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + }, + { + "type" : "header", + "value" : "_egress_report_ipv427" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + }, + { + "type" : "header", + "value" : "_egress_report_udp28" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + }, + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + }, + { + "type" : "header", + "value" : "_egress_common_report_header30" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + }, + { + "type" : "header", + "value" : "_egress_local_report_header31" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + }, + { + "type" : "header", + "value" : "_egress_drop_report_header32" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_is_int_recirc45"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 134, + "column" : 32, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vlan_tag4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 140, + "column" : 8, + "source_fragment" : "hdr_v1model.ingress.vlan_tag.setInvalid()" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator166_0", + "id" : 146, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 166, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator169_0", + "id" : 147, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x1" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 169, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(PRESERVE_INT_MD)" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator173_0", + "id" : 148, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_ethernet24" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_eth_type25" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_ipv427" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_udp28" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_common_report_header30" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_local_report_header31" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_drop_report_header32" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + } + ] + }, + { + "name" : "packetio51", + "id" : 149, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_packet_in1" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 51, + "column" : 12, + "source_fragment" : "hdr.packet_in.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_packet_in1", "ingress_port"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_ingress_port50"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 52, + "column" : 12, + "source_fragment" : "hdr.packet_in.ingress_port = preserved_ig_port; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_fake_ethernet2" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 53, + "column" : 12, + "source_fragment" : "hdr.fake_ethernet.setInvalid()" + } + }, + { + "op" : "exit", + "parameters" : [], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 54, + "column" : 12, + "source_fragment" : "exit" + } + } + ] + }, + { + "name" : "packetio60", + "id" : 150, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_pkt_length46"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "packet_length"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x0000ffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xfff2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 60, + "column" : 37, + "source_fragment" : "= (bit<16>)standard_md.packet_length - 14; ..." + } + } + ] + }, + { + "name" : "next283", + "id" : 151, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_report_type21"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 219, + "column" : 50, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 285, + "column" : 21, + "source_fragment" : "= 1; ..." + } + } + ] + }, + { + "name" : "next325", + "id" : 152, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 325, + "column" : 25, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + }, + { + "type" : "hexstr", + "value" : "0x83" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 258, + "column" : 32, + "source_fragment" : "131, ..." + } + } + ] + }, + { + "name" : "next323", + "id" : 153, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_mpls6", "ttl"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["_ingress_mpls6", "ttl"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 323, + "column" : 12, + "source_fragment" : "hdr.mpls.ttl = hdr.mpls.ttl - 1" + } + } + ] + }, + { + "name" : "next333", + "id" : 154, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 333, + "column" : 20, + "source_fragment" : "hdr.ipv4.ttl = hdr.ipv4.ttl - 1" + } + } + ] + }, + { + "name" : "next336", + "id" : 155, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 336, + "column" : 29, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + }, + { + "type" : "hexstr", + "value" : "0x1a" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 247, + "column" : 30, + "source_fragment" : "26, ..." + } + } + ] + }, + { + "name" : "next343", + "id" : 156, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv68", "hop_limit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv68", "hop_limit"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 343, + "column" : 20, + "source_fragment" : "hdr.ipv6.hop_limit = hdr.ipv6.hop_limit - 1" + } + } + ] + }, + { + "name" : "next346", + "id" : 157, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 346, + "column" : 29, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + }, + { + "type" : "hexstr", + "value" : "0x1a" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 247, + "column" : 30, + "source_fragment" : "26, ..." + } + } + ] + }, + { + "name" : "upf610", + "id" : 158, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_udp20" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 610, + "column" : 20, + "source_fragment" : "hdr.inner_udp.setValid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_udp20" + }, + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 611, + "column" : 34, + "source_fragment" : "= hdr.udp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 612, + "column" : 20, + "source_fragment" : "hdr.udp.setInvalid()" + } + } + ] + }, + { + "name" : "upf615", + "id" : 159, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 615, + "column" : 20, + "source_fragment" : "hdr.inner_tcp.setValid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + }, + { + "type" : "header", + "value" : "_ingress_tcp9" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 616, + "column" : 34, + "source_fragment" : "= hdr.tcp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_tcp9" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 617, + "column" : 20, + "source_fragment" : "hdr.tcp.setInvalid()" + } + } + ] + }, + { + "name" : "upf620", + "id" : 160, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 620, + "column" : 20, + "source_fragment" : "hdr.inner_icmp.setValid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + }, + { + "type" : "header", + "value" : "_ingress_icmp11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 621, + "column" : 35, + "source_fragment" : "= hdr.icmp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_icmp11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 622, + "column" : 20, + "source_fragment" : "hdr.icmp.setInvalid()" + } + } + ] + }, + { + "name" : "upf628", + "id" : 161, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_40"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_upf_ctr_id14"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 628, + "column" : 43, + "source_fragment" : "(bit<32>)fabric_md.bridged.upf.upf_ctr_id" + } + }, + { + "op" : "count", + "parameters" : [ + { + "type" : "counter_array", + "value" : "FabricEgress.upf.terminations_counter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_40"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 628, + "column" : 16, + "source_fragment" : "terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)" + } + } + ] + }, + { + "name" : "int128", + "id" : 162, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_eth_type" + }, + { + "type" : "header", + "value" : "_egress_report_eth_type25" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_mpls" + }, + { + "type" : "header", + "value" : "_egress_report_mpls26" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_ipv4" + }, + { + "type" : "header", + "value" : "_egress_report_ipv427" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_udp" + }, + { + "type" : "header", + "value" : "_egress_report_udp28" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_fixed_header" + }, + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_common_report_header" + }, + { + "type" : "header", + "value" : "_egress_common_report_header30" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + }, + { + "type" : "header", + "value" : "_egress_local_report_header31" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_drop_report_header" + }, + { + "type" : "header", + "value" : "_egress_drop_report_header32" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_eth_type" + }, + { + "type" : "header", + "value" : "_egress_eth_type35" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_fabric_md_bridged" + }, + { + "type" : "header", + "value" : "_egress_bridged36" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_fabric_md_int_report_md" + }, + { + "type" : "header", + "value" : "_egress_int_report_md39" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_hop_latency40"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_timestamp41"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "vlan_stripped"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_vlan_stripped42"] + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "queue_report"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_queue_report43"] + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_fabric_md_pkt_length"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_pkt_length46"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_egress_qid"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 135, + "column" : 4, + "source_fragment" : "QueueId_t egress_qid = 0;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "-", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_global_timestamp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 365, + "column" : 8, + "source_fragment" : "fabric_md.int_md.hop_latency = standard_md.egress_global_timestamp[31:0] - fabric_md.bridged.base.ig_tstamp[31:0]" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "egress_global_timestamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 366, + "column" : 8, + "source_fragment" : "fabric_md.int_md.timestamp = standard_md.egress_global_timestamp" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "key_0"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "-", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_global_timestamp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x10" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 166, + "column" : 12, + "source_fragment" : " fabric_md.int_md.hop_latency[31:16]: range @name(\\\"hop_latency_upper\\\");" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "key_1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "-", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_global_timestamp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 167, + "column" : 12, + "source_fragment" : " fabric_md.int_md.hop_latency[15:0]: range @name(\\\"hop_latency_lower\\\");" + } + } + ] + }, + { + "name" : "int383", + "id" : 163, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_41"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_int_bmd_mirror_session_id22"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 384, + "column" : 20, + "source_fragment" : "(bit<32>)fabric_md.bridged.int_bmd.mirror_session_id" + } + }, + { + "op" : "clone_egress_pkt_to_egress", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_41"] + }, + { + "type" : "hexstr", + "value" : "0x1" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 383, + "column" : 16, + "source_fragment" : "clone_preserving_field_list(CloneType.E2E, ..." + } + } + ] + }, + { + "name" : "int373", + "id" : 164, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "|", + "left" : { + "type" : "hexstr", + "value" : "0x00" + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x7" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x03" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 373, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.hw_id = 4w0 ++ standard_md.egress_spec[8:7]" + } + } + ] + }, + { + "name" : "slicing217", + "id" : 165, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + { + "type" : "field", + "value" : ["scalars", "dscp_rewriter_tmp_dscp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 217, + "column" : 16, + "source_fragment" : "hdr.ipv4.dscp = tmp_dscp" + } + } + ] + }, + { + "name" : "slicing189", + "id" : 166, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_bridged36" + }, + { + "type" : "header", + "value" : "int_egress_fabric_md_bridged" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 391, + "column" : 30, + "source_fragment" : "= fabric_md; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_int_report_md39" + }, + { + "type" : "header", + "value" : "int_egress_fabric_md_int_report_md" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 391, + "column" : 30, + "source_fragment" : "= fabric_md; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_hop_latency40"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 391, + "column" : 30, + "source_fragment" : "= fabric_md; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_timestamp41"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 391, + "column" : 30, + "source_fragment" : "= fabric_md; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_eth_type25" + }, + { + "type" : "header", + "value" : "int_egress_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_mpls26" + }, + { + "type" : "header", + "value" : "int_egress_hdr_report_mpls" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_ipv427" + }, + { + "type" : "header", + "value" : "int_egress_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_udp28" + }, + { + "type" : "header", + "value" : "int_egress_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + }, + { + "type" : "header", + "value" : "int_egress_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_common_report_header30" + }, + { + "type" : "header", + "value" : "int_egress_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_local_report_header31" + }, + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_drop_report_header32" + }, + { + "type" : "header", + "value" : "int_egress_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_eth_type35" + }, + { + "type" : "header", + "value" : "int_egress_hdr_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "dscp_rewriter_tmp_dscp"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_slice_tc12"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 189, + "column" : 4, + "source_fragment" : "bit<6> tmp_dscp = fabric_md.bridged.base.slice_tc;" + } + } + ] + }, + { + "name" : "fabric_v1model170", + "id" : 167, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x5" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 170, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + } + } + ] + }, + { + "name" : "fabric_v1model174", + "id" : 168, + "runtime_data" : [], + "primitives" : [ + { + "op" : "mark_to_drop", + "parameters" : [ + { + "type" : "header", + "value" : "standard_metadata" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 174, + "column" : 12, + "source_fragment" : "mark_to_drop(standard_md)" + } + } + ] + } + ], + "pipelines" : [ + { + "name" : "ingress", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 35, + "column" : 8, + "source_fragment" : "FabricIngress" + }, + "init_table" : "tbl_fabric_v1model61", + "tables" : [ + { + "name" : "tbl_fabric_v1model61", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "mark_to_drop(standard_md)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [73], + "actions" : ["fabric_v1model61"], + "base_default_next" : "node_3", + "next_tables" : { + "fabric_v1model61" : "node_3" + }, + "default_entry" : { + "action_id" : 73, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model64", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 64, + "column" : 12, + "source_fragment" : "exit" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [72], + "actions" : ["fabric_v1model64"], + "base_default_next" : "node_5", + "next_tables" : { + "fabric_v1model64" : "node_5" + }, + "default_entry" : { + "action_id" : 72, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model70", + "id" : 2, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 70, + "column" : 51, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [74], + "actions" : ["fabric_v1model70"], + "base_default_next" : "tbl_lookup_md_init15", + "next_tables" : { + "fabric_v1model70" : "tbl_lookup_md_init15" + }, + "default_entry" : { + "action_id" : 74, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init15", + "id" : 3, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 15, + "column" : 23, + "source_fragment" : "= hdr.ethernet.dst_addr; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [76], + "actions" : ["lookup_md_init15"], + "base_default_next" : "node_8", + "next_tables" : { + "lookup_md_init15" : "node_8" + }, + "default_entry" : { + "action_id" : 76, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init21", + "id" : 4, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 21, + "column" : 27, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [75], + "actions" : ["lookup_md_init21"], + "base_default_next" : "tbl_lookup_md_init24", + "next_tables" : { + "lookup_md_init21" : "tbl_lookup_md_init24" + }, + "default_entry" : { + "action_id" : 75, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init24", + "id" : 5, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 24, + "column" : 23, + "source_fragment" : "= false; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [85], + "actions" : ["lookup_md_init24"], + "base_default_next" : "node_11", + "next_tables" : { + "lookup_md_init24" : "node_11" + }, + "default_entry" : { + "action_id" : 85, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init33", + "id" : 6, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 33, + "column" : 27, + "source_fragment" : "= true; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [80], + "actions" : ["lookup_md_init33"], + "base_default_next" : "node_13", + "next_tables" : { + "lookup_md_init33" : "node_13" + }, + "default_entry" : { + "action_id" : 80, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init38", + "id" : 7, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 38, + "column" : 32, + "source_fragment" : "= hdr.inner_tcp.sport; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [77], + "actions" : ["lookup_md_init38"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init38" : "node_27" + }, + "default_entry" : { + "action_id" : 77, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init41", + "id" : 8, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 41, + "column" : 32, + "source_fragment" : "= hdr.inner_udp.sport; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [78], + "actions" : ["lookup_md_init41"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init41" : "node_27" + }, + "default_entry" : { + "action_id" : 78, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init44", + "id" : 9, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 44, + "column" : 33, + "source_fragment" : "= hdr.inner_icmp.icmp_type; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [79], + "actions" : ["lookup_md_init44"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init44" : "node_27" + }, + "default_entry" : { + "action_id" : 79, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init48", + "id" : 10, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 48, + "column" : 27, + "source_fragment" : "= true; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [84], + "actions" : ["lookup_md_init48"], + "base_default_next" : "node_21", + "next_tables" : { + "lookup_md_init48" : "node_21" + }, + "default_entry" : { + "action_id" : 84, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init53", + "id" : 11, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 53, + "column" : 32, + "source_fragment" : "= hdr.tcp.sport; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [81], + "actions" : ["lookup_md_init53"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init53" : "node_27" + }, + "default_entry" : { + "action_id" : 81, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init56", + "id" : 12, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 56, + "column" : 32, + "source_fragment" : "= hdr.udp.sport; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [82], + "actions" : ["lookup_md_init56"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init56" : "node_27" + }, + "default_entry" : { + "action_id" : 82, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init59", + "id" : 13, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 59, + "column" : 33, + "source_fragment" : "= hdr.icmp.icmp_type; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [83], + "actions" : ["lookup_md_init59"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init59" : "node_27" + }, + "default_entry" : { + "action_id" : 83, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_pkt_io_do_packet_out", + "id" : 14, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 25, + "column" : 12, + "source_fragment" : "do_packet_out()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [9], + "actions" : ["FabricIngress.pkt_io.do_packet_out"], + "base_default_next" : "FabricIngress.int_watchlist.watchlist", + "next_tables" : { + "FabricIngress.pkt_io.do_packet_out" : "FabricIngress.int_watchlist.watchlist" + }, + "default_entry" : { + "action_id" : 9, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.int_watchlist.watchlist", + "id" : 15, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 34, + "column" : 10, + "source_fragment" : "watchlist" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ipv4_valid", + "target" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_src", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ip_proto", + "target" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"], + "mask" : null + }, + { + "match_type" : "range", + "name" : "l4_sport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"], + "mask" : null + }, + { + "match_type" : "range", + "name" : "l4_dport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"], + "mask" : null + } + ], + "match_type" : "range", + "type" : "simple", + "max_size" : 64, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [68, 70, 69], + "actions" : ["FabricIngress.int_watchlist.mark_to_report", "FabricIngress.int_watchlist.no_report_collector", "FabricIngress.int_watchlist.no_report"], + "base_default_next" : "FabricIngress.stats.flows", + "next_tables" : { + "FabricIngress.int_watchlist.mark_to_report" : "FabricIngress.stats.flows", + "FabricIngress.int_watchlist.no_report_collector" : "FabricIngress.stats.flows", + "FabricIngress.int_watchlist.no_report" : "FabricIngress.stats.flows" + }, + "default_entry" : { + "action_id" : 69, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.stats.flows", + "id" : 16, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 21, + "column" : 10, + "source_fragment" : "flows" + }, + "key" : [ + { + "match_type" : "ternary", + "name" : "ipv4_src", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ip_proto", + "target" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_sport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_dport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "ig_port", + "target" : ["_ingress_bridged4", "_base_ig_port3"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [8], + "actions" : ["FabricIngress.stats.count"], + "base_default_next" : "FabricIngress.slice_tc_classifier.classifier", + "next_tables" : { + "FabricIngress.stats.count" : "FabricIngress.slice_tc_classifier.classifier" + }, + "default_entry" : { + "action_id" : 8, + "action_const" : true, + "action_data" : ["0x0"], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.slice_tc_classifier.classifier", + "id" : 17, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 44, + "column" : 10, + "source_fragment" : "classifier" + }, + "key" : [ + { + "match_type" : "ternary", + "name" : "ig_port", + "target" : ["_ingress_bridged4", "_base_ig_port3"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_src", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ip_proto", + "target" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_sport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_dport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 512, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [37, 39, 38], + "actions" : ["FabricIngress.slice_tc_classifier.set_slice_id_tc", "FabricIngress.slice_tc_classifier.trust_dscp", "FabricIngress.slice_tc_classifier.no_classification"], + "base_default_next" : "FabricIngress.filtering.ingress_port_vlan", + "next_tables" : { + "FabricIngress.slice_tc_classifier.set_slice_id_tc" : "FabricIngress.filtering.ingress_port_vlan", + "FabricIngress.slice_tc_classifier.trust_dscp" : "FabricIngress.filtering.ingress_port_vlan", + "FabricIngress.slice_tc_classifier.no_classification" : "FabricIngress.filtering.ingress_port_vlan" + }, + "default_entry" : { + "action_id" : 38, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.filtering.ingress_port_vlan", + "id" : 18, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 42, + "column" : 10, + "source_fragment" : "ingress_port_vlan" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ig_port", + "target" : ["_ingress_bridged4", "_base_ig_port3"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "vlan_is_valid", + "target" : ["_ingress_vlan_tag4", "$valid$"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "vlan_id", + "target" : ["_ingress_vlan_tag4", "vlan_id"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [10, 11, 12], + "actions" : ["FabricIngress.filtering.deny", "FabricIngress.filtering.permit", "FabricIngress.filtering.permit_with_internal_vlan"], + "base_default_next" : "FabricIngress.filtering.fwd_classifier", + "next_tables" : { + "FabricIngress.filtering.deny" : "FabricIngress.filtering.fwd_classifier", + "FabricIngress.filtering.permit" : "FabricIngress.filtering.fwd_classifier", + "FabricIngress.filtering.permit_with_internal_vlan" : "FabricIngress.filtering.fwd_classifier" + }, + "default_entry" : { + "action_id" : 10, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.filtering.fwd_classifier", + "id" : 19, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 80, + "column" : 10, + "source_fragment" : "fwd_classifier" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ig_port", + "target" : ["_ingress_bridged4", "_base_ig_port3"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_dst", + "target" : ["_ingress_ethernet3", "dst_addr"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_type", + "target" : ["_ingress_eth_type5", "value"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "ip_eth_type", + "target" : ["_ingress_bridged4", "_base_ip_eth_type10"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [13], + "actions" : ["FabricIngress.filtering.set_forwarding_type"], + "base_default_next" : "tbl_filtering100", + "next_tables" : { + "FabricIngress.filtering.set_forwarding_type" : "tbl_filtering100" + }, + "default_entry" : { + "action_id" : 13, + "action_const" : true, + "action_data" : ["0x0"], + "action_entry_const" : true + } + }, + { + "name" : "tbl_filtering100", + "id" : 20, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 100, + "column" : 8, + "source_fragment" : "fwd_type_counter.count((bit<32>)fabric_md.bridged.base.fwd_type)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [94], + "actions" : ["filtering100"], + "base_default_next" : "node_35", + "next_tables" : { + "filtering100" : "node_35" + }, + "default_entry" : { + "action_id" : 94, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf25", + "id" : 21, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 25, + "column" : 4, + "source_fragment" : "bool is_uplink = false; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [93], + "actions" : ["upf25"], + "base_default_next" : "node_37", + "next_tables" : { + "upf25" : "node_37" + }, + "default_entry" : { + "action_id" : 93, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.interfaces", + "id" : 22, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 107, + "column" : 10, + "source_fragment" : "interfaces" + }, + "key" : [ + { + "match_type" : "lpm", + "name" : "ipv4_dst_addr", + "target" : ["_ingress_ipv47", "dst_addr"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "gtpu_is_valid", + "target" : ["_ingress_gtpu12", "$valid$"], + "mask" : null + } + ], + "match_type" : "lpm", + "type" : "simple", + "max_size" : 64, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [45, 46, 47, 48], + "actions" : ["FabricIngress.upf.iface_access", "FabricIngress.upf.iface_core", "FabricIngress.upf.iface_dbuf", "FabricIngress.upf.iface_miss"], + "base_default_next" : "FabricIngress.upf.applications", + "next_tables" : { + "FabricIngress.upf.iface_access" : "tbl_upf409", + "FabricIngress.upf.iface_core" : "tbl_upf418", + "FabricIngress.upf.iface_dbuf" : "tbl_upf424", + "FabricIngress.upf.iface_miss" : "FabricIngress.upf.applications" + }, + "default_entry" : { + "action_id" : 48, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf409", + "id" : 23, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 409, + "column" : 30, + "source_fragment" : "= true; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [86], + "actions" : ["upf409"], + "base_default_next" : "node_40", + "next_tables" : { + "upf409" : "node_40" + }, + "default_entry" : { + "action_id" : 86, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.uplink_sessions", + "id" : 24, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 213, + "column" : 10, + "source_fragment" : "uplink_sessions" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "tunnel_ipv4_dst", + "target" : ["_ingress_ipv47", "dst_addr"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "teid", + "target" : ["_ingress_gtpu12", "teid"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 100000, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [56, 50, 49], + "actions" : ["FabricIngress.upf.set_uplink_session", "FabricIngress.upf.set_uplink_session_drop", "FabricIngress.upf.set_uplink_session_miss"], + "base_default_next" : "FabricIngress.upf.applications", + "next_tables" : { + "FabricIngress.upf.set_uplink_session" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_uplink_session_drop" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_uplink_session_miss" : "FabricIngress.upf.applications" + }, + "default_entry" : { + "action_id" : 49, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf418", + "id" : 25, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 418, + "column" : 34, + "source_fragment" : "= fabric_md.lkp.ipv4_src; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [87], + "actions" : ["upf418"], + "base_default_next" : "FabricIngress.upf.downlink_sessions", + "next_tables" : { + "upf418" : "FabricIngress.upf.downlink_sessions" + }, + "default_entry" : { + "action_id" : 87, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.downlink_sessions", + "id" : 26, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 198, + "column" : 10, + "source_fragment" : "downlink_sessions" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ue_addr", + "target" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 100000, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [53, 54, 55, 52, 51], + "actions" : ["FabricIngress.upf.set_downlink_session", "FabricIngress.upf.set_downlink_session_buf", "FabricIngress.upf.set_downlink_session_buf_drop", "FabricIngress.upf.set_downlink_session_drop", "FabricIngress.upf.set_downlink_session_miss"], + "base_default_next" : "FabricIngress.upf.applications", + "next_tables" : { + "FabricIngress.upf.set_downlink_session" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_downlink_session_buf" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_downlink_session_buf_drop" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_downlink_session_drop" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_downlink_session_miss" : "FabricIngress.upf.applications" + }, + "default_entry" : { + "action_id" : 51, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf424", + "id" : 27, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 424, + "column" : 34, + "source_fragment" : "= fabric_md.lkp.ipv4_src; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [88], + "actions" : ["upf424"], + "base_default_next" : "FabricIngress.upf.downlink_sessions", + "next_tables" : { + "upf424" : "FabricIngress.upf.downlink_sessions" + }, + "default_entry" : { + "action_id" : 88, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.applications", + "id" : 28, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 337, + "column" : 10, + "source_fragment" : "applications" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "slice_id", + "target" : ["scalars", "userMetadata._ingress_upf_slice_id30"], + "mask" : null + }, + { + "match_type" : "lpm", + "name" : "app_ipv4_addr", + "target" : ["scalars", "upf_app_ipv4_addr"], + "mask" : null + }, + { + "match_type" : "range", + "name" : "app_l4_port", + "target" : ["scalars", "upf_app_l4_port"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "app_ip_proto", + "target" : ["scalars", "upf_app_ip_proto"], + "mask" : null + } + ], + "match_type" : "range", + "type" : "simple", + "max_size" : 5, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [64, 5], + "actions" : ["FabricIngress.upf.set_app_id", "nop"], + "base_default_next" : "node_47", + "next_tables" : { + "FabricIngress.upf.set_app_id" : "node_47", + "nop" : "node_47" + }, + "default_entry" : { + "action_id" : 5, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.uplink_terminations", + "id" : 29, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 280, + "column" : 10, + "source_fragment" : "uplink_terminations" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ue_session_id", + "target" : ["scalars", "upf_ue_session_id"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "app_id", + "target" : ["scalars", "upf_internal_app_id"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 100000, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [61, 59, 57], + "actions" : ["FabricIngress.upf.app_fwd", "FabricIngress.upf.uplink_drop", "FabricIngress.upf.uplink_drop_miss"], + "base_default_next" : "FabricIngress.upf.uplink_recirc_rules", + "next_tables" : { + "FabricIngress.upf.app_fwd" : "FabricIngress.upf.uplink_recirc_rules", + "FabricIngress.upf.uplink_drop" : "FabricIngress.upf.uplink_recirc_rules", + "FabricIngress.upf.uplink_drop_miss" : "FabricIngress.upf.uplink_recirc_rules" + }, + "default_entry" : { + "action_id" : 57, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.uplink_recirc_rules", + "id" : 30, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 387, + "column" : 10, + "source_fragment" : "uplink_recirc_rules" + }, + "key" : [ + { + "match_type" : "ternary", + "name" : "ipv4_src", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 64, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [65, 66, 67], + "actions" : ["FabricIngress.upf.recirc_allow", "FabricIngress.upf.recirc_deny", "FabricIngress.upf.recirc_miss"], + "base_default_next" : "tbl_upf445", + "next_tables" : { + "FabricIngress.upf.recirc_allow" : "tbl_upf445", + "FabricIngress.upf.recirc_deny" : "tbl_upf445", + "FabricIngress.upf.recirc_miss" : "tbl_upf445" + }, + "default_entry" : { + "action_id" : 67, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.downlink_terminations", + "id" : 31, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 295, + "column" : 10, + "source_fragment" : "downlink_terminations" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ue_session_id", + "target" : ["scalars", "upf_ue_session_id"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "app_id", + "target" : ["scalars", "upf_internal_app_id"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 100000, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [62, 60, 58], + "actions" : ["FabricIngress.upf.downlink_fwd_encap", "FabricIngress.upf.downlink_drop", "FabricIngress.upf.downlink_drop_miss"], + "base_default_next" : "tbl_upf445", + "next_tables" : { + "FabricIngress.upf.downlink_fwd_encap" : "tbl_upf445", + "FabricIngress.upf.downlink_drop" : "tbl_upf445", + "FabricIngress.upf.downlink_drop_miss" : "tbl_upf445" + }, + "default_entry" : { + "action_id" : 58, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf443", + "id" : 32, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 443, + "column" : 58, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [89], + "actions" : ["upf443"], + "base_default_next" : "tbl_upf445", + "next_tables" : { + "upf443" : "tbl_upf445" + }, + "default_entry" : { + "action_id" : 89, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf445", + "id" : 33, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 445, + "column" : 12, + "source_fragment" : "app_meter.execute_meter((bit<32>) app_meter_idx_internal, fabric_md.upf_meter_color)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [91], + "actions" : ["upf445"], + "base_default_next" : "node_54", + "next_tables" : { + "upf445" : "node_54" + }, + "default_entry" : { + "action_id" : 91, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf448", + "id" : 34, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 448, + "column" : 16, + "source_fragment" : "session_meter.execute_meter((bit<32>) session_meter_idx_internal, fabric_md.upf_meter_color)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [90], + "actions" : ["upf448"], + "base_default_next" : "FabricIngress.upf.ig_tunnel_peers", + "next_tables" : { + "upf448" : "FabricIngress.upf.ig_tunnel_peers" + }, + "default_entry" : { + "action_id" : 90, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.ig_tunnel_peers", + "id" : 35, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 317, + "column" : 10, + "source_fragment" : "ig_tunnel_peers" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "tun_peer_id", + "target" : ["_ingress_bridged4", "_upf_tun_peer_id13"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 256, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [63, 4], + "actions" : ["FabricIngress.upf.set_routing_ipv4_dst", "nop"], + "base_default_next" : "node_57", + "next_tables" : { + "FabricIngress.upf.set_routing_ipv4_dst" : "node_57", + "nop" : "node_57" + }, + "default_entry" : { + "action_id" : 4, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf461", + "id" : 36, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 461, + "column" : 16, + "source_fragment" : "terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [92], + "actions" : ["upf461"], + "base_default_next" : "node_59", + "next_tables" : { + "upf461" : "node_59" + }, + "default_entry" : { + "action_id" : 92, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.forwarding.bridging", + "id" : 37, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 39, + "column" : 10, + "source_fragment" : "bridging" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "vlan_id", + "target" : ["_ingress_bridged4", "_base_vlan_id6"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_dst", + "target" : ["_ingress_ethernet3", "dst_addr"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [18, 14], + "actions" : ["FabricIngress.forwarding.set_next_id_bridging", "FabricIngress.forwarding.set_int_drop_reason"], + "base_default_next" : "tbl_hasher17", + "next_tables" : { + "FabricIngress.forwarding.set_next_id_bridging" : "tbl_hasher17", + "FabricIngress.forwarding.set_int_drop_reason" : "tbl_hasher17" + }, + "default_entry" : { + "action_id" : 14, + "action_const" : true, + "action_data" : ["0x59"], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.forwarding.mpls", + "id" : 38, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 74, + "column" : 10, + "source_fragment" : "mpls" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "mpls_label", + "target" : ["_ingress_bridged4", "_base_mpls_label2"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [19, 15], + "actions" : ["FabricIngress.forwarding.pop_mpls_and_next", "FabricIngress.forwarding.set_int_drop_reason"], + "base_default_next" : "tbl_hasher17", + "next_tables" : { + "FabricIngress.forwarding.pop_mpls_and_next" : "tbl_hasher17", + "FabricIngress.forwarding.set_int_drop_reason" : "tbl_hasher17" + }, + "default_entry" : { + "action_id" : 15, + "action_const" : true, + "action_data" : ["0x81"], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.forwarding.routing_v4", + "id" : 39, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 116, + "column" : 10, + "source_fragment" : "routing_v4" + }, + "key" : [ + { + "match_type" : "lpm", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"], + "mask" : null + } + ], + "match_type" : "lpm", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [20, 21, 22, 16], + "actions" : ["FabricIngress.forwarding.set_next_id_routing_v4", "FabricIngress.forwarding.nop_routing_v4", "FabricIngress.forwarding.drop_routing_v4", "FabricIngress.forwarding.set_int_drop_reason"], + "base_default_next" : "tbl_hasher17", + "next_tables" : { + "FabricIngress.forwarding.set_next_id_routing_v4" : "tbl_hasher17", + "FabricIngress.forwarding.nop_routing_v4" : "tbl_hasher17", + "FabricIngress.forwarding.drop_routing_v4" : "tbl_hasher17", + "FabricIngress.forwarding.set_int_drop_reason" : "tbl_hasher17" + }, + "default_entry" : { + "action_id" : 16, + "action_const" : false, + "action_data" : ["0x1d"], + "action_entry_const" : false + } + }, + { + "name" : "FabricIngress.forwarding.routing_v6", + "id" : 40, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 155, + "column" : 10, + "source_fragment" : "routing_v6" + }, + "key" : [ + { + "match_type" : "lpm", + "name" : "ipv6_dst", + "target" : ["_ingress_ipv68", "dst_addr"], + "mask" : null + } + ], + "match_type" : "lpm", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [23, 24, 17], + "actions" : ["FabricIngress.forwarding.set_next_id_routing_v6", "FabricIngress.forwarding.drop_routing_v6", "FabricIngress.forwarding.set_int_drop_reason"], + "base_default_next" : "tbl_hasher17", + "next_tables" : { + "FabricIngress.forwarding.set_next_id_routing_v6" : "tbl_hasher17", + "FabricIngress.forwarding.drop_routing_v6" : "tbl_hasher17", + "FabricIngress.forwarding.set_int_drop_reason" : "tbl_hasher17" + }, + "default_entry" : { + "action_id" : 17, + "action_const" : false, + "action_data" : ["0x1d"], + "action_entry_const" : false + } + }, + { + "name" : "tbl_hasher17", + "id" : 41, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "hash( ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [99], + "actions" : ["hasher17"], + "base_default_next" : "node_69", + "next_tables" : { + "hasher17" : "node_69" + }, + "default_entry" : { + "action_id" : 99, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_hasher28", + "id" : 42, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 28, + "column" : 12, + "source_fragment" : "hash( ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [95], + "actions" : ["hasher28"], + "base_default_next" : "node_76", + "next_tables" : { + "hasher28" : "node_76" + }, + "default_entry" : { + "action_id" : 95, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_hasher39", + "id" : 43, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 39, + "column" : 12, + "source_fragment" : "hash( ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [96], + "actions" : ["hasher39"], + "base_default_next" : "node_76", + "next_tables" : { + "hasher39" : "node_76" + }, + "default_entry" : { + "action_id" : 96, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_hasher50", + "id" : 44, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 50, + "column" : 32, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [97], + "actions" : ["hasher50"], + "base_default_next" : "node_76", + "next_tables" : { + "hasher50" : "node_76" + }, + "default_entry" : { + "action_id" : 97, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_hasher66", + "id" : 45, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 66, + "column" : 46, + "source_fragment" : "= 0; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [98], + "actions" : ["hasher66"], + "base_default_next" : "node_76", + "next_tables" : { + "hasher66" : "node_76" + }, + "default_entry" : { + "action_id" : 98, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.pre_next.next_mpls", + "id" : 46, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 22, + "column" : 10, + "source_fragment" : "next_mpls" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "next_id", + "target" : ["scalars", "userMetadata._ingress_next_id21"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [25, 0], + "actions" : ["FabricIngress.pre_next.set_mpls_label", "nop"], + "base_default_next" : "FabricIngress.pre_next.next_vlan", + "next_tables" : { + "FabricIngress.pre_next.set_mpls_label" : "FabricIngress.pre_next.next_vlan", + "nop" : "FabricIngress.pre_next.next_vlan" + }, + "default_entry" : { + "action_id" : 0, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.pre_next.next_vlan", + "id" : 47, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 54, + "column" : 10, + "source_fragment" : "next_vlan" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "next_id", + "target" : ["scalars", "userMetadata._ingress_next_id21"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [26, 1], + "actions" : ["FabricIngress.pre_next.set_vlan", "nop"], + "base_default_next" : "FabricIngress.acl.acl", + "next_tables" : { + "FabricIngress.pre_next.set_vlan" : "FabricIngress.acl.acl", + "nop" : "FabricIngress.acl.acl" + }, + "default_entry" : { + "action_id" : 1, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.acl.acl", + "id" : 48, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 74, + "column" : 10, + "source_fragment" : "acl" + }, + "key" : [ + { + "match_type" : "ternary", + "name" : "ig_port", + "target" : ["_ingress_bridged4", "_base_ig_port3"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_dst", + "target" : ["_ingress_ethernet3", "dst_addr"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_src", + "target" : ["_ingress_ethernet3", "src_addr"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "vlan_id", + "target" : ["scalars", "userMetadata._ingress_lkp_vlan_id9"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_type", + "target" : ["scalars", "userMetadata._ingress_lkp_eth_type8"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_src", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ip_proto", + "target" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "icmp_type", + "target" : ["scalars", "userMetadata._ingress_lkp_icmp_type16"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "icmp_code", + "target" : ["scalars", "userMetadata._ingress_lkp_icmp_code17"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_sport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_dport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ig_port_type", + "target" : ["scalars", "userMetadata._ingress_ig_port_type33"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [27, 29, 28, 30, 31, 32], + "actions" : ["FabricIngress.acl.set_next_id_acl", "FabricIngress.acl.punt_to_cpu", "FabricIngress.acl.copy_to_cpu", "FabricIngress.acl.drop", "FabricIngress.acl.set_output_port", "FabricIngress.acl.nop_acl"], + "base_default_next" : "node_80", + "next_tables" : { + "FabricIngress.acl.set_next_id_acl" : "node_80", + "FabricIngress.acl.punt_to_cpu" : "node_80", + "FabricIngress.acl.copy_to_cpu" : "node_80", + "FabricIngress.acl.drop" : "node_80", + "FabricIngress.acl.set_output_port" : "node_80", + "FabricIngress.acl.nop_acl" : "node_80" + }, + "default_entry" : { + "action_id" : 32, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.next.hashed", + "id" : 49, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 127, + "column" : 10, + "source_fragment" : "hashed" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "next_id", + "target" : ["scalars", "userMetadata._ingress_next_id21"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "indirect_ws", + "action_profile" : "FabricIngress.next.hashed_profile", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [33, 34, 2], + "actions" : ["FabricIngress.next.output_hashed", "FabricIngress.next.routing_hashed", "nop"], + "base_default_next" : "FabricIngress.next.multicast", + "next_tables" : { + "FabricIngress.next.output_hashed" : "FabricIngress.next.multicast", + "FabricIngress.next.routing_hashed" : "FabricIngress.next.multicast", + "nop" : "FabricIngress.next.multicast" + } + }, + { + "name" : "FabricIngress.next.multicast", + "id" : 50, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 161, + "column" : 10, + "source_fragment" : "multicast" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "next_id", + "target" : ["scalars", "userMetadata._ingress_next_id21"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [35, 36], + "actions" : ["FabricIngress.next.set_mcast_group_id", "FabricIngress.next.reset_mcast_group_id"], + "base_default_next" : "FabricIngress.qos.set_slice_tc", + "next_tables" : { + "FabricIngress.next.set_mcast_group_id" : "FabricIngress.qos.set_slice_tc", + "FabricIngress.next.reset_mcast_group_id" : "FabricIngress.qos.set_slice_tc" + }, + "default_entry" : { + "action_id" : 36, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.qos.set_slice_tc", + "id" : 51, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 91, + "column" : 10, + "source_fragment" : "set_slice_tc" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "fabric_md.is_upf_hit", + "target" : ["scalars", "userMetadata._ingress_is_upf_hit29"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 2, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [40, 41, 7], + "actions" : ["FabricIngress.qos.use_upf", "FabricIngress.qos.use_default", "NoAction"], + "base_default_next" : "FabricIngress.qos.default_tc", + "next_tables" : { + "FabricIngress.qos.use_upf" : "FabricIngress.qos.default_tc", + "FabricIngress.qos.use_default" : "FabricIngress.qos.default_tc", + "NoAction" : "FabricIngress.qos.default_tc" + }, + "default_entry" : { + "action_id" : 7, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + }, + "entries" : [ + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 96, + "column" : 12, + "source_fragment" : "true: use_upf" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + } + ], + "action_entry" : { + "action_id" : 40, + "action_data" : [] + }, + "priority" : 1 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 97, + "column" : 12, + "source_fragment" : "false: use_default" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x00" + } + ], + "action_entry" : { + "action_id" : 41, + "action_data" : [] + }, + "priority" : 2 + } + ] + }, + { + "name" : "FabricIngress.qos.default_tc", + "id" : 52, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 150, + "column" : 10, + "source_fragment" : "default_tc" + }, + "key" : [ + { + "match_type" : "ternary", + "name" : "slice_tc", + "target" : ["_ingress_bridged4", "_base_slice_tc12"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "tc_unknown", + "target" : ["scalars", "userMetadata._ingress_tc_unknown28"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 16, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [44, 3], + "actions" : ["FabricIngress.qos.set_default_tc", "nop"], + "base_default_next" : "node_85", + "next_tables" : { + "FabricIngress.qos.set_default_tc" : "node_85", + "nop" : "node_85" + }, + "default_entry" : { + "action_id" : 3, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_slicing174", + "id" : 53, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 174, + "column" : 12, + "source_fragment" : "slice_tc_meter.execute_meter((bit<32>) fabric_md.bridged.base.slice_tc, packet_color)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [100], + "actions" : ["slicing174"], + "base_default_next" : "FabricIngress.qos.queues", + "next_tables" : { + "slicing174" : "FabricIngress.qos.queues" + }, + "default_entry" : { + "action_id" : 100, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_slicing177", + "id" : 54, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 177, + "column" : 25, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [101], + "actions" : ["slicing177"], + "base_default_next" : "FabricIngress.qos.queues", + "next_tables" : { + "slicing177" : "FabricIngress.qos.queues" + }, + "default_entry" : { + "action_id" : 101, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.qos.queues", + "id" : 55, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 122, + "column" : 10, + "source_fragment" : "queues" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "slice_tc", + "target" : ["_ingress_bridged4", "_base_slice_tc12"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "color", + "target" : ["scalars", "qos_packet_color"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 128, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [42, 43], + "actions" : ["FabricIngress.qos.set_queue", "FabricIngress.qos.meter_drop"], + "base_default_next" : "tbl_int112", + "next_tables" : { + "FabricIngress.qos.set_queue" : "tbl_int112", + "FabricIngress.qos.meter_drop" : "tbl_int112" + }, + "default_entry" : { + "action_id" : 42, + "action_const" : true, + "action_data" : ["0x0"], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int112", + "id" : 56, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 112, + "column" : 46, + "source_fragment" : "= standard_md.egress_spec; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [102], + "actions" : ["int112"], + "base_default_next" : "FabricIngress.int_ingress.drop_report", + "next_tables" : { + "int112" : "FabricIngress.int_ingress.drop_report" + }, + "default_entry" : { + "action_id" : 102, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.int_ingress.drop_report", + "id" : 57, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 86, + "column" : 10, + "source_fragment" : "drop_report" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "int_report_type", + "target" : ["_ingress_bridged4", "_int_bmd_report_type21"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "drop_ctl", + "target" : ["scalars", "userMetadata._drop_ctl2"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "punt_to_cpu", + "target" : ["scalars", "userMetadata._ingress_punt_to_cpu23"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "egress_port_set", + "target" : ["scalars", "userMetadata._ingress_egress_port_set22"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "mcast_group_id", + "target" : ["standard_metadata", "mcast_grp"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 3, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [71, 6], + "actions" : ["FabricIngress.int_ingress.report_drop", "nop"], + "base_default_next" : "tbl_fabric_v1model106", + "next_tables" : { + "FabricIngress.int_ingress.report_drop" : "tbl_fabric_v1model106", + "nop" : "tbl_fabric_v1model106" + }, + "default_entry" : { + "action_id" : 6, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + }, + "entries" : [ + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 101, + "column" : 12, + "source_fragment" : "(INT_REPORT_TYPE_FLOW, 1, false, false, _): report_drop()" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "ternary", + "key" : "0x0000", + "mask" : "0x0000" + } + ], + "action_entry" : { + "action_id" : 71, + "action_data" : [] + }, + "priority" : 1 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 102, + "column" : 12, + "source_fragment" : "(INT_REPORT_TYPE_FLOW, 1, false, true, _): report_drop()" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "ternary", + "key" : "0x0000", + "mask" : "0x0000" + } + ], + "action_entry" : { + "action_id" : 71, + "action_data" : [] + }, + "priority" : 2 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 104, + "column" : 12, + "source_fragment" : "(INT_REPORT_TYPE_FLOW, 0, false, false, 0): report_drop()" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "ternary", + "key" : "0x0000", + "mask" : "0xffff" + } + ], + "action_entry" : { + "action_id" : 71, + "action_data" : [] + }, + "priority" : 3 + } + ] + }, + { + "name" : "tbl_fabric_v1model106", + "id" : 58, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 106, + "column" : 33, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [104], + "actions" : ["fabric_v1model106"], + "base_default_next" : "node_92", + "next_tables" : { + "fabric_v1model106" : "node_92" + }, + "default_entry" : { + "action_id" : 104, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model110", + "id" : 59, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 110, + "column" : 12, + "source_fragment" : "mark_to_drop(standard_md)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [103], + "actions" : ["fabric_v1model110"], + "base_default_next" : null, + "next_tables" : { + "fabric_v1model110" : null + }, + "default_entry" : { + "action_id" : 103, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + } + ], + "action_profiles" : [ + { + "name" : "FabricIngress.next.hashed_profile", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 112, + "column" : 15, + "source_fragment" : "hashed_profile" + }, + "max_size" : 16, + "selector" : { + "algo" : "crc16", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"] + } + ] + } + } + ], + "conditionals" : [ + { + "name" : "node_3", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 62, + "column" : 12, + "source_fragment" : "standard_md.parser_error == error.PacketRejectedByParser" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "parser_error"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x8" + } + } + }, + "true_next" : "tbl_fabric_v1model64", + "false_next" : "node_5" + }, + { + "name" : "node_5", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 67, + "column" : 13, + "source_fragment" : "standard_md.instance_type == 4" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "instance_type"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000004" + } + } + }, + "true_next" : "tbl_fabric_v1model70", + "false_next" : "tbl_lookup_md_init15" + }, + { + "name" : "node_8", + "id" : 2, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 20, + "column" : 12, + "source_fragment" : "hdr.vlan_tag.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_vlan_tag4", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init21", + "false_next" : "tbl_lookup_md_init24" + }, + { + "name" : "node_11", + "id" : 3, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 32, + "column" : 12, + "source_fragment" : "hdr.inner_ipv4.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init33", + "false_next" : "node_19" + }, + { + "name" : "node_13", + "id" : 4, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 37, + "column" : 16, + "source_fragment" : "hdr.inner_tcp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_tcp19", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init38", + "false_next" : "node_15" + }, + { + "name" : "node_15", + "id" : 5, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 40, + "column" : 23, + "source_fragment" : "hdr.inner_udp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_udp20", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init41", + "false_next" : "node_17" + }, + { + "name" : "node_17", + "id" : 6, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 43, + "column" : 23, + "source_fragment" : "hdr.inner_icmp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_icmp21", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init44", + "false_next" : "node_27" + }, + { + "name" : "node_19", + "id" : 7, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 47, + "column" : 19, + "source_fragment" : "hdr.ipv4.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init48", + "false_next" : "node_27" + }, + { + "name" : "node_21", + "id" : 8, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 52, + "column" : 16, + "source_fragment" : "hdr.tcp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_tcp9", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init53", + "false_next" : "node_23" + }, + { + "name" : "node_23", + "id" : 9, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 55, + "column" : 23, + "source_fragment" : "hdr.udp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_udp10", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init56", + "false_next" : "node_25" + }, + { + "name" : "node_25", + "id" : 10, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 58, + "column" : 23, + "source_fragment" : "hdr.icmp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_icmp11", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init59", + "false_next" : "node_27" + }, + { + "name" : "node_27", + "id" : 11, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 24, + "column" : 12, + "source_fragment" : "hdr.packet_out.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_packet_out0", "$valid$"] + } + } + }, + "true_next" : "tbl_pkt_io_do_packet_out", + "false_next" : "FabricIngress.int_watchlist.watchlist" + }, + { + "name" : "node_35", + "id" : 12, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 84, + "column" : 13, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + } + } + }, + "false_next" : "tbl_upf25", + "true_next" : "node_59" + }, + { + "name" : "node_37", + "id" : 13, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 406, + "column" : 12, + "source_fragment" : "hdr.ipv4.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + }, + "true_next" : "FabricIngress.upf.interfaces", + "false_next" : "node_59" + }, + { + "name" : "node_40", + "id" : 14, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 413, + "column" : 24, + "source_fragment" : "fabric_md.bridged.base.encap_presence != EncapPresence.NONE" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + }, + "true_next" : "FabricIngress.upf.uplink_sessions", + "false_next" : "FabricIngress.upf.applications" + }, + { + "name" : "node_47", + "id" : 15, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 433, + "column" : 16, + "source_fragment" : "sess_hit" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + } + } + }, + "true_next" : "node_48", + "false_next" : "tbl_upf443" + }, + { + "name" : "node_48", + "id" : 16, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 434, + "column" : 20, + "source_fragment" : "is_uplink" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "upf_is_uplink"] + } + } + }, + "true_next" : "FabricIngress.upf.uplink_terminations", + "false_next" : "FabricIngress.upf.downlink_terminations" + }, + { + "name" : "node_54", + "id" : 17, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 446, + "column" : 16, + "source_fragment" : "fabric_md.upf_meter_color != MeterColor_t.RED" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" + } + } + }, + "true_next" : "tbl_upf448", + "false_next" : "FabricIngress.upf.ig_tunnel_peers" + }, + { + "name" : "node_57", + "id" : 18, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 451, + "column" : 16, + "source_fragment" : "term_hit" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + } + } + }, + "true_next" : "tbl_upf461", + "false_next" : "node_59" + }, + { + "name" : "node_59", + "id" : 19, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 88, + "column" : 13, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + } + } + }, + "false_next" : "node_60", + "true_next" : "tbl_hasher17" + }, + { + "name" : "node_60", + "id" : 20, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 178, + "column" : 12, + "source_fragment" : "hdr.ethernet.isValid() && ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ethernet3", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + } + } + }, + "true_next" : "FabricIngress.forwarding.bridging", + "false_next" : "node_62" + }, + { + "name" : "node_62", + "id" : 21, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 181, + "column" : 19, + "source_fragment" : "hdr.mpls.isValid() && ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_mpls6", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + }, + "true_next" : "FabricIngress.forwarding.mpls", + "false_next" : "node_64" + }, + { + "name" : "node_64", + "id" : 22, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 184, + "column" : 19, + "source_fragment" : "fabric_md.lkp.is_ipv4 && ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "or", + "left" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x03" + } + } + } + } + } + } + }, + "true_next" : "FabricIngress.forwarding.routing_v4", + "false_next" : "node_66" + }, + { + "name" : "node_66", + "id" : 23, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 188, + "column" : 19, + "source_fragment" : "hdr.ipv6.isValid() && ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv68", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + } + } + }, + "true_next" : "FabricIngress.forwarding.routing_v6", + "false_next" : "tbl_hasher17" + }, + { + "name" : "node_69", + "id" : 24, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 27, + "column" : 12, + "source_fragment" : "fabric_md.bridged" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_needs_gtpu_encap16"] + } + } + }, + "true_next" : "tbl_hasher28", + "false_next" : "node_71" + }, + { + "name" : "node_71", + "id" : 25, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 38, + "column" : 12, + "source_fragment" : "hdr.gtpu.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_gtpu12", "$valid$"] + } + } + }, + "true_next" : "tbl_hasher39", + "false_next" : "node_73" + }, + { + "name" : "node_73", + "id" : 26, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"] + } + } + }, + "true_next" : "tbl_hasher50", + "false_next" : "tbl_hasher66" + }, + { + "name" : "node_76", + "id" : 27, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 92, + "column" : 13, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + } + } + }, + "false_next" : "FabricIngress.pre_next.next_mpls", + "true_next" : "FabricIngress.acl.acl" + }, + { + "name" : "node_80", + "id" : 28, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 96, + "column" : 13, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + } + } + }, + "false_next" : "FabricIngress.next.hashed", + "true_next" : "FabricIngress.qos.set_slice_tc" + }, + { + "name" : "node_85", + "id" : 29, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 173, + "column" : 12, + "source_fragment" : "fabric_md.upf_meter_color != MeterColor_t.RED" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" + } + } + }, + "true_next" : "tbl_slicing174", + "false_next" : "tbl_slicing177" + }, + { + "name" : "node_92", + "id" : 30, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 109, + "column" : 12, + "source_fragment" : "fabric_md.drop_ctl == 1" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + }, + "false_next" : null, + "true_next" : "tbl_fabric_v1model110" + } + ] + }, + { + "name" : "egress", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 115, + "column" : 8, + "source_fragment" : "FabricEgress" + }, + "init_table" : "tbl_fabric_v1model133", + "tables" : [ + { + "name" : "tbl_fabric_v1model133", + "id" : 60, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 133, + "column" : 34, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [138], + "actions" : ["fabric_v1model133"], + "base_default_next" : "node_97", + "next_tables" : { + "fabric_v1model133" : "node_97" + }, + "default_entry" : { + "action_id" : 138, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model136", + "id" : 61, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 136, + "column" : 12, + "source_fragment" : "exit" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [137], + "actions" : ["fabric_v1model136"], + "base_default_next" : "node_99", + "next_tables" : { + "fabric_v1model136" : "node_99" + }, + "default_entry" : { + "action_id" : 137, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator14", + "id" : 62, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [140], + "actions" : ["int_tna_parser_emulator14"], + "base_default_next" : "node_101", + "next_tables" : { + "int_tna_parser_emulator14" : "node_101" + }, + "default_entry" : { + "action_id" : 140, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator148", + "id" : 63, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 148, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.ipv4.setInvalid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [139], + "actions" : ["int_tna_parser_emulator148"], + "base_default_next" : "node_103", + "next_tables" : { + "int_tna_parser_emulator148" : "node_103" + }, + "default_entry" : { + "action_id" : 139, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_parser_emulator_parse_int_ingress_drop", + "id" : 64, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 165, + "column" : 12, + "source_fragment" : "parse_int_ingress_drop()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [124], + "actions" : ["FabricEgress.parser_emulator.parse_int_ingress_drop"], + "base_default_next" : "tbl_int_tna_parser_emulator166", + "next_tables" : { + "FabricEgress.parser_emulator.parse_int_ingress_drop" : "tbl_int_tna_parser_emulator166" + }, + "default_entry" : { + "action_id" : 124, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator166", + "id" : 65, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 166, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [141], + "actions" : ["int_tna_parser_emulator166"], + "base_default_next" : "tbl_int_tna_parser_emulator173", + "next_tables" : { + "int_tna_parser_emulator166" : "tbl_int_tna_parser_emulator173" + }, + "default_entry" : { + "action_id" : 141, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_parser_emulator_parse_int_report_mirror", + "id" : 66, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 168, + "column" : 12, + "source_fragment" : "parse_int_report_mirror()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [126], + "actions" : ["FabricEgress.parser_emulator.parse_int_report_mirror"], + "base_default_next" : "tbl_int_tna_parser_emulator169", + "next_tables" : { + "FabricEgress.parser_emulator.parse_int_report_mirror" : "tbl_int_tna_parser_emulator169" + }, + "default_entry" : { + "action_id" : 126, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator169", + "id" : 67, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 169, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(PRESERVE_INT_MD)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [142], + "actions" : ["int_tna_parser_emulator169"], + "base_default_next" : "tbl_int_tna_parser_emulator173", + "next_tables" : { + "int_tna_parser_emulator169" : "tbl_int_tna_parser_emulator173" + }, + "default_entry" : { + "action_id" : 142, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator173", + "id" : 68, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [143], + "actions" : ["int_tna_parser_emulator173"], + "base_default_next" : "node_109", + "next_tables" : { + "int_tna_parser_emulator173" : "node_109" + }, + "default_entry" : { + "action_id" : 143, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator14_0", + "id" : 69, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [145], + "actions" : ["int_tna_parser_emulator14_0"], + "base_default_next" : "node_111", + "next_tables" : { + "int_tna_parser_emulator14_0" : "node_111" + }, + "default_entry" : { + "action_id" : 145, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator148_0", + "id" : 70, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 148, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.ipv4.setInvalid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [144], + "actions" : ["int_tna_parser_emulator148_0"], + "base_default_next" : "node_113", + "next_tables" : { + "int_tna_parser_emulator148_0" : "node_113" + }, + "default_entry" : { + "action_id" : 144, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_parser_emulator_parse_int_ingress_drop_0", + "id" : 71, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 165, + "column" : 12, + "source_fragment" : "parse_int_ingress_drop()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [125], + "actions" : ["FabricEgress.parser_emulator.parse_int_ingress_drop"], + "base_default_next" : "tbl_int_tna_parser_emulator166_0", + "next_tables" : { + "FabricEgress.parser_emulator.parse_int_ingress_drop" : "tbl_int_tna_parser_emulator166_0" + }, + "default_entry" : { + "action_id" : 125, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator166_0", + "id" : 72, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 166, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [146], + "actions" : ["int_tna_parser_emulator166_0"], + "base_default_next" : "tbl_int_tna_parser_emulator173_0", + "next_tables" : { + "int_tna_parser_emulator166_0" : "tbl_int_tna_parser_emulator173_0" + }, + "default_entry" : { + "action_id" : 146, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_parser_emulator_parse_int_report_mirror_0", + "id" : 73, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 168, + "column" : 12, + "source_fragment" : "parse_int_report_mirror()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [127], + "actions" : ["FabricEgress.parser_emulator.parse_int_report_mirror"], + "base_default_next" : "tbl_int_tna_parser_emulator169_0", + "next_tables" : { + "FabricEgress.parser_emulator.parse_int_report_mirror" : "tbl_int_tna_parser_emulator169_0" + }, + "default_entry" : { + "action_id" : 127, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator169_0", + "id" : 74, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 169, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(PRESERVE_INT_MD)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [147], + "actions" : ["int_tna_parser_emulator169_0"], + "base_default_next" : "tbl_int_tna_parser_emulator173_0", + "next_tables" : { + "int_tna_parser_emulator169_0" : "tbl_int_tna_parser_emulator173_0" + }, + "default_entry" : { + "action_id" : 147, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator173_0", + "id" : 75, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [148], + "actions" : ["int_tna_parser_emulator173_0"], + "base_default_next" : "FabricEgress.pkt_io_egress.switch_info", + "next_tables" : { + "int_tna_parser_emulator173_0" : "FabricEgress.pkt_io_egress.switch_info" + }, + "default_entry" : { + "action_id" : 148, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.pkt_io_egress.switch_info", + "id" : 76, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 39, + "column" : 10, + "source_fragment" : "switch_info" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [113, 105], + "actions" : ["FabricEgress.pkt_io_egress.set_switch_info", "nop"], + "base_default_next" : "node_120", + "next_tables" : { + "FabricEgress.pkt_io_egress.set_switch_info" : "node_120", + "nop" : "node_120" + }, + "default_entry" : { + "action_id" : 105, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + } + }, + { + "name" : "tbl_packetio51", + "id" : 77, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 51, + "column" : 12, + "source_fragment" : "hdr.packet_in.setValid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [149], + "actions" : ["packetio51"], + "base_default_next" : "node_122", + "next_tables" : { + "packetio51" : "node_122" + }, + "default_entry" : { + "action_id" : 149, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_packetio60", + "id" : 78, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 60, + "column" : 37, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [150], + "actions" : ["packetio60"], + "base_default_next" : "node_124", + "next_tables" : { + "packetio60" : "node_124" + }, + "default_entry" : { + "action_id" : 150, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.stats.flows", + "id" : 79, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 53, + "column" : 10, + "source_fragment" : "flows" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "stats_flow_id", + "target" : ["_egress_bridged36", "_base_stats_flow_id11"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "eg_port", + "target" : ["standard_metadata", "egress_port"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [112], + "actions" : ["FabricEgress.stats.count"], + "base_default_next" : "node_126", + "next_tables" : { + "FabricEgress.stats.count" : "node_126" + }, + "default_entry" : { + "action_id" : 112, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next283", + "id" : 80, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 283, + "column" : 50, + "source_fragment" : "= INT_REPORT_TYPE_NO_REPORT; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [151], + "actions" : ["next283"], + "base_default_next" : "node_128", + "next_tables" : { + "next283" : "node_128" + }, + "default_entry" : { + "action_id" : 151, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_egress_next_pop_mpls_if_present", + "id" : 81, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 289, + "column" : 36, + "source_fragment" : "pop_mpls_if_present()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [114], + "actions" : ["FabricEgress.egress_next.pop_mpls_if_present"], + "base_default_next" : "node_132", + "next_tables" : { + "FabricEgress.egress_next.pop_mpls_if_present" : "node_132" + }, + "default_entry" : { + "action_id" : 114, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_egress_next_set_mpls", + "id" : 82, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 291, + "column" : 12, + "source_fragment" : "set_mpls()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [115], + "actions" : ["FabricEgress.egress_next.set_mpls"], + "base_default_next" : "node_132", + "next_tables" : { + "FabricEgress.egress_next.set_mpls" : "node_132" + }, + "default_entry" : { + "action_id" : 115, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.egress_next.egress_vlan", + "id" : 83, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 264, + "column" : 10, + "source_fragment" : "egress_vlan" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "vlan_id", + "target" : ["_egress_bridged36", "_base_vlan_id6"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "eg_port", + "target" : ["standard_metadata", "egress_port"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [116, 117, 118], + "actions" : ["FabricEgress.egress_next.push_vlan", "FabricEgress.egress_next.pop_vlan", "FabricEgress.egress_next.drop"], + "base_default_next" : "node_134", + "next_tables" : { + "FabricEgress.egress_next.push_vlan" : "node_134", + "FabricEgress.egress_next.pop_vlan" : "node_134", + "FabricEgress.egress_next.drop" : "node_134" + }, + "default_entry" : { + "action_id" : 118, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next323", + "id" : 84, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 323, + "column" : 25, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [153], + "actions" : ["next323"], + "base_default_next" : "node_136", + "next_tables" : { + "next323" : "node_136" + }, + "default_entry" : { + "action_id" : 153, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next325", + "id" : 85, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 325, + "column" : 25, + "source_fragment" : "= 1; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [152], + "actions" : ["next325"], + "base_default_next" : "node_148", + "next_tables" : { + "next325" : "node_148" + }, + "default_entry" : { + "action_id" : 152, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next333", + "id" : 86, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 333, + "column" : 33, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [154], + "actions" : ["next333"], + "base_default_next" : "node_141", + "next_tables" : { + "next333" : "node_141" + }, + "default_entry" : { + "action_id" : 154, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next336", + "id" : 87, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 336, + "column" : 29, + "source_fragment" : "= 1; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [155], + "actions" : ["next336"], + "base_default_next" : "node_148", + "next_tables" : { + "next336" : "node_148" + }, + "default_entry" : { + "action_id" : 155, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next343", + "id" : 88, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 343, + "column" : 39, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [156], + "actions" : ["next343"], + "base_default_next" : "node_146", + "next_tables" : { + "next343" : "node_146" + }, + "default_entry" : { + "action_id" : 156, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next346", + "id" : 89, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 346, + "column" : 29, + "source_fragment" : "= 1; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [157], + "actions" : ["next346"], + "base_default_next" : "node_148", + "next_tables" : { + "next346" : "node_148" + }, + "default_entry" : { + "action_id" : 157, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf610", + "id" : 90, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 610, + "column" : 20, + "source_fragment" : "hdr.inner_udp.setValid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [158], + "actions" : ["upf610"], + "base_default_next" : "node_152", + "next_tables" : { + "upf610" : "node_152" + }, + "default_entry" : { + "action_id" : 158, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf615", + "id" : 91, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 615, + "column" : 20, + "source_fragment" : "hdr.inner_tcp.setValid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [159], + "actions" : ["upf615"], + "base_default_next" : "node_154", + "next_tables" : { + "upf615" : "node_154" + }, + "default_entry" : { + "action_id" : 159, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf620", + "id" : 92, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 620, + "column" : 20, + "source_fragment" : "hdr.inner_icmp.setValid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [160], + "actions" : ["upf620"], + "base_default_next" : "FabricEgress.upf.gtpu_encap", + "next_tables" : { + "upf620" : "FabricEgress.upf.gtpu_encap" + }, + "default_entry" : { + "action_id" : 160, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.upf.gtpu_encap", + "id" : 93, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 597, + "column" : 10, + "source_fragment" : "gtpu_encap" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [122, 123], + "actions" : ["FabricEgress.upf.gtpu_only", "FabricEgress.upf.gtpu_with_psc"], + "base_default_next" : "FabricEgress.upf.eg_tunnel_peers", + "next_tables" : { + "FabricEgress.upf.gtpu_only" : "FabricEgress.upf.eg_tunnel_peers", + "FabricEgress.upf.gtpu_with_psc" : "FabricEgress.upf.eg_tunnel_peers" + }, + "default_entry" : { + "action_id" : 122, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + } + }, + { + "name" : "FabricEgress.upf.eg_tunnel_peers", + "id" : 94, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 491, + "column" : 10, + "source_fragment" : "eg_tunnel_peers" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "tun_peer_id", + "target" : ["_egress_bridged36", "_upf_tun_peer_id13"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 256, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [121, 107], + "actions" : ["FabricEgress.upf.load_tunnel_params", "nop"], + "base_default_next" : "node_158", + "next_tables" : { + "FabricEgress.upf.load_tunnel_params" : "node_158", + "nop" : "node_158" + }, + "default_entry" : { + "action_id" : 107, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf628", + "id" : 95, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 628, + "column" : 16, + "source_fragment" : "terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [161], + "actions" : ["upf628"], + "base_default_next" : "tbl_int128", + "next_tables" : { + "upf628" : "tbl_int128" + }, + "default_entry" : { + "action_id" : 161, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int128", + "id" : 96, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [162], + "actions" : ["int128"], + "base_default_next" : "FabricEgress.int_egress.queue_latency_thresholds", + "next_tables" : { + "int128" : "FabricEgress.int_egress.queue_latency_thresholds" + }, + "default_entry" : { + "action_id" : 162, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.int_egress.queue_latency_thresholds", + "id" : 97, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 159, + "column" : 10, + "source_fragment" : "queue_latency_thresholds" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "egress_qid", + "target" : ["scalars", "int_egress_egress_qid"], + "mask" : null + }, + { + "match_type" : "range", + "name" : "hop_latency_upper", + "target" : ["scalars", "key_0"], + "mask" : null + }, + { + "match_type" : "range", + "name" : "hop_latency_lower", + "target" : ["scalars", "key_1"], + "mask" : null + } + ], + "match_type" : "range", + "type" : "simple", + "max_size" : 128, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [128, 129, 108], + "actions" : ["FabricEgress.int_egress.check_quota", "FabricEgress.int_egress.reset_quota", "nop"], + "base_default_next" : "FabricEgress.int_egress.config", + "next_tables" : { + "FabricEgress.int_egress.check_quota" : "FabricEgress.int_egress.config", + "FabricEgress.int_egress.reset_quota" : "FabricEgress.int_egress.config", + "nop" : "FabricEgress.int_egress.config" + }, + "default_entry" : { + "action_id" : 108, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + } + }, + { + "name" : "FabricEgress.int_egress.config", + "id" : 98, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 183, + "column" : 10, + "source_fragment" : "config" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [130], + "actions" : ["FabricEgress.int_egress.set_config"], + "base_default_next" : "tbl_int373", + "next_tables" : { + "FabricEgress.int_egress.set_config" : "tbl_int373" + }, + "default_entry" : { + "action_id" : 130, + "action_const" : false, + "action_data" : ["0xffffff00", "0xffffc0000000"], + "action_entry_const" : false + } + }, + { + "name" : "tbl_int373", + "id" : 99, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 373, + "column" : 38, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [164], + "actions" : ["int373"], + "base_default_next" : "node_164", + "next_tables" : { + "int373" : "node_164" + }, + "default_entry" : { + "action_id" : 164, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.int_egress.report", + "id" : 100, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 260, + "column" : 10, + "source_fragment" : "report" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "bmd_type", + "target" : ["int_egress_fabric_md_int_report_md", "bmd_type"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "mirror_type", + "target" : ["int_egress_fabric_md_int_report_md", "mirror_type"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "int_report_type", + "target" : ["int_egress_fabric_md_int_report_md", "report_type"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 6, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [131, 132, 133, 134, 109], + "actions" : ["FabricEgress.int_egress.do_local_report_encap", "FabricEgress.int_egress.do_local_report_encap_mpls", "FabricEgress.int_egress.do_drop_report_encap", "FabricEgress.int_egress.do_drop_report_encap_mpls", "nop"], + "base_default_next" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "next_tables" : { + "FabricEgress.int_egress.do_local_report_encap" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "FabricEgress.int_egress.do_local_report_encap_mpls" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "FabricEgress.int_egress.do_drop_report_encap" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "FabricEgress.int_egress.do_drop_report_encap_mpls" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "nop" : "FabricEgress.int_egress.adjust_int_report_hdr_length" + }, + "default_entry" : { + "action_id" : 109, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + } + }, + { + "name" : "FabricEgress.int_egress.int_metadata", + "id" : 101, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 315, + "column" : 10, + "source_fragment" : "int_metadata" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "int_report_type", + "target" : ["_egress_bridged36", "_int_bmd_report_type21"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "drop_ctl", + "target" : ["scalars", "userMetadata._drop_ctl2"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "queue_report", + "target" : ["scalars", "userMetadata._egress_int_md_queue_report43"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 2, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [135, 110], + "actions" : ["FabricEgress.int_egress.init_int_metadata", "nop"], + "base_default_next" : null, + "next_tables" : { + "__HIT__" : "tbl_int383", + "__MISS__" : "FabricEgress.int_egress.adjust_int_report_hdr_length" + }, + "default_entry" : { + "action_id" : 110, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + }, + "entries" : [ + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 327, + "column" : 12, + "source_fragment" : "(INT_REPORT_TYPE_FLOW, 0, false): init_int_metadata(INT_REPORT_TYPE_FLOW)" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "exact", + "key" : "0x00" + } + ], + "action_entry" : { + "action_id" : 135, + "action_data" : ["0x1"] + }, + "priority" : 1 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 329, + "column" : 12, + "source_fragment" : "(INT_REPORT_TYPE_FLOW, 1, false): init_int_metadata(INT_REPORT_TYPE_DROP)" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x00" + } + ], + "action_entry" : { + "action_id" : 135, + "action_data" : ["0x4"] + }, + "priority" : 2 + } + ] + }, + { + "name" : "tbl_int383", + "id" : 102, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 383, + "column" : 16, + "source_fragment" : "clone_preserving_field_list(CloneType.E2E, ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [163], + "actions" : ["int383"], + "base_default_next" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "next_tables" : { + "int383" : "FabricEgress.int_egress.adjust_int_report_hdr_length" + }, + "default_entry" : { + "action_id" : 163, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "id" : 103, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 347, + "column" : 10, + "source_fragment" : "adjust_int_report_hdr_length" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "is_int_wip", + "target" : ["int_egress_fabric_md_bridged", "_int_bmd_wip_type26"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 2, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [111, 136], + "actions" : ["nop", "FabricEgress.int_egress.adjust_ip_udp_len"], + "base_default_next" : "tbl_slicing189", + "next_tables" : { + "nop" : "tbl_slicing189", + "FabricEgress.int_egress.adjust_ip_udp_len" : "tbl_slicing189" + }, + "default_entry" : { + "action_id" : 111, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + }, + "entries" : [ + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 358, + "column" : 12, + "source_fragment" : "INT_IS_WIP: adjust_ip_udp_len(INT_WIP_ADJUST_IP_BYTES, INT_WIP_ADJUST_UDP_BYTES)" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + } + ], + "action_entry" : { + "action_id" : 136, + "action_data" : ["0xfff2", "0xffde"] + }, + "priority" : 1 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 359, + "column" : 12, + "source_fragment" : "INT_IS_WIP_WITH_MPLS: adjust_ip_udp_len(INT_WIP_ADJUST_IP_MPLS_BYTES, INT_WIP_ADJUST_UDP_MPLS_BYTES)" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x02" + } + ], + "action_entry" : { + "action_id" : 136, + "action_data" : ["0xffee", "0xffda"] + }, + "priority" : 2 + } + ] + }, + { + "name" : "tbl_slicing189", + "id" : 104, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 189, + "column" : 4, + "source_fragment" : "bit<6> tmp_dscp = fabric_md.bridged.base.slice_tc; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [166], + "actions" : ["slicing189"], + "base_default_next" : "FabricEgress.dscp_rewriter.rewriter", + "next_tables" : { + "slicing189" : "FabricEgress.dscp_rewriter.rewriter" + }, + "default_entry" : { + "action_id" : 166, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.dscp_rewriter.rewriter", + "id" : 105, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 201, + "column" : 10, + "source_fragment" : "rewriter" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "eg_port", + "target" : ["standard_metadata", "egress_port"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 512, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [119, 120, 106], + "actions" : ["FabricEgress.dscp_rewriter.rewrite", "FabricEgress.dscp_rewriter.clear", "nop"], + "base_default_next" : null, + "next_tables" : { + "__HIT__" : "node_171", + "__MISS__" : "node_173" + }, + "default_entry" : { + "action_id" : 106, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_slicing217", + "id" : 106, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 217, + "column" : 30, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [165], + "actions" : ["slicing217"], + "base_default_next" : "node_173", + "next_tables" : { + "slicing217" : "node_173" + }, + "default_entry" : { + "action_id" : 165, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model170", + "id" : 107, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 170, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [167], + "actions" : ["fabric_v1model170"], + "base_default_next" : "node_175", + "next_tables" : { + "fabric_v1model170" : "node_175" + }, + "default_entry" : { + "action_id" : 167, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model174", + "id" : 108, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 174, + "column" : 12, + "source_fragment" : "mark_to_drop(standard_md)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [168], + "actions" : ["fabric_v1model174"], + "base_default_next" : null, + "next_tables" : { + "fabric_v1model174" : null + }, + "default_entry" : { + "action_id" : 168, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + } + ], + "action_profiles" : [], + "conditionals" : [ + { + "name" : "node_97", + "id" : 31, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 135, + "column" : 12, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._skip_egress0"] + } + } + }, + "true_next" : "tbl_fabric_v1model136", + "false_next" : "node_99" + }, + { + "name" : "node_99", + "id" : 32, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 140, + "column" : 13, + "source_fragment" : "standard_md.instance_type == 2" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "instance_type"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000002" + } + } + }, + "true_next" : "tbl_int_tna_parser_emulator14", + "false_next" : "node_109" + }, + { + "name" : "node_101", + "id" : 33, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 145, + "column" : 11, + "source_fragment" : "hdr_v1model.ingress.gtpu.isValid() || hdr_v1model.ingress.vxlan.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "or", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_gtpu12", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_vxlan15", "$valid$"] + } + } + } + } + }, + "true_next" : "tbl_int_tna_parser_emulator148", + "false_next" : "node_103" + }, + { + "name" : "node_103", + "id" : 34, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 164, + "column" : 12, + "source_fragment" : "(bit<8>)fabric_md.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type47"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + }, + "true_next" : "tbl_parser_emulator_parse_int_ingress_drop", + "false_next" : "tbl_parser_emulator_parse_int_report_mirror" + }, + { + "name" : "node_109", + "id" : 35, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 150, + "column" : 11, + "source_fragment" : "(bit<8>)fabric_md.egress.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_report_type21"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + }, + "true_next" : "tbl_int_tna_parser_emulator14_0", + "false_next" : "FabricEgress.pkt_io_egress.switch_info" + }, + { + "name" : "node_111", + "id" : 36, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 145, + "column" : 11, + "source_fragment" : "hdr_v1model.ingress.gtpu.isValid() || hdr_v1model.ingress.vxlan.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "or", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_gtpu12", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_vxlan15", "$valid$"] + } + } + } + } + }, + "true_next" : "tbl_int_tna_parser_emulator148_0", + "false_next" : "node_113" + }, + { + "name" : "node_113", + "id" : 37, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 164, + "column" : 12, + "source_fragment" : "(bit<8>)fabric_md.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_report_type21"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + }, + "true_next" : "tbl_parser_emulator_parse_int_ingress_drop_0", + "false_next" : "tbl_parser_emulator_parse_int_report_mirror_0" + }, + { + "name" : "node_120", + "id" : 38, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 50, + "column" : 12, + "source_fragment" : "standard_md.egress_port == fabric_md.cpu_port" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_port"] + }, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_cpu_port37"] + } + } + }, + "true_next" : "tbl_packetio51", + "false_next" : "node_122" + }, + { + "name" : "node_122", + "id" : 39, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 58, + "column" : 12, + "source_fragment" : "hdr.fake_ethernet.isValid() && ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_fake_ethernet2", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_fake_ethernet2", "ether_type"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xbf03" + } + } + } + } + }, + "true_next" : "tbl_packetio60", + "false_next" : "node_124" + }, + { + "name" : "node_124", + "id" : 40, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 67, + "column" : 12, + "source_fragment" : "bmd_type == BridgedMdType_t.INGRESS_TO_EGRESS" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + }, + "true_next" : "FabricEgress.stats.flows", + "false_next" : "node_126" + }, + { + "name" : "node_126", + "id" : 41, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 280, + "column" : 12, + "source_fragment" : "fabric_md.bridged.base.is_multicast ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_is_multicast4"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ig_port3"] + }, + "right" : { + "type" : "field", + "value" : ["standard_metadata", "egress_port"] + } + } + } + } + }, + "true_next" : "tbl_next283", + "false_next" : "node_128" + }, + { + "name" : "node_128", + "id" : 42, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 288, + "column" : 12, + "source_fragment" : "fabric_md.bridged.base.mpls_label == 0" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_mpls_label2"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x000000" + } + } + }, + "true_next" : "node_129", + "false_next" : "tbl_egress_next_set_mpls" + }, + { + "name" : "node_129", + "id" : 43, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 289, + "column" : 16, + "source_fragment" : "hdr.mpls.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_mpls6", "$valid$"] + } + } + }, + "true_next" : "tbl_egress_next_pop_mpls_if_present", + "false_next" : "node_132" + }, + { + "name" : "node_132", + "id" : 44, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 159, + "column" : 39, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_is_int_recirc45"] + } + } + }, + "false_next" : "FabricEgress.egress_next.egress_vlan", + "true_next" : "node_134" + }, + { + "name" : "node_134", + "id" : 45, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 322, + "column" : 12, + "source_fragment" : "hdr.mpls.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_mpls6", "$valid$"] + } + } + }, + "true_next" : "tbl_next323", + "false_next" : "node_138" + }, + { + "name" : "node_136", + "id" : 46, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 324, + "column" : 16, + "source_fragment" : "hdr.mpls.ttl == 0" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_mpls6", "ttl"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + }, + "true_next" : "tbl_next325", + "false_next" : "node_148" + }, + { + "name" : "node_138", + "id" : 47, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 331, + "column" : 16, + "source_fragment" : "hdr.ipv4.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + } + } + }, + "true_next" : "node_139", + "false_next" : "node_143" + }, + { + "name" : "node_139", + "id" : 48, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 319, + "column" : 28, + "source_fragment" : "(fabric_md.bridged.bmd_type == BridgedMdType_t.INT_INGRESS_DROP) || ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "or", + "left" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" + } + } + } + } + }, + "false_next" : "tbl_next333", + "true_next" : "node_141" + }, + { + "name" : "node_141", + "id" : 49, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 335, + "column" : 20, + "source_fragment" : "hdr.ipv4.ttl == 0" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + }, + "true_next" : "tbl_next336", + "false_next" : "node_148" + }, + { + "name" : "node_143", + "id" : 50, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 341, + "column" : 23, + "source_fragment" : "hdr.ipv6.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv68", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + } + } + }, + "true_next" : "node_144", + "false_next" : "node_148" + }, + { + "name" : "node_144", + "id" : 51, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 319, + "column" : 28, + "source_fragment" : "(fabric_md.bridged.bmd_type == BridgedMdType_t.INT_INGRESS_DROP) || ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "or", + "left" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" + } + } + } + } + }, + "false_next" : "tbl_next343", + "true_next" : "node_146" + }, + { + "name" : "node_146", + "id" : 52, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 345, + "column" : 20, + "source_fragment" : "hdr.ipv6.hop_limit == 0" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv68", "hop_limit"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + }, + "true_next" : "tbl_next346", + "false_next" : "node_148" + }, + { + "name" : "node_148", + "id" : 53, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 607, + "column" : 13, + "source_fragment" : "fabric_md.bridged" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_skip_upf17"] + } + } + }, + "false_next" : "node_149", + "true_next" : "tbl_int128" + }, + { + "name" : "node_149", + "id" : 54, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 608, + "column" : 16, + "source_fragment" : "fabric_md.bridged" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_needs_gtpu_encap16"] + } + } + }, + "true_next" : "node_150", + "false_next" : "node_158" + }, + { + "name" : "node_150", + "id" : 55, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 609, + "column" : 20, + "source_fragment" : "hdr.udp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_udp10", "$valid$"] + } + } + }, + "true_next" : "tbl_upf610", + "false_next" : "node_152" + }, + { + "name" : "node_152", + "id" : 56, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 614, + "column" : 20, + "source_fragment" : "hdr.tcp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_tcp9", "$valid$"] + } + } + }, + "true_next" : "tbl_upf615", + "false_next" : "node_154" + }, + { + "name" : "node_154", + "id" : 57, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 619, + "column" : 20, + "source_fragment" : "hdr.icmp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_icmp11", "$valid$"] + } + } + }, + "true_next" : "tbl_upf620", + "false_next" : "FabricEgress.upf.gtpu_encap" + }, + { + "name" : "node_158", + "id" : 58, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 627, + "column" : 17, + "source_fragment" : "fabric_md.bridged" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_skip_egress_upf_ctr18"] + } + } + }, + "false_next" : "tbl_upf628", + "true_next" : "tbl_int128" + }, + { + "name" : "node_164", + "id" : 59, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 375, + "column" : 12, + "source_fragment" : "fabric_md.int_report_md.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "$valid$"] + } + } + }, + "true_next" : "FabricEgress.int_egress.report", + "false_next" : "FabricEgress.int_egress.int_metadata" + }, + { + "name" : "node_171", + "id" : 60, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 216, + "column" : 16, + "source_fragment" : "hdr.ipv4.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + }, + "true_next" : "tbl_slicing217", + "false_next" : "node_173" + }, + { + "name" : "node_173", + "id" : 61, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 168, + "column" : 12, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._do_upf_uplink_recirc1"] + } + } + }, + "true_next" : "tbl_fabric_v1model170", + "false_next" : "node_175" + }, + { + "name" : "node_175", + "id" : 62, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 173, + "column" : 12, + "source_fragment" : "fabric_md.drop_ctl == 1" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + }, + "false_next" : null, + "true_next" : "tbl_fabric_v1model174" + } + ] + } + ], + "checksums" : [ + { + "name" : "cksum", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 55, + "column" : 8, + "source_fragment" : "update_checksum(hdr.ingress.ipv4.isValid(), ..." + }, + "target" : ["_ingress_ipv47", "hdr_checksum"], + "type" : "generic", + "calculation" : "calc_3", + "verify" : false, + "update" : true, + "if_cond" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + } + }, + { + "name" : "cksum_0", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 73, + "column" : 8, + "source_fragment" : "update_checksum(hdr.ingress.inner_ipv4.isValid(), ..." + }, + "target" : ["_ingress_inner_ipv418", "hdr_checksum"], + "type" : "generic", + "calculation" : "calc_4", + "verify" : false, + "update" : true, + "if_cond" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "$valid$"] + } + } + } + }, + { + "name" : "cksum_1", + "id" : 2, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 92, + "column" : 8, + "source_fragment" : "update_checksum(hdr.egress.report_ipv4.isValid(), ..." + }, + "target" : ["_egress_report_ipv427", "hdr_checksum"], + "type" : "generic", + "calculation" : "calc_5", + "verify" : false, + "update" : true, + "if_cond" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_egress_report_ipv427", "$valid$"] + } + } + } + }, + { + "name" : "cksum_2", + "id" : 3, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 13, + "column" : 8, + "source_fragment" : "verify_checksum(hdr.ingress.ipv4.isValid(), ..." + }, + "target" : ["_ingress_ipv47", "hdr_checksum"], + "type" : "generic", + "calculation" : "calc_6", + "verify" : true, + "update" : false, + "if_cond" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + } + }, + { + "name" : "cksum_3", + "id" : 4, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 31, + "column" : 8, + "source_fragment" : "verify_checksum(hdr.ingress.inner_ipv4.isValid(), ..." + }, + "target" : ["_ingress_inner_ipv418", "hdr_checksum"], + "type" : "generic", + "calculation" : "calc_7", + "verify" : true, + "update" : false, + "if_cond" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "$valid$"] + } + } + } + } + ], + "force_arith" : [], + "extern_instances" : [], + "field_aliases" : [ + [ + "queueing_metadata.enq_timestamp", + ["standard_metadata", "enq_timestamp"] + ], + [ + "queueing_metadata.enq_qdepth", + ["standard_metadata", "enq_qdepth"] + ], + [ + "queueing_metadata.deq_timedelta", + ["standard_metadata", "deq_timedelta"] + ], + [ + "queueing_metadata.deq_qdepth", + ["standard_metadata", "deq_qdepth"] + ], + [ + "intrinsic_metadata.ingress_global_timestamp", + ["standard_metadata", "ingress_global_timestamp"] + ], + [ + "intrinsic_metadata.egress_global_timestamp", + ["standard_metadata", "egress_global_timestamp"] + ], + [ + "intrinsic_metadata.mcast_grp", + ["standard_metadata", "mcast_grp"] + ], + [ + "intrinsic_metadata.egress_rid", + ["standard_metadata", "egress_rid"] + ], + [ + "intrinsic_metadata.priority", + ["standard_metadata", "priority"] + ] + ], + "program" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "__meta__" : { + "version" : [2, 23], + "compiler" : "https://github.com/p4lang/p4c" + } +} \ No newline at end of file diff --git a/src/tests/p4-sd-fabric-svc-upf/p4src/p4info.txt b/src/tests/p4-sd-fabric-svc-upf/p4src/p4info.txt new file mode 100644 index 0000000000000000000000000000000000000000..d502367c0c2acb101b7ea4c4df11837b0d8c3271 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/p4src/p4info.txt @@ -0,0 +1,2482 @@ +pkg_info { + arch: "v1model" +} +tables { + preamble { + id: 41243186 + name: "FabricIngress.stats.flows" + alias: "FabricIngress.stats.flows" + } + match_fields { + id: 1 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 2 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 3 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 4 + name: "l4_sport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 5 + name: "l4_dport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 6 + name: "ig_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 21929788 + } + const_default_action_id: 21929788 + direct_resource_ids: 333776332 + size: 1024 +} +tables { + preamble { + id: 43310977 + name: "FabricIngress.filtering.ingress_port_vlan" + alias: "ingress_port_vlan" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: EXACT + } + match_fields { + id: 2 + name: "vlan_is_valid" + bitwidth: 1 + match_type: EXACT + } + match_fields { + id: 3 + name: "vlan_id" + bitwidth: 12 + match_type: TERNARY + } + action_refs { + id: 17164167 + } + action_refs { + id: 24158268 + } + action_refs { + id: 24266015 + } + const_default_action_id: 17164167 + direct_resource_ids: 326221069 + size: 1024 +} +tables { + preamble { + id: 49718154 + name: "FabricIngress.filtering.fwd_classifier" + alias: "fwd_classifier" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: EXACT + } + match_fields { + id: 2 + name: "eth_dst" + bitwidth: 48 + match_type: TERNARY + } + match_fields { + id: 3 + name: "eth_type" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 4 + name: "ip_eth_type" + bitwidth: 16 + match_type: EXACT + } + action_refs { + id: 25032921 + } + const_default_action_id: 25032921 + direct_resource_ids: 335473470 + size: 1024 +} +tables { + preamble { + id: 43623757 + name: "FabricIngress.forwarding.bridging" + alias: "bridging" + } + match_fields { + id: 1 + name: "vlan_id" + bitwidth: 12 + match_type: EXACT + } + match_fields { + id: 2 + name: "eth_dst" + bitwidth: 48 + match_type: TERNARY + } + action_refs { + id: 21791748 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 29734112 + direct_resource_ids: 330959985 + size: 1024 +} +tables { + preamble { + id: 37768578 + name: "FabricIngress.forwarding.mpls" + alias: "mpls" + } + match_fields { + id: 1 + name: "mpls_label" + bitwidth: 20 + match_type: EXACT + } + action_refs { + id: 30066030 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 29734112 + direct_resource_ids: 318961579 + size: 1024 +} +tables { + preamble { + id: 41754650 + name: "FabricIngress.forwarding.routing_v4" + alias: "routing_v4" + } + match_fields { + id: 1 + name: "ipv4_dst" + bitwidth: 32 + match_type: LPM + } + action_refs { + id: 19792090 + } + action_refs { + id: 29124955 + } + action_refs { + id: 17639597 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + direct_resource_ids: 333425635 + size: 1024 +} +tables { + preamble { + id: 49342721 + name: "FabricIngress.forwarding.routing_v6" + alias: "routing_v6" + } + match_fields { + id: 1 + name: "ipv6_dst" + bitwidth: 128 + match_type: LPM + } + action_refs { + id: 21856023 + } + action_refs { + id: 24646532 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + direct_resource_ids: 324042090 + size: 1024 +} +tables { + preamble { + id: 36626242 + name: "FabricIngress.pre_next.next_mpls" + alias: "next_mpls" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 22765924 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + direct_resource_ids: 330020245 + size: 1024 +} +tables { + preamble { + id: 48011802 + name: "FabricIngress.pre_next.next_vlan" + alias: "next_vlan" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 33475378 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + direct_resource_ids: 333692067 + size: 1024 +} +tables { + preamble { + id: 44104738 + name: "FabricIngress.acl.acl" + alias: "acl" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: TERNARY + } + match_fields { + id: 2 + name: "eth_dst" + bitwidth: 48 + match_type: TERNARY + } + match_fields { + id: 3 + name: "eth_src" + bitwidth: 48 + match_type: TERNARY + } + match_fields { + id: 4 + name: "vlan_id" + bitwidth: 12 + match_type: TERNARY + } + match_fields { + id: 5 + name: "eth_type" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 6 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 7 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 8 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 9 + name: "icmp_type" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 10 + name: "icmp_code" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 11 + name: "l4_sport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 12 + name: "l4_dport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 13 + name: "ig_port_type" + bitwidth: 2 + match_type: TERNARY + } + action_refs { + id: 23623126 + } + action_refs { + id: 23579892 + } + action_refs { + id: 21161133 + } + action_refs { + id: 23570973 + } + action_refs { + id: 24507494 + } + action_refs { + id: 29607214 + } + const_default_action_id: 29607214 + direct_resource_ids: 319194241 + size: 1024 +} +tables { + preamble { + id: 47960972 + name: "FabricIngress.next.hashed" + alias: "hashed" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 27301117 + } + action_refs { + id: 20985706 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + implementation_id: 289544276 + direct_resource_ids: 322798228 + size: 1024 +} +tables { + preamble { + id: 40619180 + name: "FabricIngress.next.multicast" + alias: "multicast" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 21629581 + } + action_refs { + id: 23637707 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 23637707 + direct_resource_ids: 319194968 + size: 1024 +} +tables { + preamble { + id: 34606298 + name: "FabricIngress.slice_tc_classifier.classifier" + alias: "classifier" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: TERNARY + } + match_fields { + id: 2 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 3 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 4 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 5 + name: "l4_sport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 6 + name: "l4_dport" + bitwidth: 16 + match_type: TERNARY + } + action_refs { + id: 23786376 + } + action_refs { + id: 25983516 + } + action_refs { + id: 30111108 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 30111108 + direct_resource_ids: 334706097 + size: 512 +} +tables { + preamble { + id: 36435258 + name: "FabricIngress.qos.queues" + alias: "queues" + } + match_fields { + id: 1 + name: "slice_tc" + bitwidth: 6 + match_type: EXACT + } + match_fields { + id: 2 + name: "color" + bitwidth: 2 + match_type: TERNARY + } + action_refs { + id: 32116918 + } + action_refs { + id: 28214351 + } + const_default_action_id: 32116918 + direct_resource_ids: 327743278 + size: 128 +} +tables { + preamble { + id: 43965782 + name: "FabricIngress.qos.default_tc" + alias: "default_tc" + } + match_fields { + id: 1 + name: "slice_tc" + bitwidth: 6 + match_type: TERNARY + } + match_fields { + id: 2 + name: "tc_unknown" + bitwidth: 1 + match_type: EXACT + } + action_refs { + id: 23587909 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 16 +} +tables { + preamble { + id: 41155994 + name: "FabricIngress.upf.interfaces" + alias: "interfaces" + } + match_fields { + id: 1 + name: "ipv4_dst_addr" + bitwidth: 32 + match_type: LPM + } + match_fields { + id: 2 + name: "gtpu_is_valid" + bitwidth: 1 + match_type: EXACT + } + action_refs { + id: 30131500 + } + action_refs { + id: 19786139 + } + action_refs { + id: 19466514 + } + action_refs { + id: 30204657 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 30204657 + size: 64 +} +tables { + preamble { + id: 37952203 + name: "FabricIngress.upf.downlink_sessions" + alias: "downlink_sessions" + } + match_fields { + id: 1 + name: "ue_addr" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 16984383 + } + action_refs { + id: 31195396 + } + action_refs { + id: 21581660 + } + action_refs { + id: 24509779 + } + action_refs { + id: 32013192 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 32013192 + size: 100000 +} +tables { + preamble { + id: 45463032 + name: "FabricIngress.upf.uplink_sessions" + alias: "uplink_sessions" + } + match_fields { + id: 1 + name: "tunnel_ipv4_dst" + bitwidth: 32 + match_type: EXACT + } + match_fields { + id: 2 + name: "teid" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 31219743 + } + action_refs { + id: 24328070 + } + action_refs { + id: 20368148 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 20368148 + size: 100000 +} +tables { + preamble { + id: 50169666 + name: "FabricIngress.upf.uplink_terminations" + alias: "uplink_terminations" + } + match_fields { + id: 1 + name: "ue_session_id" + bitwidth: 32 + match_type: EXACT + } + match_fields { + id: 2 + name: "app_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 25805419 + } + action_refs { + id: 28764209 + } + action_refs { + id: 20624836 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 20624836 + size: 100000 +} +tables { + preamble { + id: 35221941 + name: "FabricIngress.upf.downlink_terminations" + alias: "downlink_terminations" + } + match_fields { + id: 1 + name: "ue_session_id" + bitwidth: 32 + match_type: EXACT + } + match_fields { + id: 2 + name: "app_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 23536134 + } + action_refs { + id: 30742995 + } + action_refs { + id: 26608757 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 26608757 + size: 100000 +} +tables { + preamble { + id: 48831175 + name: "FabricIngress.upf.ig_tunnel_peers" + alias: "ig_tunnel_peers" + } + match_fields { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 26011763 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 256 +} +tables { + preamble { + id: 46184415 + name: "FabricIngress.upf.applications" + alias: "applications" + } + match_fields { + id: 1 + name: "slice_id" + bitwidth: 4 + match_type: EXACT + } + match_fields { + id: 2 + name: "app_ipv4_addr" + bitwidth: 32 + match_type: LPM + } + match_fields { + id: 3 + name: "app_l4_port" + bitwidth: 16 + match_type: RANGE + } + match_fields { + id: 4 + name: "app_ip_proto" + bitwidth: 8 + match_type: TERNARY + } + action_refs { + id: 26631629 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 5 +} +tables { + preamble { + id: 34400315 + name: "FabricIngress.upf.uplink_recirc_rules" + alias: "uplink_recirc_rules" + } + match_fields { + id: 1 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 2 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + action_refs { + id: 28119063 + } + action_refs { + id: 19222227 + } + action_refs { + id: 29186084 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 29186084 + direct_resource_ids: 335275671 + size: 64 +} +tables { + preamble { + id: 40748488 + name: "FabricIngress.int_watchlist.watchlist" + alias: "watchlist" + } + match_fields { + id: 1 + name: "ipv4_valid" + bitwidth: 1 + match_type: EXACT + } + match_fields { + id: 2 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 3 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 4 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 5 + name: "l4_sport" + bitwidth: 16 + match_type: RANGE + } + match_fields { + id: 6 + name: "l4_dport" + bitwidth: 16 + match_type: RANGE + } + action_refs { + id: 25078550 + } + action_refs { + id: 20118842 + } + action_refs { + id: 28396787 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28396787 + direct_resource_ids: 328581521 + size: 64 +} +tables { + preamble { + id: 43851059 + name: "FabricEgress.stats.flows" + alias: "FabricEgress.stats.flows" + } + match_fields { + id: 1 + name: "stats_flow_id" + bitwidth: 10 + match_type: EXACT + } + match_fields { + id: 2 + name: "eg_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 26838724 + } + const_default_action_id: 26838724 + direct_resource_ids: 334508337 + size: 1024 +} +tables { + preamble { + id: 35217901 + name: "FabricEgress.pkt_io_egress.switch_info" + alias: "switch_info" + } + action_refs { + id: 32804382 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + size: 1 +} +tables { + preamble { + id: 49262446 + name: "FabricEgress.egress_next.egress_vlan" + alias: "egress_vlan" + } + match_fields { + id: 1 + name: "vlan_id" + bitwidth: 12 + match_type: EXACT + } + match_fields { + id: 2 + name: "eg_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 30307755 + } + action_refs { + id: 17183246 + } + action_refs { + id: 30812542 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 30812542 + direct_resource_ids: 318892680 + size: 1024 +} +tables { + preamble { + id: 49970092 + name: "FabricEgress.dscp_rewriter.rewriter" + alias: "rewriter" + } + match_fields { + id: 1 + name: "eg_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 27951287 + } + action_refs { + id: 24120545 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 512 +} +tables { + preamble { + id: 37756041 + name: "FabricEgress.upf.eg_tunnel_peers" + alias: "eg_tunnel_peers" + } + match_fields { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 28490145 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 256 +} +tables { + preamble { + id: 35202849 + name: "FabricEgress.upf.gtpu_encap" + alias: "gtpu_encap" + } + action_refs { + id: 18154440 + } + action_refs { + id: 25872588 + } + size: 1 +} +tables { + preamble { + id: 36860953 + name: "FabricEgress.int_egress.queue_latency_thresholds" + alias: "queue_latency_thresholds" + } + match_fields { + id: 1 + name: "egress_qid" + bitwidth: 5 + match_type: EXACT + } + match_fields { + id: 2 + name: "hop_latency_upper" + bitwidth: 16 + match_type: RANGE + } + match_fields { + id: 3 + name: "hop_latency_lower" + bitwidth: 16 + match_type: RANGE + } + action_refs { + id: 22415037 + } + action_refs { + id: 19702294 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + size: 128 +} +tables { + preamble { + id: 40475827 + name: "FabricEgress.int_egress.config" + alias: "config" + } + action_refs { + id: 22425991 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + size: 1 +} +tables { + preamble { + id: 46071383 + name: "FabricEgress.int_egress.report" + alias: "report" + } + match_fields { + id: 1 + name: "bmd_type" + bitwidth: 8 + match_type: EXACT + } + match_fields { + id: 2 + name: "mirror_type" + bitwidth: 3 + match_type: EXACT + } + match_fields { + id: 3 + name: "int_report_type" + bitwidth: 3 + match_type: EXACT + } + action_refs { + id: 30783845 + } + action_refs { + id: 22769901 + } + action_refs { + id: 32486459 + } + action_refs { + id: 25343592 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + direct_resource_ids: 325056546 + size: 6 +} +actions { + preamble { + id: 28485346 + name: "nop" + alias: "nop" + } +} +actions { + preamble { + id: 21257015 + name: "NoAction" + alias: "NoAction" + annotations: "@noWarn(\"unused\")" + } +} +actions { + preamble { + id: 21929788 + name: "FabricIngress.stats.count" + alias: "FabricIngress.stats.count" + } + params { + id: 1 + name: "flow_id" + bitwidth: 10 + } +} +actions { + preamble { + id: 17164167 + name: "FabricIngress.filtering.deny" + alias: "deny" + } +} +actions { + preamble { + id: 24158268 + name: "FabricIngress.filtering.permit" + alias: "permit" + } + params { + id: 1 + name: "port_type" + bitwidth: 2 + } +} +actions { + preamble { + id: 24266015 + name: "FabricIngress.filtering.permit_with_internal_vlan" + alias: "permit_with_internal_vlan" + } + params { + id: 1 + name: "vlan_id" + bitwidth: 12 + } + params { + id: 2 + name: "port_type" + bitwidth: 2 + } +} +actions { + preamble { + id: 25032921 + name: "FabricIngress.filtering.set_forwarding_type" + alias: "set_forwarding_type" + } + params { + id: 1 + name: "fwd_type" + bitwidth: 3 + } +} +actions { + preamble { + id: 29734112 + name: "FabricIngress.forwarding.set_int_drop_reason" + alias: "set_int_drop_reason" + } + params { + id: 1 + name: "drop_reason" + bitwidth: 8 + } +} +actions { + preamble { + id: 21791748 + name: "FabricIngress.forwarding.set_next_id_bridging" + alias: "set_next_id_bridging" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 30066030 + name: "FabricIngress.forwarding.pop_mpls_and_next" + alias: "pop_mpls_and_next" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 19792090 + name: "FabricIngress.forwarding.set_next_id_routing_v4" + alias: "set_next_id_routing_v4" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 29124955 + name: "FabricIngress.forwarding.nop_routing_v4" + alias: "nop_routing_v4" + } +} +actions { + preamble { + id: 17639597 + name: "FabricIngress.forwarding.drop_routing_v4" + alias: "drop_routing_v4" + } +} +actions { + preamble { + id: 21856023 + name: "FabricIngress.forwarding.set_next_id_routing_v6" + alias: "set_next_id_routing_v6" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 24646532 + name: "FabricIngress.forwarding.drop_routing_v6" + alias: "drop_routing_v6" + } +} +actions { + preamble { + id: 22765924 + name: "FabricIngress.pre_next.set_mpls_label" + alias: "set_mpls_label" + } + params { + id: 1 + name: "label" + bitwidth: 20 + } +} +actions { + preamble { + id: 33475378 + name: "FabricIngress.pre_next.set_vlan" + alias: "set_vlan" + } + params { + id: 1 + name: "vlan_id" + bitwidth: 12 + } +} +actions { + preamble { + id: 23623126 + name: "FabricIngress.acl.set_next_id_acl" + alias: "set_next_id_acl" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 21161133 + name: "FabricIngress.acl.copy_to_cpu" + alias: "copy_to_cpu" + } +} +actions { + preamble { + id: 23579892 + name: "FabricIngress.acl.punt_to_cpu" + alias: "punt_to_cpu" + } +} +actions { + preamble { + id: 23570973 + name: "FabricIngress.acl.drop" + alias: "acl.drop" + } +} +actions { + preamble { + id: 24507494 + name: "FabricIngress.acl.set_output_port" + alias: "set_output_port" + } + params { + id: 1 + name: "port_num" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } +} +actions { + preamble { + id: 29607214 + name: "FabricIngress.acl.nop_acl" + alias: "nop_acl" + } +} +actions { + preamble { + id: 27301117 + name: "FabricIngress.next.output_hashed" + alias: "output_hashed" + } + params { + id: 1 + name: "port_num" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } +} +actions { + preamble { + id: 20985706 + name: "FabricIngress.next.routing_hashed" + alias: "routing_hashed" + } + params { + id: 1 + name: "port_num" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + params { + id: 2 + name: "smac" + bitwidth: 48 + } + params { + id: 3 + name: "dmac" + bitwidth: 48 + } +} +actions { + preamble { + id: 21629581 + name: "FabricIngress.next.set_mcast_group_id" + alias: "set_mcast_group_id" + } + params { + id: 1 + name: "group_id" + bitwidth: 16 + } +} +actions { + preamble { + id: 23637707 + name: "FabricIngress.next.reset_mcast_group_id" + alias: "reset_mcast_group_id" + } +} +actions { + preamble { + id: 23786376 + name: "FabricIngress.slice_tc_classifier.set_slice_id_tc" + alias: "set_slice_id_tc" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } + params { + id: 2 + name: "tc" + bitwidth: 2 + } +} +actions { + preamble { + id: 30111108 + name: "FabricIngress.slice_tc_classifier.no_classification" + alias: "no_classification" + } +} +actions { + preamble { + id: 25983516 + name: "FabricIngress.slice_tc_classifier.trust_dscp" + alias: "trust_dscp" + } +} +actions { + preamble { + id: 32116918 + name: "FabricIngress.qos.set_queue" + alias: "set_queue" + } + params { + id: 1 + name: "qid" + bitwidth: 5 + } +} +actions { + preamble { + id: 28214351 + name: "FabricIngress.qos.meter_drop" + alias: "meter_drop" + } +} +actions { + preamble { + id: 23587909 + name: "FabricIngress.qos.set_default_tc" + alias: "set_default_tc" + } + params { + id: 1 + name: "tc" + bitwidth: 2 + } +} +actions { + preamble { + id: 30131500 + name: "FabricIngress.upf.iface_access" + alias: "iface_access" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } +} +actions { + preamble { + id: 19786139 + name: "FabricIngress.upf.iface_core" + alias: "iface_core" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } +} +actions { + preamble { + id: 19466514 + name: "FabricIngress.upf.iface_dbuf" + alias: "iface_dbuf" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } +} +actions { + preamble { + id: 30204657 + name: "FabricIngress.upf.iface_miss" + alias: "iface_miss" + } +} +actions { + preamble { + id: 20368148 + name: "FabricIngress.upf.set_uplink_session_miss" + alias: "set_uplink_session_miss" + } +} +actions { + preamble { + id: 24328070 + name: "FabricIngress.upf.set_uplink_session_drop" + alias: "set_uplink_session_drop" + } +} +actions { + preamble { + id: 32013192 + name: "FabricIngress.upf.set_downlink_session_miss" + alias: "set_downlink_session_miss" + } +} +actions { + preamble { + id: 24509779 + name: "FabricIngress.upf.set_downlink_session_drop" + alias: "set_downlink_session_drop" + } +} +actions { + preamble { + id: 16984383 + name: "FabricIngress.upf.set_downlink_session" + alias: "set_downlink_session" + } + params { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + } + params { + id: 2 + name: "session_meter_idx" + bitwidth: 15 + } +} +actions { + preamble { + id: 31195396 + name: "FabricIngress.upf.set_downlink_session_buf" + alias: "set_downlink_session_buf" + } + params { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + } + params { + id: 2 + name: "session_meter_idx" + bitwidth: 15 + } +} +actions { + preamble { + id: 21581660 + name: "FabricIngress.upf.set_downlink_session_buf_drop" + alias: "set_downlink_session_buf_drop" + } +} +actions { + preamble { + id: 31219743 + name: "FabricIngress.upf.set_uplink_session" + alias: "set_uplink_session" + } + params { + id: 1 + name: "session_meter_idx" + bitwidth: 15 + } +} +actions { + preamble { + id: 20624836 + name: "FabricIngress.upf.uplink_drop_miss" + alias: "uplink_drop_miss" + } +} +actions { + preamble { + id: 26608757 + name: "FabricIngress.upf.downlink_drop_miss" + alias: "downlink_drop_miss" + } +} +actions { + preamble { + id: 28764209 + name: "FabricIngress.upf.uplink_drop" + alias: "uplink_drop" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } +} +actions { + preamble { + id: 30742995 + name: "FabricIngress.upf.downlink_drop" + alias: "downlink_drop" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } +} +actions { + preamble { + id: 25805419 + name: "FabricIngress.upf.app_fwd" + alias: "app_fwd" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } + params { + id: 2 + name: "tc" + bitwidth: 2 + } + params { + id: 3 + name: "app_meter_idx" + bitwidth: 15 + } +} +actions { + preamble { + id: 23536134 + name: "FabricIngress.upf.downlink_fwd_encap" + alias: "downlink_fwd_encap" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } + params { + id: 2 + name: "tc" + bitwidth: 2 + } + params { + id: 3 + name: "teid" + bitwidth: 32 + } + params { + id: 4 + name: "qfi" + bitwidth: 6 + } + params { + id: 5 + name: "app_meter_idx" + bitwidth: 15 + } +} +actions { + preamble { + id: 26011763 + name: "FabricIngress.upf.set_routing_ipv4_dst" + alias: "set_routing_ipv4_dst" + } + params { + id: 1 + name: "tun_dst_addr" + bitwidth: 32 + } +} +actions { + preamble { + id: 26631629 + name: "FabricIngress.upf.set_app_id" + alias: "set_app_id" + } + params { + id: 1 + name: "app_id" + bitwidth: 8 + } +} +actions { + preamble { + id: 28119063 + name: "FabricIngress.upf.recirc_allow" + alias: "recirc_allow" + } +} +actions { + preamble { + id: 19222227 + name: "FabricIngress.upf.recirc_deny" + alias: "recirc_deny" + } +} +actions { + preamble { + id: 29186084 + name: "FabricIngress.upf.recirc_miss" + alias: "recirc_miss" + } +} +actions { + preamble { + id: 25078550 + name: "FabricIngress.int_watchlist.mark_to_report" + alias: "mark_to_report" + } +} +actions { + preamble { + id: 28396787 + name: "FabricIngress.int_watchlist.no_report" + alias: "no_report" + } +} +actions { + preamble { + id: 20118842 + name: "FabricIngress.int_watchlist.no_report_collector" + alias: "no_report_collector" + } +} +actions { + preamble { + id: 26838724 + name: "FabricEgress.stats.count" + alias: "FabricEgress.stats.count" + } +} +actions { + preamble { + id: 32804382 + name: "FabricEgress.pkt_io_egress.set_switch_info" + alias: "set_switch_info" + } + params { + id: 1 + name: "cpu_port" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } +} +actions { + preamble { + id: 30307755 + name: "FabricEgress.egress_next.push_vlan" + alias: "push_vlan" + } +} +actions { + preamble { + id: 17183246 + name: "FabricEgress.egress_next.pop_vlan" + alias: "pop_vlan" + } +} +actions { + preamble { + id: 30812542 + name: "FabricEgress.egress_next.drop" + alias: "egress_next.drop" + } +} +actions { + preamble { + id: 27951287 + name: "FabricEgress.dscp_rewriter.rewrite" + alias: "rewrite" + } +} +actions { + preamble { + id: 24120545 + name: "FabricEgress.dscp_rewriter.clear" + alias: "clear" + } +} +actions { + preamble { + id: 28490145 + name: "FabricEgress.upf.load_tunnel_params" + alias: "load_tunnel_params" + } + params { + id: 1 + name: "tunnel_src_port" + bitwidth: 16 + } + params { + id: 2 + name: "tunnel_src_addr" + bitwidth: 32 + } + params { + id: 3 + name: "tunnel_dst_addr" + bitwidth: 32 + } +} +actions { + preamble { + id: 18154440 + name: "FabricEgress.upf.gtpu_only" + alias: "gtpu_only" + } +} +actions { + preamble { + id: 25872588 + name: "FabricEgress.upf.gtpu_with_psc" + alias: "gtpu_with_psc" + } +} +actions { + preamble { + id: 22415037 + name: "FabricEgress.int_egress.check_quota" + alias: "check_quota" + } +} +actions { + preamble { + id: 19702294 + name: "FabricEgress.int_egress.reset_quota" + alias: "reset_quota" + } +} +actions { + preamble { + id: 22425991 + name: "FabricEgress.int_egress.set_config" + alias: "set_config" + } + params { + id: 1 + name: "hop_latency_mask" + bitwidth: 32 + } + params { + id: 2 + name: "timestamp_mask" + bitwidth: 48 + } +} +actions { + preamble { + id: 30783845 + name: "FabricEgress.int_egress.do_local_report_encap" + alias: "do_local_report_encap" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "switch_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 22769901 + name: "FabricEgress.int_egress.do_local_report_encap_mpls" + alias: "do_local_report_encap_mpls" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "mon_label" + bitwidth: 20 + } + params { + id: 5 + name: "switch_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 32486459 + name: "FabricEgress.int_egress.do_drop_report_encap" + alias: "do_drop_report_encap" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "switch_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 25343592 + name: "FabricEgress.int_egress.do_drop_report_encap_mpls" + alias: "do_drop_report_encap_mpls" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "mon_label" + bitwidth: 20 + } + params { + id: 5 + name: "switch_id" + bitwidth: 32 + } +} +action_profiles { + preamble { + id: 289544276 + name: "FabricIngress.next.hashed_profile" + alias: "hashed_profile" + } + table_ids: 47960972 + with_selector: true + size: 16 + max_group_size: 16 +} +counters { + preamble { + id: 309010261 + name: "FabricIngress.filtering.fwd_type_counter" + alias: "fwd_type_counter" + } + spec { + unit: BOTH + } + size: 8 +} +counters { + preamble { + id: 316677328 + name: "FabricIngress.upf.terminations_counter" + alias: "FabricIngress.upf.terminations_counter" + } + spec { + unit: BOTH + } + size: 4096 +} +counters { + preamble { + id: 314209362 + name: "FabricEgress.upf.terminations_counter" + alias: "FabricEgress.upf.terminations_counter" + } + spec { + unit: BOTH + } + size: 4096 +} +direct_counters { + preamble { + id: 333776332 + name: "FabricIngress.stats.flow_counter" + alias: "FabricIngress.stats.flow_counter" + } + spec { + unit: BOTH + } + direct_table_id: 41243186 +} +direct_counters { + preamble { + id: 326221069 + name: "FabricIngress.filtering.ingress_port_vlan_counter" + alias: "ingress_port_vlan_counter" + } + spec { + unit: BOTH + } + direct_table_id: 43310977 +} +direct_counters { + preamble { + id: 335473470 + name: "FabricIngress.filtering.fwd_classifier_counter" + alias: "fwd_classifier_counter" + } + spec { + unit: BOTH + } + direct_table_id: 49718154 +} +direct_counters { + preamble { + id: 330959985 + name: "FabricIngress.forwarding.bridging_counter" + alias: "bridging_counter" + } + spec { + unit: BOTH + } + direct_table_id: 43623757 +} +direct_counters { + preamble { + id: 318961579 + name: "FabricIngress.forwarding.mpls_counter" + alias: "mpls_counter" + } + spec { + unit: BOTH + } + direct_table_id: 37768578 +} +direct_counters { + preamble { + id: 333425635 + name: "FabricIngress.forwarding.routing_v4_counter" + alias: "routing_v4_counter" + } + spec { + unit: BOTH + } + direct_table_id: 41754650 +} +direct_counters { + preamble { + id: 324042090 + name: "FabricIngress.forwarding.routing_v6_counter" + alias: "routing_v6_counter" + } + spec { + unit: BOTH + } + direct_table_id: 49342721 +} +direct_counters { + preamble { + id: 330020245 + name: "FabricIngress.pre_next.next_mpls_counter" + alias: "next_mpls_counter" + } + spec { + unit: BOTH + } + direct_table_id: 36626242 +} +direct_counters { + preamble { + id: 333692067 + name: "FabricIngress.pre_next.next_vlan_counter" + alias: "next_vlan_counter" + } + spec { + unit: BOTH + } + direct_table_id: 48011802 +} +direct_counters { + preamble { + id: 319194241 + name: "FabricIngress.acl.acl_counter" + alias: "acl_counter" + } + spec { + unit: BOTH + } + direct_table_id: 44104738 +} +direct_counters { + preamble { + id: 322798228 + name: "FabricIngress.next.hashed_counter" + alias: "hashed_counter" + } + spec { + unit: BOTH + } + direct_table_id: 47960972 +} +direct_counters { + preamble { + id: 319194968 + name: "FabricIngress.next.multicast_counter" + alias: "multicast_counter" + } + spec { + unit: BOTH + } + direct_table_id: 40619180 +} +direct_counters { + preamble { + id: 334706097 + name: "FabricIngress.slice_tc_classifier.classifier_stats" + alias: "classifier_stats" + } + spec { + unit: PACKETS + } + direct_table_id: 34606298 +} +direct_counters { + preamble { + id: 327743278 + name: "FabricIngress.qos.queues_stats" + alias: "queues_stats" + } + spec { + unit: PACKETS + } + direct_table_id: 36435258 +} +direct_counters { + preamble { + id: 335275671 + name: "FabricIngress.upf.recirc_stats" + alias: "recirc_stats" + } + spec { + unit: PACKETS + } + direct_table_id: 34400315 +} +direct_counters { + preamble { + id: 328581521 + name: "FabricIngress.int_watchlist.watchlist_counter" + alias: "watchlist_counter" + } + spec { + unit: BOTH + } + direct_table_id: 40748488 +} +direct_counters { + preamble { + id: 334508337 + name: "FabricEgress.stats.flow_counter" + alias: "FabricEgress.stats.flow_counter" + } + spec { + unit: BOTH + } + direct_table_id: 43851059 +} +direct_counters { + preamble { + id: 318892680 + name: "FabricEgress.egress_next.egress_vlan_counter" + alias: "egress_vlan_counter" + } + spec { + unit: BOTH + } + direct_table_id: 49262446 +} +direct_counters { + preamble { + id: 325056546 + name: "FabricEgress.int_egress.report_counter" + alias: "report_counter" + } + spec { + unit: BOTH + } + direct_table_id: 46071383 +} +meters { + preamble { + id: 348573637 + name: "FabricIngress.qos.slice_tc_meter" + alias: "slice_tc_meter" + } + spec { + unit: BYTES + } + size: 64 +} +meters { + preamble { + id: 345152250 + name: "FabricIngress.upf.session_meter" + alias: "session_meter" + } + spec { + unit: BYTES + } + size: 20000 +} +meters { + preamble { + id: 343216442 + name: "FabricIngress.upf.app_meter" + alias: "app_meter" + } + spec { + unit: BYTES + } + size: 20000 +} +controller_packet_metadata { + preamble { + id: 81826293 + name: "packet_in" + alias: "packet_in" + annotations: "@controller_header(\"packet_in\")" + } + metadata { + id: 1 + name: "ingress_port" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + metadata { + id: 2 + name: "_pad0" + bitwidth: 7 + } +} +controller_packet_metadata { + preamble { + id: 76689799 + name: "packet_out" + alias: "packet_out" + annotations: "@controller_header(\"packet_out\")" + } + metadata { + id: 1 + name: "pad0" + annotations: "@padding" + bitwidth: 7 + } + metadata { + id: 2 + name: "egress_port" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + metadata { + id: 3 + name: "pad1" + annotations: "@padding" + bitwidth: 3 + } + metadata { + id: 4 + name: "queue_id" + bitwidth: 5 + } + metadata { + id: 5 + name: "pad2" + annotations: "@padding" + bitwidth: 5 + } + metadata { + id: 6 + name: "cpu_loopback_mode" + bitwidth: 2 + } + metadata { + id: 7 + name: "do_forwarding" + bitwidth: 1 + } + metadata { + id: 8 + name: "pad3" + annotations: "@padding" + bitwidth: 16 + } + metadata { + id: 9 + name: "pad4" + annotations: "@padding" + bitwidth: 48 + } + metadata { + id: 10 + name: "ether_type" + bitwidth: 16 + } +} +registers { + preamble { + id: 376533241 + name: "FabricEgress.int_egress.seq_number" + alias: "seq_number" + annotations: "@hidden" + } + type_spec { + bitstring { + bit { + bitwidth: 32 + } + } + } + size: 1024 +} +type_info { + serializable_enums { + key: "BridgedMdType_t" + value { + underlying_type { + bitwidth: 8 + } + members { + name: "INVALID" + value: "\000" + } + members { + name: "INGRESS_TO_EGRESS" + value: "\001" + } + members { + name: "EGRESS_MIRROR" + value: "\002" + } + members { + name: "INGRESS_MIRROR" + value: "\003" + } + members { + name: "INT_INGRESS_DROP" + value: "\004" + } + members { + name: "DEFLECTED" + value: "\005" + } + } + } + serializable_enums { + key: "CpuLoopbackMode_t" + value { + underlying_type { + bitwidth: 2 + } + members { + name: "DISABLED" + value: "\000" + } + members { + name: "DIRECT" + value: "\001" + } + members { + name: "INGRESS" + value: "\002" + } + } + } + serializable_enums { + key: "FabricMirrorType_t" + value { + underlying_type { + bitwidth: 3 + } + members { + name: "INVALID" + value: "\000" + } + members { + name: "INT_REPORT" + value: "\001" + } + members { + name: "PACKET_IN" + value: "\002" + } + } + } + serializable_enums { + key: "PortType_t" + value { + underlying_type { + bitwidth: 2 + } + members { + name: "UNKNOWN" + value: "\000" + } + members { + name: "EDGE" + value: "\001" + } + members { + name: "INFRA" + value: "\002" + } + members { + name: "INTERNAL" + value: "\003" + } + } + } + new_types { + key: "FabricPortId_t" + value { + original_type { + bitstring { + bit { + bitwidth: 9 + } + } + } + } + } +} diff --git a/src/tests/p4-sd-fabric-svc-upf/run_test_01_bootstrap.sh b/src/tests/p4-sd-fabric-svc-upf/run_test_01_bootstrap.sh new file mode 100755 index 0000000000000000000000000000000000000000..ee3121da03ece2e500bf8c096c257c23bd2e6c3c --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/run_test_01_bootstrap.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# 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. + +# make sure to source the following scripts: +# - my_deploy.sh +# - tfs_runtime_env_vars.sh + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_bootstrap.py diff --git a/src/tests/p4-sd-fabric-svc-upf/run_test_02_service_provision_upf.sh b/src/tests/p4-sd-fabric-svc-upf/run_test_02_service_provision_upf.sh new file mode 100755 index 0000000000000000000000000000000000000000..22cfd65dea87ca8010a74b64ed939023d9602f32 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/run_test_02_service_provision_upf.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# 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. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_provision_upf.py diff --git a/src/tests/p4-sd-fabric-svc-upf/run_test_03_service_deprovision_upf.sh b/src/tests/p4-sd-fabric-svc-upf/run_test_03_service_deprovision_upf.sh new file mode 100755 index 0000000000000000000000000000000000000000..248b09f3f6620332f4a67936e591fada8d62bd31 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/run_test_03_service_deprovision_upf.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# 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. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_deprovision_upf.py diff --git a/src/tests/p4-sd-fabric-svc-upf/run_test_04_cleanup.sh b/src/tests/p4-sd-fabric-svc-upf/run_test_04_cleanup.sh new file mode 100755 index 0000000000000000000000000000000000000000..caf69ba612d54814bd9ae1547cd08adddf329804 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/run_test_04_cleanup.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# 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. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_cleanup.py diff --git a/src/tests/p4-sd-fabric-svc-upf/run_test_05_purge.sh b/src/tests/p4-sd-fabric-svc-upf/run_test_05_purge.sh new file mode 100755 index 0000000000000000000000000000000000000000..fa46662befa3d0b598d6409e24dd021701e0bfe1 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/run_test_05_purge.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# 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. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_purge.py diff --git a/src/tests/p4-sd-fabric-svc-upf/setup.sh b/src/tests/p4-sd-fabric-svc-upf/setup.sh new file mode 100755 index 0000000000000000000000000000000000000000..d4979ff45c575bb797dea0cc90e9c0520356cc87 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/setup.sh @@ -0,0 +1,22 @@ +#! /bin/bash +# 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. + + +export POD_NAME=$(kubectl get pods -n=tfs | grep device | awk '{print $1}') + +kubectl exec ${POD_NAME} -n=tfs -c=server -- mkdir -p /root/p4 + +kubectl cp src/tests/p4-sd-fabric-svc-upf/p4src/p4info.txt tfs/${POD_NAME}:/root/p4 -c=server +kubectl cp src/tests/p4-sd-fabric-svc-upf/p4src/bmv2.json tfs/${POD_NAME}:/root/p4 -c=server diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-service/Fixtures.py b/src/tests/p4-sd-fabric-svc-upf/tests-service/Fixtures.py new file mode 100644 index 0000000000000000000000000000000000000000..cf77538f9d3860c1a45c56038288b87b08b8fd01 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/tests-service/Fixtures.py @@ -0,0 +1,39 @@ +# Copyright 2022-2026 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 context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient + + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def service_client(): + _client = ServiceClient() + yield _client + _client.close() diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-service/__init__.py b/src/tests/p4-sd-fabric-svc-upf/tests-service/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..b53987a4eae1aed245eba5c7ddd8cd10e35919c2 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/tests-service/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2026 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/p4-sd-fabric-svc-upf/tests-service/test_functional_service_deprovision_upf.py b/src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_deprovision_upf.py new file mode 100644 index 0000000000000000000000000000000000000000..7b1496b9b802c43627a57b26fca2c3f4ff75acb1 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_deprovision_upf.py @@ -0,0 +1,94 @@ +# Copyright 2022-2026 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 common.proto.context_pb2 import ( + ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.object_factory.Service import json_service_id +from context.client.ContextClient import ContextClient +from service.client.ServiceClient import ServiceClient +from tests.tools.test_tools_p4 import * + +from .Fixtures import ( # pylint: disable=unused-import + context_client, service_client, +) + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +DEV_NB = 5 +P4_DEV_NB = 1 +UE_NB = 1 + +BASIC_UPF_RULES = 22 +PER_UE_RULES = 4 + +def test_service_deletion_upf( + context_client : ContextClient, # pylint: disable=redefined-outer-name + service_client : ServiceClient # pylint: disable=redefined-outer-name +) -> None: + # Get the current number of devices + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response))) + + # Total devices + dev_nb = len(response.devices) + assert dev_nb == DEV_NB + + # P4 devices + p4_dev_nb = identify_number_of_p4_devices(response.devices) + assert p4_dev_nb == P4_DEV_NB + + # Get the current number of rules in the P4 devices + p4_rules_before_deletion = get_number_of_rules(response.devices) + + # Get the current number of services + response = context_client.ListServices(ADMIN_CONTEXT_ID) + services_nb_before_deletion = len(response.services) + assert verify_active_service_type(response.services, ServiceTypeEnum.SERVICETYPE_UPF) + + for service in response.services: + # Ignore services of other types + if service.service_type != ServiceTypeEnum.SERVICETYPE_UPF: + continue + + service_id = service.service_id + assert service_id + + service_uuid = service_id.service_uuid.uuid + context_uuid = service_id.context_id.context_uuid.uuid + assert service.service_status.service_status == ServiceStatusEnum.SERVICESTATUS_ACTIVE + + # Delete L2 service + service_client.DeleteService(ServiceId(**json_service_id(service_uuid, json_context_id(context_uuid)))) + + # Get an updated view of the services + response = context_client.ListServices(ADMIN_CONTEXT_ID) + services_nb_after_deletion = len(response.services) + assert services_nb_after_deletion == services_nb_before_deletion - 1, "Exactly one service must be deleted" + + # Get an updated view of the devices + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + p4_rules_after_deletion = get_number_of_rules(response.devices) + + rules_diff = p4_rules_before_deletion - p4_rules_after_deletion + + desired_rules = (P4_DEV_NB * BASIC_UPF_RULES) + (UE_NB * PER_UE_RULES) + + assert p4_rules_after_deletion < p4_rules_before_deletion, "UPF service must contain some rules" + assert rules_diff == desired_rules, \ + "UPF service must contain {} rules per device".format(desired_rules) diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_provision_upf.py b/src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_provision_upf.py new file mode 100644 index 0000000000000000000000000000000000000000..fcc50d523851a97e51659860f18326ce01b38a4a --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_provision_upf.py @@ -0,0 +1,100 @@ +# Copyright 2022-2026 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 os + +from common.proto.context_pb2 import ServiceTypeEnum +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) +from common.tools.grpc.Tools import grpc_message_to_json_string +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient +from tests.tools.test_tools_p4 import * + +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, service_client, +) + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +DEV_NB = 5 +P4_DEV_NB = 1 +UE_NB = 1 + +BASIC_UPF_RULES = 22 +PER_UE_RULES = 4 + +TEST_PATH = os.path.join( + os.path.dirname(os.path.dirname( + os.path.abspath(__file__) + )) + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to tests" + +DESC_FILE_SERVICE_P4_UPF = os.path.join(TEST_PATH, 'service-upf-ui.json') +assert os.path.exists(DESC_FILE_SERVICE_P4_UPF),\ + "Invalid path to the UPF service descriptor" + +def test_service_creation_upf( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient, # pylint: disable=redefined-outer-name + service_client : ServiceClient # pylint: disable=redefined-outer-name +) -> None: + # Get the current number of services + response = context_client.ListServices(ADMIN_CONTEXT_ID) + services_nb_before = len(response.services) + + # Get the current number of devices + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response))) + + # Total devices + dev_nb = len(response.devices) + assert dev_nb == DEV_NB + + # P4 devices + p4_dev_nb = identify_number_of_p4_devices(response.devices) + assert p4_dev_nb == P4_DEV_NB + + # Get the current number of rules in the P4 devices + p4_rules_before = get_number_of_rules(response.devices) + + # Load service + descriptor_loader = DescriptorLoader( + descriptors_file=DESC_FILE_SERVICE_P4_UPF, + context_client=context_client, device_client=device_client, service_client=service_client + ) + results = descriptor_loader.process() + check_descriptor_load_results(results, descriptor_loader) + + # Get an updated view of the services + response = context_client.ListServices(ADMIN_CONTEXT_ID) + services_nb_after = len(response.services) + assert services_nb_after == services_nb_before + 1, "Exactly one service must be in place" + assert verify_active_service_type(response.services, ServiceTypeEnum.SERVICETYPE_UPF) + + # Get an updated view of the devices + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + p4_rules_after = get_number_of_rules(response.devices) + + rules_diff = p4_rules_after - p4_rules_before + + desired_rules = (P4_DEV_NB * BASIC_UPF_RULES) + (UE_NB * PER_UE_RULES) + + assert p4_rules_after > p4_rules_before, "UPF service must install some rules" + assert rules_diff == desired_rules, \ + "UPF service must install {} rules per device".format(desired_rules) diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-setup/Fixtures.py b/src/tests/p4-sd-fabric-svc-upf/tests-setup/Fixtures.py new file mode 100644 index 0000000000000000000000000000000000000000..cf77538f9d3860c1a45c56038288b87b08b8fd01 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/tests-setup/Fixtures.py @@ -0,0 +1,39 @@ +# Copyright 2022-2026 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 context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient + + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def service_client(): + _client = ServiceClient() + yield _client + _client.close() diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-setup/__init__.py b/src/tests/p4-sd-fabric-svc-upf/tests-setup/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..b53987a4eae1aed245eba5c7ddd8cd10e35919c2 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/tests-setup/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2026 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/p4-sd-fabric-svc-upf/tests-setup/test_functional_bootstrap.py b/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_bootstrap.py new file mode 100644 index 0000000000000000000000000000000000000000..e40b360c45408843403ed45e31e6510c91c55ce7 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_bootstrap.py @@ -0,0 +1,85 @@ +# 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 logging, os, time + +from common.proto.context_pb2 import DeviceOperationalStatusEnum, Empty +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID + +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, +) + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +TEST_PATH = os.path.join( + os.path.dirname(os.path.dirname( + os.path.abspath(__file__) + )) + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to tests" + +# Topology descriptor +DESC_TOPOLOGY = os.path.join(TEST_PATH, 'all.json') +assert os.path.exists(DESC_TOPOLOGY), "Invalid path to the topology descriptor" + +def test_scenario_bootstrap( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient # pylint: disable=redefined-outer-name +) -> None: + """ + This test assumes that the environment is in a clean state (empty) + before bootstrapping the P4 topology. + It loads the topology descriptor and verifies that no other services + or slices are created. + """ + validate_empty_scenario(context_client) + + descriptor_loader = DescriptorLoader( + descriptors_file=DESC_TOPOLOGY, context_client=context_client, device_client=device_client) + results = descriptor_loader.process() + check_descriptor_load_results(results, descriptor_loader) + descriptor_loader.validate() + + # Verify the scenario has no services/slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 0 + assert len(response.slice_ids) == 0 + +def test_scenario_devices_enabled( + context_client : ContextClient # pylint: disable=redefined-outer-name +) -> None: + """ + This test validates that the devices are enabled. + """ + DEVICE_OP_STATUS_ENABLED = DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_ENABLED + + num_devices = -1 + num_devices_enabled, num_retry = 0, 0 + while (num_devices != num_devices_enabled) and (num_retry < 10): + time.sleep(1.0) + response = context_client.ListDevices(Empty()) + num_devices = len(response.devices) + num_devices_enabled = 0 + for device in response.devices: + if device.device_operational_status != DEVICE_OP_STATUS_ENABLED: continue + num_devices_enabled += 1 + LOGGER.info('Num Devices enabled: {:d}/{:d}'.format(num_devices_enabled, num_devices)) + num_retry += 1 + assert num_devices_enabled == num_devices diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_cleanup.py b/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_cleanup.py new file mode 100644 index 0000000000000000000000000000000000000000..f1ec69c6532515f3bbca6ba0d7b436ae640bc5eb --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_cleanup.py @@ -0,0 +1,54 @@ +# 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 logging +import os + +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID + +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, +) + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +TEST_PATH = os.path.join( + os.path.dirname(os.path.dirname( + os.path.abspath(__file__) + )) + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to tests" + +# Topology descriptor +DESC_TOPOLOGY = os.path.join(TEST_PATH, 'all.json') +assert os.path.exists(DESC_TOPOLOGY), "Invalid path to the topology descriptor" + +def test_scenario_cleanup( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient # pylint: disable=redefined-outer-name +) -> None: + # Verify the scenario has no services/slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + + # Unload topology and validate empty scenario + descriptor_loader = DescriptorLoader( + descriptors_file=DESC_TOPOLOGY, context_client=context_client, device_client=device_client) + descriptor_loader.validate() + descriptor_loader.unload() + validate_empty_scenario(context_client) diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_purge.py b/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_purge.py new file mode 100644 index 0000000000000000000000000000000000000000..39d45d43f3976e1c4f07848bc75921bb06b28b01 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_purge.py @@ -0,0 +1,89 @@ +# 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 logging + +from common.proto.context_pb2 import ( + DeviceId, LinkId, ServiceId, ServiceStatusEnum, +) +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.object_factory.Context import json_context_id +from common.tools.object_factory.Device import json_device_id +from common.tools.object_factory.Service import json_service_id +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient +from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID + +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, service_client, +) + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +def test_clean_services( + context_client : ContextClient, # pylint: disable=redefined-outer-name + service_client : ServiceClient # pylint: disable=redefined-outer-name +) -> None: + response = context_client.ListServices(ADMIN_CONTEXT_ID) + LOGGER.warning('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) + + for service in response.services: + service_id = service.service_id + assert service_id + + service_uuid = service_id.service_uuid.uuid + context_uuid = service_id.context_id.context_uuid.uuid + assert service.service_status.service_status == ServiceStatusEnum.SERVICESTATUS_ACTIVE + + # Delete service + service_client.DeleteService(ServiceId(**json_service_id(service_uuid, json_context_id(context_uuid)))) + +def test_clean_links( + context_client : ContextClient, # pylint: disable=redefined-outer-name +) -> None: + response = context_client.ListLinks(ADMIN_CONTEXT_ID) + + for link in response.links: + link_id = link.link_id + + # Delete link + context_client.RemoveLink(LinkId(**link_id)) + +def test_clean_devices( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient # pylint: disable=redefined-outer-name +) -> None: + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response))) + + for device in response.devices: + device_uuid = device.device_id.device_uuid.uuid + device_json = json_device_id(device_uuid) + + # Delete device + device_client.DeleteDevice(DeviceId(**device_json)) + +def test_clean_context( + context_client : ContextClient # pylint: disable=redefined-outer-name +) -> None: + # Verify the scenario has no services/slices + response = context_client.ListTopologies(ADMIN_CONTEXT_ID) + + for topology in response.topologies: + topology_id = topology.topology_id + response = context_client.RemoveTopology(topology_id) + + response = context_client.RemoveContext(ADMIN_CONTEXT_ID) diff --git a/src/tests/p4-sd-fabric-svc-upf/topology/README.md b/src/tests/p4-sd-fabric-svc-upf/topology/README.md new file mode 100644 index 0000000000000000000000000000000000000000..1ce9cb1dc508020f699a06be47709692b2481575 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/topology/README.md @@ -0,0 +1,135 @@ +# P4 5G UPF + +For a P4 switch to act as a 5G UPF, you need a machine with at least 3 network interfaces as follows: + +- a management interface `mgmt` for the switch to communicate with the control plane (i.e., TFS controller) +- a left-hand side data plane interface `dp-1` towards the 5G gNB +- a right-hand side data plane interface `dp-2` towards the Data Network + +Also, due to Stratum's restrictions, the desired OS of the machine shall be `Ubuntu server 20.04 LTS`. + +To build Stratum on this machine, follow the steps [here](https://github.com/stratum/stratum/blob/main/stratum/hal/bin/bmv2/README.md). +It is preferred to run Stratum as a binary. + +### Steps to setup the 5G UPF P4 switch + +Follow the steps below to prepare the P4 switch to act as a UPF. + +```bash +nano p4-switch-conf-common.sh + +HOST_IFACE_EXT="mgmt" # Interface towards TFS (management, not part of the switch) +SW_IFACE_DATA_LEFT="dp-1" # Switch interface towards the 5G gNB +SW_IFACE_DATA_RIGHT="dp-2" # Switch interface towards the Data Network +``` + +### 1: Setup environment + +Edit the `p4-switch-setup.sh` script to modify the subnets' information according to your network setup: + +```bash +nano p4-switch-setup.sh + +# Subnets managed by the switch +DOMAIN_IP_LEFT="10.10.1.1/24" # Left-hand side subnet (5G gNB) +DOMAIN_IP_RIGHT="10.10.2.1/24" # Right-hand side subnet (DNN) +``` + +Once your network setup is applied, run the `p4-switch-setup.sh` script as follows: + +```bash +sudo bash p4-switch-setup.sh +``` + +### 2: Deploy Stratum + +First you need to configure the chassis configuration file with the correct network interfaces names. +Ensure that the interface names listed in the chassis configuration file agree with the ones you added in `p4-switch-conf-common.sh`. + +```bash +cat p4-switch-three-port-chassis-config-phy.pb.txt + +# Copyright 2018-present Open Networking Foundation +# SPDX-License-Identifier: Apache-2.0 + +description: "Chassis configuration for a single Stratum bmv2 switch with 3 ports" +chassis { + platform: PLT_P4_SOFT_SWITCH + name: "bmv2-1" +} +nodes { + id: 1 + slot: 1 + index: 1 +} +singleton_ports { + id: 1 + name: "dp-1" + slot: 1 + port: 1 + channel: 1 + speed_bps: 100000000000 + config_params { + admin_state: ADMIN_STATE_ENABLED + } + node: 1 +} +singleton_ports { + id: 2 + name: "dp-2" + slot: 1 + port: 2 + channel: 1 + speed_bps: 100000000000 + config_params { + admin_state: ADMIN_STATE_ENABLED + } + node: 1 +} +singleton_ports { + id: 3 + name: "mgmt" + slot: 1 + port: 3 + channel: 1 + speed_bps: 100000000000 + config_params { + admin_state: ADMIN_STATE_ENABLED + } + node: 1 +} +``` + +To deploy Stratum, do: + +```bash +sudo bash run-stratum.sh +``` + +To run Stratum will verbose logging, open the `run-stratum.sh` and change: + +```bash +LOG_LEVEL="debug" +``` + +Then, re-deploy Stratum as shown above. + +To verify that Stratum has been correctly deployed, you should see the following output: + +``` + config_monitoring_service.cc:94] Pushing the saved chassis config read from p4-switch-three-port-chassis-config-phy.pb.txt... + bmv2_chassis_manager.cc:519] Registered port status callbacks successfully for node 1. + bmv2_chassis_manager.cc:453] State of port 1 in node 1: UP. + bmv2_chassis_manager.cc:453] State of port 2 in node 1: UP. + bmv2_chassis_manager.cc:453] State of port 3 in node 1: UP. + bmv2_switch.cc:74] P4-based forwarding pipeline config pushed successfully to node with ID 1. + hal.cc:220] Stratum external facing services are listening to 0.0.0.0:50000, 0.0.0.0:50001, 0.0.0.0:50101... +``` + +### 3: Restore to the original setup + +When your tests with Stratum and TFS are over, you may want to tear the switch down and kill Stratum. + +```bash +sudo bash p4-switch-tear-down.sh +``` diff --git a/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-conf-common.sh b/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-conf-common.sh new file mode 100644 index 0000000000000000000000000000000000000000..d961b920da220caed4368b8c9247be5b3fd98e4e --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-conf-common.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Physical interfaces +HOST_IFACE_EXT="mgmt" # Interface towards TFS (management) +SW_IFACE_DATA_LEFT="dp-1" # Interface towards the 5G gNB (data plane) +SW_IFACE_DATA_RIGHT="dp-2" # Interface towards the Data Network (data plane) + +# Subnets managed by the switch +DOMAIN_IP_LEFT="10.10.1.1/24" # Left-hand side subnet (5G gNB) +DOMAIN_IP_RIGHT="10.10.2.1/24" # Right-hand side subnet (DNN) + +# Transport port where the P4Runtime gRPC server is deployed on the switch +SW_P4RT_GRPC_PORT="50001" + +# Transport port where the P4Runtime gNMI server is deployed on the switch +SW_P4RT_GNMI_PORT="50000" + +# Transport port where Stratum listens to local calls +SW_P4RT_LOCAL_PORT="50101" diff --git a/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-setup.sh b/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-setup.sh new file mode 100644 index 0000000000000000000000000000000000000000..55d104f6e251695bf09507975f4a9339674547d2 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-setup.sh @@ -0,0 +1,23 @@ +#!bin/bash + +# You must run this script as root +if [ "$EUID" -ne 0 ]; then + echo "Please run as root" + exit 1 +fi + +source "p4-switch-conf-common.sh" + +kill_stratum() { + pkill stratum +} + +disable_csum_offloading() { + ethtool -K ${SW_IFACE_DATA_LEFT} rx off tx off + ethtool -K ${SW_IFACE_DATA_RIGHT} rx off tx off +} + +kill_stratum +disable_csum_offloading + +exit 0 diff --git a/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-tear-down.sh b/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-tear-down.sh new file mode 100644 index 0000000000000000000000000000000000000000..77551c612462a28e4e8f84b932a5f33c79b744ab --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-tear-down.sh @@ -0,0 +1,17 @@ +#!bin/bash + +# You must run this script as root +if [ "$EUID" -ne 0 ]; then + echo "Please run as root" + exit 1 +fi + +source "p4-switch-conf-common.sh" + +kill_stratum() { + pkill stratum +} + +kill_stratum + +exit 0 diff --git a/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-three-port-chassis-config-phy.pb.txt b/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-three-port-chassis-config-phy.pb.txt new file mode 100644 index 0000000000000000000000000000000000000000..474196ef903cedfbd5137bfa380dc88a77f50e16 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-three-port-chassis-config-phy.pb.txt @@ -0,0 +1,46 @@ +description: "Chassis configuration for a single Stratum bmv2 switch with 3 ports" +chassis { + platform: PLT_P4_SOFT_SWITCH + name: "bmv2-1" +} +nodes { + id: 1 + slot: 1 + index: 1 +} +singleton_ports { + id: 1 + name: "dp-1" + slot: 1 + port: 1 + channel: 1 + speed_bps: 100000000000 + config_params { + admin_state: ADMIN_STATE_ENABLED + } + node: 1 +} +singleton_ports { + id: 2 + name: "dp-2" + slot: 1 + port: 2 + channel: 1 + speed_bps: 100000000000 + config_params { + admin_state: ADMIN_STATE_ENABLED + } + node: 1 +} +singleton_ports { + id: 3 + name: "mgmt" + slot: 1 + port: 3 + channel: 1 + speed_bps: 100000000000 + config_params { + admin_state: ADMIN_STATE_ENABLED + } + node: 1 +} diff --git a/src/tests/p4-sd-fabric-svc-upf/topology/pipeline_config.pb.txt b/src/tests/p4-sd-fabric-svc-upf/topology/pipeline_config.pb.txt new file mode 100644 index 0000000000000000000000000000000000000000..e127e83445ad11f302dec705e8e4383d0f6f2ed6 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/topology/pipeline_config.pb.txt @@ -0,0 +1,2490 @@ +node_id_to_config { + key: 1 + value { + p4info { + pkg_info { + arch: "v1model" + } + tables { + preamble { + id: 41243186 + name: "FabricIngress.stats.flows" + alias: "FabricIngress.stats.flows" + } + match_fields { + id: 1 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 2 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 3 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 4 + name: "l4_sport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 5 + name: "l4_dport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 6 + name: "ig_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 21929788 + } + const_default_action_id: 21929788 + direct_resource_ids: 333776332 + size: 1024 + } + tables { + preamble { + id: 43310977 + name: "FabricIngress.filtering.ingress_port_vlan" + alias: "ingress_port_vlan" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: EXACT + } + match_fields { + id: 2 + name: "vlan_is_valid" + bitwidth: 1 + match_type: EXACT + } + match_fields { + id: 3 + name: "vlan_id" + bitwidth: 12 + match_type: TERNARY + } + action_refs { + id: 17164167 + } + action_refs { + id: 24158268 + } + action_refs { + id: 24266015 + } + const_default_action_id: 17164167 + direct_resource_ids: 326221069 + size: 1024 + } + tables { + preamble { + id: 49718154 + name: "FabricIngress.filtering.fwd_classifier" + alias: "fwd_classifier" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: EXACT + } + match_fields { + id: 2 + name: "eth_dst" + bitwidth: 48 + match_type: TERNARY + } + match_fields { + id: 3 + name: "eth_type" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 4 + name: "ip_eth_type" + bitwidth: 16 + match_type: EXACT + } + action_refs { + id: 25032921 + } + const_default_action_id: 25032921 + direct_resource_ids: 335473470 + size: 1024 + } + tables { + preamble { + id: 43623757 + name: "FabricIngress.forwarding.bridging" + alias: "bridging" + } + match_fields { + id: 1 + name: "vlan_id" + bitwidth: 12 + match_type: EXACT + } + match_fields { + id: 2 + name: "eth_dst" + bitwidth: 48 + match_type: TERNARY + } + action_refs { + id: 21791748 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 29734112 + direct_resource_ids: 330959985 + size: 1024 + } + tables { + preamble { + id: 37768578 + name: "FabricIngress.forwarding.mpls" + alias: "mpls" + } + match_fields { + id: 1 + name: "mpls_label" + bitwidth: 20 + match_type: EXACT + } + action_refs { + id: 30066030 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 29734112 + direct_resource_ids: 318961579 + size: 1024 + } + tables { + preamble { + id: 41754650 + name: "FabricIngress.forwarding.routing_v4" + alias: "routing_v4" + } + match_fields { + id: 1 + name: "ipv4_dst" + bitwidth: 32 + match_type: LPM + } + action_refs { + id: 19792090 + } + action_refs { + id: 29124955 + } + action_refs { + id: 17639597 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + direct_resource_ids: 333425635 + size: 1024 + } + tables { + preamble { + id: 49342721 + name: "FabricIngress.forwarding.routing_v6" + alias: "routing_v6" + } + match_fields { + id: 1 + name: "ipv6_dst" + bitwidth: 128 + match_type: LPM + } + action_refs { + id: 21856023 + } + action_refs { + id: 24646532 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + direct_resource_ids: 324042090 + size: 1024 + } + tables { + preamble { + id: 36626242 + name: "FabricIngress.pre_next.next_mpls" + alias: "next_mpls" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 22765924 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + direct_resource_ids: 330020245 + size: 1024 + } + tables { + preamble { + id: 48011802 + name: "FabricIngress.pre_next.next_vlan" + alias: "next_vlan" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 33475378 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + direct_resource_ids: 333692067 + size: 1024 + } + tables { + preamble { + id: 44104738 + name: "FabricIngress.acl.acl" + alias: "acl" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: TERNARY + } + match_fields { + id: 2 + name: "eth_dst" + bitwidth: 48 + match_type: TERNARY + } + match_fields { + id: 3 + name: "eth_src" + bitwidth: 48 + match_type: TERNARY + } + match_fields { + id: 4 + name: "vlan_id" + bitwidth: 12 + match_type: TERNARY + } + match_fields { + id: 5 + name: "eth_type" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 6 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 7 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 8 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 9 + name: "icmp_type" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 10 + name: "icmp_code" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 11 + name: "l4_sport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 12 + name: "l4_dport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 13 + name: "ig_port_type" + bitwidth: 2 + match_type: TERNARY + } + action_refs { + id: 23623126 + } + action_refs { + id: 23579892 + } + action_refs { + id: 21161133 + } + action_refs { + id: 23570973 + } + action_refs { + id: 24507494 + } + action_refs { + id: 29607214 + } + const_default_action_id: 29607214 + direct_resource_ids: 319194241 + size: 1024 + } + tables { + preamble { + id: 47960972 + name: "FabricIngress.next.hashed" + alias: "hashed" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 27301117 + } + action_refs { + id: 20985706 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + implementation_id: 289544276 + direct_resource_ids: 322798228 + size: 1024 + } + tables { + preamble { + id: 40619180 + name: "FabricIngress.next.multicast" + alias: "multicast" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 21629581 + } + action_refs { + id: 23637707 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 23637707 + direct_resource_ids: 319194968 + size: 1024 + } + tables { + preamble { + id: 34606298 + name: "FabricIngress.slice_tc_classifier.classifier" + alias: "classifier" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: TERNARY + } + match_fields { + id: 2 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 3 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 4 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 5 + name: "l4_sport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 6 + name: "l4_dport" + bitwidth: 16 + match_type: TERNARY + } + action_refs { + id: 23786376 + } + action_refs { + id: 25983516 + } + action_refs { + id: 30111108 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 30111108 + direct_resource_ids: 334706097 + size: 512 + } + tables { + preamble { + id: 36435258 + name: "FabricIngress.qos.queues" + alias: "queues" + } + match_fields { + id: 1 + name: "slice_tc" + bitwidth: 6 + match_type: EXACT + } + match_fields { + id: 2 + name: "color" + bitwidth: 2 + match_type: TERNARY + } + action_refs { + id: 32116918 + } + action_refs { + id: 28214351 + } + const_default_action_id: 32116918 + direct_resource_ids: 327743278 + size: 128 + } + tables { + preamble { + id: 43965782 + name: "FabricIngress.qos.default_tc" + alias: "default_tc" + } + match_fields { + id: 1 + name: "slice_tc" + bitwidth: 6 + match_type: TERNARY + } + match_fields { + id: 2 + name: "tc_unknown" + bitwidth: 1 + match_type: EXACT + } + action_refs { + id: 23587909 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 16 + } + tables { + preamble { + id: 41155994 + name: "FabricIngress.upf.interfaces" + alias: "interfaces" + } + match_fields { + id: 1 + name: "ipv4_dst_addr" + bitwidth: 32 + match_type: LPM + } + match_fields { + id: 2 + name: "gtpu_is_valid" + bitwidth: 1 + match_type: EXACT + } + action_refs { + id: 30131500 + } + action_refs { + id: 19786139 + } + action_refs { + id: 19466514 + } + action_refs { + id: 30204657 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 30204657 + size: 64 + } + tables { + preamble { + id: 37952203 + name: "FabricIngress.upf.downlink_sessions" + alias: "downlink_sessions" + } + match_fields { + id: 1 + name: "ue_addr" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 16984383 + } + action_refs { + id: 31195396 + } + action_refs { + id: 21581660 + } + action_refs { + id: 24509779 + } + action_refs { + id: 32013192 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 32013192 + size: 100000 + } + tables { + preamble { + id: 45463032 + name: "FabricIngress.upf.uplink_sessions" + alias: "uplink_sessions" + } + match_fields { + id: 1 + name: "tunnel_ipv4_dst" + bitwidth: 32 + match_type: EXACT + } + match_fields { + id: 2 + name: "teid" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 31219743 + } + action_refs { + id: 24328070 + } + action_refs { + id: 20368148 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 20368148 + size: 100000 + } + tables { + preamble { + id: 50169666 + name: "FabricIngress.upf.uplink_terminations" + alias: "uplink_terminations" + } + match_fields { + id: 1 + name: "ue_session_id" + bitwidth: 32 + match_type: EXACT + } + match_fields { + id: 2 + name: "app_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 25805419 + } + action_refs { + id: 28764209 + } + action_refs { + id: 20624836 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 20624836 + size: 100000 + } + tables { + preamble { + id: 35221941 + name: "FabricIngress.upf.downlink_terminations" + alias: "downlink_terminations" + } + match_fields { + id: 1 + name: "ue_session_id" + bitwidth: 32 + match_type: EXACT + } + match_fields { + id: 2 + name: "app_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 23536134 + } + action_refs { + id: 30742995 + } + action_refs { + id: 26608757 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 26608757 + size: 100000 + } + tables { + preamble { + id: 48831175 + name: "FabricIngress.upf.ig_tunnel_peers" + alias: "ig_tunnel_peers" + } + match_fields { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 26011763 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 256 + } + tables { + preamble { + id: 46184415 + name: "FabricIngress.upf.applications" + alias: "applications" + } + match_fields { + id: 1 + name: "slice_id" + bitwidth: 4 + match_type: EXACT + } + match_fields { + id: 2 + name: "app_ipv4_addr" + bitwidth: 32 + match_type: LPM + } + match_fields { + id: 3 + name: "app_l4_port" + bitwidth: 16 + match_type: RANGE + } + match_fields { + id: 4 + name: "app_ip_proto" + bitwidth: 8 + match_type: TERNARY + } + action_refs { + id: 26631629 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 5 + } + tables { + preamble { + id: 34400315 + name: "FabricIngress.upf.uplink_recirc_rules" + alias: "uplink_recirc_rules" + } + match_fields { + id: 1 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 2 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + action_refs { + id: 28119063 + } + action_refs { + id: 19222227 + } + action_refs { + id: 29186084 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 29186084 + direct_resource_ids: 335275671 + size: 64 + } + tables { + preamble { + id: 40748488 + name: "FabricIngress.int_watchlist.watchlist" + alias: "watchlist" + } + match_fields { + id: 1 + name: "ipv4_valid" + bitwidth: 1 + match_type: EXACT + } + match_fields { + id: 2 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 3 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 4 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 5 + name: "l4_sport" + bitwidth: 16 + match_type: RANGE + } + match_fields { + id: 6 + name: "l4_dport" + bitwidth: 16 + match_type: RANGE + } + action_refs { + id: 25078550 + } + action_refs { + id: 20118842 + } + action_refs { + id: 28396787 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28396787 + direct_resource_ids: 328581521 + size: 64 + } + tables { + preamble { + id: 43851059 + name: "FabricEgress.stats.flows" + alias: "FabricEgress.stats.flows" + } + match_fields { + id: 1 + name: "stats_flow_id" + bitwidth: 10 + match_type: EXACT + } + match_fields { + id: 2 + name: "eg_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 26838724 + } + const_default_action_id: 26838724 + direct_resource_ids: 334508337 + size: 1024 + } + tables { + preamble { + id: 35217901 + name: "FabricEgress.pkt_io_egress.switch_info" + alias: "switch_info" + } + action_refs { + id: 32804382 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + size: 1 + } + tables { + preamble { + id: 49262446 + name: "FabricEgress.egress_next.egress_vlan" + alias: "egress_vlan" + } + match_fields { + id: 1 + name: "vlan_id" + bitwidth: 12 + match_type: EXACT + } + match_fields { + id: 2 + name: "eg_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 30307755 + } + action_refs { + id: 17183246 + } + action_refs { + id: 30812542 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 30812542 + direct_resource_ids: 318892680 + size: 1024 + } + tables { + preamble { + id: 49970092 + name: "FabricEgress.dscp_rewriter.rewriter" + alias: "rewriter" + } + match_fields { + id: 1 + name: "eg_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 27951287 + } + action_refs { + id: 24120545 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 512 + } + tables { + preamble { + id: 37756041 + name: "FabricEgress.upf.eg_tunnel_peers" + alias: "eg_tunnel_peers" + } + match_fields { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 28490145 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 256 + } + tables { + preamble { + id: 35202849 + name: "FabricEgress.upf.gtpu_encap" + alias: "gtpu_encap" + } + action_refs { + id: 18154440 + } + action_refs { + id: 25872588 + } + size: 1 + } + tables { + preamble { + id: 36860953 + name: "FabricEgress.int_egress.queue_latency_thresholds" + alias: "queue_latency_thresholds" + } + match_fields { + id: 1 + name: "egress_qid" + bitwidth: 5 + match_type: EXACT + } + match_fields { + id: 2 + name: "hop_latency_upper" + bitwidth: 16 + match_type: RANGE + } + match_fields { + id: 3 + name: "hop_latency_lower" + bitwidth: 16 + match_type: RANGE + } + action_refs { + id: 22415037 + } + action_refs { + id: 19702294 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + size: 128 + } + tables { + preamble { + id: 40475827 + name: "FabricEgress.int_egress.config" + alias: "config" + } + action_refs { + id: 22425991 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + size: 1 + } + tables { + preamble { + id: 46071383 + name: "FabricEgress.int_egress.report" + alias: "report" + } + match_fields { + id: 1 + name: "bmd_type" + bitwidth: 8 + match_type: EXACT + } + match_fields { + id: 2 + name: "mirror_type" + bitwidth: 3 + match_type: EXACT + } + match_fields { + id: 3 + name: "int_report_type" + bitwidth: 3 + match_type: EXACT + } + action_refs { + id: 30783845 + } + action_refs { + id: 22769901 + } + action_refs { + id: 32486459 + } + action_refs { + id: 25343592 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + direct_resource_ids: 325056546 + size: 6 + } + actions { + preamble { + id: 28485346 + name: "nop" + alias: "nop" + } + } + actions { + preamble { + id: 21257015 + name: "NoAction" + alias: "NoAction" + annotations: "@noWarn(\"unused\")" + } + } + actions { + preamble { + id: 21929788 + name: "FabricIngress.stats.count" + alias: "FabricIngress.stats.count" + } + params { + id: 1 + name: "flow_id" + bitwidth: 10 + } + } + actions { + preamble { + id: 17164167 + name: "FabricIngress.filtering.deny" + alias: "deny" + } + } + actions { + preamble { + id: 24158268 + name: "FabricIngress.filtering.permit" + alias: "permit" + } + params { + id: 1 + name: "port_type" + bitwidth: 2 + } + } + actions { + preamble { + id: 24266015 + name: "FabricIngress.filtering.permit_with_internal_vlan" + alias: "permit_with_internal_vlan" + } + params { + id: 1 + name: "vlan_id" + bitwidth: 12 + } + params { + id: 2 + name: "port_type" + bitwidth: 2 + } + } + actions { + preamble { + id: 25032921 + name: "FabricIngress.filtering.set_forwarding_type" + alias: "set_forwarding_type" + } + params { + id: 1 + name: "fwd_type" + bitwidth: 3 + } + } + actions { + preamble { + id: 29734112 + name: "FabricIngress.forwarding.set_int_drop_reason" + alias: "set_int_drop_reason" + } + params { + id: 1 + name: "drop_reason" + bitwidth: 8 + } + } + actions { + preamble { + id: 21791748 + name: "FabricIngress.forwarding.set_next_id_bridging" + alias: "set_next_id_bridging" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } + } + actions { + preamble { + id: 30066030 + name: "FabricIngress.forwarding.pop_mpls_and_next" + alias: "pop_mpls_and_next" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } + } + actions { + preamble { + id: 19792090 + name: "FabricIngress.forwarding.set_next_id_routing_v4" + alias: "set_next_id_routing_v4" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } + } + actions { + preamble { + id: 29124955 + name: "FabricIngress.forwarding.nop_routing_v4" + alias: "nop_routing_v4" + } + } + actions { + preamble { + id: 17639597 + name: "FabricIngress.forwarding.drop_routing_v4" + alias: "drop_routing_v4" + } + } + actions { + preamble { + id: 21856023 + name: "FabricIngress.forwarding.set_next_id_routing_v6" + alias: "set_next_id_routing_v6" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } + } + actions { + preamble { + id: 24646532 + name: "FabricIngress.forwarding.drop_routing_v6" + alias: "drop_routing_v6" + } + } + actions { + preamble { + id: 22765924 + name: "FabricIngress.pre_next.set_mpls_label" + alias: "set_mpls_label" + } + params { + id: 1 + name: "label" + bitwidth: 20 + } + } + actions { + preamble { + id: 33475378 + name: "FabricIngress.pre_next.set_vlan" + alias: "set_vlan" + } + params { + id: 1 + name: "vlan_id" + bitwidth: 12 + } + } + actions { + preamble { + id: 23623126 + name: "FabricIngress.acl.set_next_id_acl" + alias: "set_next_id_acl" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } + } + actions { + preamble { + id: 21161133 + name: "FabricIngress.acl.copy_to_cpu" + alias: "copy_to_cpu" + } + } + actions { + preamble { + id: 23579892 + name: "FabricIngress.acl.punt_to_cpu" + alias: "punt_to_cpu" + } + } + actions { + preamble { + id: 23570973 + name: "FabricIngress.acl.drop" + alias: "acl.drop" + } + } + actions { + preamble { + id: 24507494 + name: "FabricIngress.acl.set_output_port" + alias: "set_output_port" + } + params { + id: 1 + name: "port_num" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + } + actions { + preamble { + id: 29607214 + name: "FabricIngress.acl.nop_acl" + alias: "nop_acl" + } + } + actions { + preamble { + id: 27301117 + name: "FabricIngress.next.output_hashed" + alias: "output_hashed" + } + params { + id: 1 + name: "port_num" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + } + actions { + preamble { + id: 20985706 + name: "FabricIngress.next.routing_hashed" + alias: "routing_hashed" + } + params { + id: 1 + name: "port_num" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + params { + id: 2 + name: "smac" + bitwidth: 48 + } + params { + id: 3 + name: "dmac" + bitwidth: 48 + } + } + actions { + preamble { + id: 21629581 + name: "FabricIngress.next.set_mcast_group_id" + alias: "set_mcast_group_id" + } + params { + id: 1 + name: "group_id" + bitwidth: 16 + } + } + actions { + preamble { + id: 23637707 + name: "FabricIngress.next.reset_mcast_group_id" + alias: "reset_mcast_group_id" + } + } + actions { + preamble { + id: 23786376 + name: "FabricIngress.slice_tc_classifier.set_slice_id_tc" + alias: "set_slice_id_tc" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } + params { + id: 2 + name: "tc" + bitwidth: 2 + } + } + actions { + preamble { + id: 30111108 + name: "FabricIngress.slice_tc_classifier.no_classification" + alias: "no_classification" + } + } + actions { + preamble { + id: 25983516 + name: "FabricIngress.slice_tc_classifier.trust_dscp" + alias: "trust_dscp" + } + } + actions { + preamble { + id: 32116918 + name: "FabricIngress.qos.set_queue" + alias: "set_queue" + } + params { + id: 1 + name: "qid" + bitwidth: 5 + } + } + actions { + preamble { + id: 28214351 + name: "FabricIngress.qos.meter_drop" + alias: "meter_drop" + } + } + actions { + preamble { + id: 23587909 + name: "FabricIngress.qos.set_default_tc" + alias: "set_default_tc" + } + params { + id: 1 + name: "tc" + bitwidth: 2 + } + } + actions { + preamble { + id: 30131500 + name: "FabricIngress.upf.iface_access" + alias: "iface_access" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } + } + actions { + preamble { + id: 19786139 + name: "FabricIngress.upf.iface_core" + alias: "iface_core" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } + } + actions { + preamble { + id: 19466514 + name: "FabricIngress.upf.iface_dbuf" + alias: "iface_dbuf" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } + } + actions { + preamble { + id: 30204657 + name: "FabricIngress.upf.iface_miss" + alias: "iface_miss" + } + } + actions { + preamble { + id: 20368148 + name: "FabricIngress.upf.set_uplink_session_miss" + alias: "set_uplink_session_miss" + } + } + actions { + preamble { + id: 24328070 + name: "FabricIngress.upf.set_uplink_session_drop" + alias: "set_uplink_session_drop" + } + } + actions { + preamble { + id: 32013192 + name: "FabricIngress.upf.set_downlink_session_miss" + alias: "set_downlink_session_miss" + } + } + actions { + preamble { + id: 24509779 + name: "FabricIngress.upf.set_downlink_session_drop" + alias: "set_downlink_session_drop" + } + } + actions { + preamble { + id: 16984383 + name: "FabricIngress.upf.set_downlink_session" + alias: "set_downlink_session" + } + params { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + } + params { + id: 2 + name: "session_meter_idx" + bitwidth: 15 + } + } + actions { + preamble { + id: 31195396 + name: "FabricIngress.upf.set_downlink_session_buf" + alias: "set_downlink_session_buf" + } + params { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + } + params { + id: 2 + name: "session_meter_idx" + bitwidth: 15 + } + } + actions { + preamble { + id: 21581660 + name: "FabricIngress.upf.set_downlink_session_buf_drop" + alias: "set_downlink_session_buf_drop" + } + } + actions { + preamble { + id: 31219743 + name: "FabricIngress.upf.set_uplink_session" + alias: "set_uplink_session" + } + params { + id: 1 + name: "session_meter_idx" + bitwidth: 15 + } + } + actions { + preamble { + id: 20624836 + name: "FabricIngress.upf.uplink_drop_miss" + alias: "uplink_drop_miss" + } + } + actions { + preamble { + id: 26608757 + name: "FabricIngress.upf.downlink_drop_miss" + alias: "downlink_drop_miss" + } + } + actions { + preamble { + id: 28764209 + name: "FabricIngress.upf.uplink_drop" + alias: "uplink_drop" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } + } + actions { + preamble { + id: 30742995 + name: "FabricIngress.upf.downlink_drop" + alias: "downlink_drop" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } + } + actions { + preamble { + id: 25805419 + name: "FabricIngress.upf.app_fwd" + alias: "app_fwd" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } + params { + id: 2 + name: "tc" + bitwidth: 2 + } + params { + id: 3 + name: "app_meter_idx" + bitwidth: 15 + } + } + actions { + preamble { + id: 23536134 + name: "FabricIngress.upf.downlink_fwd_encap" + alias: "downlink_fwd_encap" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } + params { + id: 2 + name: "tc" + bitwidth: 2 + } + params { + id: 3 + name: "teid" + bitwidth: 32 + } + params { + id: 4 + name: "qfi" + bitwidth: 6 + } + params { + id: 5 + name: "app_meter_idx" + bitwidth: 15 + } + } + actions { + preamble { + id: 26011763 + name: "FabricIngress.upf.set_routing_ipv4_dst" + alias: "set_routing_ipv4_dst" + } + params { + id: 1 + name: "tun_dst_addr" + bitwidth: 32 + } + } + actions { + preamble { + id: 26631629 + name: "FabricIngress.upf.set_app_id" + alias: "set_app_id" + } + params { + id: 1 + name: "app_id" + bitwidth: 8 + } + } + actions { + preamble { + id: 28119063 + name: "FabricIngress.upf.recirc_allow" + alias: "recirc_allow" + } + } + actions { + preamble { + id: 19222227 + name: "FabricIngress.upf.recirc_deny" + alias: "recirc_deny" + } + } + actions { + preamble { + id: 29186084 + name: "FabricIngress.upf.recirc_miss" + alias: "recirc_miss" + } + } + actions { + preamble { + id: 25078550 + name: "FabricIngress.int_watchlist.mark_to_report" + alias: "mark_to_report" + } + } + actions { + preamble { + id: 28396787 + name: "FabricIngress.int_watchlist.no_report" + alias: "no_report" + } + } + actions { + preamble { + id: 20118842 + name: "FabricIngress.int_watchlist.no_report_collector" + alias: "no_report_collector" + } + } + actions { + preamble { + id: 26838724 + name: "FabricEgress.stats.count" + alias: "FabricEgress.stats.count" + } + } + actions { + preamble { + id: 32804382 + name: "FabricEgress.pkt_io_egress.set_switch_info" + alias: "set_switch_info" + } + params { + id: 1 + name: "cpu_port" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + } + actions { + preamble { + id: 30307755 + name: "FabricEgress.egress_next.push_vlan" + alias: "push_vlan" + } + } + actions { + preamble { + id: 17183246 + name: "FabricEgress.egress_next.pop_vlan" + alias: "pop_vlan" + } + } + actions { + preamble { + id: 30812542 + name: "FabricEgress.egress_next.drop" + alias: "egress_next.drop" + } + } + actions { + preamble { + id: 27951287 + name: "FabricEgress.dscp_rewriter.rewrite" + alias: "rewrite" + } + } + actions { + preamble { + id: 24120545 + name: "FabricEgress.dscp_rewriter.clear" + alias: "clear" + } + } + actions { + preamble { + id: 28490145 + name: "FabricEgress.upf.load_tunnel_params" + alias: "load_tunnel_params" + } + params { + id: 1 + name: "tunnel_src_port" + bitwidth: 16 + } + params { + id: 2 + name: "tunnel_src_addr" + bitwidth: 32 + } + params { + id: 3 + name: "tunnel_dst_addr" + bitwidth: 32 + } + } + actions { + preamble { + id: 18154440 + name: "FabricEgress.upf.gtpu_only" + alias: "gtpu_only" + } + } + actions { + preamble { + id: 25872588 + name: "FabricEgress.upf.gtpu_with_psc" + alias: "gtpu_with_psc" + } + } + actions { + preamble { + id: 22415037 + name: "FabricEgress.int_egress.check_quota" + alias: "check_quota" + } + } + actions { + preamble { + id: 19702294 + name: "FabricEgress.int_egress.reset_quota" + alias: "reset_quota" + } + } + actions { + preamble { + id: 22425991 + name: "FabricEgress.int_egress.set_config" + alias: "set_config" + } + params { + id: 1 + name: "hop_latency_mask" + bitwidth: 32 + } + params { + id: 2 + name: "timestamp_mask" + bitwidth: 48 + } + } + actions { + preamble { + id: 30783845 + name: "FabricEgress.int_egress.do_local_report_encap" + alias: "do_local_report_encap" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "switch_id" + bitwidth: 32 + } + } + actions { + preamble { + id: 22769901 + name: "FabricEgress.int_egress.do_local_report_encap_mpls" + alias: "do_local_report_encap_mpls" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "mon_label" + bitwidth: 20 + } + params { + id: 5 + name: "switch_id" + bitwidth: 32 + } + } + actions { + preamble { + id: 32486459 + name: "FabricEgress.int_egress.do_drop_report_encap" + alias: "do_drop_report_encap" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "switch_id" + bitwidth: 32 + } + } + actions { + preamble { + id: 25343592 + name: "FabricEgress.int_egress.do_drop_report_encap_mpls" + alias: "do_drop_report_encap_mpls" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "mon_label" + bitwidth: 20 + } + params { + id: 5 + name: "switch_id" + bitwidth: 32 + } + } + action_profiles { + preamble { + id: 289544276 + name: "FabricIngress.next.hashed_profile" + alias: "hashed_profile" + } + table_ids: 47960972 + with_selector: true + size: 16 + max_group_size: 16 + } + counters { + preamble { + id: 309010261 + name: "FabricIngress.filtering.fwd_type_counter" + alias: "fwd_type_counter" + } + spec { + unit: BOTH + } + size: 8 + } + counters { + preamble { + id: 316677328 + name: "FabricIngress.upf.terminations_counter" + alias: "FabricIngress.upf.terminations_counter" + } + spec { + unit: BOTH + } + size: 4096 + } + counters { + preamble { + id: 314209362 + name: "FabricEgress.upf.terminations_counter" + alias: "FabricEgress.upf.terminations_counter" + } + spec { + unit: BOTH + } + size: 4096 + } + direct_counters { + preamble { + id: 333776332 + name: "FabricIngress.stats.flow_counter" + alias: "FabricIngress.stats.flow_counter" + } + spec { + unit: BOTH + } + direct_table_id: 41243186 + } + direct_counters { + preamble { + id: 326221069 + name: "FabricIngress.filtering.ingress_port_vlan_counter" + alias: "ingress_port_vlan_counter" + } + spec { + unit: BOTH + } + direct_table_id: 43310977 + } + direct_counters { + preamble { + id: 335473470 + name: "FabricIngress.filtering.fwd_classifier_counter" + alias: "fwd_classifier_counter" + } + spec { + unit: BOTH + } + direct_table_id: 49718154 + } + direct_counters { + preamble { + id: 330959985 + name: "FabricIngress.forwarding.bridging_counter" + alias: "bridging_counter" + } + spec { + unit: BOTH + } + direct_table_id: 43623757 + } + direct_counters { + preamble { + id: 318961579 + name: "FabricIngress.forwarding.mpls_counter" + alias: "mpls_counter" + } + spec { + unit: BOTH + } + direct_table_id: 37768578 + } + direct_counters { + preamble { + id: 333425635 + name: "FabricIngress.forwarding.routing_v4_counter" + alias: "routing_v4_counter" + } + spec { + unit: BOTH + } + direct_table_id: 41754650 + } + direct_counters { + preamble { + id: 324042090 + name: "FabricIngress.forwarding.routing_v6_counter" + alias: "routing_v6_counter" + } + spec { + unit: BOTH + } + direct_table_id: 49342721 + } + direct_counters { + preamble { + id: 330020245 + name: "FabricIngress.pre_next.next_mpls_counter" + alias: "next_mpls_counter" + } + spec { + unit: BOTH + } + direct_table_id: 36626242 + } + direct_counters { + preamble { + id: 333692067 + name: "FabricIngress.pre_next.next_vlan_counter" + alias: "next_vlan_counter" + } + spec { + unit: BOTH + } + direct_table_id: 48011802 + } + direct_counters { + preamble { + id: 319194241 + name: "FabricIngress.acl.acl_counter" + alias: "acl_counter" + } + spec { + unit: BOTH + } + direct_table_id: 44104738 + } + direct_counters { + preamble { + id: 322798228 + name: "FabricIngress.next.hashed_counter" + alias: "hashed_counter" + } + spec { + unit: BOTH + } + direct_table_id: 47960972 + } + direct_counters { + preamble { + id: 319194968 + name: "FabricIngress.next.multicast_counter" + alias: "multicast_counter" + } + spec { + unit: BOTH + } + direct_table_id: 40619180 + } + direct_counters { + preamble { + id: 334706097 + name: "FabricIngress.slice_tc_classifier.classifier_stats" + alias: "classifier_stats" + } + spec { + unit: PACKETS + } + direct_table_id: 34606298 + } + direct_counters { + preamble { + id: 327743278 + name: "FabricIngress.qos.queues_stats" + alias: "queues_stats" + } + spec { + unit: PACKETS + } + direct_table_id: 36435258 + } + direct_counters { + preamble { + id: 335275671 + name: "FabricIngress.upf.recirc_stats" + alias: "recirc_stats" + } + spec { + unit: PACKETS + } + direct_table_id: 34400315 + } + direct_counters { + preamble { + id: 328581521 + name: "FabricIngress.int_watchlist.watchlist_counter" + alias: "watchlist_counter" + } + spec { + unit: BOTH + } + direct_table_id: 40748488 + } + direct_counters { + preamble { + id: 334508337 + name: "FabricEgress.stats.flow_counter" + alias: "FabricEgress.stats.flow_counter" + } + spec { + unit: BOTH + } + direct_table_id: 43851059 + } + direct_counters { + preamble { + id: 318892680 + name: "FabricEgress.egress_next.egress_vlan_counter" + alias: "egress_vlan_counter" + } + spec { + unit: BOTH + } + direct_table_id: 49262446 + } + direct_counters { + preamble { + id: 325056546 + name: "FabricEgress.int_egress.report_counter" + alias: "report_counter" + } + spec { + unit: BOTH + } + direct_table_id: 46071383 + } + meters { + preamble { + id: 348573637 + name: "FabricIngress.qos.slice_tc_meter" + alias: "slice_tc_meter" + } + spec { + unit: BYTES + } + size: 64 + } + meters { + preamble { + id: 345152250 + name: "FabricIngress.upf.session_meter" + alias: "session_meter" + } + spec { + unit: BYTES + } + size: 20000 + } + meters { + preamble { + id: 343216442 + name: "FabricIngress.upf.app_meter" + alias: "app_meter" + } + spec { + unit: BYTES + } + size: 20000 + } + controller_packet_metadata { + preamble { + id: 81826293 + name: "packet_in" + alias: "packet_in" + annotations: "@controller_header(\"packet_in\")" + } + metadata { + id: 1 + name: "ingress_port" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + metadata { + id: 2 + name: "_pad0" + bitwidth: 7 + } + } + controller_packet_metadata { + preamble { + id: 76689799 + name: "packet_out" + alias: "packet_out" + annotations: "@controller_header(\"packet_out\")" + } + metadata { + id: 1 + name: "pad0" + annotations: "@padding" + bitwidth: 7 + } + metadata { + id: 2 + name: "egress_port" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + metadata { + id: 3 + name: "pad1" + annotations: "@padding" + bitwidth: 3 + } + metadata { + id: 4 + name: "queue_id" + bitwidth: 5 + } + metadata { + id: 5 + name: "pad2" + annotations: "@padding" + bitwidth: 5 + } + metadata { + id: 6 + name: "cpu_loopback_mode" + bitwidth: 2 + } + metadata { + id: 7 + name: "do_forwarding" + bitwidth: 1 + } + metadata { + id: 8 + name: "pad3" + annotations: "@padding" + bitwidth: 16 + } + metadata { + id: 9 + name: "pad4" + annotations: "@padding" + bitwidth: 48 + } + metadata { + id: 10 + name: "ether_type" + bitwidth: 16 + } + } + registers { + preamble { + id: 376533241 + name: "FabricEgress.int_egress.seq_number" + alias: "seq_number" + annotations: "@hidden" + } + type_spec { + bitstring { + bit { + bitwidth: 32 + } + } + } + size: 1024 + } + type_info { + serializable_enums { + key: "BridgedMdType_t" + value { + underlying_type { + bitwidth: 8 + } + members { + name: "INVALID" + value: "\000" + } + members { + name: "INGRESS_TO_EGRESS" + value: "\001" + } + members { + name: "EGRESS_MIRROR" + value: "\002" + } + members { + name: "INGRESS_MIRROR" + value: "\003" + } + members { + name: "INT_INGRESS_DROP" + value: "\004" + } + members { + name: "DEFLECTED" + value: "\005" + } + } + } + serializable_enums { + key: "CpuLoopbackMode_t" + value { + underlying_type { + bitwidth: 2 + } + members { + name: "DISABLED" + value: "\000" + } + members { + name: "DIRECT" + value: "\001" + } + members { + name: "INGRESS" + value: "\002" + } + } + } + serializable_enums { + key: "FabricMirrorType_t" + value { + underlying_type { + bitwidth: 3 + } + members { + name: "INVALID" + value: "\000" + } + members { + name: "INT_REPORT" + value: "\001" + } + members { + name: "PACKET_IN" + value: "\002" + } + } + } + serializable_enums { + key: "PortType_t" + value { + underlying_type { + bitwidth: 2 + } + members { + name: "UNKNOWN" + value: "\000" + } + members { + name: "EDGE" + value: "\001" + } + members { + name: "INFRA" + value: "\002" + } + members { + name: "INTERNAL" + value: "\003" + } + } + } + new_types { + key: "FabricPortId_t" + value { + original_type { + bitstring { + bit { + bitwidth: 9 + } + } + } + } + } + } + } + p4_device_config: "{\n \"header_types\" : [\n {\n \"name\" : \"scalars_0\",\n \"id\" : 0,\n \"fields\" : [\n [\"tmp_2\", 16, false],\n [\"tmp_4\", 1, false],\n [\"tmp_6\", 16, false],\n [\"tmp_12\", 3, false],\n [\"tmp_13\", 8, false],\n [\"gtpu_ext_len_0\", 8, false],\n [\"tmp_3\", 16, false],\n [\"tmp_5\", 16, false],\n [\"tmp_7\", 4, false],\n [\"tmp_8\", 112, false],\n [\"tmp_9\", 112, false],\n [\"tmp_10\", 112, false],\n [\"tmp_11\", 64, false],\n [\"tmp_14\", 32, false],\n [\"tmp_15\", 32, false],\n [\"tmp_16\", 32, false],\n [\"tmp_17\", 32, false],\n [\"tmp_18\", 8, false],\n [\"tmp_19\", 32, false],\n [\"tmp_20\", 32, false],\n [\"tmp_21\", 32, false],\n [\"tmp_22\", 32, false],\n [\"tmp_23\", 48, false],\n [\"tmp_24\", 48, false],\n [\"tmp_25\", 16, false],\n [\"tmp_26\", 32, false],\n [\"tmp_27\", 32, false],\n [\"tmp_28\", 8, false],\n [\"tmp_29\", 16, false],\n [\"tmp_30\", 16, false],\n [\"tmp_31\", 32, false],\n [\"qos_packet_color\", 2, false],\n [\"upf_is_uplink\", 1, false],\n [\"upf_term_hit\", 1, false],\n [\"upf_sess_hit\", 1, false],\n [\"upf_app_ipv4_addr\", 32, false],\n [\"upf_app_l4_port\", 16, false],\n [\"upf_app_ip_proto\", 8, false],\n [\"upf_internal_app_id\", 8, false],\n [\"upf_ue_session_id\", 32, false],\n [\"upf_session_meter_idx_internal\", 15, false],\n [\"upf_app_meter_idx_internal\", 15, false],\n [\"tmp_32\", 32, false],\n [\"tmp_33\", 32, false],\n [\"tmp_34\", 32, false],\n [\"tmp_35\", 32, false],\n [\"tmp_36\", 32, false],\n [\"tmp_37\", 32, false],\n [\"tmp_38\", 32, false],\n [\"tmp_39\", 32, false],\n [\"tmp_40\", 32, false],\n [\"tmp_41\", 32, false],\n [\"dscp_rewriter_tmp_dscp\", 6, false],\n [\"int_egress_fabric_md_pkt_length\", 16, false],\n [\"int_egress_egress_qid\", 5, false],\n [\"int_egress_reg\", 32, false],\n [\"key_0\", 16, false],\n [\"key_1\", 16, false],\n [\"userMetadata._skip_egress0\", 1, false],\n [\"userMetadata._do_upf_uplink_recirc1\", 1, false],\n [\"userMetadata._drop_ctl2\", 1, false],\n [\"userMetadata._int_mirror_type3\", 3, false],\n [\"userMetadata._ingress_ecmp_hash5\", 32, false],\n [\"userMetadata._ingress_lkp_eth_dst6\", 48, false],\n [\"userMetadata._ingress_lkp_eth_src7\", 48, false],\n [\"userMetadata._ingress_lkp_eth_type8\", 16, false],\n [\"userMetadata._ingress_lkp_vlan_id9\", 12, false],\n [\"userMetadata._ingress_lkp_is_ipv410\", 1, false],\n [\"userMetadata._ingress_lkp_ipv4_src11\", 32, false],\n [\"userMetadata._ingress_lkp_ipv4_dst12\", 32, false],\n [\"userMetadata._ingress_lkp_ip_proto13\", 8, false],\n [\"userMetadata._ingress_lkp_l4_sport14\", 16, false],\n [\"userMetadata._ingress_lkp_l4_dport15\", 16, false],\n [\"userMetadata._ingress_lkp_icmp_type16\", 8, false],\n [\"userMetadata._ingress_lkp_icmp_code17\", 8, false],\n [\"userMetadata._ingress_routing_ipv4_dst18\", 32, false],\n [\"userMetadata._ingress_skip_forwarding19\", 1, false],\n [\"userMetadata._ingress_skip_next20\", 1, false],\n [\"userMetadata._ingress_next_id21\", 32, false],\n [\"userMetadata._ingress_egress_port_set22\", 1, false],\n [\"userMetadata._ingress_punt_to_cpu23\", 1, false],\n [\"userMetadata._ingress_ipv4_checksum_err24\", 1, false],\n [\"userMetadata._ingress_inner_ipv4_checksum_err25\", 1, false],\n [\"userMetadata._ingress_slice_id26\", 4, false],\n [\"userMetadata._ingress_tc27\", 2, false],\n [\"userMetadata._ingress_tc_unknown28\", 1, false],\n [\"userMetadata._ingress_is_upf_hit29\", 1, false],\n [\"userMetadata._ingress_upf_slice_id30\", 4, false],\n [\"userMetadata._ingress_upf_tc31\", 2, false],\n [\"userMetadata._ingress_upf_meter_color32\", 2, false],\n [\"userMetadata._ingress_ig_port_type33\", 2, false],\n [\"userMetadata._ingress_mirror_mirror_session_id34\", 10, false],\n [\"userMetadata._ingress_mirror_bmd_type35\", 8, false],\n [\"userMetadata._egress_cpu_port37\", 9, false],\n [\"userMetadata._egress_inner_ipv4_checksum_err38\", 1, false],\n [\"userMetadata._egress_int_md_hop_latency40\", 32, false],\n [\"userMetadata._egress_int_md_timestamp41\", 48, false],\n [\"userMetadata._egress_int_md_vlan_stripped42\", 1, false],\n [\"userMetadata._egress_int_md_queue_report43\", 1, false],\n [\"userMetadata._egress_int_ipv4_len44\", 16, false],\n [\"userMetadata._egress_is_int_recirc45\", 1, false],\n [\"userMetadata._egress_pkt_length46\", 16, false],\n [\"userMetadata._recirc_preserved_report_type47\", 3, false],\n [\"userMetadata._recirc_preserved_egress_port48\", 9, false],\n [\"userMetadata._recirc_preserved_drop_reason49\", 8, false],\n [\"userMetadata._recirc_preserved_ingress_port50\", 9, false],\n [\"_padding_1\", 3, false]\n ]\n },\n {\n \"name\" : \"fake_ethernet_t\",\n \"id\" : 1,\n \"fields\" : [\n [\"_pad0\", 48, false],\n [\"_pad1\", 48, false],\n [\"ether_type\", 16, false]\n ]\n },\n {\n \"name\" : \"packet_out_header_t\",\n \"id\" : 2,\n \"fields\" : [\n [\"pad0\", 7, false],\n [\"egress_port\", 9, false],\n [\"pad1\", 3, false],\n [\"queue_id\", 5, false],\n [\"pad2\", 5, false],\n [\"cpu_loopback_mode\", 2, false],\n [\"do_forwarding\", 1, false],\n [\"pad3\", 16, false],\n [\"pad4\", 48, false],\n [\"ether_type\", 16, false]\n ]\n },\n {\n \"name\" : \"gtpu_t\",\n \"id\" : 3,\n \"fields\" : [\n [\"version\", 3, false],\n [\"pt\", 1, false],\n [\"spare\", 1, false],\n [\"ex_flag\", 1, false],\n [\"seq_flag\", 1, false],\n [\"npdu_flag\", 1, false],\n [\"msgtype\", 8, false],\n [\"msglen\", 16, false],\n [\"teid\", 32, false]\n ]\n },\n {\n \"name\" : \"ethernet_t\",\n \"id\" : 4,\n \"fields\" : [\n [\"dst_addr\", 48, false],\n [\"src_addr\", 48, false]\n ]\n },\n {\n \"name\" : \"eth_type_t\",\n \"id\" : 5,\n \"fields\" : [\n [\"value\", 16, false]\n ]\n },\n {\n \"name\" : \"ipv4_t\",\n \"id\" : 6,\n \"fields\" : [\n [\"version\", 4, false],\n [\"ihl\", 4, false],\n [\"dscp\", 6, false],\n [\"ecn\", 2, false],\n [\"total_len\", 16, false],\n [\"identification\", 16, false],\n [\"flags\", 3, false],\n [\"frag_offset\", 13, false],\n [\"ttl\", 8, false],\n [\"protocol\", 8, false],\n [\"hdr_checksum\", 16, false],\n [\"src_addr\", 32, false],\n [\"dst_addr\", 32, false]\n ]\n },\n {\n \"name\" : \"udp_t\",\n \"id\" : 7,\n \"fields\" : [\n [\"sport\", 16, false],\n [\"dport\", 16, false],\n [\"len\", 16, false],\n [\"checksum\", 16, false]\n ]\n },\n {\n \"name\" : \"report_fixed_header_t\",\n \"id\" : 8,\n \"fields\" : [\n [\"ver\", 4, false],\n [\"nproto\", 4, false],\n [\"dqf\", 3, false],\n [\"rsvd\", 15, false],\n [\"hw_id\", 6, false],\n [\"seq_no\", 32, false],\n [\"ig_tstamp\", 32, false]\n ]\n },\n {\n \"name\" : \"common_report_header_t\",\n \"id\" : 9,\n \"fields\" : [\n [\"switch_id\", 32, false],\n [\"pad1\", 7, false],\n [\"ig_port\", 9, false],\n [\"pad2\", 7, false],\n [\"eg_port\", 9, false],\n [\"pad3\", 3, false],\n [\"queue_id\", 5, false]\n ]\n },\n {\n \"name\" : \"local_report_header_t\",\n \"id\" : 10,\n \"fields\" : [\n [\"pad1\", 5, false],\n [\"queue_occupancy\", 19, false],\n [\"eg_tstamp\", 32, false]\n ]\n },\n {\n \"name\" : \"drop_report_header_t\",\n \"id\" : 11,\n \"fields\" : [\n [\"drop_reason\", 8, false],\n [\"pad\", 16, false]\n ]\n },\n {\n \"name\" : \"mpls_t\",\n \"id\" : 12,\n \"fields\" : [\n [\"label\", 20, false],\n [\"tc\", 3, false],\n [\"bos\", 1, false],\n [\"ttl\", 8, false]\n ]\n },\n {\n \"name\" : \"bridged_metadata_t\",\n \"id\" : 13,\n \"fields\" : [\n [\"_bmd_type0\", 8, false],\n [\"_base_inner_hash1\", 32, false],\n [\"_base_mpls_label2\", 20, false],\n [\"_base_ig_port3\", 9, false],\n [\"_base_is_multicast4\", 1, 0],\n [\"_base_fwd_type5\", 3, false],\n [\"_base_vlan_id6\", 12, false],\n [\"_base_encap_presence7\", 2, false],\n [\"_base_mpls_ttl8\", 8, false],\n [\"_base_ig_tstamp9\", 48, false],\n [\"_base_ip_eth_type10\", 16, false],\n [\"_base_stats_flow_id11\", 10, false],\n [\"_base_slice_tc12\", 6, false],\n [\"_upf_tun_peer_id13\", 8, false],\n [\"_upf_upf_ctr_id14\", 12, false],\n [\"_upf_qfi15\", 6, false],\n [\"_upf_needs_gtpu_encap16\", 1, 0],\n [\"_upf_skip_upf17\", 1, 0],\n [\"_upf_skip_egress_upf_ctr18\", 1, 0],\n [\"_upf_teid19\", 32, false],\n [\"_upf__pad20\", 4, false],\n [\"_int_bmd_report_type21\", 3, false],\n [\"_int_bmd_mirror_session_id22\", 10, false],\n [\"_int_bmd_drop_reason23\", 8, false],\n [\"_int_bmd_queue_id24\", 5, false],\n [\"_int_bmd_egress_port25\", 9, false],\n [\"_int_bmd_wip_type26\", 8, false],\n [\"__pad027\", 1, false],\n [\"__pad128\", 7, false],\n [\"__pad229\", 5, false]\n ]\n },\n {\n \"name\" : \"int_report_metadata_t\",\n \"id\" : 14,\n \"fields\" : [\n [\"bmd_type\", 8, false],\n [\"_pad0\", 5, false],\n [\"mirror_type\", 3, false],\n [\"_pad1\", 7, false],\n [\"ig_port\", 9, false],\n [\"_pad2\", 7, false],\n [\"eg_port\", 9, false],\n [\"_pad3\", 3, false],\n [\"queue_id\", 5, false],\n [\"_pad4\", 5, false],\n [\"queue_occupancy\", 19, false],\n [\"ig_tstamp\", 32, false],\n [\"eg_tstamp\", 32, false],\n [\"drop_reason\", 8, false],\n [\"ip_eth_type\", 16, false],\n [\"_pad5\", 6, false],\n [\"encap_presence\", 2, false],\n [\"report_type\", 3, false],\n [\"_pad6\", 5, false],\n [\"flow_hash\", 32, false]\n ]\n },\n {\n \"name\" : \"int_metadata_t\",\n \"id\" : 15,\n \"fields\" : [\n [\"hop_latency\", 32, false],\n [\"timestamp\", 48, false],\n [\"vlan_stripped\", 1, 0],\n [\"queue_report\", 1, 0],\n [\"_padding\", 6, false]\n ]\n },\n {\n \"name\" : \"standard_metadata\",\n \"id\" : 16,\n \"fields\" : [\n [\"ingress_port\", 9, false],\n [\"egress_spec\", 9, false],\n [\"egress_port\", 9, false],\n [\"instance_type\", 32, false],\n [\"packet_length\", 32, false],\n [\"enq_timestamp\", 32, false],\n [\"enq_qdepth\", 19, false],\n [\"deq_timedelta\", 32, false],\n [\"deq_qdepth\", 19, false],\n [\"ingress_global_timestamp\", 48, false],\n [\"egress_global_timestamp\", 48, false],\n [\"mcast_grp\", 16, false],\n [\"egress_rid\", 16, false],\n [\"checksum_error\", 1, false],\n [\"parser_error\", 32, false],\n [\"priority\", 3, false],\n [\"_padding_0\", 3, false]\n ]\n },\n {\n \"name\" : \"packet_in_header_t\",\n \"id\" : 17,\n \"fields\" : [\n [\"ingress_port\", 9, false],\n [\"_pad0\", 7, false]\n ]\n },\n {\n \"name\" : \"vlan_tag_t\",\n \"id\" : 18,\n \"fields\" : [\n [\"eth_type\", 16, false],\n [\"pri\", 3, false],\n [\"cfi\", 1, false],\n [\"vlan_id\", 12, false]\n ]\n },\n {\n \"name\" : \"ipv6_t\",\n \"id\" : 19,\n \"fields\" : [\n [\"version\", 4, false],\n [\"traffic_class\", 8, false],\n [\"flow_label\", 20, false],\n [\"payload_len\", 16, false],\n [\"next_hdr\", 8, false],\n [\"hop_limit\", 8, false],\n [\"src_addr\", 128, false],\n [\"dst_addr\", 128, false]\n ]\n },\n {\n \"name\" : \"tcp_t\",\n \"id\" : 20,\n \"fields\" : [\n [\"sport\", 16, false],\n [\"dport\", 16, false]\n ]\n },\n {\n \"name\" : \"icmp_t\",\n \"id\" : 21,\n \"fields\" : [\n [\"icmp_type\", 8, false],\n [\"icmp_code\", 8, false]\n ]\n },\n {\n \"name\" : \"gtpu_options_t\",\n \"id\" : 22,\n \"fields\" : [\n [\"seq_num\", 16, false],\n [\"n_pdu_num\", 8, false],\n [\"next_ext\", 8, false]\n ]\n },\n {\n \"name\" : \"gtpu_ext_psc_t\",\n \"id\" : 23,\n \"fields\" : [\n [\"len\", 8, false],\n [\"type\", 4, false],\n [\"spare0\", 4, false],\n [\"ppp\", 1, false],\n [\"rqi\", 1, false],\n [\"qfi\", 6, false],\n [\"next_ext\", 8, false]\n ]\n },\n {\n \"name\" : \"vxlan_t\",\n \"id\" : 24,\n \"fields\" : [\n [\"flags\", 8, false],\n [\"reserved\", 24, false],\n [\"vni\", 24, false],\n [\"reserved_2\", 8, false]\n ]\n }\n ],\n \"headers\" : [\n {\n \"name\" : \"tmp\",\n \"id\" : 0,\n \"header_type\" : \"fake_ethernet_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"tmp_0\",\n \"id\" : 1,\n \"header_type\" : \"packet_out_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"tmp_1\",\n \"id\" : 2,\n \"header_type\" : \"fake_ethernet_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"gtpu_0\",\n \"id\" : 3,\n \"header_type\" : \"gtpu_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"parser_emulator_hdr_report_ethernet\",\n \"id\" : 4,\n \"header_type\" : \"ethernet_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"parser_emulator_hdr_report_eth_type\",\n \"id\" : 5,\n \"header_type\" : \"eth_type_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"parser_emulator_hdr_report_ipv4\",\n \"id\" : 6,\n \"header_type\" : \"ipv4_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"parser_emulator_hdr_report_udp\",\n \"id\" : 7,\n \"header_type\" : \"udp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"parser_emulator_hdr_report_fixed_header\",\n \"id\" : 8,\n \"header_type\" : \"report_fixed_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"parser_emulator_hdr_common_report_header\",\n \"id\" : 9,\n \"header_type\" : \"common_report_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"parser_emulator_hdr_local_report_header\",\n \"id\" : 10,\n \"header_type\" : \"local_report_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"parser_emulator_hdr_drop_report_header\",\n \"id\" : 11,\n \"header_type\" : \"drop_report_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_hdr_report_eth_type\",\n \"id\" : 12,\n \"header_type\" : \"eth_type_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_hdr_report_mpls\",\n \"id\" : 13,\n \"header_type\" : \"mpls_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_hdr_report_ipv4\",\n \"id\" : 14,\n \"header_type\" : \"ipv4_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_hdr_report_udp\",\n \"id\" : 15,\n \"header_type\" : \"udp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_hdr_report_fixed_header\",\n \"id\" : 16,\n \"header_type\" : \"report_fixed_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_hdr_common_report_header\",\n \"id\" : 17,\n \"header_type\" : \"common_report_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_hdr_local_report_header\",\n \"id\" : 18,\n \"header_type\" : \"local_report_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_hdr_drop_report_header\",\n \"id\" : 19,\n \"header_type\" : \"drop_report_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_hdr_eth_type\",\n \"id\" : 20,\n \"header_type\" : \"eth_type_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_fabric_md_bridged\",\n \"id\" : 21,\n \"header_type\" : \"bridged_metadata_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_fabric_md_int_report_md\",\n \"id\" : 22,\n \"header_type\" : \"int_report_metadata_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_fabric_md_int_md\",\n \"id\" : 23,\n \"header_type\" : \"int_metadata_t\",\n \"metadata\" : true,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"scalars\",\n \"id\" : 24,\n \"header_type\" : \"scalars_0\",\n \"metadata\" : true,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"standard_metadata\",\n \"id\" : 25,\n \"header_type\" : \"standard_metadata\",\n \"metadata\" : true,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_packet_out0\",\n \"id\" : 26,\n \"header_type\" : \"packet_out_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_packet_in1\",\n \"id\" : 27,\n \"header_type\" : \"packet_in_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_fake_ethernet2\",\n \"id\" : 28,\n \"header_type\" : \"fake_ethernet_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_ethernet3\",\n \"id\" : 29,\n \"header_type\" : \"ethernet_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_vlan_tag4\",\n \"id\" : 30,\n \"header_type\" : \"vlan_tag_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_eth_type5\",\n \"id\" : 31,\n \"header_type\" : \"eth_type_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_mpls6\",\n \"id\" : 32,\n \"header_type\" : \"mpls_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_ipv47\",\n \"id\" : 33,\n \"header_type\" : \"ipv4_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_ipv68\",\n \"id\" : 34,\n \"header_type\" : \"ipv6_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_tcp9\",\n \"id\" : 35,\n \"header_type\" : \"tcp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_udp10\",\n \"id\" : 36,\n \"header_type\" : \"udp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_icmp11\",\n \"id\" : 37,\n \"header_type\" : \"icmp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_gtpu12\",\n \"id\" : 38,\n \"header_type\" : \"gtpu_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_gtpu_options13\",\n \"id\" : 39,\n \"header_type\" : \"gtpu_options_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_gtpu_ext_psc14\",\n \"id\" : 40,\n \"header_type\" : \"gtpu_ext_psc_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_vxlan15\",\n \"id\" : 41,\n \"header_type\" : \"vxlan_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_inner_ethernet16\",\n \"id\" : 42,\n \"header_type\" : \"ethernet_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_inner_eth_type17\",\n \"id\" : 43,\n \"header_type\" : \"eth_type_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_inner_ipv418\",\n \"id\" : 44,\n \"header_type\" : \"ipv4_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_inner_tcp19\",\n \"id\" : 45,\n \"header_type\" : \"tcp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_inner_udp20\",\n \"id\" : 46,\n \"header_type\" : \"udp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_inner_icmp21\",\n \"id\" : 47,\n \"header_type\" : \"icmp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_packet_in22\",\n \"id\" : 48,\n \"header_type\" : \"packet_in_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_fake_ethernet23\",\n \"id\" : 49,\n \"header_type\" : \"fake_ethernet_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_report_ethernet24\",\n \"id\" : 50,\n \"header_type\" : \"ethernet_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_report_eth_type25\",\n \"id\" : 51,\n \"header_type\" : \"eth_type_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_report_mpls26\",\n \"id\" : 52,\n \"header_type\" : \"mpls_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_report_ipv427\",\n \"id\" : 53,\n \"header_type\" : \"ipv4_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_report_udp28\",\n \"id\" : 54,\n \"header_type\" : \"udp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_report_fixed_header29\",\n \"id\" : 55,\n \"header_type\" : \"report_fixed_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_common_report_header30\",\n \"id\" : 56,\n \"header_type\" : \"common_report_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_local_report_header31\",\n \"id\" : 57,\n \"header_type\" : \"local_report_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_drop_report_header32\",\n \"id\" : 58,\n \"header_type\" : \"drop_report_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_ethernet33\",\n \"id\" : 59,\n \"header_type\" : \"ethernet_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_vlan_tag34\",\n \"id\" : 60,\n \"header_type\" : \"vlan_tag_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_eth_type35\",\n \"id\" : 61,\n \"header_type\" : \"eth_type_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_mpls36\",\n \"id\" : 62,\n \"header_type\" : \"mpls_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_outer_ipv437\",\n \"id\" : 63,\n \"header_type\" : \"ipv4_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_outer_udp38\",\n \"id\" : 64,\n \"header_type\" : \"udp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_outer_gtpu39\",\n \"id\" : 65,\n \"header_type\" : \"gtpu_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_outer_gtpu_options40\",\n \"id\" : 66,\n \"header_type\" : \"gtpu_options_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_outer_gtpu_ext_psc41\",\n \"id\" : 67,\n \"header_type\" : \"gtpu_ext_psc_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_ipv442\",\n \"id\" : 68,\n \"header_type\" : \"ipv4_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_ipv643\",\n \"id\" : 69,\n \"header_type\" : \"ipv6_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_udp44\",\n \"id\" : 70,\n \"header_type\" : \"udp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_bridged4\",\n \"id\" : 71,\n \"header_type\" : \"bridged_metadata_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_bridged36\",\n \"id\" : 72,\n \"header_type\" : \"bridged_metadata_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_int_report_md39\",\n \"id\" : 73,\n \"header_type\" : \"int_report_metadata_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n }\n ],\n \"header_stacks\" : [],\n \"header_union_types\" : [],\n \"header_unions\" : [],\n \"header_union_stacks\" : [],\n \"field_lists\" : [\n {\n \"id\" : 1,\n \"name\" : \"field_list241\",\n \"elements\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_report_type47\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_egress_port48\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_drop_reason49\"]\n }\n ]\n },\n {\n \"id\" : 2,\n \"name\" : \"field_list231\",\n \"elements\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_ingress_port50\"]\n }\n ]\n },\n {\n \"id\" : 3,\n \"name\" : \"empty\",\n \"elements\" : []\n },\n {\n \"id\" : 4,\n \"name\" : \"empty_0\",\n \"elements\" : []\n },\n {\n \"id\" : 5,\n \"name\" : \"empty_1\",\n \"elements\" : []\n }\n ],\n \"errors\" : [\n [\"NoError\", 1],\n [\"PacketTooShort\", 2],\n [\"NoMatch\", 3],\n [\"StackOutOfBounds\", 4],\n [\"HeaderTooShort\", 5],\n [\"ParserTimeout\", 6],\n [\"ParserInvalidArgument\", 7],\n [\"PacketRejectedByParser\", 8]\n ],\n \"enums\" : [],\n \"parsers\" : [\n {\n \"name\" : \"parser\",\n \"id\" : 0,\n \"init_state\" : \"start\",\n \"parse_states\" : [\n {\n \"name\" : \"start\",\n \"id\" : 0,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_pkt_length46\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"packet_length\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000ffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_bridged4\"\n }\n ],\n \"op\" : \"add_header\"\n }\n ],\n \"op\" : \"primitive\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_bmd_type0\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_ig_port3\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"ingress_port\"]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_ingress_port50\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"ingress_port\"]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_ig_tstamp9\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"ingress_global_timestamp\"]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_egress_port_set22\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_punt_to_cpu23\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_ip_eth_type10\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_wip_type26\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_encap_presence7\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_meter_color32\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_8\"]\n },\n {\n \"type\" : \"lookahead\",\n \"value\" : [0, 112]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"tmp\"\n }\n ],\n \"op\" : \"add_header\"\n }\n ],\n \"op\" : \"primitive\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp\", \"_pad0\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_8\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp\", \"_pad1\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_8\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x10\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp\", \"ether_type\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_8\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_2\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_8\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf02\",\n \"mask\" : null,\n \"next_state\" : \"parse_fake_ethernet\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf03\",\n \"mask\" : null,\n \"next_state\" : \"parse_fake_ethernet_and_accept\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf01\",\n \"mask\" : null,\n \"next_state\" : \"check_packet_out\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf04\",\n \"mask\" : null,\n \"next_state\" : \"parse_int_wip_ipv4\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf05\",\n \"mask\" : null,\n \"next_state\" : \"parse_int_wip_mpls\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"parse_ethernet\"\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_2\"]\n }\n ]\n },\n {\n \"name\" : \"check_packet_out\",\n \"id\" : 1,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n {\n \"type\" : \"lookahead\",\n \"value\" : [0, 112]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"tmp_0\"\n }\n ],\n \"op\" : \"add_header\"\n }\n ],\n \"op\" : \"primitive\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_0\", \"pad0\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x69\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x7f\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_0\", \"egress_port\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x60\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01ff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_0\", \"pad1\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x5d\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x07\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_0\", \"queue_id\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x58\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x1f\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_0\", \"pad2\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x53\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x1f\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_0\", \"cpu_loopback_mode\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x51\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x03\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_0\", \"do_forwarding\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x50\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_0\", \"pad3\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_0\", \"pad4\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x10\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_0\", \"ether_type\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_4\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x50\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\",\n \"mask\" : null,\n \"next_state\" : \"parse_packet_out_and_accept\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"strip_packet_out\"\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_4\"]\n }\n ]\n },\n {\n \"name\" : \"parse_int_wip_ipv4\",\n \"id\" : 2,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_ethernet3\"\n }\n ],\n \"op\" : \"add_header\"\n }\n ],\n \"op\" : \"primitive\"\n },\n {\n \"parameters\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_eth_type5\"\n }\n ],\n \"op\" : \"add_header\"\n }\n ],\n \"op\" : \"primitive\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_eth_type5\", \"value\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0800\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_wip_type26\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_mpls_label2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x000000\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_mpls_ttl8\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x41\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000070\"\n }\n ],\n \"op\" : \"advance\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"parse_ipv4\"\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_int_wip_mpls\",\n \"id\" : 3,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_ethernet3\"\n }\n ],\n \"op\" : \"add_header\"\n }\n ],\n \"op\" : \"primitive\"\n },\n {\n \"parameters\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_eth_type5\"\n }\n ],\n \"op\" : \"add_header\"\n }\n ],\n \"op\" : \"primitive\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_eth_type5\", \"value\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8847\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_wip_type26\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000070\"\n }\n ],\n \"op\" : \"advance\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"parse_mpls\"\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_packet_out_and_accept\",\n \"id\" : 4,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_packet_out0\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"strip_packet_out\",\n \"id\" : 5,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000070\"\n }\n ],\n \"op\" : \"advance\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"parse_ethernet\"\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_fake_ethernet\",\n \"id\" : 6,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_fake_ethernet2\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_10\"]\n },\n {\n \"type\" : \"lookahead\",\n \"value\" : [0, 112]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"tmp_1\"\n }\n ],\n \"op\" : \"add_header\"\n }\n ],\n \"op\" : \"primitive\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_1\", \"_pad0\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_10\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_1\", \"_pad1\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_10\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x10\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_1\", \"ether_type\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_10\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_6\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_10\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf04\",\n \"mask\" : null,\n \"next_state\" : \"parse_int_wip_ipv4\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf05\",\n \"mask\" : null,\n \"next_state\" : \"parse_int_wip_mpls\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"parse_ethernet\"\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_6\"]\n }\n ]\n },\n {\n \"name\" : \"parse_fake_ethernet_and_accept\",\n \"id\" : 7,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_fake_ethernet2\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_ethernet\",\n \"id\" : 8,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_ethernet3\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_3\"]\n },\n {\n \"type\" : \"lookahead\",\n \"value\" : [0, 16]\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x88a8\",\n \"mask\" : null,\n \"next_state\" : \"parse_vlan_tag\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8100\",\n \"mask\" : \"0xefff\",\n \"next_state\" : \"parse_vlan_tag\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"parse_untagged\"\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_3\"]\n }\n ]\n },\n {\n \"name\" : \"parse_vlan_tag\",\n \"id\" : 9,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_vlan_tag4\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_vlan_id6\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_vlan_tag4\", \"vlan_id\"]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_5\"]\n },\n {\n \"type\" : \"lookahead\",\n \"value\" : [0, 16]\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"parse_eth_type\"\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_5\"]\n }\n ]\n },\n {\n \"name\" : \"parse_untagged\",\n \"id\" : 10,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_vlan_id6\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0ffe\"\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"parse_eth_type\"\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_eth_type\",\n \"id\" : 11,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_eth_type5\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8847\",\n \"mask\" : null,\n \"next_state\" : \"parse_mpls\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0800\",\n \"mask\" : null,\n \"next_state\" : \"parse_non_mpls\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x86dd\",\n \"mask\" : null,\n \"next_state\" : \"parse_non_mpls\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_eth_type5\", \"value\"]\n }\n ]\n },\n {\n \"name\" : \"parse_mpls\",\n \"id\" : 12,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_mpls6\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_mpls_label2\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"label\"]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_mpls_ttl8\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"ttl\"]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_7\"]\n },\n {\n \"type\" : \"lookahead\",\n \"value\" : [0, 4]\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\",\n \"mask\" : null,\n \"next_state\" : \"parse_ipv4\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x06\",\n \"mask\" : null,\n \"next_state\" : \"parse_ipv6\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"reject_packet\"\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_7\"]\n }\n ]\n },\n {\n \"name\" : \"reject_packet\",\n \"id\" : 13,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"bool\",\n \"value\" : false\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8\"\n }\n ],\n \"op\" : \"verify\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_non_mpls\",\n \"id\" : 14,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_mpls_label2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x000000\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_mpls_ttl8\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x41\"\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0800\",\n \"mask\" : null,\n \"next_state\" : \"parse_ipv4\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x86dd\",\n \"mask\" : null,\n \"next_state\" : \"parse_ipv6\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_eth_type5\", \"value\"]\n }\n ]\n },\n {\n \"name\" : \"parse_ipv4\",\n \"id\" : 15,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_ipv47\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_routing_ipv4_dst18\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dst_addr\"]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_ip_eth_type10\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0800\"\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x06\",\n \"mask\" : null,\n \"next_state\" : \"parse_tcp\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x11\",\n \"mask\" : null,\n \"next_state\" : \"parse_udp\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\",\n \"mask\" : null,\n \"next_state\" : \"parse_icmp\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"protocol\"]\n }\n ]\n },\n {\n \"name\" : \"parse_ipv6\",\n \"id\" : 16,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_ipv68\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_ip_eth_type10\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x86dd\"\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x06\",\n \"mask\" : null,\n \"next_state\" : \"parse_tcp\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x11\",\n \"mask\" : null,\n \"next_state\" : \"parse_udp\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3a\",\n \"mask\" : null,\n \"next_state\" : \"parse_icmp\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv68\", \"next_hdr\"]\n }\n ]\n },\n {\n \"name\" : \"parse_icmp\",\n \"id\" : 17,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_icmp11\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_tcp\",\n \"id\" : 18,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_tcp9\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_udp\",\n \"id\" : 19,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_udp10\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n {\n \"type\" : \"lookahead\",\n \"value\" : [0, 64]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"gtpu_0\"\n }\n ],\n \"op\" : \"add_header\"\n }\n ],\n \"op\" : \"primitive\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"gtpu_0\", \"version\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3d\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x07\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"gtpu_0\", \"pt\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3c\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"gtpu_0\", \"spare\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3b\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"gtpu_0\", \"ex_flag\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3a\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"gtpu_0\", \"seq_flag\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x39\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"gtpu_0\", \"npdu_flag\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x38\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"gtpu_0\", \"msgtype\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x30\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"gtpu_0\", \"msglen\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x20\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"gtpu_0\", \"teid\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_12\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3d\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x07\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_13\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x30\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x086801ff\",\n \"mask\" : null,\n \"next_state\" : \"parse_gtpu\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x12b50000\",\n \"mask\" : \"0xffff0000\",\n \"next_state\" : \"parse_vxlan\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"dport\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_12\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_13\"]\n }\n ]\n },\n {\n \"name\" : \"parse_gtpu\",\n \"id\" : 20,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_gtpu12\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x000000\",\n \"mask\" : null,\n \"next_state\" : \"set_gtpu_only\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"parse_gtpu_options\"\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"ex_flag\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"seq_flag\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"npdu_flag\"]\n }\n ]\n },\n {\n \"name\" : \"set_gtpu_only\",\n \"id\" : 21,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_encap_presence7\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"parse_inner_ipv4\"\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_gtpu_options\",\n \"id\" : 22,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_gtpu_options13\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"gtpu_ext_len_0\"]\n },\n {\n \"type\" : \"lookahead\",\n \"value\" : [0, 8]\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8501\",\n \"mask\" : null,\n \"next_state\" : \"parse_gtpu_ext_psc\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_options13\", \"next_ext\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"gtpu_ext_len_0\"]\n }\n ]\n },\n {\n \"name\" : \"parse_gtpu_ext_psc\",\n \"id\" : 23,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_gtpu_ext_psc14\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_encap_presence7\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\",\n \"mask\" : null,\n \"next_state\" : \"parse_inner_ipv4\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"next_ext\"]\n }\n ]\n },\n {\n \"name\" : \"parse_vxlan\",\n \"id\" : 24,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_vxlan15\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_encap_presence7\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x03\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_inner_ethernet16\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_inner_eth_type17\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0800\",\n \"mask\" : null,\n \"next_state\" : \"parse_inner_ipv4\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_eth_type17\", \"value\"]\n }\n ]\n },\n {\n \"name\" : \"parse_inner_ipv4\",\n \"id\" : 25,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_inner_ipv418\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x06\",\n \"mask\" : null,\n \"next_state\" : \"parse_inner_tcp\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x11\",\n \"mask\" : null,\n \"next_state\" : \"parse_inner_udp\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\",\n \"mask\" : null,\n \"next_state\" : \"parse_inner_icmp\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"protocol\"]\n }\n ]\n },\n {\n \"name\" : \"parse_inner_tcp\",\n \"id\" : 26,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_inner_tcp19\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_inner_udp\",\n \"id\" : 27,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_inner_udp20\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_inner_icmp\",\n \"id\" : 28,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_inner_icmp21\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : []\n }\n ]\n }\n ],\n \"parse_vsets\" : [],\n \"deparsers\" : [\n {\n \"name\" : \"deparser\",\n \"id\" : 0,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/parser.p4\",\n \"line\" : 321,\n \"column\" : 8,\n \"source_fragment\" : \"FabricDeparser\"\n },\n \"order\" : [\"_ingress_fake_ethernet2\", \"_ingress_packet_in1\", \"_egress_report_ethernet24\", \"_egress_report_eth_type25\", \"_egress_report_mpls26\", \"_egress_report_ipv427\", \"_egress_report_udp28\", \"_egress_report_fixed_header29\", \"_egress_common_report_header30\", \"_egress_local_report_header31\", \"_egress_drop_report_header32\", \"_ingress_ethernet3\", \"_ingress_vlan_tag4\", \"_ingress_eth_type5\", \"_ingress_mpls6\", \"_ingress_ipv47\", \"_ingress_ipv68\", \"_ingress_tcp9\", \"_ingress_udp10\", \"_ingress_icmp11\", \"_ingress_gtpu12\", \"_ingress_gtpu_options13\", \"_ingress_gtpu_ext_psc14\", \"_ingress_vxlan15\", \"_ingress_inner_ethernet16\", \"_ingress_inner_eth_type17\", \"_ingress_inner_ipv418\", \"_ingress_inner_tcp19\", \"_ingress_inner_udp20\", \"_ingress_inner_icmp21\"],\n \"primitives\" : []\n }\n ],\n \"meter_arrays\" : [\n {\n \"name\" : \"FabricIngress.qos.slice_tc_meter\",\n \"id\" : 0,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 104,\n \"column\" : 41,\n \"source_fragment\" : \"slice_tc_meter\"\n },\n \"is_direct\" : false,\n \"size\" : 64,\n \"rate_count\" : 2,\n \"type\" : \"bytes\"\n },\n {\n \"name\" : \"FabricIngress.upf.session_meter\",\n \"id\" : 1,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 22,\n \"column\" : 34,\n \"source_fragment\" : \"session_meter\"\n },\n \"is_direct\" : false,\n \"size\" : 20000,\n \"rate_count\" : 2,\n \"type\" : \"bytes\"\n },\n {\n \"name\" : \"FabricIngress.upf.app_meter\",\n \"id\" : 2,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 23,\n \"column\" : 34,\n \"source_fragment\" : \"app_meter\"\n },\n \"is_direct\" : false,\n \"size\" : 20000,\n \"rate_count\" : 2,\n \"type\" : \"bytes\"\n }\n ],\n \"counter_arrays\" : [\n {\n \"name\" : \"FabricIngress.stats.flow_counter\",\n \"id\" : 0,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.stats.flows\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4\",\n \"line\" : 14,\n \"column\" : 50,\n \"source_fragment\" : \"flow_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.filtering.ingress_port_vlan_counter\",\n \"id\" : 1,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.filtering.ingress_port_vlan\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 17,\n \"column\" : 50,\n \"source_fragment\" : \"ingress_port_vlan_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.filtering.fwd_classifier_counter\",\n \"id\" : 2,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.filtering.fwd_classifier\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 71,\n \"column\" : 50,\n \"source_fragment\" : \"fwd_classifier_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.filtering.fwd_type_counter\",\n \"id\" : 3,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 78,\n \"column\" : 46,\n \"source_fragment\" : \"fwd_type_counter\"\n },\n \"size\" : 8,\n \"is_direct\" : false\n },\n {\n \"name\" : \"FabricIngress.forwarding.bridging_counter\",\n \"id\" : 4,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.forwarding.bridging\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 29,\n \"column\" : 50,\n \"source_fragment\" : \"bridging_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.forwarding.mpls_counter\",\n \"id\" : 5,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.forwarding.mpls\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 64,\n \"column\" : 50,\n \"source_fragment\" : \"mpls_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.forwarding.routing_v4_counter\",\n \"id\" : 6,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.forwarding.routing_v4\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 98,\n \"column\" : 50,\n \"source_fragment\" : \"routing_v4_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.forwarding.routing_v6_counter\",\n \"id\" : 7,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.forwarding.routing_v6\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 142,\n \"column\" : 50,\n \"source_fragment\" : \"routing_v6_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.pre_next.next_mpls_counter\",\n \"id\" : 8,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.pre_next.next_mpls\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4\",\n \"line\" : 15,\n \"column\" : 50,\n \"source_fragment\" : \"next_mpls_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.pre_next.next_vlan_counter\",\n \"id\" : 9,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.pre_next.next_vlan\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4\",\n \"line\" : 39,\n \"column\" : 50,\n \"source_fragment\" : \"next_vlan_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.acl.acl_counter\",\n \"id\" : 10,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.acl.acl\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 19,\n \"column\" : 50,\n \"source_fragment\" : \"acl_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.next.hashed_counter\",\n \"id\" : 11,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.next.hashed\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 115,\n \"column\" : 50,\n \"source_fragment\" : \"hashed_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.next.multicast_counter\",\n \"id\" : 12,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.next.multicast\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 148,\n \"column\" : 50,\n \"source_fragment\" : \"multicast_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.slice_tc_classifier.classifier_stats\",\n \"id\" : 13,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.slice_tc_classifier.classifier\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 20,\n \"column\" : 40,\n \"source_fragment\" : \"classifier_stats\"\n }\n },\n {\n \"name\" : \"FabricIngress.qos.queues_stats\",\n \"id\" : 14,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.qos.queues\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 106,\n \"column\" : 40,\n \"source_fragment\" : \"queues_stats\"\n }\n },\n {\n \"name\" : \"FabricIngress.upf.terminations_counter\",\n \"id\" : 15,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 20,\n \"column\" : 49,\n \"source_fragment\" : \"terminations_counter\"\n },\n \"size\" : 4096,\n \"is_direct\" : false\n },\n {\n \"name\" : \"FabricIngress.upf.recirc_stats\",\n \"id\" : 16,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.upf.uplink_recirc_rules\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 356,\n \"column\" : 40,\n \"source_fragment\" : \"recirc_stats\"\n }\n },\n {\n \"name\" : \"FabricIngress.int_watchlist.watchlist_counter\",\n \"id\" : 17,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.int_watchlist.watchlist\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 15,\n \"column\" : 50,\n \"source_fragment\" : \"watchlist_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.int_ingress.drop_report_counter\",\n \"id\" : 18,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.int_ingress.drop_report\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 64,\n \"column\" : 50,\n \"source_fragment\" : \"drop_report_counter\"\n }\n },\n {\n \"name\" : \"FabricEgress.stats.flow_counter\",\n \"id\" : 19,\n \"is_direct\" : true,\n \"binding\" : \"FabricEgress.stats.flows\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4\",\n \"line\" : 47,\n \"column\" : 50,\n \"source_fragment\" : \"flow_counter\"\n }\n },\n {\n \"name\" : \"FabricEgress.egress_next.egress_vlan_counter\",\n \"id\" : 20,\n \"is_direct\" : true,\n \"binding\" : \"FabricEgress.egress_next.egress_vlan\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 241,\n \"column\" : 50,\n \"source_fragment\" : \"egress_vlan_counter\"\n }\n },\n {\n \"name\" : \"FabricEgress.upf.terminations_counter\",\n \"id\" : 21,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 477,\n \"column\" : 49,\n \"source_fragment\" : \"terminations_counter\"\n },\n \"size\" : 4096,\n \"is_direct\" : false\n },\n {\n \"name\" : \"FabricEgress.int_egress.report_counter\",\n \"id\" : 22,\n \"is_direct\" : true,\n \"binding\" : \"FabricEgress.int_egress.report\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 131,\n \"column\" : 50,\n \"source_fragment\" : \"report_counter\"\n }\n },\n {\n \"name\" : \"FabricEgress.int_egress.int_metadata_counter\",\n \"id\" : 23,\n \"is_direct\" : true,\n \"binding\" : \"FabricEgress.int_egress.int_metadata\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 132,\n \"column\" : 50,\n \"source_fragment\" : \"int_metadata_counter\"\n }\n }\n ],\n \"register_arrays\" : [\n {\n \"name\" : \"FabricEgress.int_egress.seq_number\",\n \"id\" : 0,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 138,\n \"column\" : 28,\n \"source_fragment\" : \"seq_number\"\n },\n \"size\" : 1024,\n \"bitwidth\" : 32\n }\n ],\n \"calculations\" : [\n {\n \"name\" : \"calc\",\n \"id\" : 0,\n \"algo\" : \"crc32\",\n \"input\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_18\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_19\"]\n }\n ]\n },\n {\n \"name\" : \"calc_0\",\n \"id\" : 1,\n \"algo\" : \"crc32\",\n \"input\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_20\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_21\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_22\"]\n }\n ]\n },\n {\n \"name\" : \"calc_1\",\n \"id\" : 2,\n \"algo\" : \"crc32\",\n \"input\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_23\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_24\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_25\"]\n }\n ]\n },\n {\n \"name\" : \"calc_2\",\n \"id\" : 3,\n \"algo\" : \"crc32\",\n \"input\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_26\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_27\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_28\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_29\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_30\"]\n }\n ]\n },\n {\n \"name\" : \"calc_3\",\n \"id\" : 4,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4\",\n \"line\" : 55,\n \"column\" : 8,\n \"source_fragment\" : \"update_checksum(hdr.ingress.ipv4.isValid(), ...\"\n },\n \"algo\" : \"csum16\",\n \"input\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"version\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ihl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dscp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ecn\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"total_len\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"identification\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"flags\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"frag_offset\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ttl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"protocol\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"src_addr\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dst_addr\"]\n }\n ]\n },\n {\n \"name\" : \"calc_4\",\n \"id\" : 5,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4\",\n \"line\" : 73,\n \"column\" : 8,\n \"source_fragment\" : \"update_checksum(hdr.ingress.inner_ipv4.isValid(), ...\"\n },\n \"algo\" : \"csum16\",\n \"input\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"version\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"ihl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"dscp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"ecn\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"total_len\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"identification\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"flags\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"frag_offset\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"ttl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"protocol\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"src_addr\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"dst_addr\"]\n }\n ]\n },\n {\n \"name\" : \"calc_5\",\n \"id\" : 6,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4\",\n \"line\" : 92,\n \"column\" : 8,\n \"source_fragment\" : \"update_checksum(hdr.egress.report_ipv4.isValid(), ...\"\n },\n \"algo\" : \"csum16\",\n \"input\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"version\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"ihl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"dscp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"ecn\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"total_len\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"identification\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"flags\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"frag_offset\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"ttl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"protocol\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"src_addr\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"dst_addr\"]\n }\n ]\n },\n {\n \"name\" : \"calc_6\",\n \"id\" : 7,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4\",\n \"line\" : 13,\n \"column\" : 8,\n \"source_fragment\" : \"verify_checksum(hdr.ingress.ipv4.isValid(), ...\"\n },\n \"algo\" : \"csum16\",\n \"input\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"version\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ihl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dscp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ecn\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"total_len\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"identification\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"flags\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"frag_offset\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ttl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"protocol\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"src_addr\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dst_addr\"]\n }\n ]\n },\n {\n \"name\" : \"calc_7\",\n \"id\" : 8,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4\",\n \"line\" : 31,\n \"column\" : 8,\n \"source_fragment\" : \"verify_checksum(hdr.ingress.inner_ipv4.isValid(), ...\"\n },\n \"algo\" : \"csum16\",\n \"input\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"version\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"ihl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"dscp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"ecn\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"total_len\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"identification\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"flags\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"frag_offset\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"ttl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"protocol\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"src_addr\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"dst_addr\"]\n }\n ]\n }\n ],\n \"learn_lists\" : [],\n \"actions\" : [\n {\n \"name\" : \"nop\",\n \"id\" : 0,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 1,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 2,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 3,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 4,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 5,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 6,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"NoAction\",\n \"id\" : 7,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"FabricIngress.stats.count\",\n \"id\" : 8,\n \"runtime_data\" : [\n {\n \"name\" : \"flow_id\",\n \"bitwidth\" : 10\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_stats_flow_id11\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4\",\n \"line\" : 17,\n \"column\" : 22,\n \"source_fragment\" : \"= flow_id; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.pkt_io.do_packet_out\",\n \"id\" : 9,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_spec\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_packet_out0\", \"egress_port\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01ff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 13,\n \"column\" : 8,\n \"source_fragment\" : \"standard_md.egress_spec = (PortId_t)hdr.packet_out.egress_port\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_egress_port48\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_packet_out0\", \"egress_port\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 14,\n \"column\" : 37,\n \"source_fragment\" : \"= hdr.packet_out.egress_port; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_egress_port_set22\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 15,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_packet_out0\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 16,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.packet_out.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._skip_egress0\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 17,\n \"column\" : 20,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_bridged4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 19,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.setInvalid()\"\n }\n },\n {\n \"op\" : \"exit\",\n \"parameters\" : [],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 20,\n \"column\" : 8,\n \"source_fragment\" : \"exit\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.filtering.deny\",\n \"id\" : 10,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 22,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 23,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_ig_port_type33\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 100,\n \"column\" : 14,\n \"source_fragment\" : \"0x0, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x37\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 250,\n \"column\" : 41,\n \"source_fragment\" : \"55, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.filtering.permit\",\n \"id\" : 11,\n \"runtime_data\" : [\n {\n \"name\" : \"port_type\",\n \"bitwidth\" : 2\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_ig_port_type33\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 33,\n \"column\" : 31,\n \"source_fragment\" : \"= port_type; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.filtering.permit_with_internal_vlan\",\n \"id\" : 12,\n \"runtime_data\" : [\n {\n \"name\" : \"vlan_id\",\n \"bitwidth\" : 12\n },\n {\n \"name\" : \"port_type\",\n \"bitwidth\" : 2\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_vlan_id6\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 38,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.vlan_id = vlan_id\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_ig_port_type33\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 33,\n \"column\" : 31,\n \"source_fragment\" : \"= port_type; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.filtering.set_forwarding_type\",\n \"id\" : 13,\n \"runtime_data\" : [\n {\n \"name\" : \"fwd_type\",\n \"bitwidth\" : 3\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_fwd_type5\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 74,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.fwd_type = fwd_type\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.forwarding.set_int_drop_reason\",\n \"id\" : 14,\n \"runtime_data\" : [\n {\n \"name\" : \"drop_reason\",\n \"bitwidth\" : 8\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"local\",\n \"value\" : 0\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 17,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.forwarding.set_int_drop_reason\",\n \"id\" : 15,\n \"runtime_data\" : [\n {\n \"name\" : \"drop_reason\",\n \"bitwidth\" : 8\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"local\",\n \"value\" : 0\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 17,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.forwarding.set_int_drop_reason\",\n \"id\" : 16,\n \"runtime_data\" : [\n {\n \"name\" : \"drop_reason\",\n \"bitwidth\" : 8\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"local\",\n \"value\" : 0\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 17,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.forwarding.set_int_drop_reason\",\n \"id\" : 17,\n \"runtime_data\" : [\n {\n \"name\" : \"drop_reason\",\n \"bitwidth\" : 8\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"local\",\n \"value\" : 0\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 17,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.forwarding.set_next_id_bridging\",\n \"id\" : 18,\n \"runtime_data\" : [\n {\n \"name\" : \"next_id\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_next_id21\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 23,\n \"column\" : 26,\n \"source_fragment\" : \"= next_id; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.forwarding.pop_mpls_and_next\",\n \"id\" : 19,\n \"runtime_data\" : [\n {\n \"name\" : \"next_id\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_mpls6\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 67,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.mpls.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_eth_type5\", \"value\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_ip_eth_type10\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 68,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.eth_type.value = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_mpls_label2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x000000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 69,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.mpls_label = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_next_id21\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 23,\n \"column\" : 26,\n \"source_fragment\" : \"= next_id; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.forwarding.set_next_id_routing_v4\",\n \"id\" : 20,\n \"runtime_data\" : [\n {\n \"name\" : \"next_id\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_next_id21\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 23,\n \"column\" : 26,\n \"source_fragment\" : \"= next_id; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.forwarding.nop_routing_v4\",\n \"id\" : 21,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"FabricIngress.forwarding.drop_routing_v4\",\n \"id\" : 22,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 111,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 113,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.forwarding.set_next_id_routing_v6\",\n \"id\" : 23,\n \"runtime_data\" : [\n {\n \"name\" : \"next_id\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_next_id21\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 23,\n \"column\" : 26,\n \"source_fragment\" : \"= next_id; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.forwarding.drop_routing_v6\",\n \"id\" : 24,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 150,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 152,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.pre_next.set_mpls_label\",\n \"id\" : 25,\n \"runtime_data\" : [\n {\n \"name\" : \"label\",\n \"bitwidth\" : 20\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_mpls_label2\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4\",\n \"line\" : 18,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.mpls_label = label\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.pre_next.set_vlan\",\n \"id\" : 26,\n \"runtime_data\" : [\n {\n \"name\" : \"vlan_id\",\n \"bitwidth\" : 12\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_vlan_id6\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4\",\n \"line\" : 42,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.vlan_id = vlan_id\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.acl.set_next_id_acl\",\n \"id\" : 27,\n \"runtime_data\" : [\n {\n \"name\" : \"next_id\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_next_id21\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 22,\n \"column\" : 26,\n \"source_fragment\" : \"= next_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 26,\n \"column\" : 28,\n \"source_fragment\" : \"= false; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 27,\n \"column\" : 17,\n \"source_fragment\" : \"= 0; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.acl.copy_to_cpu\",\n \"id\" : 28,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"clone_ingress_pkt_to_egress\",\n \"parameters\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x000001ff\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x2\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 31,\n \"column\" : 8,\n \"source_fragment\" : \"clone_preserving_field_list(CloneType.I2E, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.acl.punt_to_cpu\",\n \"id\" : 29,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"clone_ingress_pkt_to_egress\",\n \"parameters\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x000001ff\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x2\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 31,\n \"column\" : 8,\n \"source_fragment\" : \"clone_preserving_field_list(CloneType.I2E, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 40,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_punt_to_cpu23\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 41,\n \"column\" : 30,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 42,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.acl.drop\",\n \"id\" : 30,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 46,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 47,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x50\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 252,\n \"column\" : 27,\n \"source_fragment\" : \"80, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.acl.set_output_port\",\n \"id\" : 31,\n \"runtime_data\" : [\n {\n \"name\" : \"port_num\",\n \"bitwidth\" : 9\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_spec\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"local\",\n \"value\" : 0\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01ff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 62,\n \"column\" : 8,\n \"source_fragment\" : \"standard_md.egress_spec = (PortId_t) port_num\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_egress_port48\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 63,\n \"column\" : 37,\n \"source_fragment\" : \"= port_num; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_egress_port_set22\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 64,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 65,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 66,\n \"column\" : 17,\n \"source_fragment\" : \"= 0; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.acl.nop_acl\",\n \"id\" : 32,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"FabricIngress.next.output_hashed\",\n \"id\" : 33,\n \"runtime_data\" : [\n {\n \"name\" : \"port_num\",\n \"bitwidth\" : 9\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_spec\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"local\",\n \"value\" : 0\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01ff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 16,\n \"column\" : 8,\n \"source_fragment\" : \"standard_md.egress_spec = (PortId_t)port_num\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_egress_port48\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 17,\n \"column\" : 37,\n \"source_fragment\" : \"= port_num; // Needed by INT. ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_egress_port_set22\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 18,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.next.routing_hashed\",\n \"id\" : 34,\n \"runtime_data\" : [\n {\n \"name\" : \"port_num\",\n \"bitwidth\" : 9\n },\n {\n \"name\" : \"smac\",\n \"bitwidth\" : 48\n },\n {\n \"name\" : \"dmac\",\n \"bitwidth\" : 48\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ethernet3\", \"src_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 23,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ethernet.src_addr = smac; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ethernet3\", \"dst_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 2\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 28,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ethernet.dst_addr = dmac; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_spec\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"local\",\n \"value\" : 0\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01ff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 16,\n \"column\" : 8,\n \"source_fragment\" : \"standard_md.egress_spec = (PortId_t)port_num\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_egress_port48\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 17,\n \"column\" : 37,\n \"source_fragment\" : \"= port_num; // Needed by INT. ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_egress_port_set22\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 18,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.next.set_mcast_group_id\",\n \"id\" : 35,\n \"runtime_data\" : [\n {\n \"name\" : \"group_id\",\n \"bitwidth\" : 16\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"mcast_grp\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 151,\n \"column\" : 8,\n \"source_fragment\" : \"standard_md.mcast_grp = group_id\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_is_multicast4\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 152,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.is_multicast = true\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.next.reset_mcast_group_id\",\n \"id\" : 36,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"mcast_grp\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 157,\n \"column\" : 8,\n \"source_fragment\" : \"standard_md.mcast_grp = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_is_multicast4\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 158,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.is_multicast = false\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.slice_tc_classifier.set_slice_id_tc\",\n \"id\" : 37,\n \"runtime_data\" : [\n {\n \"name\" : \"slice_id\",\n \"bitwidth\" : 4\n },\n {\n \"name\" : \"tc\",\n \"bitwidth\" : 2\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_slice_id26\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 23,\n \"column\" : 27,\n \"source_fragment\" : \"= slice_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_tc27\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 24,\n \"column\" : 21,\n \"source_fragment\" : \"= tc; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_tc_unknown28\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 25,\n \"column\" : 29,\n \"source_fragment\" : \"= false; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.slice_tc_classifier.no_classification\",\n \"id\" : 38,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_slice_id26\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 57,\n \"column\" : 36,\n \"source_fragment\" : \"0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_tc27\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 58,\n \"column\" : 24,\n \"source_fragment\" : \"0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_tc_unknown28\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 25,\n \"column\" : 29,\n \"source_fragment\" : \"= false; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_tc_unknown28\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 31,\n \"column\" : 29,\n \"source_fragment\" : \"= true; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.slice_tc_classifier.trust_dscp\",\n \"id\" : 39,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_slice_id26\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dscp\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x2\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0f\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 38,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr.ipv4.dscp[4 +2 -1:2]; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_tc27\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dscp\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x03\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 39,\n \"column\" : 21,\n \"source_fragment\" : \"= hdr.ipv4.dscp[2 -1:0]; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_tc_unknown28\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 40,\n \"column\" : 29,\n \"source_fragment\" : \"= false; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.qos.use_upf\",\n \"id\" : 40,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_slice_tc12\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"|\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"<<\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_slice_id30\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x2\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_tc31\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x07\"\n }\n }\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 81,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.slice_tc = fabric_md.upf_slice_id++fabric_md.upf_tc\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.qos.use_default\",\n \"id\" : 41,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_slice_tc12\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"|\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"<<\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_slice_id26\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x2\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_tc27\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x07\"\n }\n }\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 86,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.slice_tc = fabric_md.slice_id++fabric_md.tc\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.qos.set_queue\",\n \"id\" : 42,\n \"runtime_data\" : [\n {\n \"name\" : \"qid\",\n \"bitwidth\" : 5\n }\n ],\n \"primitives\" : []\n },\n {\n \"name\" : \"FabricIngress.qos.meter_drop\",\n \"id\" : 43,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 115,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xa0\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 269,\n \"column\" : 36,\n \"source_fragment\" : \"160, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.qos.set_default_tc\",\n \"id\" : 44,\n \"runtime_data\" : [\n {\n \"name\" : \"tc\",\n \"bitwidth\" : 2\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_slice_tc12\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"|\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"<<\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_slice_tc12\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x2\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x2\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"local\",\n \"value\" : 0\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x07\"\n }\n }\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 146,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.slice_tc = fabric_md.bridged.base.slice_tc[4 +2 -1:2]++tc\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.iface_access\",\n \"id\" : 45,\n \"runtime_data\" : [\n {\n \"name\" : \"slice_id\",\n \"bitwidth\" : 4\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_skip_upf17\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 85,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.skip_upf = false\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_is_upf_hit29\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 86,\n \"column\" : 29,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_slice_id30\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 87,\n \"column\" : 31,\n \"source_fragment\" : \"= slice_id; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.iface_core\",\n \"id\" : 46,\n \"runtime_data\" : [\n {\n \"name\" : \"slice_id\",\n \"bitwidth\" : 4\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_skip_upf17\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 85,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.skip_upf = false\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_is_upf_hit29\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 86,\n \"column\" : 29,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_slice_id30\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 87,\n \"column\" : 31,\n \"source_fragment\" : \"= slice_id; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.iface_dbuf\",\n \"id\" : 47,\n \"runtime_data\" : [\n {\n \"name\" : \"slice_id\",\n \"bitwidth\" : 4\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_skip_upf17\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 85,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.skip_upf = false\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_is_upf_hit29\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 86,\n \"column\" : 29,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_slice_id30\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 87,\n \"column\" : 31,\n \"source_fragment\" : \"= slice_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_ip_eth_type10\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0800\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 114,\n \"column\" : 31,\n \"source_fragment\" : \"0x0800; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_routing_ipv4_dst18\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"dst_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 62,\n \"column\" : 35,\n \"source_fragment\" : \"= hdr.inner_ipv4.dst_addr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_ipv47\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_ipv418\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 64,\n \"column\" : 17,\n \"source_fragment\" : \"= hdr.inner_ipv4; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_ipv418\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 65,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.inner_ipv4.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_udp10\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_udp20\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 66,\n \"column\" : 16,\n \"source_fragment\" : \"= hdr.inner_udp; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_udp20\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 67,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.inner_udp.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_tcp9\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_tcp19\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 68,\n \"column\" : 16,\n \"source_fragment\" : \"= hdr.inner_tcp; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_tcp19\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 69,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.inner_tcp.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_icmp11\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_icmp21\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 70,\n \"column\" : 17,\n \"source_fragment\" : \"= hdr.inner_icmp; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_icmp21\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 71,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.inner_icmp.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu12\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 72,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu_options13\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 73,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_options.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu_ext_psc14\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 74,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_ext_psc.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_encap_presence7\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 80,\n \"column\" : 11,\n \"source_fragment\" : \"0x0, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.iface_miss\",\n \"id\" : 48,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_skip_upf17\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 104,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.skip_upf = true\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.set_uplink_session_miss\",\n \"id\" : 49,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 39,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 40,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 41,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x86\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 261,\n \"column\" : 38,\n \"source_fragment\" : \"134, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.set_uplink_session_drop\",\n \"id\" : 50,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_sess_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 136,\n \"column\" : 8,\n \"source_fragment\" : \"sess_hit = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 39,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 40,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 41,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x87\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 262,\n \"column\" : 38,\n \"source_fragment\" : \"135, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.set_downlink_session_miss\",\n \"id\" : 51,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 39,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 40,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 41,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x84\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 259,\n \"column\" : 38,\n \"source_fragment\" : \"132, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.set_downlink_session_drop\",\n \"id\" : 52,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_sess_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 151,\n \"column\" : 8,\n \"source_fragment\" : \"sess_hit = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 39,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 40,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 41,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x85\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 260,\n \"column\" : 38,\n \"source_fragment\" : \"133, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.set_downlink_session\",\n \"id\" : 53,\n \"runtime_data\" : [\n {\n \"name\" : \"tun_peer_id\",\n \"bitwidth\" : 8\n },\n {\n \"name\" : \"session_meter_idx\",\n \"bitwidth\" : 15\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_sess_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 159,\n \"column\" : 8,\n \"source_fragment\" : \"sess_hit = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_ue_session_id\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_routing_ipv4_dst18\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 161,\n \"column\" : 8,\n \"source_fragment\" : \"ue_session_id = fabric_md.routing_ipv4_dst; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_session_meter_idx_internal\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 162,\n \"column\" : 8,\n \"source_fragment\" : \"session_meter_idx_internal = session_meter_idx\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_tun_peer_id13\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 163,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.tun_peer_id = tun_peer_id\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.set_downlink_session_buf\",\n \"id\" : 54,\n \"runtime_data\" : [\n {\n \"name\" : \"tun_peer_id\",\n \"bitwidth\" : 8\n },\n {\n \"name\" : \"session_meter_idx\",\n \"bitwidth\" : 15\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_sess_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 167,\n \"column\" : 8,\n \"source_fragment\" : \"sess_hit = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_ue_session_id\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_routing_ipv4_dst18\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 169,\n \"column\" : 8,\n \"source_fragment\" : \"ue_session_id = fabric_md.routing_ipv4_dst; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_session_meter_idx_internal\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 170,\n \"column\" : 8,\n \"source_fragment\" : \"session_meter_idx_internal = session_meter_idx\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_tun_peer_id13\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 171,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.tun_peer_id = tun_peer_id\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_skip_egress_upf_ctr18\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 175,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.skip_egress_upf_ctr = true\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.set_downlink_session_buf_drop\",\n \"id\" : 55,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_sess_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 179,\n \"column\" : 8,\n \"source_fragment\" : \"sess_hit = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_ue_session_id\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_routing_ipv4_dst18\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 182,\n \"column\" : 8,\n \"source_fragment\" : \"ue_session_id = fabric_md.routing_ipv4_dst; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 39,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 40,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 41,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x88\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 263,\n \"column\" : 43,\n \"source_fragment\" : \"136, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.set_uplink_session\",\n \"id\" : 56,\n \"runtime_data\" : [\n {\n \"name\" : \"session_meter_idx\",\n \"bitwidth\" : 15\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_sess_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 190,\n \"column\" : 8,\n \"source_fragment\" : \"sess_hit = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_ue_session_id\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 192,\n \"column\" : 8,\n \"source_fragment\" : \"ue_session_id = fabric_md.lkp.ipv4_src; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_session_meter_idx_internal\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 193,\n \"column\" : 8,\n \"source_fragment\" : \"session_meter_idx_internal = session_meter_idx\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_ip_eth_type10\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0800\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 114,\n \"column\" : 31,\n \"source_fragment\" : \"0x0800; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_routing_ipv4_dst18\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"dst_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 62,\n \"column\" : 35,\n \"source_fragment\" : \"= hdr.inner_ipv4.dst_addr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_ipv47\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_ipv418\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 64,\n \"column\" : 17,\n \"source_fragment\" : \"= hdr.inner_ipv4; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_ipv418\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 65,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.inner_ipv4.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_udp10\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_udp20\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 66,\n \"column\" : 16,\n \"source_fragment\" : \"= hdr.inner_udp; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_udp20\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 67,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.inner_udp.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_tcp9\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_tcp19\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 68,\n \"column\" : 16,\n \"source_fragment\" : \"= hdr.inner_tcp; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_tcp19\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 69,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.inner_tcp.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_icmp11\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_icmp21\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 70,\n \"column\" : 17,\n \"source_fragment\" : \"= hdr.inner_icmp; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_icmp21\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 71,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.inner_icmp.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu12\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 72,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu_options13\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 73,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_options.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu_ext_psc14\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 74,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_ext_psc.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_encap_presence7\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 80,\n \"column\" : 11,\n \"source_fragment\" : \"0x0, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.uplink_drop_miss\",\n \"id\" : 57,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 39,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 40,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 41,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8b\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 266,\n \"column\" : 42,\n \"source_fragment\" : \"139, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.downlink_drop_miss\",\n \"id\" : 58,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 39,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 40,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 41,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x89\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 264,\n \"column\" : 42,\n \"source_fragment\" : \"137, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.uplink_drop\",\n \"id\" : 59,\n \"runtime_data\" : [\n {\n \"name\" : \"ctr_id\",\n \"bitwidth\" : 12\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 39,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 40,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 41,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_upf_ctr_id14\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 46,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.upf_ctr_id = ctr_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_term_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 47,\n \"column\" : 8,\n \"source_fragment\" : \"term_hit = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8c\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 267,\n \"column\" : 42,\n \"source_fragment\" : \"140, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.downlink_drop\",\n \"id\" : 60,\n \"runtime_data\" : [\n {\n \"name\" : \"ctr_id\",\n \"bitwidth\" : 12\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 39,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 40,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 41,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_upf_ctr_id14\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 46,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.upf_ctr_id = ctr_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_term_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 47,\n \"column\" : 8,\n \"source_fragment\" : \"term_hit = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8a\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 265,\n \"column\" : 42,\n \"source_fragment\" : \"138, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.app_fwd\",\n \"id\" : 61,\n \"runtime_data\" : [\n {\n \"name\" : \"ctr_id\",\n \"bitwidth\" : 12\n },\n {\n \"name\" : \"tc\",\n \"bitwidth\" : 2\n },\n {\n \"name\" : \"app_meter_idx\",\n \"bitwidth\" : 15\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_upf_ctr_id14\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 46,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.upf_ctr_id = ctr_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_term_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 47,\n \"column\" : 8,\n \"source_fragment\" : \"term_hit = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_tc31\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 265,\n \"column\" : 25,\n \"source_fragment\" : \"= tc; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_meter_idx_internal\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 2\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 266,\n \"column\" : 8,\n \"source_fragment\" : \"app_meter_idx_internal = app_meter_idx\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_tc_unknown28\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 267,\n \"column\" : 29,\n \"source_fragment\" : \"= false; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.downlink_fwd_encap\",\n \"id\" : 62,\n \"runtime_data\" : [\n {\n \"name\" : \"ctr_id\",\n \"bitwidth\" : 12\n },\n {\n \"name\" : \"tc\",\n \"bitwidth\" : 2\n },\n {\n \"name\" : \"teid\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"qfi\",\n \"bitwidth\" : 6\n },\n {\n \"name\" : \"app_meter_idx\",\n \"bitwidth\" : 15\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_upf_ctr_id14\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 46,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.upf_ctr_id = ctr_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_term_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 47,\n \"column\" : 8,\n \"source_fragment\" : \"term_hit = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_tc31\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 265,\n \"column\" : 25,\n \"source_fragment\" : \"= tc; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_meter_idx_internal\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 4\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 266,\n \"column\" : 8,\n \"source_fragment\" : \"app_meter_idx_internal = app_meter_idx; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_tc_unknown28\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 267,\n \"column\" : 29,\n \"source_fragment\" : \"= false; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_needs_gtpu_encap16\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 54,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.needs_gtpu_encap = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_teid19\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 2\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 55,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.teid = teid; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_qfi15\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 3\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 56,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.qfi = qfi; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.set_routing_ipv4_dst\",\n \"id\" : 63,\n \"runtime_data\" : [\n {\n \"name\" : \"tun_dst_addr\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_routing_ipv4_dst18\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 314,\n \"column\" : 35,\n \"source_fragment\" : \"= tun_dst_addr; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.set_app_id\",\n \"id\" : 64,\n \"runtime_data\" : [\n {\n \"name\" : \"app_id\",\n \"bitwidth\" : 8\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_internal_app_id\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 334,\n \"column\" : 8,\n \"source_fragment\" : \"internal_app_id = app_id\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.recirc_allow\",\n \"id\" : 65,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_spec\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01fe\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4\",\n \"line\" : 36,\n \"column\" : 42,\n \"source_fragment\" : \"510; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_vlan_id6\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0ffe\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 147,\n \"column\" : 34,\n \"source_fragment\" : \"12w4094; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._do_upf_uplink_recirc1\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 364,\n \"column\" : 29,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_egress_port_set22\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 365,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 366,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 367,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.recirc_deny\",\n \"id\" : 66,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x96\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 268,\n \"column\" : 41,\n \"source_fragment\" : \"150, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._do_upf_uplink_recirc1\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 375,\n \"column\" : 29,\n \"source_fragment\" : \"= false; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 376,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 377,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.recirc_miss\",\n \"id\" : 67,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"FabricIngress.int_watchlist.mark_to_report\",\n \"id\" : 68,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_report_type21\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 223,\n \"column\" : 45,\n \"source_fragment\" : \"1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_report_type47\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 223,\n \"column\" : 45,\n \"source_fragment\" : \"1; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.int_watchlist.no_report\",\n \"id\" : 69,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_report_type21\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 219,\n \"column\" : 50,\n \"source_fragment\" : \"0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_report_type47\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 219,\n \"column\" : 50,\n \"source_fragment\" : \"0; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.int_watchlist.no_report_collector\",\n \"id\" : 70,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_report_type21\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 219,\n \"column\" : 50,\n \"source_fragment\" : \"0; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.int_ingress.report_drop\",\n \"id\" : 71,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_bmd_type0\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 169,\n \"column\" : 23,\n \"source_fragment\" : \"4, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_report_type21\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 221,\n \"column\" : 45,\n \"source_fragment\" : \"4; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_vlan_id6\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0ffe\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 147,\n \"column\" : 34,\n \"source_fragment\" : \"12w4094; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_mpls_label2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x000000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 71,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.mpls_label = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_skip_upf17\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 73,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.skip_upf = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 79,\n \"column\" : 17,\n \"source_fragment\" : \"= 0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_spec\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01fe\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4\",\n \"line\" : 36,\n \"column\" : 42,\n \"source_fragment\" : \"510; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"fabric_v1model64\",\n \"id\" : 72,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"exit\",\n \"parameters\" : [],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 64,\n \"column\" : 12,\n \"source_fragment\" : \"exit\"\n }\n }\n ]\n },\n {\n \"name\" : \"fabric_v1model61\",\n \"id\" : 73,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"mark_to_drop\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"standard_metadata\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 61,\n \"column\" : 8,\n \"source_fragment\" : \"mark_to_drop(standard_md)\"\n }\n }\n ]\n },\n {\n \"name\" : \"fabric_v1model70\",\n \"id\" : 74,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_ig_port3\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01fe\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4\",\n \"line\" : 36,\n \"column\" : 42,\n \"source_fragment\" : \"510; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init21\",\n \"id\" : 75,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_vlan_id9\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_vlan_tag4\", \"vlan_id\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 21,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr.vlan_tag.vlan_id; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init15\",\n \"id\" : 76,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_eth_dst6\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ethernet3\", \"dst_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 15,\n \"column\" : 23,\n \"source_fragment\" : \"= hdr.ethernet.dst_addr; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_eth_src7\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ethernet3\", \"src_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 16,\n \"column\" : 23,\n \"source_fragment\" : \"= hdr.ethernet.src_addr; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_eth_type8\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_eth_type5\", \"value\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 17,\n \"column\" : 24,\n \"source_fragment\" : \"= hdr.eth_type.value; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_vlan_id9\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 19,\n \"column\" : 23,\n \"source_fragment\" : \"= 0; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init38\",\n \"id\" : 77,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_tcp19\", \"sport\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 38,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.inner_tcp.sport; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_tcp19\", \"dport\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 39,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.inner_tcp.dport; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init41\",\n \"id\" : 78,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_udp20\", \"sport\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 41,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.inner_udp.sport; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_udp20\", \"dport\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 42,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.inner_udp.dport; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init44\",\n \"id\" : 79,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_icmp_type16\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_icmp21\", \"icmp_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 44,\n \"column\" : 33,\n \"source_fragment\" : \"= hdr.inner_icmp.icmp_type; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_icmp_code17\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_icmp21\", \"icmp_code\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 45,\n \"column\" : 33,\n \"source_fragment\" : \"= hdr.inner_icmp.icmp_code; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init33\",\n \"id\" : 80,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_is_ipv410\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 33,\n \"column\" : 27,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"src_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 34,\n \"column\" : 28,\n \"source_fragment\" : \"= hdr.inner_ipv4.src_addr; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_dst12\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"dst_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 35,\n \"column\" : 28,\n \"source_fragment\" : \"= hdr.inner_ipv4.dst_addr; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"protocol\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 36,\n \"column\" : 28,\n \"source_fragment\" : \"= hdr.inner_ipv4.protocol; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init53\",\n \"id\" : 81,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_tcp9\", \"sport\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 53,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.tcp.sport; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_tcp9\", \"dport\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 54,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.tcp.dport; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init56\",\n \"id\" : 82,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"sport\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 56,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.udp.sport; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"dport\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 57,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.udp.dport; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init59\",\n \"id\" : 83,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_icmp_type16\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_icmp11\", \"icmp_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 59,\n \"column\" : 33,\n \"source_fragment\" : \"= hdr.icmp.icmp_type; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_icmp_code17\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_icmp11\", \"icmp_code\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 60,\n \"column\" : 33,\n \"source_fragment\" : \"= hdr.icmp.icmp_code; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init48\",\n \"id\" : 84,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_is_ipv410\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 48,\n \"column\" : 27,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"src_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 49,\n \"column\" : 28,\n \"source_fragment\" : \"= hdr.ipv4.src_addr; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_dst12\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dst_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 50,\n \"column\" : 28,\n \"source_fragment\" : \"= hdr.ipv4.dst_addr; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"protocol\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 51,\n \"column\" : 28,\n \"source_fragment\" : \"= hdr.ipv4.protocol; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init24\",\n \"id\" : 85,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_is_ipv410\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 24,\n \"column\" : 23,\n \"source_fragment\" : \"= false; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 25,\n \"column\" : 24,\n \"source_fragment\" : \"= 0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_dst12\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 26,\n \"column\" : 24,\n \"source_fragment\" : \"= 0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 27,\n \"column\" : 24,\n \"source_fragment\" : \"= 0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 28,\n \"column\" : 24,\n \"source_fragment\" : \"= 0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 29,\n \"column\" : 24,\n \"source_fragment\" : \"= 0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_icmp_type16\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 30,\n \"column\" : 25,\n \"source_fragment\" : \"= 0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_icmp_code17\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 31,\n \"column\" : 25,\n \"source_fragment\" : \"= 0; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf409\",\n \"id\" : 86,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_is_uplink\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 409,\n \"column\" : 20,\n \"source_fragment\" : \"is_uplink = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_ipv4_addr\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_dst12\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 410,\n \"column\" : 20,\n \"source_fragment\" : \"app_ipv4_addr = fabric_md.lkp.ipv4_dst; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_l4_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 411,\n \"column\" : 20,\n \"source_fragment\" : \"app_l4_port = fabric_md.lkp.l4_dport; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_ip_proto\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 412,\n \"column\" : 20,\n \"source_fragment\" : \"app_ip_proto = fabric_md.lkp.ip_proto; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf418\",\n \"id\" : 87,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_ipv4_addr\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 418,\n \"column\" : 20,\n \"source_fragment\" : \"app_ipv4_addr = fabric_md.lkp.ipv4_src; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_l4_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 419,\n \"column\" : 20,\n \"source_fragment\" : \"app_l4_port = fabric_md.lkp.l4_sport; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_ip_proto\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 420,\n \"column\" : 20,\n \"source_fragment\" : \"app_ip_proto = fabric_md.lkp.ip_proto; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf424\",\n \"id\" : 88,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_ipv4_addr\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 424,\n \"column\" : 20,\n \"source_fragment\" : \"app_ipv4_addr = fabric_md.lkp.ipv4_src; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_l4_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 425,\n \"column\" : 20,\n \"source_fragment\" : \"app_l4_port = fabric_md.lkp.l4_sport; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_ip_proto\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 426,\n \"column\" : 20,\n \"source_fragment\" : \"app_ip_proto = fabric_md.lkp.ip_proto; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf443\",\n \"id\" : 89,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_skip_egress_upf_ctr18\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 443,\n \"column\" : 16,\n \"source_fragment\" : \"fabric_md.bridged.upf.skip_egress_upf_ctr = true\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf448\",\n \"id\" : 90,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_14\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_session_meter_idx_internal\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 448,\n \"column\" : 44,\n \"source_fragment\" : \"(bit<32>) session_meter_idx_internal\"\n }\n },\n {\n \"op\" : \"execute_meter\",\n \"parameters\" : [\n {\n \"type\" : \"meter_array\",\n \"value\" : \"FabricIngress.upf.session_meter\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_14\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_meter_color32\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 448,\n \"column\" : 16,\n \"source_fragment\" : \"session_meter.execute_meter((bit<32>) session_meter_idx_internal, fabric_md.upf_meter_color)\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf445\",\n \"id\" : 91,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_15\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_meter_idx_internal\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 445,\n \"column\" : 36,\n \"source_fragment\" : \"(bit<32>) app_meter_idx_internal\"\n }\n },\n {\n \"op\" : \"execute_meter\",\n \"parameters\" : [\n {\n \"type\" : \"meter_array\",\n \"value\" : \"FabricIngress.upf.app_meter\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_15\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_meter_color32\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 445,\n \"column\" : 12,\n \"source_fragment\" : \"app_meter.execute_meter((bit<32>) app_meter_idx_internal, fabric_md.upf_meter_color)\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf461\",\n \"id\" : 92,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_16\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_upf_ctr_id14\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 461,\n \"column\" : 43,\n \"source_fragment\" : \"(bit<32>)fabric_md.bridged.upf.upf_ctr_id\"\n }\n },\n {\n \"op\" : \"count\",\n \"parameters\" : [\n {\n \"type\" : \"counter_array\",\n \"value\" : \"FabricIngress.upf.terminations_counter\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_16\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 461,\n \"column\" : 16,\n \"source_fragment\" : \"terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf25\",\n \"id\" : 93,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_is_uplink\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 25,\n \"column\" : 4,\n \"source_fragment\" : \"bool is_uplink = false;\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_term_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 26,\n \"column\" : 4,\n \"source_fragment\" : \"bool term_hit = false;\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_sess_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 27,\n \"column\" : 4,\n \"source_fragment\" : \"bool sess_hit = false;\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_ipv4_addr\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 28,\n \"column\" : 4,\n \"source_fragment\" : \"bit<32> app_ipv4_addr = 0;\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_l4_port\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 29,\n \"column\" : 4,\n \"source_fragment\" : \"l4_port_t app_l4_port = 0;\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_ip_proto\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 30,\n \"column\" : 4,\n \"source_fragment\" : \"bit<8> app_ip_proto = 0;\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_internal_app_id\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 55,\n \"column\" : 30,\n \"source_fragment\" : \"0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_ue_session_id\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 32,\n \"column\" : 4,\n \"source_fragment\" : \"ue_session_id_t ue_session_id = 0;\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_session_meter_idx_internal\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 72,\n \"column\" : 54,\n \"source_fragment\" : \"0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_meter_idx_internal\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 73,\n \"column\" : 46,\n \"source_fragment\" : \"0; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"filtering100\",\n \"id\" : 94,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_17\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_fwd_type5\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 100,\n \"column\" : 31,\n \"source_fragment\" : \"(bit<32>)fabric_md.bridged.base.fwd_type\"\n }\n },\n {\n \"op\" : \"count\",\n \"parameters\" : [\n {\n \"type\" : \"counter_array\",\n \"value\" : \"FabricIngress.filtering.fwd_type_counter\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_17\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 100,\n \"column\" : 8,\n \"source_fragment\" : \"fwd_type_counter.count((bit<32>)fabric_md.bridged.base.fwd_type)\"\n }\n }\n ]\n },\n {\n \"name\" : \"hasher28\",\n \"id\" : 95,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_18\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_tun_peer_id13\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 32,\n \"column\" : 17,\n \"source_fragment\" : \"fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_19\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_teid19\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 32,\n \"column\" : 52,\n \"source_fragment\" : \"fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"modify_field_with_hash_based_offset\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_ecmp_hash5\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000000\"\n },\n {\n \"type\" : \"calculation\",\n \"value\" : \"calc\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 28,\n \"column\" : 12,\n \"source_fragment\" : \"hash( ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"hasher39\",\n \"id\" : 96,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_20\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"src_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 43,\n \"column\" : 17,\n \"source_fragment\" : \"hdr.ipv4.src_addr\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_21\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dst_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 43,\n \"column\" : 36,\n \"source_fragment\" : \"hdr.ipv4.dst_addr\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_22\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"teid\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 43,\n \"column\" : 55,\n \"source_fragment\" : \"hdr.gtpu.teid\"\n }\n },\n {\n \"op\" : \"modify_field_with_hash_based_offset\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_ecmp_hash5\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000000\"\n },\n {\n \"type\" : \"calculation\",\n \"value\" : \"calc_0\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 39,\n \"column\" : 12,\n \"source_fragment\" : \"hash( ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"hasher50\",\n \"id\" : 97,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_ecmp_hash5\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_inner_hash1\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 50,\n \"column\" : 32,\n \"source_fragment\" : \"= fabric_md.bridged.base.inner_hash; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"hasher66\",\n \"id\" : 98,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_inner_hash1\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 66,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.bridged.base.inner_hash = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_23\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ethernet3\", \"dst_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 71,\n \"column\" : 17,\n \"source_fragment\" : \"hdr.ethernet.dst_addr\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_24\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ethernet3\", \"src_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 71,\n \"column\" : 40,\n \"source_fragment\" : \"hdr.ethernet.src_addr\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_25\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_eth_type5\", \"value\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 71,\n \"column\" : 63,\n \"source_fragment\" : \"hdr.eth_type.value\"\n }\n },\n {\n \"op\" : \"modify_field_with_hash_based_offset\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_ecmp_hash5\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000000\"\n },\n {\n \"type\" : \"calculation\",\n \"value\" : \"calc_1\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 67,\n \"column\" : 12,\n \"source_fragment\" : \"hash( ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"hasher17\",\n \"id\" : 99,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_26\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 91,\n \"column\" : 34,\n \"source_fragment\" : \"fabric_md\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_27\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_dst12\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 91,\n \"column\" : 34,\n \"source_fragment\" : \"fabric_md\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_28\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 91,\n \"column\" : 34,\n \"source_fragment\" : \"fabric_md\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_29\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 91,\n \"column\" : 34,\n \"source_fragment\" : \"fabric_md\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_30\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 91,\n \"column\" : 34,\n \"source_fragment\" : \"fabric_md\"\n }\n },\n {\n \"op\" : \"modify_field_with_hash_based_offset\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_inner_hash1\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000000\"\n },\n {\n \"type\" : \"calculation\",\n \"value\" : \"calc_2\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 17,\n \"column\" : 8,\n \"source_fragment\" : \"hash( ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"slicing174\",\n \"id\" : 100,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_31\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_slice_tc12\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 174,\n \"column\" : 41,\n \"source_fragment\" : \"(bit<32>) fabric_md.bridged.base.slice_tc\"\n }\n },\n {\n \"op\" : \"execute_meter\",\n \"parameters\" : [\n {\n \"type\" : \"meter_array\",\n \"value\" : \"FabricIngress.qos.slice_tc_meter\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_31\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"qos_packet_color\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 174,\n \"column\" : 12,\n \"source_fragment\" : \"slice_tc_meter.execute_meter((bit<32>) fabric_md.bridged.base.slice_tc, packet_color)\"\n }\n }\n ]\n },\n {\n \"name\" : \"slicing177\",\n \"id\" : 101,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"qos_packet_color\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4\",\n \"line\" : 25,\n \"column\" : 10,\n \"source_fragment\" : \"2 ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"int112\",\n \"id\" : 102,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_egress_port25\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_spec\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 112,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.int_bmd.egress_port = standard_md.egress_spec\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_queue_id24\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 113,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.int_bmd.queue_id = 0\"\n }\n }\n ]\n },\n {\n \"name\" : \"fabric_v1model110\",\n \"id\" : 103,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"mark_to_drop\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"standard_metadata\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 110,\n \"column\" : 12,\n \"source_fragment\" : \"mark_to_drop(standard_md)\"\n }\n }\n ]\n },\n {\n \"name\" : \"fabric_v1model106\",\n \"id\" : 104,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_bridged36\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_bridged4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 106,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.egress.bridged = fabric_md\"\n }\n }\n ]\n },\n {\n \"name\" : \"nop\",\n \"id\" : 105,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 106,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 107,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 108,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 109,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 110,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 111,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"FabricEgress.stats.count\",\n \"id\" : 112,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"FabricEgress.pkt_io_egress.set_switch_info\",\n \"id\" : 113,\n \"runtime_data\" : [\n {\n \"name\" : \"cpu_port\",\n \"bitwidth\" : 9\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_cpu_port37\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"local\",\n \"value\" : 0\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01ff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 36,\n \"column\" : 27,\n \"source_fragment\" : \"= (PortId_t)cpu_port; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.egress_next.pop_mpls_if_present\",\n \"id\" : 114,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_mpls6\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 198,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.mpls.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_eth_type5\", \"value\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_ip_eth_type10\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 200,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.eth_type.value = fabric_md.bridged\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.egress_next.set_mpls\",\n \"id\" : 115,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_mpls6\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 205,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.mpls.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"label\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_mpls_label2\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 206,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.mpls.label = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"tc\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 207,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.mpls.tc = 3w0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"bos\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 208,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.mpls.bos = 1w1\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"ttl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_mpls_ttl8\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 209,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.mpls.ttl = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_eth_type5\", \"value\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8847\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 112,\n \"column\" : 31,\n \"source_fragment\" : \"0x8847; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.egress_next.push_vlan\",\n \"id\" : 116,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_vlan_tag4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 217,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.vlan_tag.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_vlan_tag4\", \"eth_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8100\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 111,\n \"column\" : 31,\n \"source_fragment\" : \"0x8100; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_vlan_tag4\", \"vlan_id\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_vlan_id6\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 221,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.vlan_tag.vlan_id = fabric_md.bridged\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.egress_next.pop_vlan\",\n \"id\" : 117,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_vlan_tag4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 249,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.vlan_tag.setInvalid()\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.egress_next.drop\",\n \"id\" : 118,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 254,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_drop_reason49\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x82\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 257,\n \"column\" : 35,\n \"source_fragment\" : \"130, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.dscp_rewriter.rewrite\",\n \"id\" : 119,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"FabricEgress.dscp_rewriter.clear\",\n \"id\" : 120,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"dscp_rewriter_tmp_dscp\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 198,\n \"column\" : 8,\n \"source_fragment\" : \"tmp_dscp = 0\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.upf.load_tunnel_params\",\n \"id\" : 121,\n \"runtime_data\" : [\n {\n \"name\" : \"tunnel_src_port\",\n \"bitwidth\" : 16\n },\n {\n \"name\" : \"tunnel_src_addr\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"tunnel_dst_addr\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"src_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 486,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.src_addr = tunnel_src_addr\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dst_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 2\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 487,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.dst_addr = tunnel_dst_addr\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"sport\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 488,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.udp.sport = tunnel_src_port\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.upf.gtpu_only\",\n \"id\" : 122,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_ipv418\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 551,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.inner_ipv4.setValid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_ipv418\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_ipv47\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 552,\n \"column\" : 23,\n \"source_fragment\" : \"= hdr.ipv4; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_udp10\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 553,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.udp.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu12\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 554,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"version\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 506,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.version = 4w4\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ihl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x05\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 507,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.ihl = 4w5\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dscp\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 508,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.dscp = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ecn\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 509,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.ecn = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"identification\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x1513\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 511,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.identification = 0x1513\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"flags\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 512,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.flags = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"frag_offset\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 513,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.frag_offset = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ttl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 150,\n \"column\" : 32,\n \"source_fragment\" : \"64; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"protocol\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x11\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 134,\n \"column\" : 25,\n \"source_fragment\" : \"17; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"dport\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0868\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 86,\n \"column\" : 30,\n \"source_fragment\" : \"2152; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"version\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 87,\n \"column\" : 22,\n \"source_fragment\" : \"3w1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"pt\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 89,\n \"column\" : 37,\n \"source_fragment\" : \"1w1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"spare\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 527,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.spare = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"seq_flag\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 529,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.seq_flag = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"npdu_flag\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 530,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.npdu_flag = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"msgtype\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 88,\n \"column\" : 25,\n \"source_fragment\" : \"0xff; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"teid\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_upf_teid19\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 533,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.teid = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_options13\", \"seq_num\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 535,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_options.seq_num = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_options13\", \"n_pdu_num\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 536,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_options.n_pdu_num = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_options13\", \"next_ext\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x85\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 91,\n \"column\" : 33,\n \"source_fragment\" : \"0x85; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"len\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 94,\n \"column\" : 32,\n \"source_fragment\" : \"8w1; // 1*4-octets ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 92,\n \"column\" : 36,\n \"source_fragment\" : \"4w0; // Downlink ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"spare0\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 541,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_ext_psc.spare0 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"ppp\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 542,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_ext_psc.ppp = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"rqi\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 543,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_ext_psc.rqi = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"next_ext\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 90,\n \"column\" : 34,\n \"source_fragment\" : \"0x0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"total_len\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0024\"\n },\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"total_len\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 563,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.total_len = 20 + 8 + 8 ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"len\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0010\"\n },\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"total_len\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 565,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.udp.len = 8 + 8 ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"msglen\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"total_len\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 567,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.msglen = hdr.inner_ipv4.total_len\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"encap_presence\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 81,\n \"column\" : 16,\n \"source_fragment\" : \"0x1, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.upf.gtpu_with_psc\",\n \"id\" : 123,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu_options13\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 577,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_options.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu_ext_psc14\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 578,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_ext_psc.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_ipv418\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 551,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.inner_ipv4.setValid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_ipv418\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_ipv47\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 552,\n \"column\" : 23,\n \"source_fragment\" : \"= hdr.ipv4; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_udp10\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 553,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.udp.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu12\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 554,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"version\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 506,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.version = 4w4\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ihl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x05\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 507,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.ihl = 4w5\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dscp\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 508,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.dscp = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ecn\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 509,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.ecn = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"identification\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x1513\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 511,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.identification = 0x1513\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"flags\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 512,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.flags = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"frag_offset\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 513,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.frag_offset = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ttl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 150,\n \"column\" : 32,\n \"source_fragment\" : \"64; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"protocol\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x11\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 134,\n \"column\" : 25,\n \"source_fragment\" : \"17; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"dport\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0868\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 86,\n \"column\" : 30,\n \"source_fragment\" : \"2152; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"version\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 87,\n \"column\" : 22,\n \"source_fragment\" : \"3w1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"pt\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 89,\n \"column\" : 37,\n \"source_fragment\" : \"1w1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"spare\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 527,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.spare = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"seq_flag\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 529,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.seq_flag = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"npdu_flag\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 530,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.npdu_flag = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"msgtype\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 88,\n \"column\" : 25,\n \"source_fragment\" : \"0xff; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"teid\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_upf_teid19\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 533,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.teid = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_options13\", \"seq_num\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 535,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_options.seq_num = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_options13\", \"n_pdu_num\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 536,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_options.n_pdu_num = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_options13\", \"next_ext\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x85\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 91,\n \"column\" : 33,\n \"source_fragment\" : \"0x85; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"len\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 94,\n \"column\" : 32,\n \"source_fragment\" : \"8w1; // 1*4-octets ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 92,\n \"column\" : 36,\n \"source_fragment\" : \"4w0; // Downlink ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"spare0\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 541,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_ext_psc.spare0 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"ppp\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 542,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_ext_psc.ppp = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"rqi\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 543,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_ext_psc.rqi = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"next_ext\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 90,\n \"column\" : 34,\n \"source_fragment\" : \"0x0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"total_len\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x002c\"\n },\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"total_len\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 580,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.total_len = 20 + 8 + 8 ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"len\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0018\"\n },\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"total_len\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 583,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.udp.len = 8 + 8 ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"msglen\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0008\"\n },\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"total_len\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 586,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.msglen = 4 + 4 ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"ex_flag\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 588,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.ex_flag = 1\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"qfi\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_upf_qfi15\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 589,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_ext_psc.qfi = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"encap_presence\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 82,\n \"column\" : 20,\n \"source_fragment\" : \"0x2, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.parser_emulator.parse_int_ingress_drop\",\n \"id\" : 124,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ethernet\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 20,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ethernet.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_eth_type\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 25,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_eth_type.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ipv4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 37,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"version\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 38,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.version = 4w4\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ihl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x05\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 39,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.ihl = 4w5\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"dscp\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 40,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.dscp = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ecn\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 41,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.ecn = 2w0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"flags\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 44,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.flags = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"frag_offset\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 45,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.frag_offset = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ttl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 150,\n \"column\" : 32,\n \"source_fragment\" : \"64; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"protocol\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x11\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 134,\n \"column\" : 25,\n \"source_fragment\" : \"17; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_udp\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 53,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_udp\", \"sport\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 54,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.sport = 0\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_fixed_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 60,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"ver\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 61,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.ver = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"nproto\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 203,\n \"column\" : 52,\n \"source_fragment\" : \"2; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"rsvd\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 66,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.rsvd = 0\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_common_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 71,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_int_report_md39\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 79,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"ip_eth_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0800\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 114,\n \"column\" : 31,\n \"source_fragment\" : \"0x0800; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"report_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 221,\n \"column\" : 45,\n \"source_fragment\" : \"4; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"mirror_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 178,\n \"column\" : 14,\n \"source_fragment\" : \"0, ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_drop_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 85,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.drop_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"bmd_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 169,\n \"column\" : 23,\n \"source_fragment\" : \"4, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"encap_presence\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_encap_presence7\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 93,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.encap_presence = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"flow_hash\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_inner_hash1\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 94,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.flow_hash = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_drop_report_header\", \"drop_reason\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_int_bmd_drop_reason23\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 97,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.drop_report_header.drop_reason = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"ig_tstamp\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_ig_tstamp9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 99,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"ig_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_ig_port3\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 101,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.ig_port = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"eg_port\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 102,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.eg_port = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"queue_id\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 103,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.queue_id = 0\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.parser_emulator.parse_int_ingress_drop\",\n \"id\" : 125,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ethernet\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 20,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ethernet.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_eth_type\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 25,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_eth_type.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ipv4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 37,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"version\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 38,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.version = 4w4\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ihl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x05\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 39,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.ihl = 4w5\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"dscp\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 40,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.dscp = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ecn\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 41,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.ecn = 2w0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"flags\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 44,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.flags = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"frag_offset\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 45,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.frag_offset = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ttl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 150,\n \"column\" : 32,\n \"source_fragment\" : \"64; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"protocol\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x11\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 134,\n \"column\" : 25,\n \"source_fragment\" : \"17; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_udp\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 53,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_udp\", \"sport\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 54,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.sport = 0\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_fixed_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 60,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"ver\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 61,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.ver = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"nproto\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 203,\n \"column\" : 52,\n \"source_fragment\" : \"2; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"rsvd\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 66,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.rsvd = 0\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_common_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 71,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_int_report_md39\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 79,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"ip_eth_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0800\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 114,\n \"column\" : 31,\n \"source_fragment\" : \"0x0800; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"report_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 221,\n \"column\" : 45,\n \"source_fragment\" : \"4; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"mirror_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 178,\n \"column\" : 14,\n \"source_fragment\" : \"0, ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_drop_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 85,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.drop_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"bmd_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 169,\n \"column\" : 23,\n \"source_fragment\" : \"4, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"encap_presence\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_encap_presence7\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 93,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.encap_presence = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"flow_hash\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_inner_hash1\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 94,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.flow_hash = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_drop_report_header\", \"drop_reason\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_int_bmd_drop_reason23\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 97,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.drop_report_header.drop_reason = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"ig_tstamp\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_ig_tstamp9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 99,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"ig_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_ig_port3\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 101,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.ig_port = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"eg_port\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 102,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.eg_port = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"queue_id\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 103,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.queue_id = 0\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.parser_emulator.parse_int_report_mirror\",\n \"id\" : 126,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ethernet\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 20,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ethernet.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_eth_type\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 25,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_eth_type.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ipv4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 37,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"version\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 38,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.version = 4w4\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ihl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x05\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 39,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.ihl = 4w5\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"dscp\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 40,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.dscp = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ecn\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 41,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.ecn = 2w0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"flags\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 44,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.flags = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"frag_offset\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 45,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.frag_offset = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ttl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 150,\n \"column\" : 32,\n \"source_fragment\" : \"64; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"protocol\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x11\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 134,\n \"column\" : 25,\n \"source_fragment\" : \"17; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_udp\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 53,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_udp\", \"sport\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 54,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.sport = 0\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_fixed_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 60,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"ver\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 61,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.ver = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"nproto\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 203,\n \"column\" : 52,\n \"source_fragment\" : \"2; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"rsvd\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 66,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.rsvd = 0\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_common_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 71,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_bmd_type0\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"bmd_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 110,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.bmd_type = fabric_md.int_report_md.bmd_type\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_vlan_id6\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0ffe\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 147,\n \"column\" : 34,\n \"source_fragment\" : \"12w4094; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_mpls_label2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x000000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 112,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.mpls_label = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_upf_skip_upf17\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 114,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.bridged.upf.skip_upf = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"ig_tstamp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"ig_tstamp\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 118,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.ig_tstamp = fabric_md.int_report_md.ig_tstamp\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"ig_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"ig_port\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 121,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.ig_port = fabric_md.int_report_md.ig_port\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"eg_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"eg_port\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 122,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.eg_port = fabric_md.int_report_md.eg_port\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"queue_id\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"queue_id\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 123,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.queue_id = fabric_md.int_report_md.queue_id\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_local_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 126,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.local_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_local_report_header\", \"queue_occupancy\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"queue_occupancy\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 127,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.local_report_header.queue_occupancy = fabric_md.int_report_md.queue_occupancy\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_local_report_header\", \"eg_tstamp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"eg_tstamp\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 128,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.local_report_header.eg_tstamp = fabric_md.int_report_md.eg_tstamp\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.parser_emulator.parse_int_report_mirror\",\n \"id\" : 127,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ethernet\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 20,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ethernet.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_eth_type\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 25,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_eth_type.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ipv4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 37,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"version\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 38,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.version = 4w4\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ihl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x05\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 39,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.ihl = 4w5\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"dscp\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 40,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.dscp = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ecn\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 41,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.ecn = 2w0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"flags\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 44,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.flags = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"frag_offset\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 45,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.frag_offset = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ttl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 150,\n \"column\" : 32,\n \"source_fragment\" : \"64; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"protocol\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x11\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 134,\n \"column\" : 25,\n \"source_fragment\" : \"17; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_udp\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 53,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_udp\", \"sport\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 54,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.sport = 0\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_fixed_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 60,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"ver\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 61,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.ver = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"nproto\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 203,\n \"column\" : 52,\n \"source_fragment\" : \"2; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"rsvd\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 66,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.rsvd = 0\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_common_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 71,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_bmd_type0\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"bmd_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 110,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.bmd_type = fabric_md.int_report_md.bmd_type\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_vlan_id6\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0ffe\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 147,\n \"column\" : 34,\n \"source_fragment\" : \"12w4094; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_mpls_label2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x000000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 112,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.mpls_label = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_upf_skip_upf17\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 114,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.bridged.upf.skip_upf = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"ig_tstamp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"ig_tstamp\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 118,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.ig_tstamp = fabric_md.int_report_md.ig_tstamp\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"ig_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"ig_port\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 121,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.ig_port = fabric_md.int_report_md.ig_port\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"eg_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"eg_port\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 122,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.eg_port = fabric_md.int_report_md.eg_port\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"queue_id\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"queue_id\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 123,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.queue_id = fabric_md.int_report_md.queue_id\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_local_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 126,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.local_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_local_report_header\", \"queue_occupancy\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"queue_occupancy\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 127,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.local_report_header.queue_occupancy = fabric_md.int_report_md.queue_occupancy\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_local_report_header\", \"eg_tstamp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"eg_tstamp\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 128,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.local_report_header.eg_tstamp = fabric_md.int_report_md.eg_tstamp\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.int_egress.check_quota\",\n \"id\" : 128,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"FabricEgress.int_egress.reset_quota\",\n \"id\" : 129,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"FabricEgress.int_egress.set_config\",\n \"id\" : 130,\n \"runtime_data\" : [\n {\n \"name\" : \"hop_latency_mask\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"timestamp_mask\",\n \"bitwidth\" : 48\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"hop_latency\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"hop_latency\"]\n },\n \"right\" : {\n \"type\" : \"local\",\n \"value\" : 0\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 179,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_md.hop_latency = fabric_md.int_md.hop_latency & hop_latency_mask\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"timestamp\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"timestamp\"]\n },\n \"right\" : {\n \"type\" : \"local\",\n \"value\" : 1\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 180,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_md.timestamp = fabric_md.int_md.timestamp & timestamp_mask\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.int_egress.do_local_report_encap\",\n \"id\" : 131,\n \"runtime_data\" : [\n {\n \"name\" : \"src_ip\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"mon_ip\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"mon_port\",\n \"bitwidth\" : 16\n },\n {\n \"name\" : \"switch_id\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"modify_field_rng_uniform\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"identification\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 195,\n \"column\" : 8,\n \"source_fragment\" : \"random(hdr.report_ipv4.identification, 0, 0xffff)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"src_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 197,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.src_addr = src_ip; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"dst_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 198,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.dst_addr = mon_ip; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_udp\", \"dport\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 2\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 199,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.dport = mon_port; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_32\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"hw_id\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 200,\n \"column\" : 23,\n \"source_fragment\" : \"(bit<32>)hdr.report_fixed_header.hw_id\"\n }\n },\n {\n \"op\" : \"register_read\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n {\n \"type\" : \"register_array\",\n \"value\" : \"FabricEgress.int_egress.seq_number\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_32\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 143,\n \"column\" : 8,\n \"source_fragment\" : \"seq_number.read(reg, seq_number_idx)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000001\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 144,\n \"column\" : 8,\n \"source_fragment\" : \"reg = reg + 1\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_33\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"hw_id\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 200,\n \"column\" : 23,\n \"source_fragment\" : \"(bit<32>)hdr.report_fixed_header.hw_id\"\n }\n },\n {\n \"op\" : \"register_write\",\n \"parameters\" : [\n {\n \"type\" : \"register_array\",\n \"value\" : \"FabricEgress.int_egress.seq_number\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_33\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 146,\n \"column\" : 8,\n \"source_fragment\" : \"seq_number.write(seq_number_idx, reg)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"seq_no\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n }\n ]\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"dqf\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"report_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 201,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"switch_id\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 3\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 202,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.switch_id = switch_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad1\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 203,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad1 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 204,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad2 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad3\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 205,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad3 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_eth_type\", \"value\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"ip_eth_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 207,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._int_mirror_type3\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 178,\n \"column\" : 14,\n \"source_fragment\" : \"0, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_eth_type\", \"value\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 125,\n \"column\" : 39,\n \"source_fragment\" : \"0xBF04; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"nproto\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 203,\n \"column\" : 52,\n \"source_fragment\" : \"2; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_local_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 218,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.local_report_header.setValid()\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.int_egress.do_local_report_encap_mpls\",\n \"id\" : 132,\n \"runtime_data\" : [\n {\n \"name\" : \"src_ip\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"mon_ip\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"mon_port\",\n \"bitwidth\" : 16\n },\n {\n \"name\" : \"mon_label\",\n \"bitwidth\" : 20\n },\n {\n \"name\" : \"switch_id\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"modify_field_rng_uniform\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"identification\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 195,\n \"column\" : 8,\n \"source_fragment\" : \"random(hdr.report_ipv4.identification, 0, 0xffff)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"src_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 197,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.src_addr = src_ip; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"dst_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 198,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.dst_addr = mon_ip; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_udp\", \"dport\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 2\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 199,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.dport = mon_port; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_34\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"hw_id\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 200,\n \"column\" : 23,\n \"source_fragment\" : \"(bit<32>)hdr.report_fixed_header.hw_id\"\n }\n },\n {\n \"op\" : \"register_read\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n {\n \"type\" : \"register_array\",\n \"value\" : \"FabricEgress.int_egress.seq_number\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_34\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 143,\n \"column\" : 8,\n \"source_fragment\" : \"seq_number.read(reg, seq_number_idx)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000001\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 144,\n \"column\" : 8,\n \"source_fragment\" : \"reg = reg + 1\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_35\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"hw_id\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 200,\n \"column\" : 23,\n \"source_fragment\" : \"(bit<32>)hdr.report_fixed_header.hw_id\"\n }\n },\n {\n \"op\" : \"register_write\",\n \"parameters\" : [\n {\n \"type\" : \"register_array\",\n \"value\" : \"FabricEgress.int_egress.seq_number\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_35\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 146,\n \"column\" : 8,\n \"source_fragment\" : \"seq_number.write(seq_number_idx, reg)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"seq_no\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n }\n ]\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"dqf\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"report_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 201,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"switch_id\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 4\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 202,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.switch_id = switch_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad1\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 203,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad1 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 204,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad2 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad3\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 205,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad3 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_eth_type\", \"value\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"ip_eth_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 207,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._int_mirror_type3\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 178,\n \"column\" : 14,\n \"source_fragment\" : \"0, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_eth_type\", \"value\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 125,\n \"column\" : 39,\n \"source_fragment\" : \"0xBF04; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"nproto\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 203,\n \"column\" : 52,\n \"source_fragment\" : \"2; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_local_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 218,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.local_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_eth_type\", \"value\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf05\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 126,\n \"column\" : 39,\n \"source_fragment\" : \"0xBF05; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_mpls\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 226,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_mpls.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_mpls\", \"tc\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 227,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_mpls.tc = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_mpls\", \"bos\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 228,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_mpls.bos = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_mpls\", \"ttl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 149,\n \"column\" : 32,\n \"source_fragment\" : \"64; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_mpls\", \"label\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 3\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 230,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_mpls.label = mon_label\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.int_egress.do_drop_report_encap\",\n \"id\" : 133,\n \"runtime_data\" : [\n {\n \"name\" : \"src_ip\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"mon_ip\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"mon_port\",\n \"bitwidth\" : 16\n },\n {\n \"name\" : \"switch_id\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"modify_field_rng_uniform\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"identification\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 195,\n \"column\" : 8,\n \"source_fragment\" : \"random(hdr.report_ipv4.identification, 0, 0xffff)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"src_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 197,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.src_addr = src_ip; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"dst_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 198,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.dst_addr = mon_ip; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_udp\", \"dport\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 2\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 199,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.dport = mon_port; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_36\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"hw_id\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 200,\n \"column\" : 23,\n \"source_fragment\" : \"(bit<32>)hdr.report_fixed_header.hw_id\"\n }\n },\n {\n \"op\" : \"register_read\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n {\n \"type\" : \"register_array\",\n \"value\" : \"FabricEgress.int_egress.seq_number\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_36\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 143,\n \"column\" : 8,\n \"source_fragment\" : \"seq_number.read(reg, seq_number_idx)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000001\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 144,\n \"column\" : 8,\n \"source_fragment\" : \"reg = reg + 1\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_37\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"hw_id\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 200,\n \"column\" : 23,\n \"source_fragment\" : \"(bit<32>)hdr.report_fixed_header.hw_id\"\n }\n },\n {\n \"op\" : \"register_write\",\n \"parameters\" : [\n {\n \"type\" : \"register_array\",\n \"value\" : \"FabricEgress.int_egress.seq_number\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_37\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 146,\n \"column\" : 8,\n \"source_fragment\" : \"seq_number.write(seq_number_idx, reg)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"seq_no\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n }\n ]\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"dqf\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"report_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 201,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"switch_id\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 3\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 202,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.switch_id = switch_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad1\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 203,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad1 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 204,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad2 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad3\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 205,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad3 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_eth_type\", \"value\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"ip_eth_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 207,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._int_mirror_type3\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 178,\n \"column\" : 14,\n \"source_fragment\" : \"0, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_eth_type\", \"value\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 125,\n \"column\" : 39,\n \"source_fragment\" : \"0xBF04; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"nproto\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 202,\n \"column\" : 44,\n \"source_fragment\" : \"1; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_drop_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 238,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.drop_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_local_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 241,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.local_report_header.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_drop_report_header\", \"drop_reason\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_int_bmd_drop_reason23\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 243,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.drop_report_header.drop_reason =\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.int_egress.do_drop_report_encap_mpls\",\n \"id\" : 134,\n \"runtime_data\" : [\n {\n \"name\" : \"src_ip\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"mon_ip\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"mon_port\",\n \"bitwidth\" : 16\n },\n {\n \"name\" : \"mon_label\",\n \"bitwidth\" : 20\n },\n {\n \"name\" : \"switch_id\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"modify_field_rng_uniform\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"identification\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 195,\n \"column\" : 8,\n \"source_fragment\" : \"random(hdr.report_ipv4.identification, 0, 0xffff)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"src_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 197,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.src_addr = src_ip; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"dst_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 198,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.dst_addr = mon_ip; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_udp\", \"dport\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 2\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 199,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.dport = mon_port; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_38\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"hw_id\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 200,\n \"column\" : 23,\n \"source_fragment\" : \"(bit<32>)hdr.report_fixed_header.hw_id\"\n }\n },\n {\n \"op\" : \"register_read\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n {\n \"type\" : \"register_array\",\n \"value\" : \"FabricEgress.int_egress.seq_number\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_38\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 143,\n \"column\" : 8,\n \"source_fragment\" : \"seq_number.read(reg, seq_number_idx)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000001\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 144,\n \"column\" : 8,\n \"source_fragment\" : \"reg = reg + 1\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_39\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"hw_id\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 200,\n \"column\" : 23,\n \"source_fragment\" : \"(bit<32>)hdr.report_fixed_header.hw_id\"\n }\n },\n {\n \"op\" : \"register_write\",\n \"parameters\" : [\n {\n \"type\" : \"register_array\",\n \"value\" : \"FabricEgress.int_egress.seq_number\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_39\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 146,\n \"column\" : 8,\n \"source_fragment\" : \"seq_number.write(seq_number_idx, reg)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"seq_no\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n }\n ]\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"dqf\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"report_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 201,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"switch_id\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 4\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 202,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.switch_id = switch_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad1\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 203,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad1 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 204,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad2 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad3\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 205,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad3 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_eth_type\", \"value\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"ip_eth_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 207,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._int_mirror_type3\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 178,\n \"column\" : 14,\n \"source_fragment\" : \"0, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_eth_type\", \"value\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 125,\n \"column\" : 39,\n \"source_fragment\" : \"0xBF04; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"nproto\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 202,\n \"column\" : 44,\n \"source_fragment\" : \"1; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_drop_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 238,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.drop_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_local_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 241,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.local_report_header.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_drop_report_header\", \"drop_reason\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_int_bmd_drop_reason23\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 243,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.drop_report_header.drop_reason =\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_eth_type\", \"value\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf05\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 126,\n \"column\" : 39,\n \"source_fragment\" : \"0xBF05; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_mpls\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 251,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_mpls.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_mpls\", \"tc\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 252,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_mpls.tc = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_mpls\", \"bos\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 253,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_mpls.bos = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_mpls\", \"ttl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 149,\n \"column\" : 32,\n \"source_fragment\" : \"64; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_mpls\", \"label\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 3\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 256,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_mpls.label = mon_label\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.int_egress.init_int_metadata\",\n \"id\" : 135,\n \"runtime_data\" : [\n {\n \"name\" : \"report_type\",\n \"bitwidth\" : 3\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_int_bmd_mirror_session_id22\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01fa\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 208,\n \"column\" : 43,\n \"source_fragment\" : \"0x1FA; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_fabric_md_int_report_md\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 293,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._int_mirror_type3\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 179,\n \"column\" : 17,\n \"source_fragment\" : \"1, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"bmd_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 167,\n \"column\" : 20,\n \"source_fragment\" : \"2, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"mirror_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 179,\n \"column\" : 17,\n \"source_fragment\" : \"1, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"ig_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_base_ig_port3\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 299,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.ig_port =\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"eg_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_port\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 300,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.eg_port = (PortId_t)standard_md.egress_port\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"queue_id\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_egress_qid\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 301,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.queue_id = egress_qid\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"queue_occupancy\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"deq_qdepth\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 302,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.queue_occupancy = standard_md.deq_qdepth\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"ig_tstamp\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_base_ig_tstamp9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 303,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"eg_tstamp\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_global_timestamp\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 304,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.eg_tstamp = standard_md.egress_global_timestamp[31:0]\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"ip_eth_type\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_base_ip_eth_type10\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 305,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.ip_eth_type =\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"flow_hash\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_base_inner_hash1\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 306,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.flow_hash =\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"report_type\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 309,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.report_type = report_type\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.int_egress.adjust_ip_udp_len\",\n \"id\" : 136,\n \"runtime_data\" : [\n {\n \"name\" : \"adjust_ip\",\n \"bitwidth\" : 16\n },\n {\n \"name\" : \"adjust_udp\",\n \"bitwidth\" : 16\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"total_len\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_fabric_md_pkt_length\"]\n },\n \"right\" : {\n \"type\" : \"local\",\n \"value\" : 0\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 342,\n \"column\" : 8,\n \"source_fragment\" : \"hdr_v1model.ingress.ipv4.total_len = fabric_md.pkt_length + adjust_ip\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"len\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_fabric_md_pkt_length\"]\n },\n \"right\" : {\n \"type\" : \"local\",\n \"value\" : 1\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 343,\n \"column\" : 8,\n \"source_fragment\" : \"hdr_v1model.ingress.udp.len = fabric_md.pkt_length + adjust_udp\"\n }\n }\n ]\n },\n {\n \"name\" : \"fabric_v1model136\",\n \"id\" : 137,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"exit\",\n \"parameters\" : [],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 136,\n \"column\" : 12,\n \"source_fragment\" : \"exit\"\n }\n }\n ]\n },\n {\n \"name\" : \"fabric_v1model133\",\n \"id\" : 138,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_cpu_port37\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 133,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.egress.cpu_port = 0\"\n }\n }\n ]\n },\n {\n \"name\" : \"int_tna_parser_emulator148\",\n \"id\" : 139,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_ipv47\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 148,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.ipv4.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_tcp9\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 149,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.tcp.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_udp10\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 150,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.udp.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_icmp11\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 151,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.icmp.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_vxlan15\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 153,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.vxlan.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_ethernet16\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 154,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.inner_ethernet.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_eth_type17\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 155,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.inner_eth_type.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu12\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 157,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.gtpu.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu_options13\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 158,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.gtpu_options.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu_ext_psc14\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 159,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.gtpu_ext_psc.setInvalid()\"\n }\n }\n ]\n },\n {\n \"name\" : \"int_tna_parser_emulator14\",\n \"id\" : 140,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_drop_reason49\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 144,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.egress.bridged.int_bmd.drop_reason = fabric_md\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_int_bmd_report_type21\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_report_type47\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 145,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.egress.bridged.int_bmd.report_type = fabric_md\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ethernet\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_ethernet24\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_eth_type\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_eth_type25\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ipv4\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_ipv427\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_udp\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_udp28\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_fixed_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_fixed_header29\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_common_report_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_common_report_header30\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_local_report_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_local_report_header31\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_drop_report_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_drop_report_header32\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_is_int_recirc45\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 134,\n \"column\" : 32,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_vlan_tag4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 140,\n \"column\" : 8,\n \"source_fragment\" : \"hdr_v1model.ingress.vlan_tag.setInvalid()\"\n }\n }\n ]\n },\n {\n \"name\" : \"int_tna_parser_emulator166\",\n \"id\" : 141,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"recirculate\",\n \"parameters\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 166,\n \"column\" : 12,\n \"source_fragment\" : \"recirculate_preserving_field_list(NO_PRESERVATION)\"\n }\n }\n ]\n },\n {\n \"name\" : \"int_tna_parser_emulator169\",\n \"id\" : 142,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"recirculate\",\n \"parameters\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x1\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 169,\n \"column\" : 12,\n \"source_fragment\" : \"recirculate_preserving_field_list(PRESERVE_INT_MD)\"\n }\n }\n ]\n },\n {\n \"name\" : \"int_tna_parser_emulator173\",\n \"id\" : 143,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_ethernet24\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ethernet\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_eth_type25\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_eth_type\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_ipv427\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ipv4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_udp28\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_udp\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_fixed_header29\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_fixed_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_common_report_header30\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_common_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_local_report_header31\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_local_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_drop_report_header32\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_drop_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"int_tna_parser_emulator148_0\",\n \"id\" : 144,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_ipv47\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 148,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.ipv4.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_tcp9\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 149,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.tcp.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_udp10\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 150,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.udp.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_icmp11\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 151,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.icmp.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_vxlan15\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 153,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.vxlan.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_ethernet16\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 154,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.inner_ethernet.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_eth_type17\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 155,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.inner_eth_type.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu12\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 157,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.gtpu.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu_options13\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 158,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.gtpu_options.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu_ext_psc14\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 159,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.gtpu_ext_psc.setInvalid()\"\n }\n }\n ]\n },\n {\n \"name\" : \"int_tna_parser_emulator14_0\",\n \"id\" : 145,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ethernet\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_ethernet24\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_eth_type\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_eth_type25\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ipv4\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_ipv427\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_udp\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_udp28\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_fixed_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_fixed_header29\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_common_report_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_common_report_header30\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_local_report_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_local_report_header31\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_drop_report_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_drop_report_header32\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_is_int_recirc45\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 134,\n \"column\" : 32,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_vlan_tag4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 140,\n \"column\" : 8,\n \"source_fragment\" : \"hdr_v1model.ingress.vlan_tag.setInvalid()\"\n }\n }\n ]\n },\n {\n \"name\" : \"int_tna_parser_emulator166_0\",\n \"id\" : 146,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"recirculate\",\n \"parameters\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 166,\n \"column\" : 12,\n \"source_fragment\" : \"recirculate_preserving_field_list(NO_PRESERVATION)\"\n }\n }\n ]\n },\n {\n \"name\" : \"int_tna_parser_emulator169_0\",\n \"id\" : 147,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"recirculate\",\n \"parameters\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x1\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 169,\n \"column\" : 12,\n \"source_fragment\" : \"recirculate_preserving_field_list(PRESERVE_INT_MD)\"\n }\n }\n ]\n },\n {\n \"name\" : \"int_tna_parser_emulator173_0\",\n \"id\" : 148,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_ethernet24\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ethernet\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_eth_type25\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_eth_type\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_ipv427\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ipv4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_udp28\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_udp\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_fixed_header29\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_fixed_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_common_report_header30\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_common_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_local_report_header31\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_local_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_drop_report_header32\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_drop_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"packetio51\",\n \"id\" : 149,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_packet_in1\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 51,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.packet_in.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_packet_in1\", \"ingress_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_ingress_port50\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 52,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.packet_in.ingress_port = preserved_ig_port; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_fake_ethernet2\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 53,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.fake_ethernet.setInvalid()\"\n }\n },\n {\n \"op\" : \"exit\",\n \"parameters\" : [],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 54,\n \"column\" : 12,\n \"source_fragment\" : \"exit\"\n }\n }\n ]\n },\n {\n \"name\" : \"packetio60\",\n \"id\" : 150,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_pkt_length46\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"packet_length\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000ffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xfff2\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 60,\n \"column\" : 37,\n \"source_fragment\" : \"= (bit<16>)standard_md.packet_length - 14; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"next283\",\n \"id\" : 151,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_int_bmd_report_type21\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 219,\n \"column\" : 50,\n \"source_fragment\" : \"0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 285,\n \"column\" : 21,\n \"source_fragment\" : \"= 1; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"next325\",\n \"id\" : 152,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 325,\n \"column\" : 25,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_drop_reason49\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x83\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 258,\n \"column\" : 32,\n \"source_fragment\" : \"131, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"next323\",\n \"id\" : 153,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"ttl\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"ttl\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 323,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.mpls.ttl = hdr.mpls.ttl - 1\"\n }\n }\n ]\n },\n {\n \"name\" : \"next333\",\n \"id\" : 154,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ttl\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ttl\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 333,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.ipv4.ttl = hdr.ipv4.ttl - 1\"\n }\n }\n ]\n },\n {\n \"name\" : \"next336\",\n \"id\" : 155,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 336,\n \"column\" : 29,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_drop_reason49\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x1a\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 247,\n \"column\" : 30,\n \"source_fragment\" : \"26, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"next343\",\n \"id\" : 156,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv68\", \"hop_limit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv68\", \"hop_limit\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 343,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.ipv6.hop_limit = hdr.ipv6.hop_limit - 1\"\n }\n }\n ]\n },\n {\n \"name\" : \"next346\",\n \"id\" : 157,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 346,\n \"column\" : 29,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_drop_reason49\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x1a\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 247,\n \"column\" : 30,\n \"source_fragment\" : \"26, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf610\",\n \"id\" : 158,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_udp20\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 610,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.inner_udp.setValid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_udp20\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_udp10\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 611,\n \"column\" : 34,\n \"source_fragment\" : \"= hdr.udp; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_udp10\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 612,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.udp.setInvalid()\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf615\",\n \"id\" : 159,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_tcp19\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 615,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.inner_tcp.setValid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_tcp19\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_tcp9\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 616,\n \"column\" : 34,\n \"source_fragment\" : \"= hdr.tcp; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_tcp9\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 617,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.tcp.setInvalid()\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf620\",\n \"id\" : 160,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_icmp21\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 620,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.inner_icmp.setValid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_icmp21\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_icmp11\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 621,\n \"column\" : 35,\n \"source_fragment\" : \"= hdr.icmp; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_icmp11\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 622,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.icmp.setInvalid()\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf628\",\n \"id\" : 161,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_40\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_upf_upf_ctr_id14\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 628,\n \"column\" : 43,\n \"source_fragment\" : \"(bit<32>)fabric_md.bridged.upf.upf_ctr_id\"\n }\n },\n {\n \"op\" : \"count\",\n \"parameters\" : [\n {\n \"type\" : \"counter_array\",\n \"value\" : \"FabricEgress.upf.terminations_counter\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_40\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 628,\n \"column\" : 16,\n \"source_fragment\" : \"terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)\"\n }\n }\n ]\n },\n {\n \"name\" : \"int128\",\n \"id\" : 162,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_eth_type\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_eth_type25\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 128,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_mpls\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_mpls26\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 128,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_ipv4\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_ipv427\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 128,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_udp\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_udp28\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 128,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_fixed_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_fixed_header29\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 128,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_common_report_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_common_report_header30\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 128,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_local_report_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_local_report_header31\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 128,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_drop_report_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_drop_report_header32\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 128,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_eth_type\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_eth_type35\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 128,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_fabric_md_bridged\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_bridged36\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 129,\n \"column\" : 4,\n \"source_fragment\" : \"fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_fabric_md_int_report_md\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_int_report_md39\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 129,\n \"column\" : 4,\n \"source_fragment\" : \"fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"hop_latency\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_int_md_hop_latency40\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 129,\n \"column\" : 4,\n \"source_fragment\" : \"fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"timestamp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_int_md_timestamp41\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 129,\n \"column\" : 4,\n \"source_fragment\" : \"fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"vlan_stripped\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_int_md_vlan_stripped42\"]\n }\n }\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 129,\n \"column\" : 4,\n \"source_fragment\" : \"fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"queue_report\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_int_md_queue_report43\"]\n }\n }\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 129,\n \"column\" : 4,\n \"source_fragment\" : \"fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_fabric_md_pkt_length\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_pkt_length46\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 129,\n \"column\" : 4,\n \"source_fragment\" : \"fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_egress_qid\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 135,\n \"column\" : 4,\n \"source_fragment\" : \"QueueId_t egress_qid = 0;\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"hop_latency\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"-\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_global_timestamp\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_base_ig_tstamp9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 365,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_md.hop_latency = standard_md.egress_global_timestamp[31:0] - fabric_md.bridged.base.ig_tstamp[31:0]\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"timestamp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_global_timestamp\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 366,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_md.timestamp = standard_md.egress_global_timestamp\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"key_0\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"-\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_global_timestamp\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_base_ig_tstamp9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x10\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 166,\n \"column\" : 12,\n \"source_fragment\" : \" fabric_md.int_md.hop_latency[31:16]: range @name(\\\\\\\"hop_latency_upper\\\\\\\");\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"key_1\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"-\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_global_timestamp\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_base_ig_tstamp9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 167,\n \"column\" : 12,\n \"source_fragment\" : \" fabric_md.int_md.hop_latency[15:0]: range @name(\\\\\\\"hop_latency_lower\\\\\\\");\"\n }\n }\n ]\n },\n {\n \"name\" : \"int383\",\n \"id\" : 163,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_41\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_int_bmd_mirror_session_id22\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 384,\n \"column\" : 20,\n \"source_fragment\" : \"(bit<32>)fabric_md.bridged.int_bmd.mirror_session_id\"\n }\n },\n {\n \"op\" : \"clone_egress_pkt_to_egress\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_41\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x1\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 383,\n \"column\" : 16,\n \"source_fragment\" : \"clone_preserving_field_list(CloneType.E2E, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"int373\",\n \"id\" : 164,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"hw_id\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"|\",\n \"left\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_spec\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x7\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01ff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x03\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x07\"\n }\n }\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 373,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.hw_id = 4w0 ++ standard_md.egress_spec[8:7]\"\n }\n }\n ]\n },\n {\n \"name\" : \"slicing217\",\n \"id\" : 165,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dscp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"dscp_rewriter_tmp_dscp\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 217,\n \"column\" : 16,\n \"source_fragment\" : \"hdr.ipv4.dscp = tmp_dscp\"\n }\n }\n ]\n },\n {\n \"name\" : \"slicing189\",\n \"id\" : 166,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_bridged36\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_fabric_md_bridged\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 391,\n \"column\" : 30,\n \"source_fragment\" : \"= fabric_md; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_int_report_md39\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_fabric_md_int_report_md\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 391,\n \"column\" : 30,\n \"source_fragment\" : \"= fabric_md; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_int_md_hop_latency40\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"hop_latency\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 391,\n \"column\" : 30,\n \"source_fragment\" : \"= fabric_md; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_int_md_timestamp41\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"timestamp\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 391,\n \"column\" : 30,\n \"source_fragment\" : \"= fabric_md; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_eth_type25\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_eth_type\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 392,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_mpls26\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_mpls\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 392,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_ipv427\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_ipv4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 392,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_udp28\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_udp\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 392,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_fixed_header29\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_fixed_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 392,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_common_report_header30\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_common_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 392,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_local_report_header31\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_local_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 392,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_drop_report_header32\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_drop_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 392,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_eth_type35\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_eth_type\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 392,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"dscp_rewriter_tmp_dscp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_slice_tc12\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 189,\n \"column\" : 4,\n \"source_fragment\" : \"bit<6> tmp_dscp = fabric_md.bridged.base.slice_tc;\"\n }\n }\n ]\n },\n {\n \"name\" : \"fabric_v1model170\",\n \"id\" : 167,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"recirculate\",\n \"parameters\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x5\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 170,\n \"column\" : 12,\n \"source_fragment\" : \"recirculate_preserving_field_list(NO_PRESERVATION)\"\n }\n }\n ]\n },\n {\n \"name\" : \"fabric_v1model174\",\n \"id\" : 168,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"mark_to_drop\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"standard_metadata\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 174,\n \"column\" : 12,\n \"source_fragment\" : \"mark_to_drop(standard_md)\"\n }\n }\n ]\n }\n ],\n \"pipelines\" : [\n {\n \"name\" : \"ingress\",\n \"id\" : 0,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 35,\n \"column\" : 8,\n \"source_fragment\" : \"FabricIngress\"\n },\n \"init_table\" : \"tbl_fabric_v1model61\",\n \"tables\" : [\n {\n \"name\" : \"tbl_fabric_v1model61\",\n \"id\" : 0,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 61,\n \"column\" : 8,\n \"source_fragment\" : \"mark_to_drop(standard_md)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [73],\n \"actions\" : [\"fabric_v1model61\"],\n \"base_default_next\" : \"node_3\",\n \"next_tables\" : {\n \"fabric_v1model61\" : \"node_3\"\n },\n \"default_entry\" : {\n \"action_id\" : 73,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_fabric_v1model64\",\n \"id\" : 1,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 64,\n \"column\" : 12,\n \"source_fragment\" : \"exit\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [72],\n \"actions\" : [\"fabric_v1model64\"],\n \"base_default_next\" : \"node_5\",\n \"next_tables\" : {\n \"fabric_v1model64\" : \"node_5\"\n },\n \"default_entry\" : {\n \"action_id\" : 72,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_fabric_v1model70\",\n \"id\" : 2,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 70,\n \"column\" : 51,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [74],\n \"actions\" : [\"fabric_v1model70\"],\n \"base_default_next\" : \"tbl_lookup_md_init15\",\n \"next_tables\" : {\n \"fabric_v1model70\" : \"tbl_lookup_md_init15\"\n },\n \"default_entry\" : {\n \"action_id\" : 74,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init15\",\n \"id\" : 3,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 15,\n \"column\" : 23,\n \"source_fragment\" : \"= hdr.ethernet.dst_addr; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [76],\n \"actions\" : [\"lookup_md_init15\"],\n \"base_default_next\" : \"node_8\",\n \"next_tables\" : {\n \"lookup_md_init15\" : \"node_8\"\n },\n \"default_entry\" : {\n \"action_id\" : 76,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init21\",\n \"id\" : 4,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 21,\n \"column\" : 27,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [75],\n \"actions\" : [\"lookup_md_init21\"],\n \"base_default_next\" : \"tbl_lookup_md_init24\",\n \"next_tables\" : {\n \"lookup_md_init21\" : \"tbl_lookup_md_init24\"\n },\n \"default_entry\" : {\n \"action_id\" : 75,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init24\",\n \"id\" : 5,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 24,\n \"column\" : 23,\n \"source_fragment\" : \"= false; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [85],\n \"actions\" : [\"lookup_md_init24\"],\n \"base_default_next\" : \"node_11\",\n \"next_tables\" : {\n \"lookup_md_init24\" : \"node_11\"\n },\n \"default_entry\" : {\n \"action_id\" : 85,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init33\",\n \"id\" : 6,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 33,\n \"column\" : 27,\n \"source_fragment\" : \"= true; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [80],\n \"actions\" : [\"lookup_md_init33\"],\n \"base_default_next\" : \"node_13\",\n \"next_tables\" : {\n \"lookup_md_init33\" : \"node_13\"\n },\n \"default_entry\" : {\n \"action_id\" : 80,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init38\",\n \"id\" : 7,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 38,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.inner_tcp.sport; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [77],\n \"actions\" : [\"lookup_md_init38\"],\n \"base_default_next\" : \"node_27\",\n \"next_tables\" : {\n \"lookup_md_init38\" : \"node_27\"\n },\n \"default_entry\" : {\n \"action_id\" : 77,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init41\",\n \"id\" : 8,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 41,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.inner_udp.sport; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [78],\n \"actions\" : [\"lookup_md_init41\"],\n \"base_default_next\" : \"node_27\",\n \"next_tables\" : {\n \"lookup_md_init41\" : \"node_27\"\n },\n \"default_entry\" : {\n \"action_id\" : 78,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init44\",\n \"id\" : 9,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 44,\n \"column\" : 33,\n \"source_fragment\" : \"= hdr.inner_icmp.icmp_type; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [79],\n \"actions\" : [\"lookup_md_init44\"],\n \"base_default_next\" : \"node_27\",\n \"next_tables\" : {\n \"lookup_md_init44\" : \"node_27\"\n },\n \"default_entry\" : {\n \"action_id\" : 79,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init48\",\n \"id\" : 10,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 48,\n \"column\" : 27,\n \"source_fragment\" : \"= true; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [84],\n \"actions\" : [\"lookup_md_init48\"],\n \"base_default_next\" : \"node_21\",\n \"next_tables\" : {\n \"lookup_md_init48\" : \"node_21\"\n },\n \"default_entry\" : {\n \"action_id\" : 84,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init53\",\n \"id\" : 11,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 53,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.tcp.sport; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [81],\n \"actions\" : [\"lookup_md_init53\"],\n \"base_default_next\" : \"node_27\",\n \"next_tables\" : {\n \"lookup_md_init53\" : \"node_27\"\n },\n \"default_entry\" : {\n \"action_id\" : 81,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init56\",\n \"id\" : 12,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 56,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.udp.sport; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [82],\n \"actions\" : [\"lookup_md_init56\"],\n \"base_default_next\" : \"node_27\",\n \"next_tables\" : {\n \"lookup_md_init56\" : \"node_27\"\n },\n \"default_entry\" : {\n \"action_id\" : 82,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init59\",\n \"id\" : 13,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 59,\n \"column\" : 33,\n \"source_fragment\" : \"= hdr.icmp.icmp_type; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [83],\n \"actions\" : [\"lookup_md_init59\"],\n \"base_default_next\" : \"node_27\",\n \"next_tables\" : {\n \"lookup_md_init59\" : \"node_27\"\n },\n \"default_entry\" : {\n \"action_id\" : 83,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_pkt_io_do_packet_out\",\n \"id\" : 14,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 25,\n \"column\" : 12,\n \"source_fragment\" : \"do_packet_out()\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [9],\n \"actions\" : [\"FabricIngress.pkt_io.do_packet_out\"],\n \"base_default_next\" : \"FabricIngress.int_watchlist.watchlist\",\n \"next_tables\" : {\n \"FabricIngress.pkt_io.do_packet_out\" : \"FabricIngress.int_watchlist.watchlist\"\n },\n \"default_entry\" : {\n \"action_id\" : 9,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.int_watchlist.watchlist\",\n \"id\" : 15,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 34,\n \"column\" : 10,\n \"source_fragment\" : \"watchlist\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"ipv4_valid\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_is_ipv410\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ipv4_src\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ipv4_dst\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_dst12\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ip_proto\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"range\",\n \"name\" : \"l4_sport\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"range\",\n \"name\" : \"l4_dport\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"range\",\n \"type\" : \"simple\",\n \"max_size\" : 64,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [68, 70, 69],\n \"actions\" : [\"FabricIngress.int_watchlist.mark_to_report\", \"FabricIngress.int_watchlist.no_report_collector\", \"FabricIngress.int_watchlist.no_report\"],\n \"base_default_next\" : \"FabricIngress.stats.flows\",\n \"next_tables\" : {\n \"FabricIngress.int_watchlist.mark_to_report\" : \"FabricIngress.stats.flows\",\n \"FabricIngress.int_watchlist.no_report_collector\" : \"FabricIngress.stats.flows\",\n \"FabricIngress.int_watchlist.no_report\" : \"FabricIngress.stats.flows\"\n },\n \"default_entry\" : {\n \"action_id\" : 69,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.stats.flows\",\n \"id\" : 16,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4\",\n \"line\" : 21,\n \"column\" : 10,\n \"source_fragment\" : \"flows\"\n },\n \"key\" : [\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ipv4_src\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ipv4_dst\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_dst12\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ip_proto\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"l4_sport\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"l4_dport\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"ig_port\",\n \"target\" : [\"_ingress_bridged4\", \"_base_ig_port3\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"ternary\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [8],\n \"actions\" : [\"FabricIngress.stats.count\"],\n \"base_default_next\" : \"FabricIngress.slice_tc_classifier.classifier\",\n \"next_tables\" : {\n \"FabricIngress.stats.count\" : \"FabricIngress.slice_tc_classifier.classifier\"\n },\n \"default_entry\" : {\n \"action_id\" : 8,\n \"action_const\" : true,\n \"action_data\" : [\"0x0\"],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.slice_tc_classifier.classifier\",\n \"id\" : 17,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 44,\n \"column\" : 10,\n \"source_fragment\" : \"classifier\"\n },\n \"key\" : [\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ig_port\",\n \"target\" : [\"_ingress_bridged4\", \"_base_ig_port3\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ipv4_src\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ipv4_dst\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_dst12\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ip_proto\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"l4_sport\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"l4_dport\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"ternary\",\n \"type\" : \"simple\",\n \"max_size\" : 512,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [37, 39, 38],\n \"actions\" : [\"FabricIngress.slice_tc_classifier.set_slice_id_tc\", \"FabricIngress.slice_tc_classifier.trust_dscp\", \"FabricIngress.slice_tc_classifier.no_classification\"],\n \"base_default_next\" : \"FabricIngress.filtering.ingress_port_vlan\",\n \"next_tables\" : {\n \"FabricIngress.slice_tc_classifier.set_slice_id_tc\" : \"FabricIngress.filtering.ingress_port_vlan\",\n \"FabricIngress.slice_tc_classifier.trust_dscp\" : \"FabricIngress.filtering.ingress_port_vlan\",\n \"FabricIngress.slice_tc_classifier.no_classification\" : \"FabricIngress.filtering.ingress_port_vlan\"\n },\n \"default_entry\" : {\n \"action_id\" : 38,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.filtering.ingress_port_vlan\",\n \"id\" : 18,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 42,\n \"column\" : 10,\n \"source_fragment\" : \"ingress_port_vlan\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"ig_port\",\n \"target\" : [\"_ingress_bridged4\", \"_base_ig_port3\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"vlan_is_valid\",\n \"target\" : [\"_ingress_vlan_tag4\", \"$valid$\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"vlan_id\",\n \"target\" : [\"_ingress_vlan_tag4\", \"vlan_id\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"ternary\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [10, 11, 12],\n \"actions\" : [\"FabricIngress.filtering.deny\", \"FabricIngress.filtering.permit\", \"FabricIngress.filtering.permit_with_internal_vlan\"],\n \"base_default_next\" : \"FabricIngress.filtering.fwd_classifier\",\n \"next_tables\" : {\n \"FabricIngress.filtering.deny\" : \"FabricIngress.filtering.fwd_classifier\",\n \"FabricIngress.filtering.permit\" : \"FabricIngress.filtering.fwd_classifier\",\n \"FabricIngress.filtering.permit_with_internal_vlan\" : \"FabricIngress.filtering.fwd_classifier\"\n },\n \"default_entry\" : {\n \"action_id\" : 10,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.filtering.fwd_classifier\",\n \"id\" : 19,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 80,\n \"column\" : 10,\n \"source_fragment\" : \"fwd_classifier\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"ig_port\",\n \"target\" : [\"_ingress_bridged4\", \"_base_ig_port3\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"eth_dst\",\n \"target\" : [\"_ingress_ethernet3\", \"dst_addr\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"eth_type\",\n \"target\" : [\"_ingress_eth_type5\", \"value\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"ip_eth_type\",\n \"target\" : [\"_ingress_bridged4\", \"_base_ip_eth_type10\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"ternary\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [13],\n \"actions\" : [\"FabricIngress.filtering.set_forwarding_type\"],\n \"base_default_next\" : \"tbl_filtering100\",\n \"next_tables\" : {\n \"FabricIngress.filtering.set_forwarding_type\" : \"tbl_filtering100\"\n },\n \"default_entry\" : {\n \"action_id\" : 13,\n \"action_const\" : true,\n \"action_data\" : [\"0x0\"],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_filtering100\",\n \"id\" : 20,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 100,\n \"column\" : 8,\n \"source_fragment\" : \"fwd_type_counter.count((bit<32>)fabric_md.bridged.base.fwd_type)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [94],\n \"actions\" : [\"filtering100\"],\n \"base_default_next\" : \"node_35\",\n \"next_tables\" : {\n \"filtering100\" : \"node_35\"\n },\n \"default_entry\" : {\n \"action_id\" : 94,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf25\",\n \"id\" : 21,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 25,\n \"column\" : 4,\n \"source_fragment\" : \"bool is_uplink = false; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [93],\n \"actions\" : [\"upf25\"],\n \"base_default_next\" : \"node_37\",\n \"next_tables\" : {\n \"upf25\" : \"node_37\"\n },\n \"default_entry\" : {\n \"action_id\" : 93,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.upf.interfaces\",\n \"id\" : 22,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 107,\n \"column\" : 10,\n \"source_fragment\" : \"interfaces\"\n },\n \"key\" : [\n {\n \"match_type\" : \"lpm\",\n \"name\" : \"ipv4_dst_addr\",\n \"target\" : [\"_ingress_ipv47\", \"dst_addr\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"gtpu_is_valid\",\n \"target\" : [\"_ingress_gtpu12\", \"$valid$\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"lpm\",\n \"type\" : \"simple\",\n \"max_size\" : 64,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [45, 46, 47, 48],\n \"actions\" : [\"FabricIngress.upf.iface_access\", \"FabricIngress.upf.iface_core\", \"FabricIngress.upf.iface_dbuf\", \"FabricIngress.upf.iface_miss\"],\n \"base_default_next\" : \"FabricIngress.upf.applications\",\n \"next_tables\" : {\n \"FabricIngress.upf.iface_access\" : \"tbl_upf409\",\n \"FabricIngress.upf.iface_core\" : \"tbl_upf418\",\n \"FabricIngress.upf.iface_dbuf\" : \"tbl_upf424\",\n \"FabricIngress.upf.iface_miss\" : \"FabricIngress.upf.applications\"\n },\n \"default_entry\" : {\n \"action_id\" : 48,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf409\",\n \"id\" : 23,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 409,\n \"column\" : 30,\n \"source_fragment\" : \"= true; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [86],\n \"actions\" : [\"upf409\"],\n \"base_default_next\" : \"node_40\",\n \"next_tables\" : {\n \"upf409\" : \"node_40\"\n },\n \"default_entry\" : {\n \"action_id\" : 86,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.upf.uplink_sessions\",\n \"id\" : 24,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 213,\n \"column\" : 10,\n \"source_fragment\" : \"uplink_sessions\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"tunnel_ipv4_dst\",\n \"target\" : [\"_ingress_ipv47\", \"dst_addr\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"teid\",\n \"target\" : [\"_ingress_gtpu12\", \"teid\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 100000,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [56, 50, 49],\n \"actions\" : [\"FabricIngress.upf.set_uplink_session\", \"FabricIngress.upf.set_uplink_session_drop\", \"FabricIngress.upf.set_uplink_session_miss\"],\n \"base_default_next\" : \"FabricIngress.upf.applications\",\n \"next_tables\" : {\n \"FabricIngress.upf.set_uplink_session\" : \"FabricIngress.upf.applications\",\n \"FabricIngress.upf.set_uplink_session_drop\" : \"FabricIngress.upf.applications\",\n \"FabricIngress.upf.set_uplink_session_miss\" : \"FabricIngress.upf.applications\"\n },\n \"default_entry\" : {\n \"action_id\" : 49,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf418\",\n \"id\" : 25,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 418,\n \"column\" : 34,\n \"source_fragment\" : \"= fabric_md.lkp.ipv4_src; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [87],\n \"actions\" : [\"upf418\"],\n \"base_default_next\" : \"FabricIngress.upf.downlink_sessions\",\n \"next_tables\" : {\n \"upf418\" : \"FabricIngress.upf.downlink_sessions\"\n },\n \"default_entry\" : {\n \"action_id\" : 87,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.upf.downlink_sessions\",\n \"id\" : 26,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 198,\n \"column\" : 10,\n \"source_fragment\" : \"downlink_sessions\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"ue_addr\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_routing_ipv4_dst18\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 100000,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [53, 54, 55, 52, 51],\n \"actions\" : [\"FabricIngress.upf.set_downlink_session\", \"FabricIngress.upf.set_downlink_session_buf\", \"FabricIngress.upf.set_downlink_session_buf_drop\", \"FabricIngress.upf.set_downlink_session_drop\", \"FabricIngress.upf.set_downlink_session_miss\"],\n \"base_default_next\" : \"FabricIngress.upf.applications\",\n \"next_tables\" : {\n \"FabricIngress.upf.set_downlink_session\" : \"FabricIngress.upf.applications\",\n \"FabricIngress.upf.set_downlink_session_buf\" : \"FabricIngress.upf.applications\",\n \"FabricIngress.upf.set_downlink_session_buf_drop\" : \"FabricIngress.upf.applications\",\n \"FabricIngress.upf.set_downlink_session_drop\" : \"FabricIngress.upf.applications\",\n \"FabricIngress.upf.set_downlink_session_miss\" : \"FabricIngress.upf.applications\"\n },\n \"default_entry\" : {\n \"action_id\" : 51,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf424\",\n \"id\" : 27,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 424,\n \"column\" : 34,\n \"source_fragment\" : \"= fabric_md.lkp.ipv4_src; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [88],\n \"actions\" : [\"upf424\"],\n \"base_default_next\" : \"FabricIngress.upf.downlink_sessions\",\n \"next_tables\" : {\n \"upf424\" : \"FabricIngress.upf.downlink_sessions\"\n },\n \"default_entry\" : {\n \"action_id\" : 88,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.upf.applications\",\n \"id\" : 28,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 337,\n \"column\" : 10,\n \"source_fragment\" : \"applications\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"slice_id\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_upf_slice_id30\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"lpm\",\n \"name\" : \"app_ipv4_addr\",\n \"target\" : [\"scalars\", \"upf_app_ipv4_addr\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"range\",\n \"name\" : \"app_l4_port\",\n \"target\" : [\"scalars\", \"upf_app_l4_port\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"app_ip_proto\",\n \"target\" : [\"scalars\", \"upf_app_ip_proto\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"range\",\n \"type\" : \"simple\",\n \"max_size\" : 5,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [64, 5],\n \"actions\" : [\"FabricIngress.upf.set_app_id\", \"nop\"],\n \"base_default_next\" : \"node_47\",\n \"next_tables\" : {\n \"FabricIngress.upf.set_app_id\" : \"node_47\",\n \"nop\" : \"node_47\"\n },\n \"default_entry\" : {\n \"action_id\" : 5,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.upf.uplink_terminations\",\n \"id\" : 29,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 280,\n \"column\" : 10,\n \"source_fragment\" : \"uplink_terminations\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"ue_session_id\",\n \"target\" : [\"scalars\", \"upf_ue_session_id\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"app_id\",\n \"target\" : [\"scalars\", \"upf_internal_app_id\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 100000,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [61, 59, 57],\n \"actions\" : [\"FabricIngress.upf.app_fwd\", \"FabricIngress.upf.uplink_drop\", \"FabricIngress.upf.uplink_drop_miss\"],\n \"base_default_next\" : \"FabricIngress.upf.uplink_recirc_rules\",\n \"next_tables\" : {\n \"FabricIngress.upf.app_fwd\" : \"FabricIngress.upf.uplink_recirc_rules\",\n \"FabricIngress.upf.uplink_drop\" : \"FabricIngress.upf.uplink_recirc_rules\",\n \"FabricIngress.upf.uplink_drop_miss\" : \"FabricIngress.upf.uplink_recirc_rules\"\n },\n \"default_entry\" : {\n \"action_id\" : 57,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.upf.uplink_recirc_rules\",\n \"id\" : 30,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 387,\n \"column\" : 10,\n \"source_fragment\" : \"uplink_recirc_rules\"\n },\n \"key\" : [\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ipv4_src\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ipv4_dst\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_dst12\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"ternary\",\n \"type\" : \"simple\",\n \"max_size\" : 64,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [65, 66, 67],\n \"actions\" : [\"FabricIngress.upf.recirc_allow\", \"FabricIngress.upf.recirc_deny\", \"FabricIngress.upf.recirc_miss\"],\n \"base_default_next\" : \"tbl_upf445\",\n \"next_tables\" : {\n \"FabricIngress.upf.recirc_allow\" : \"tbl_upf445\",\n \"FabricIngress.upf.recirc_deny\" : \"tbl_upf445\",\n \"FabricIngress.upf.recirc_miss\" : \"tbl_upf445\"\n },\n \"default_entry\" : {\n \"action_id\" : 67,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.upf.downlink_terminations\",\n \"id\" : 31,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 295,\n \"column\" : 10,\n \"source_fragment\" : \"downlink_terminations\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"ue_session_id\",\n \"target\" : [\"scalars\", \"upf_ue_session_id\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"app_id\",\n \"target\" : [\"scalars\", \"upf_internal_app_id\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 100000,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [62, 60, 58],\n \"actions\" : [\"FabricIngress.upf.downlink_fwd_encap\", \"FabricIngress.upf.downlink_drop\", \"FabricIngress.upf.downlink_drop_miss\"],\n \"base_default_next\" : \"tbl_upf445\",\n \"next_tables\" : {\n \"FabricIngress.upf.downlink_fwd_encap\" : \"tbl_upf445\",\n \"FabricIngress.upf.downlink_drop\" : \"tbl_upf445\",\n \"FabricIngress.upf.downlink_drop_miss\" : \"tbl_upf445\"\n },\n \"default_entry\" : {\n \"action_id\" : 58,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf443\",\n \"id\" : 32,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 443,\n \"column\" : 58,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [89],\n \"actions\" : [\"upf443\"],\n \"base_default_next\" : \"tbl_upf445\",\n \"next_tables\" : {\n \"upf443\" : \"tbl_upf445\"\n },\n \"default_entry\" : {\n \"action_id\" : 89,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf445\",\n \"id\" : 33,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 445,\n \"column\" : 12,\n \"source_fragment\" : \"app_meter.execute_meter((bit<32>) app_meter_idx_internal, fabric_md.upf_meter_color)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [91],\n \"actions\" : [\"upf445\"],\n \"base_default_next\" : \"node_54\",\n \"next_tables\" : {\n \"upf445\" : \"node_54\"\n },\n \"default_entry\" : {\n \"action_id\" : 91,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf448\",\n \"id\" : 34,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 448,\n \"column\" : 16,\n \"source_fragment\" : \"session_meter.execute_meter((bit<32>) session_meter_idx_internal, fabric_md.upf_meter_color)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [90],\n \"actions\" : [\"upf448\"],\n \"base_default_next\" : \"FabricIngress.upf.ig_tunnel_peers\",\n \"next_tables\" : {\n \"upf448\" : \"FabricIngress.upf.ig_tunnel_peers\"\n },\n \"default_entry\" : {\n \"action_id\" : 90,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.upf.ig_tunnel_peers\",\n \"id\" : 35,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 317,\n \"column\" : 10,\n \"source_fragment\" : \"ig_tunnel_peers\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"tun_peer_id\",\n \"target\" : [\"_ingress_bridged4\", \"_upf_tun_peer_id13\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 256,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [63, 4],\n \"actions\" : [\"FabricIngress.upf.set_routing_ipv4_dst\", \"nop\"],\n \"base_default_next\" : \"node_57\",\n \"next_tables\" : {\n \"FabricIngress.upf.set_routing_ipv4_dst\" : \"node_57\",\n \"nop\" : \"node_57\"\n },\n \"default_entry\" : {\n \"action_id\" : 4,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf461\",\n \"id\" : 36,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 461,\n \"column\" : 16,\n \"source_fragment\" : \"terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [92],\n \"actions\" : [\"upf461\"],\n \"base_default_next\" : \"node_59\",\n \"next_tables\" : {\n \"upf461\" : \"node_59\"\n },\n \"default_entry\" : {\n \"action_id\" : 92,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.forwarding.bridging\",\n \"id\" : 37,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 39,\n \"column\" : 10,\n \"source_fragment\" : \"bridging\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"vlan_id\",\n \"target\" : [\"_ingress_bridged4\", \"_base_vlan_id6\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"eth_dst\",\n \"target\" : [\"_ingress_ethernet3\", \"dst_addr\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"ternary\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [18, 14],\n \"actions\" : [\"FabricIngress.forwarding.set_next_id_bridging\", \"FabricIngress.forwarding.set_int_drop_reason\"],\n \"base_default_next\" : \"tbl_hasher17\",\n \"next_tables\" : {\n \"FabricIngress.forwarding.set_next_id_bridging\" : \"tbl_hasher17\",\n \"FabricIngress.forwarding.set_int_drop_reason\" : \"tbl_hasher17\"\n },\n \"default_entry\" : {\n \"action_id\" : 14,\n \"action_const\" : true,\n \"action_data\" : [\"0x59\"],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.forwarding.mpls\",\n \"id\" : 38,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 74,\n \"column\" : 10,\n \"source_fragment\" : \"mpls\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"mpls_label\",\n \"target\" : [\"_ingress_bridged4\", \"_base_mpls_label2\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [19, 15],\n \"actions\" : [\"FabricIngress.forwarding.pop_mpls_and_next\", \"FabricIngress.forwarding.set_int_drop_reason\"],\n \"base_default_next\" : \"tbl_hasher17\",\n \"next_tables\" : {\n \"FabricIngress.forwarding.pop_mpls_and_next\" : \"tbl_hasher17\",\n \"FabricIngress.forwarding.set_int_drop_reason\" : \"tbl_hasher17\"\n },\n \"default_entry\" : {\n \"action_id\" : 15,\n \"action_const\" : true,\n \"action_data\" : [\"0x81\"],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.forwarding.routing_v4\",\n \"id\" : 39,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 116,\n \"column\" : 10,\n \"source_fragment\" : \"routing_v4\"\n },\n \"key\" : [\n {\n \"match_type\" : \"lpm\",\n \"name\" : \"ipv4_dst\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_routing_ipv4_dst18\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"lpm\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [20, 21, 22, 16],\n \"actions\" : [\"FabricIngress.forwarding.set_next_id_routing_v4\", \"FabricIngress.forwarding.nop_routing_v4\", \"FabricIngress.forwarding.drop_routing_v4\", \"FabricIngress.forwarding.set_int_drop_reason\"],\n \"base_default_next\" : \"tbl_hasher17\",\n \"next_tables\" : {\n \"FabricIngress.forwarding.set_next_id_routing_v4\" : \"tbl_hasher17\",\n \"FabricIngress.forwarding.nop_routing_v4\" : \"tbl_hasher17\",\n \"FabricIngress.forwarding.drop_routing_v4\" : \"tbl_hasher17\",\n \"FabricIngress.forwarding.set_int_drop_reason\" : \"tbl_hasher17\"\n },\n \"default_entry\" : {\n \"action_id\" : 16,\n \"action_const\" : false,\n \"action_data\" : [\"0x1d\"],\n \"action_entry_const\" : false\n }\n },\n {\n \"name\" : \"FabricIngress.forwarding.routing_v6\",\n \"id\" : 40,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 155,\n \"column\" : 10,\n \"source_fragment\" : \"routing_v6\"\n },\n \"key\" : [\n {\n \"match_type\" : \"lpm\",\n \"name\" : \"ipv6_dst\",\n \"target\" : [\"_ingress_ipv68\", \"dst_addr\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"lpm\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [23, 24, 17],\n \"actions\" : [\"FabricIngress.forwarding.set_next_id_routing_v6\", \"FabricIngress.forwarding.drop_routing_v6\", \"FabricIngress.forwarding.set_int_drop_reason\"],\n \"base_default_next\" : \"tbl_hasher17\",\n \"next_tables\" : {\n \"FabricIngress.forwarding.set_next_id_routing_v6\" : \"tbl_hasher17\",\n \"FabricIngress.forwarding.drop_routing_v6\" : \"tbl_hasher17\",\n \"FabricIngress.forwarding.set_int_drop_reason\" : \"tbl_hasher17\"\n },\n \"default_entry\" : {\n \"action_id\" : 17,\n \"action_const\" : false,\n \"action_data\" : [\"0x1d\"],\n \"action_entry_const\" : false\n }\n },\n {\n \"name\" : \"tbl_hasher17\",\n \"id\" : 41,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 17,\n \"column\" : 8,\n \"source_fragment\" : \"hash( ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [99],\n \"actions\" : [\"hasher17\"],\n \"base_default_next\" : \"node_69\",\n \"next_tables\" : {\n \"hasher17\" : \"node_69\"\n },\n \"default_entry\" : {\n \"action_id\" : 99,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_hasher28\",\n \"id\" : 42,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 28,\n \"column\" : 12,\n \"source_fragment\" : \"hash( ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [95],\n \"actions\" : [\"hasher28\"],\n \"base_default_next\" : \"node_76\",\n \"next_tables\" : {\n \"hasher28\" : \"node_76\"\n },\n \"default_entry\" : {\n \"action_id\" : 95,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_hasher39\",\n \"id\" : 43,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 39,\n \"column\" : 12,\n \"source_fragment\" : \"hash( ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [96],\n \"actions\" : [\"hasher39\"],\n \"base_default_next\" : \"node_76\",\n \"next_tables\" : {\n \"hasher39\" : \"node_76\"\n },\n \"default_entry\" : {\n \"action_id\" : 96,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_hasher50\",\n \"id\" : 44,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 50,\n \"column\" : 32,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [97],\n \"actions\" : [\"hasher50\"],\n \"base_default_next\" : \"node_76\",\n \"next_tables\" : {\n \"hasher50\" : \"node_76\"\n },\n \"default_entry\" : {\n \"action_id\" : 97,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_hasher66\",\n \"id\" : 45,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 66,\n \"column\" : 46,\n \"source_fragment\" : \"= 0; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [98],\n \"actions\" : [\"hasher66\"],\n \"base_default_next\" : \"node_76\",\n \"next_tables\" : {\n \"hasher66\" : \"node_76\"\n },\n \"default_entry\" : {\n \"action_id\" : 98,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.pre_next.next_mpls\",\n \"id\" : 46,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4\",\n \"line\" : 22,\n \"column\" : 10,\n \"source_fragment\" : \"next_mpls\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"next_id\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_next_id21\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [25, 0],\n \"actions\" : [\"FabricIngress.pre_next.set_mpls_label\", \"nop\"],\n \"base_default_next\" : \"FabricIngress.pre_next.next_vlan\",\n \"next_tables\" : {\n \"FabricIngress.pre_next.set_mpls_label\" : \"FabricIngress.pre_next.next_vlan\",\n \"nop\" : \"FabricIngress.pre_next.next_vlan\"\n },\n \"default_entry\" : {\n \"action_id\" : 0,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.pre_next.next_vlan\",\n \"id\" : 47,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4\",\n \"line\" : 54,\n \"column\" : 10,\n \"source_fragment\" : \"next_vlan\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"next_id\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_next_id21\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [26, 1],\n \"actions\" : [\"FabricIngress.pre_next.set_vlan\", \"nop\"],\n \"base_default_next\" : \"FabricIngress.acl.acl\",\n \"next_tables\" : {\n \"FabricIngress.pre_next.set_vlan\" : \"FabricIngress.acl.acl\",\n \"nop\" : \"FabricIngress.acl.acl\"\n },\n \"default_entry\" : {\n \"action_id\" : 1,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.acl.acl\",\n \"id\" : 48,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 74,\n \"column\" : 10,\n \"source_fragment\" : \"acl\"\n },\n \"key\" : [\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ig_port\",\n \"target\" : [\"_ingress_bridged4\", \"_base_ig_port3\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"eth_dst\",\n \"target\" : [\"_ingress_ethernet3\", \"dst_addr\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"eth_src\",\n \"target\" : [\"_ingress_ethernet3\", \"src_addr\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"vlan_id\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_vlan_id9\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"eth_type\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_eth_type8\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ipv4_src\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ipv4_dst\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_dst12\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ip_proto\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"icmp_type\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_icmp_type16\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"icmp_code\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_icmp_code17\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"l4_sport\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"l4_dport\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ig_port_type\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_ig_port_type33\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"ternary\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [27, 29, 28, 30, 31, 32],\n \"actions\" : [\"FabricIngress.acl.set_next_id_acl\", \"FabricIngress.acl.punt_to_cpu\", \"FabricIngress.acl.copy_to_cpu\", \"FabricIngress.acl.drop\", \"FabricIngress.acl.set_output_port\", \"FabricIngress.acl.nop_acl\"],\n \"base_default_next\" : \"node_80\",\n \"next_tables\" : {\n \"FabricIngress.acl.set_next_id_acl\" : \"node_80\",\n \"FabricIngress.acl.punt_to_cpu\" : \"node_80\",\n \"FabricIngress.acl.copy_to_cpu\" : \"node_80\",\n \"FabricIngress.acl.drop\" : \"node_80\",\n \"FabricIngress.acl.set_output_port\" : \"node_80\",\n \"FabricIngress.acl.nop_acl\" : \"node_80\"\n },\n \"default_entry\" : {\n \"action_id\" : 32,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.next.hashed\",\n \"id\" : 49,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 127,\n \"column\" : 10,\n \"source_fragment\" : \"hashed\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"next_id\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_next_id21\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"indirect_ws\",\n \"action_profile\" : \"FabricIngress.next.hashed_profile\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [33, 34, 2],\n \"actions\" : [\"FabricIngress.next.output_hashed\", \"FabricIngress.next.routing_hashed\", \"nop\"],\n \"base_default_next\" : \"FabricIngress.next.multicast\",\n \"next_tables\" : {\n \"FabricIngress.next.output_hashed\" : \"FabricIngress.next.multicast\",\n \"FabricIngress.next.routing_hashed\" : \"FabricIngress.next.multicast\",\n \"nop\" : \"FabricIngress.next.multicast\"\n }\n },\n {\n \"name\" : \"FabricIngress.next.multicast\",\n \"id\" : 50,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 161,\n \"column\" : 10,\n \"source_fragment\" : \"multicast\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"next_id\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_next_id21\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [35, 36],\n \"actions\" : [\"FabricIngress.next.set_mcast_group_id\", \"FabricIngress.next.reset_mcast_group_id\"],\n \"base_default_next\" : \"FabricIngress.qos.set_slice_tc\",\n \"next_tables\" : {\n \"FabricIngress.next.set_mcast_group_id\" : \"FabricIngress.qos.set_slice_tc\",\n \"FabricIngress.next.reset_mcast_group_id\" : \"FabricIngress.qos.set_slice_tc\"\n },\n \"default_entry\" : {\n \"action_id\" : 36,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.qos.set_slice_tc\",\n \"id\" : 51,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 91,\n \"column\" : 10,\n \"source_fragment\" : \"set_slice_tc\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"fabric_md.is_upf_hit\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_is_upf_hit29\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 2,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [40, 41, 7],\n \"actions\" : [\"FabricIngress.qos.use_upf\", \"FabricIngress.qos.use_default\", \"NoAction\"],\n \"base_default_next\" : \"FabricIngress.qos.default_tc\",\n \"next_tables\" : {\n \"FabricIngress.qos.use_upf\" : \"FabricIngress.qos.default_tc\",\n \"FabricIngress.qos.use_default\" : \"FabricIngress.qos.default_tc\",\n \"NoAction\" : \"FabricIngress.qos.default_tc\"\n },\n \"default_entry\" : {\n \"action_id\" : 7,\n \"action_const\" : false,\n \"action_data\" : [],\n \"action_entry_const\" : false\n },\n \"entries\" : [\n {\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 96,\n \"column\" : 12,\n \"source_fragment\" : \"true: use_upf\"\n },\n \"match_key\" : [\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n }\n ],\n \"action_entry\" : {\n \"action_id\" : 40,\n \"action_data\" : []\n },\n \"priority\" : 1\n },\n {\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 97,\n \"column\" : 12,\n \"source_fragment\" : \"false: use_default\"\n },\n \"match_key\" : [\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x00\"\n }\n ],\n \"action_entry\" : {\n \"action_id\" : 41,\n \"action_data\" : []\n },\n \"priority\" : 2\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.qos.default_tc\",\n \"id\" : 52,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 150,\n \"column\" : 10,\n \"source_fragment\" : \"default_tc\"\n },\n \"key\" : [\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"slice_tc\",\n \"target\" : [\"_ingress_bridged4\", \"_base_slice_tc12\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"tc_unknown\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_tc_unknown28\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"ternary\",\n \"type\" : \"simple\",\n \"max_size\" : 16,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [44, 3],\n \"actions\" : [\"FabricIngress.qos.set_default_tc\", \"nop\"],\n \"base_default_next\" : \"node_85\",\n \"next_tables\" : {\n \"FabricIngress.qos.set_default_tc\" : \"node_85\",\n \"nop\" : \"node_85\"\n },\n \"default_entry\" : {\n \"action_id\" : 3,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_slicing174\",\n \"id\" : 53,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 174,\n \"column\" : 12,\n \"source_fragment\" : \"slice_tc_meter.execute_meter((bit<32>) fabric_md.bridged.base.slice_tc, packet_color)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [100],\n \"actions\" : [\"slicing174\"],\n \"base_default_next\" : \"FabricIngress.qos.queues\",\n \"next_tables\" : {\n \"slicing174\" : \"FabricIngress.qos.queues\"\n },\n \"default_entry\" : {\n \"action_id\" : 100,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_slicing177\",\n \"id\" : 54,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 177,\n \"column\" : 25,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [101],\n \"actions\" : [\"slicing177\"],\n \"base_default_next\" : \"FabricIngress.qos.queues\",\n \"next_tables\" : {\n \"slicing177\" : \"FabricIngress.qos.queues\"\n },\n \"default_entry\" : {\n \"action_id\" : 101,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.qos.queues\",\n \"id\" : 55,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 122,\n \"column\" : 10,\n \"source_fragment\" : \"queues\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"slice_tc\",\n \"target\" : [\"_ingress_bridged4\", \"_base_slice_tc12\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"color\",\n \"target\" : [\"scalars\", \"qos_packet_color\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"ternary\",\n \"type\" : \"simple\",\n \"max_size\" : 128,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [42, 43],\n \"actions\" : [\"FabricIngress.qos.set_queue\", \"FabricIngress.qos.meter_drop\"],\n \"base_default_next\" : \"tbl_int112\",\n \"next_tables\" : {\n \"FabricIngress.qos.set_queue\" : \"tbl_int112\",\n \"FabricIngress.qos.meter_drop\" : \"tbl_int112\"\n },\n \"default_entry\" : {\n \"action_id\" : 42,\n \"action_const\" : true,\n \"action_data\" : [\"0x0\"],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int112\",\n \"id\" : 56,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 112,\n \"column\" : 46,\n \"source_fragment\" : \"= standard_md.egress_spec; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [102],\n \"actions\" : [\"int112\"],\n \"base_default_next\" : \"FabricIngress.int_ingress.drop_report\",\n \"next_tables\" : {\n \"int112\" : \"FabricIngress.int_ingress.drop_report\"\n },\n \"default_entry\" : {\n \"action_id\" : 102,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.int_ingress.drop_report\",\n \"id\" : 57,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 86,\n \"column\" : 10,\n \"source_fragment\" : \"drop_report\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"int_report_type\",\n \"target\" : [\"_ingress_bridged4\", \"_int_bmd_report_type21\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"drop_ctl\",\n \"target\" : [\"scalars\", \"userMetadata._drop_ctl2\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"punt_to_cpu\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_punt_to_cpu23\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"egress_port_set\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_egress_port_set22\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"mcast_group_id\",\n \"target\" : [\"standard_metadata\", \"mcast_grp\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"ternary\",\n \"type\" : \"simple\",\n \"max_size\" : 3,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [71, 6],\n \"actions\" : [\"FabricIngress.int_ingress.report_drop\", \"nop\"],\n \"base_default_next\" : \"tbl_fabric_v1model106\",\n \"next_tables\" : {\n \"FabricIngress.int_ingress.report_drop\" : \"tbl_fabric_v1model106\",\n \"nop\" : \"tbl_fabric_v1model106\"\n },\n \"default_entry\" : {\n \"action_id\" : 6,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n },\n \"entries\" : [\n {\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 101,\n \"column\" : 12,\n \"source_fragment\" : \"(INT_REPORT_TYPE_FLOW, 1, false, false, _): report_drop()\"\n },\n \"match_key\" : [\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x00\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x00\"\n },\n {\n \"match_type\" : \"ternary\",\n \"key\" : \"0x0000\",\n \"mask\" : \"0x0000\"\n }\n ],\n \"action_entry\" : {\n \"action_id\" : 71,\n \"action_data\" : []\n },\n \"priority\" : 1\n },\n {\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 102,\n \"column\" : 12,\n \"source_fragment\" : \"(INT_REPORT_TYPE_FLOW, 1, false, true, _): report_drop()\"\n },\n \"match_key\" : [\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x00\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n },\n {\n \"match_type\" : \"ternary\",\n \"key\" : \"0x0000\",\n \"mask\" : \"0x0000\"\n }\n ],\n \"action_entry\" : {\n \"action_id\" : 71,\n \"action_data\" : []\n },\n \"priority\" : 2\n },\n {\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 104,\n \"column\" : 12,\n \"source_fragment\" : \"(INT_REPORT_TYPE_FLOW, 0, false, false, 0): report_drop()\"\n },\n \"match_key\" : [\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x00\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x00\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x00\"\n },\n {\n \"match_type\" : \"ternary\",\n \"key\" : \"0x0000\",\n \"mask\" : \"0xffff\"\n }\n ],\n \"action_entry\" : {\n \"action_id\" : 71,\n \"action_data\" : []\n },\n \"priority\" : 3\n }\n ]\n },\n {\n \"name\" : \"tbl_fabric_v1model106\",\n \"id\" : 58,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 106,\n \"column\" : 33,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [104],\n \"actions\" : [\"fabric_v1model106\"],\n \"base_default_next\" : \"node_92\",\n \"next_tables\" : {\n \"fabric_v1model106\" : \"node_92\"\n },\n \"default_entry\" : {\n \"action_id\" : 104,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_fabric_v1model110\",\n \"id\" : 59,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 110,\n \"column\" : 12,\n \"source_fragment\" : \"mark_to_drop(standard_md)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [103],\n \"actions\" : [\"fabric_v1model110\"],\n \"base_default_next\" : null,\n \"next_tables\" : {\n \"fabric_v1model110\" : null\n },\n \"default_entry\" : {\n \"action_id\" : 103,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n }\n ],\n \"action_profiles\" : [\n {\n \"name\" : \"FabricIngress.next.hashed_profile\",\n \"id\" : 0,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 112,\n \"column\" : 15,\n \"source_fragment\" : \"hashed_profile\"\n },\n \"max_size\" : 16,\n \"selector\" : {\n \"algo\" : \"crc16\",\n \"input\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_ecmp_hash5\"]\n }\n ]\n }\n }\n ],\n \"conditionals\" : [\n {\n \"name\" : \"node_3\",\n \"id\" : 0,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 62,\n \"column\" : 12,\n \"source_fragment\" : \"standard_md.parser_error == error.PacketRejectedByParser\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"parser_error\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8\"\n }\n }\n },\n \"true_next\" : \"tbl_fabric_v1model64\",\n \"false_next\" : \"node_5\"\n },\n {\n \"name\" : \"node_5\",\n \"id\" : 1,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 67,\n \"column\" : 13,\n \"source_fragment\" : \"standard_md.instance_type == 4\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"instance_type\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000004\"\n }\n }\n },\n \"true_next\" : \"tbl_fabric_v1model70\",\n \"false_next\" : \"tbl_lookup_md_init15\"\n },\n {\n \"name\" : \"node_8\",\n \"id\" : 2,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 20,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.vlan_tag.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_vlan_tag4\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_lookup_md_init21\",\n \"false_next\" : \"tbl_lookup_md_init24\"\n },\n {\n \"name\" : \"node_11\",\n \"id\" : 3,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 32,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.inner_ipv4.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_lookup_md_init33\",\n \"false_next\" : \"node_19\"\n },\n {\n \"name\" : \"node_13\",\n \"id\" : 4,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 37,\n \"column\" : 16,\n \"source_fragment\" : \"hdr.inner_tcp.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_tcp19\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_lookup_md_init38\",\n \"false_next\" : \"node_15\"\n },\n {\n \"name\" : \"node_15\",\n \"id\" : 5,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 40,\n \"column\" : 23,\n \"source_fragment\" : \"hdr.inner_udp.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_udp20\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_lookup_md_init41\",\n \"false_next\" : \"node_17\"\n },\n {\n \"name\" : \"node_17\",\n \"id\" : 6,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 43,\n \"column\" : 23,\n \"source_fragment\" : \"hdr.inner_icmp.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_icmp21\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_lookup_md_init44\",\n \"false_next\" : \"node_27\"\n },\n {\n \"name\" : \"node_19\",\n \"id\" : 7,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 47,\n \"column\" : 19,\n \"source_fragment\" : \"hdr.ipv4.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_lookup_md_init48\",\n \"false_next\" : \"node_27\"\n },\n {\n \"name\" : \"node_21\",\n \"id\" : 8,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 52,\n \"column\" : 16,\n \"source_fragment\" : \"hdr.tcp.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_tcp9\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_lookup_md_init53\",\n \"false_next\" : \"node_23\"\n },\n {\n \"name\" : \"node_23\",\n \"id\" : 9,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 55,\n \"column\" : 23,\n \"source_fragment\" : \"hdr.udp.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_lookup_md_init56\",\n \"false_next\" : \"node_25\"\n },\n {\n \"name\" : \"node_25\",\n \"id\" : 10,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 58,\n \"column\" : 23,\n \"source_fragment\" : \"hdr.icmp.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_icmp11\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_lookup_md_init59\",\n \"false_next\" : \"node_27\"\n },\n {\n \"name\" : \"node_27\",\n \"id\" : 11,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 24,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.packet_out.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_packet_out0\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_pkt_io_do_packet_out\",\n \"false_next\" : \"FabricIngress.int_watchlist.watchlist\"\n },\n {\n \"name\" : \"node_35\",\n \"id\" : 12,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 84,\n \"column\" : 13,\n \"source_fragment\" : \"fabric_md\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n }\n }\n },\n \"false_next\" : \"tbl_upf25\",\n \"true_next\" : \"node_59\"\n },\n {\n \"name\" : \"node_37\",\n \"id\" : 13,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 406,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.ipv4.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"FabricIngress.upf.interfaces\",\n \"false_next\" : \"node_59\"\n },\n {\n \"name\" : \"node_40\",\n \"id\" : 14,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 413,\n \"column\" : 24,\n \"source_fragment\" : \"fabric_md.bridged.base.encap_presence != EncapPresence.NONE\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"!=\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_encap_presence7\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n }\n },\n \"true_next\" : \"FabricIngress.upf.uplink_sessions\",\n \"false_next\" : \"FabricIngress.upf.applications\"\n },\n {\n \"name\" : \"node_47\",\n \"id\" : 15,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 433,\n \"column\" : 16,\n \"source_fragment\" : \"sess_hit\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_sess_hit\"]\n }\n }\n },\n \"true_next\" : \"node_48\",\n \"false_next\" : \"tbl_upf443\"\n },\n {\n \"name\" : \"node_48\",\n \"id\" : 16,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 434,\n \"column\" : 20,\n \"source_fragment\" : \"is_uplink\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_is_uplink\"]\n }\n }\n },\n \"true_next\" : \"FabricIngress.upf.uplink_terminations\",\n \"false_next\" : \"FabricIngress.upf.downlink_terminations\"\n },\n {\n \"name\" : \"node_54\",\n \"id\" : 17,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 446,\n \"column\" : 16,\n \"source_fragment\" : \"fabric_md.upf_meter_color != MeterColor_t.RED\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"!=\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_meter_color32\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n }\n },\n \"true_next\" : \"tbl_upf448\",\n \"false_next\" : \"FabricIngress.upf.ig_tunnel_peers\"\n },\n {\n \"name\" : \"node_57\",\n \"id\" : 18,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 451,\n \"column\" : 16,\n \"source_fragment\" : \"term_hit\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_term_hit\"]\n }\n }\n },\n \"true_next\" : \"tbl_upf461\",\n \"false_next\" : \"node_59\"\n },\n {\n \"name\" : \"node_59\",\n \"id\" : 19,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 88,\n \"column\" : 13,\n \"source_fragment\" : \"fabric_md\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n }\n }\n },\n \"false_next\" : \"node_60\",\n \"true_next\" : \"tbl_hasher17\"\n },\n {\n \"name\" : \"node_60\",\n \"id\" : 20,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 178,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.ethernet.isValid() && ...\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"and\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ethernet3\", \"$valid$\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_fwd_type5\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n }\n }\n }\n },\n \"true_next\" : \"FabricIngress.forwarding.bridging\",\n \"false_next\" : \"node_62\"\n },\n {\n \"name\" : \"node_62\",\n \"id\" : 21,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 181,\n \"column\" : 19,\n \"source_fragment\" : \"hdr.mpls.isValid() && ...\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"and\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"$valid$\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_fwd_type5\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n }\n }\n },\n \"true_next\" : \"FabricIngress.forwarding.mpls\",\n \"false_next\" : \"node_64\"\n },\n {\n \"name\" : \"node_64\",\n \"id\" : 22,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 184,\n \"column\" : 19,\n \"source_fragment\" : \"fabric_md.lkp.is_ipv4 && ...\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"and\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_is_ipv410\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"or\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_fwd_type5\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_fwd_type5\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x03\"\n }\n }\n }\n }\n }\n }\n },\n \"true_next\" : \"FabricIngress.forwarding.routing_v4\",\n \"false_next\" : \"node_66\"\n },\n {\n \"name\" : \"node_66\",\n \"id\" : 23,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 188,\n \"column\" : 19,\n \"source_fragment\" : \"hdr.ipv6.isValid() && ...\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"and\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv68\", \"$valid$\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_fwd_type5\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n }\n }\n }\n },\n \"true_next\" : \"FabricIngress.forwarding.routing_v6\",\n \"false_next\" : \"tbl_hasher17\"\n },\n {\n \"name\" : \"node_69\",\n \"id\" : 24,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 27,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.bridged\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_needs_gtpu_encap16\"]\n }\n }\n },\n \"true_next\" : \"tbl_hasher28\",\n \"false_next\" : \"node_71\"\n },\n {\n \"name\" : \"node_71\",\n \"id\" : 25,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 38,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.gtpu.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_hasher39\",\n \"false_next\" : \"node_73\"\n },\n {\n \"name\" : \"node_73\",\n \"id\" : 26,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 91,\n \"column\" : 34,\n \"source_fragment\" : \"fabric_md\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_is_ipv410\"]\n }\n }\n },\n \"true_next\" : \"tbl_hasher50\",\n \"false_next\" : \"tbl_hasher66\"\n },\n {\n \"name\" : \"node_76\",\n \"id\" : 27,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 92,\n \"column\" : 13,\n \"source_fragment\" : \"fabric_md\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n }\n }\n },\n \"false_next\" : \"FabricIngress.pre_next.next_mpls\",\n \"true_next\" : \"FabricIngress.acl.acl\"\n },\n {\n \"name\" : \"node_80\",\n \"id\" : 28,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 96,\n \"column\" : 13,\n \"source_fragment\" : \"fabric_md\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n }\n }\n },\n \"false_next\" : \"FabricIngress.next.hashed\",\n \"true_next\" : \"FabricIngress.qos.set_slice_tc\"\n },\n {\n \"name\" : \"node_85\",\n \"id\" : 29,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 173,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.upf_meter_color != MeterColor_t.RED\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"!=\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_meter_color32\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n }\n },\n \"true_next\" : \"tbl_slicing174\",\n \"false_next\" : \"tbl_slicing177\"\n },\n {\n \"name\" : \"node_92\",\n \"id\" : 30,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 109,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.drop_ctl == 1\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n },\n \"false_next\" : null,\n \"true_next\" : \"tbl_fabric_v1model110\"\n }\n ]\n },\n {\n \"name\" : \"egress\",\n \"id\" : 1,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 115,\n \"column\" : 8,\n \"source_fragment\" : \"FabricEgress\"\n },\n \"init_table\" : \"tbl_fabric_v1model133\",\n \"tables\" : [\n {\n \"name\" : \"tbl_fabric_v1model133\",\n \"id\" : 60,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 133,\n \"column\" : 34,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [138],\n \"actions\" : [\"fabric_v1model133\"],\n \"base_default_next\" : \"node_97\",\n \"next_tables\" : {\n \"fabric_v1model133\" : \"node_97\"\n },\n \"default_entry\" : {\n \"action_id\" : 138,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_fabric_v1model136\",\n \"id\" : 61,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 136,\n \"column\" : 12,\n \"source_fragment\" : \"exit\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [137],\n \"actions\" : [\"fabric_v1model136\"],\n \"base_default_next\" : \"node_99\",\n \"next_tables\" : {\n \"fabric_v1model136\" : \"node_99\"\n },\n \"default_entry\" : {\n \"action_id\" : 137,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int_tna_parser_emulator14\",\n \"id\" : 62,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [140],\n \"actions\" : [\"int_tna_parser_emulator14\"],\n \"base_default_next\" : \"node_101\",\n \"next_tables\" : {\n \"int_tna_parser_emulator14\" : \"node_101\"\n },\n \"default_entry\" : {\n \"action_id\" : 140,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int_tna_parser_emulator148\",\n \"id\" : 63,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 148,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.ipv4.setInvalid(); ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [139],\n \"actions\" : [\"int_tna_parser_emulator148\"],\n \"base_default_next\" : \"node_103\",\n \"next_tables\" : {\n \"int_tna_parser_emulator148\" : \"node_103\"\n },\n \"default_entry\" : {\n \"action_id\" : 139,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_parser_emulator_parse_int_ingress_drop\",\n \"id\" : 64,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 165,\n \"column\" : 12,\n \"source_fragment\" : \"parse_int_ingress_drop()\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [124],\n \"actions\" : [\"FabricEgress.parser_emulator.parse_int_ingress_drop\"],\n \"base_default_next\" : \"tbl_int_tna_parser_emulator166\",\n \"next_tables\" : {\n \"FabricEgress.parser_emulator.parse_int_ingress_drop\" : \"tbl_int_tna_parser_emulator166\"\n },\n \"default_entry\" : {\n \"action_id\" : 124,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int_tna_parser_emulator166\",\n \"id\" : 65,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 166,\n \"column\" : 12,\n \"source_fragment\" : \"recirculate_preserving_field_list(NO_PRESERVATION)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [141],\n \"actions\" : [\"int_tna_parser_emulator166\"],\n \"base_default_next\" : \"tbl_int_tna_parser_emulator173\",\n \"next_tables\" : {\n \"int_tna_parser_emulator166\" : \"tbl_int_tna_parser_emulator173\"\n },\n \"default_entry\" : {\n \"action_id\" : 141,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_parser_emulator_parse_int_report_mirror\",\n \"id\" : 66,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 168,\n \"column\" : 12,\n \"source_fragment\" : \"parse_int_report_mirror()\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [126],\n \"actions\" : [\"FabricEgress.parser_emulator.parse_int_report_mirror\"],\n \"base_default_next\" : \"tbl_int_tna_parser_emulator169\",\n \"next_tables\" : {\n \"FabricEgress.parser_emulator.parse_int_report_mirror\" : \"tbl_int_tna_parser_emulator169\"\n },\n \"default_entry\" : {\n \"action_id\" : 126,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int_tna_parser_emulator169\",\n \"id\" : 67,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 169,\n \"column\" : 12,\n \"source_fragment\" : \"recirculate_preserving_field_list(PRESERVE_INT_MD)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [142],\n \"actions\" : [\"int_tna_parser_emulator169\"],\n \"base_default_next\" : \"tbl_int_tna_parser_emulator173\",\n \"next_tables\" : {\n \"int_tna_parser_emulator169\" : \"tbl_int_tna_parser_emulator173\"\n },\n \"default_entry\" : {\n \"action_id\" : 142,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int_tna_parser_emulator173\",\n \"id\" : 68,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [143],\n \"actions\" : [\"int_tna_parser_emulator173\"],\n \"base_default_next\" : \"node_109\",\n \"next_tables\" : {\n \"int_tna_parser_emulator173\" : \"node_109\"\n },\n \"default_entry\" : {\n \"action_id\" : 143,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int_tna_parser_emulator14_0\",\n \"id\" : 69,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [145],\n \"actions\" : [\"int_tna_parser_emulator14_0\"],\n \"base_default_next\" : \"node_111\",\n \"next_tables\" : {\n \"int_tna_parser_emulator14_0\" : \"node_111\"\n },\n \"default_entry\" : {\n \"action_id\" : 145,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int_tna_parser_emulator148_0\",\n \"id\" : 70,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 148,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.ipv4.setInvalid(); ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [144],\n \"actions\" : [\"int_tna_parser_emulator148_0\"],\n \"base_default_next\" : \"node_113\",\n \"next_tables\" : {\n \"int_tna_parser_emulator148_0\" : \"node_113\"\n },\n \"default_entry\" : {\n \"action_id\" : 144,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_parser_emulator_parse_int_ingress_drop_0\",\n \"id\" : 71,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 165,\n \"column\" : 12,\n \"source_fragment\" : \"parse_int_ingress_drop()\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [125],\n \"actions\" : [\"FabricEgress.parser_emulator.parse_int_ingress_drop\"],\n \"base_default_next\" : \"tbl_int_tna_parser_emulator166_0\",\n \"next_tables\" : {\n \"FabricEgress.parser_emulator.parse_int_ingress_drop\" : \"tbl_int_tna_parser_emulator166_0\"\n },\n \"default_entry\" : {\n \"action_id\" : 125,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int_tna_parser_emulator166_0\",\n \"id\" : 72,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 166,\n \"column\" : 12,\n \"source_fragment\" : \"recirculate_preserving_field_list(NO_PRESERVATION)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [146],\n \"actions\" : [\"int_tna_parser_emulator166_0\"],\n \"base_default_next\" : \"tbl_int_tna_parser_emulator173_0\",\n \"next_tables\" : {\n \"int_tna_parser_emulator166_0\" : \"tbl_int_tna_parser_emulator173_0\"\n },\n \"default_entry\" : {\n \"action_id\" : 146,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_parser_emulator_parse_int_report_mirror_0\",\n \"id\" : 73,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 168,\n \"column\" : 12,\n \"source_fragment\" : \"parse_int_report_mirror()\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [127],\n \"actions\" : [\"FabricEgress.parser_emulator.parse_int_report_mirror\"],\n \"base_default_next\" : \"tbl_int_tna_parser_emulator169_0\",\n \"next_tables\" : {\n \"FabricEgress.parser_emulator.parse_int_report_mirror\" : \"tbl_int_tna_parser_emulator169_0\"\n },\n \"default_entry\" : {\n \"action_id\" : 127,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int_tna_parser_emulator169_0\",\n \"id\" : 74,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 169,\n \"column\" : 12,\n \"source_fragment\" : \"recirculate_preserving_field_list(PRESERVE_INT_MD)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [147],\n \"actions\" : [\"int_tna_parser_emulator169_0\"],\n \"base_default_next\" : \"tbl_int_tna_parser_emulator173_0\",\n \"next_tables\" : {\n \"int_tna_parser_emulator169_0\" : \"tbl_int_tna_parser_emulator173_0\"\n },\n \"default_entry\" : {\n \"action_id\" : 147,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int_tna_parser_emulator173_0\",\n \"id\" : 75,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [148],\n \"actions\" : [\"int_tna_parser_emulator173_0\"],\n \"base_default_next\" : \"FabricEgress.pkt_io_egress.switch_info\",\n \"next_tables\" : {\n \"int_tna_parser_emulator173_0\" : \"FabricEgress.pkt_io_egress.switch_info\"\n },\n \"default_entry\" : {\n \"action_id\" : 148,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricEgress.pkt_io_egress.switch_info\",\n \"id\" : 76,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 39,\n \"column\" : 10,\n \"source_fragment\" : \"switch_info\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [113, 105],\n \"actions\" : [\"FabricEgress.pkt_io_egress.set_switch_info\", \"nop\"],\n \"base_default_next\" : \"node_120\",\n \"next_tables\" : {\n \"FabricEgress.pkt_io_egress.set_switch_info\" : \"node_120\",\n \"nop\" : \"node_120\"\n },\n \"default_entry\" : {\n \"action_id\" : 105,\n \"action_const\" : false,\n \"action_data\" : [],\n \"action_entry_const\" : false\n }\n },\n {\n \"name\" : \"tbl_packetio51\",\n \"id\" : 77,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 51,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.packet_in.setValid(); ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [149],\n \"actions\" : [\"packetio51\"],\n \"base_default_next\" : \"node_122\",\n \"next_tables\" : {\n \"packetio51\" : \"node_122\"\n },\n \"default_entry\" : {\n \"action_id\" : 149,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_packetio60\",\n \"id\" : 78,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 60,\n \"column\" : 37,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [150],\n \"actions\" : [\"packetio60\"],\n \"base_default_next\" : \"node_124\",\n \"next_tables\" : {\n \"packetio60\" : \"node_124\"\n },\n \"default_entry\" : {\n \"action_id\" : 150,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricEgress.stats.flows\",\n \"id\" : 79,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4\",\n \"line\" : 53,\n \"column\" : 10,\n \"source_fragment\" : \"flows\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"stats_flow_id\",\n \"target\" : [\"_egress_bridged36\", \"_base_stats_flow_id11\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"eg_port\",\n \"target\" : [\"standard_metadata\", \"egress_port\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [112],\n \"actions\" : [\"FabricEgress.stats.count\"],\n \"base_default_next\" : \"node_126\",\n \"next_tables\" : {\n \"FabricEgress.stats.count\" : \"node_126\"\n },\n \"default_entry\" : {\n \"action_id\" : 112,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_next283\",\n \"id\" : 80,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 283,\n \"column\" : 50,\n \"source_fragment\" : \"= INT_REPORT_TYPE_NO_REPORT; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [151],\n \"actions\" : [\"next283\"],\n \"base_default_next\" : \"node_128\",\n \"next_tables\" : {\n \"next283\" : \"node_128\"\n },\n \"default_entry\" : {\n \"action_id\" : 151,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_egress_next_pop_mpls_if_present\",\n \"id\" : 81,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 289,\n \"column\" : 36,\n \"source_fragment\" : \"pop_mpls_if_present()\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [114],\n \"actions\" : [\"FabricEgress.egress_next.pop_mpls_if_present\"],\n \"base_default_next\" : \"node_132\",\n \"next_tables\" : {\n \"FabricEgress.egress_next.pop_mpls_if_present\" : \"node_132\"\n },\n \"default_entry\" : {\n \"action_id\" : 114,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_egress_next_set_mpls\",\n \"id\" : 82,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 291,\n \"column\" : 12,\n \"source_fragment\" : \"set_mpls()\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [115],\n \"actions\" : [\"FabricEgress.egress_next.set_mpls\"],\n \"base_default_next\" : \"node_132\",\n \"next_tables\" : {\n \"FabricEgress.egress_next.set_mpls\" : \"node_132\"\n },\n \"default_entry\" : {\n \"action_id\" : 115,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricEgress.egress_next.egress_vlan\",\n \"id\" : 83,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 264,\n \"column\" : 10,\n \"source_fragment\" : \"egress_vlan\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"vlan_id\",\n \"target\" : [\"_egress_bridged36\", \"_base_vlan_id6\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"eg_port\",\n \"target\" : [\"standard_metadata\", \"egress_port\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [116, 117, 118],\n \"actions\" : [\"FabricEgress.egress_next.push_vlan\", \"FabricEgress.egress_next.pop_vlan\", \"FabricEgress.egress_next.drop\"],\n \"base_default_next\" : \"node_134\",\n \"next_tables\" : {\n \"FabricEgress.egress_next.push_vlan\" : \"node_134\",\n \"FabricEgress.egress_next.pop_vlan\" : \"node_134\",\n \"FabricEgress.egress_next.drop\" : \"node_134\"\n },\n \"default_entry\" : {\n \"action_id\" : 118,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_next323\",\n \"id\" : 84,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 323,\n \"column\" : 25,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [153],\n \"actions\" : [\"next323\"],\n \"base_default_next\" : \"node_136\",\n \"next_tables\" : {\n \"next323\" : \"node_136\"\n },\n \"default_entry\" : {\n \"action_id\" : 153,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_next325\",\n \"id\" : 85,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 325,\n \"column\" : 25,\n \"source_fragment\" : \"= 1; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [152],\n \"actions\" : [\"next325\"],\n \"base_default_next\" : \"node_148\",\n \"next_tables\" : {\n \"next325\" : \"node_148\"\n },\n \"default_entry\" : {\n \"action_id\" : 152,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_next333\",\n \"id\" : 86,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 333,\n \"column\" : 33,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [154],\n \"actions\" : [\"next333\"],\n \"base_default_next\" : \"node_141\",\n \"next_tables\" : {\n \"next333\" : \"node_141\"\n },\n \"default_entry\" : {\n \"action_id\" : 154,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_next336\",\n \"id\" : 87,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 336,\n \"column\" : 29,\n \"source_fragment\" : \"= 1; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [155],\n \"actions\" : [\"next336\"],\n \"base_default_next\" : \"node_148\",\n \"next_tables\" : {\n \"next336\" : \"node_148\"\n },\n \"default_entry\" : {\n \"action_id\" : 155,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_next343\",\n \"id\" : 88,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 343,\n \"column\" : 39,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [156],\n \"actions\" : [\"next343\"],\n \"base_default_next\" : \"node_146\",\n \"next_tables\" : {\n \"next343\" : \"node_146\"\n },\n \"default_entry\" : {\n \"action_id\" : 156,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_next346\",\n \"id\" : 89,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 346,\n \"column\" : 29,\n \"source_fragment\" : \"= 1; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [157],\n \"actions\" : [\"next346\"],\n \"base_default_next\" : \"node_148\",\n \"next_tables\" : {\n \"next346\" : \"node_148\"\n },\n \"default_entry\" : {\n \"action_id\" : 157,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf610\",\n \"id\" : 90,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 610,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.inner_udp.setValid(); ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [158],\n \"actions\" : [\"upf610\"],\n \"base_default_next\" : \"node_152\",\n \"next_tables\" : {\n \"upf610\" : \"node_152\"\n },\n \"default_entry\" : {\n \"action_id\" : 158,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf615\",\n \"id\" : 91,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 615,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.inner_tcp.setValid(); ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [159],\n \"actions\" : [\"upf615\"],\n \"base_default_next\" : \"node_154\",\n \"next_tables\" : {\n \"upf615\" : \"node_154\"\n },\n \"default_entry\" : {\n \"action_id\" : 159,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf620\",\n \"id\" : 92,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 620,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.inner_icmp.setValid(); ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [160],\n \"actions\" : [\"upf620\"],\n \"base_default_next\" : \"FabricEgress.upf.gtpu_encap\",\n \"next_tables\" : {\n \"upf620\" : \"FabricEgress.upf.gtpu_encap\"\n },\n \"default_entry\" : {\n \"action_id\" : 160,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricEgress.upf.gtpu_encap\",\n \"id\" : 93,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 597,\n \"column\" : 10,\n \"source_fragment\" : \"gtpu_encap\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [122, 123],\n \"actions\" : [\"FabricEgress.upf.gtpu_only\", \"FabricEgress.upf.gtpu_with_psc\"],\n \"base_default_next\" : \"FabricEgress.upf.eg_tunnel_peers\",\n \"next_tables\" : {\n \"FabricEgress.upf.gtpu_only\" : \"FabricEgress.upf.eg_tunnel_peers\",\n \"FabricEgress.upf.gtpu_with_psc\" : \"FabricEgress.upf.eg_tunnel_peers\"\n },\n \"default_entry\" : {\n \"action_id\" : 122,\n \"action_const\" : false,\n \"action_data\" : [],\n \"action_entry_const\" : false\n }\n },\n {\n \"name\" : \"FabricEgress.upf.eg_tunnel_peers\",\n \"id\" : 94,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 491,\n \"column\" : 10,\n \"source_fragment\" : \"eg_tunnel_peers\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"tun_peer_id\",\n \"target\" : [\"_egress_bridged36\", \"_upf_tun_peer_id13\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 256,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [121, 107],\n \"actions\" : [\"FabricEgress.upf.load_tunnel_params\", \"nop\"],\n \"base_default_next\" : \"node_158\",\n \"next_tables\" : {\n \"FabricEgress.upf.load_tunnel_params\" : \"node_158\",\n \"nop\" : \"node_158\"\n },\n \"default_entry\" : {\n \"action_id\" : 107,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf628\",\n \"id\" : 95,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 628,\n \"column\" : 16,\n \"source_fragment\" : \"terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [161],\n \"actions\" : [\"upf628\"],\n \"base_default_next\" : \"tbl_int128\",\n \"next_tables\" : {\n \"upf628\" : \"tbl_int128\"\n },\n \"default_entry\" : {\n \"action_id\" : 161,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int128\",\n \"id\" : 96,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 128,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [162],\n \"actions\" : [\"int128\"],\n \"base_default_next\" : \"FabricEgress.int_egress.queue_latency_thresholds\",\n \"next_tables\" : {\n \"int128\" : \"FabricEgress.int_egress.queue_latency_thresholds\"\n },\n \"default_entry\" : {\n \"action_id\" : 162,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricEgress.int_egress.queue_latency_thresholds\",\n \"id\" : 97,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 159,\n \"column\" : 10,\n \"source_fragment\" : \"queue_latency_thresholds\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"egress_qid\",\n \"target\" : [\"scalars\", \"int_egress_egress_qid\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"range\",\n \"name\" : \"hop_latency_upper\",\n \"target\" : [\"scalars\", \"key_0\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"range\",\n \"name\" : \"hop_latency_lower\",\n \"target\" : [\"scalars\", \"key_1\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"range\",\n \"type\" : \"simple\",\n \"max_size\" : 128,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [128, 129, 108],\n \"actions\" : [\"FabricEgress.int_egress.check_quota\", \"FabricEgress.int_egress.reset_quota\", \"nop\"],\n \"base_default_next\" : \"FabricEgress.int_egress.config\",\n \"next_tables\" : {\n \"FabricEgress.int_egress.check_quota\" : \"FabricEgress.int_egress.config\",\n \"FabricEgress.int_egress.reset_quota\" : \"FabricEgress.int_egress.config\",\n \"nop\" : \"FabricEgress.int_egress.config\"\n },\n \"default_entry\" : {\n \"action_id\" : 108,\n \"action_const\" : false,\n \"action_data\" : [],\n \"action_entry_const\" : false\n }\n },\n {\n \"name\" : \"FabricEgress.int_egress.config\",\n \"id\" : 98,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 183,\n \"column\" : 10,\n \"source_fragment\" : \"config\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [130],\n \"actions\" : [\"FabricEgress.int_egress.set_config\"],\n \"base_default_next\" : \"tbl_int373\",\n \"next_tables\" : {\n \"FabricEgress.int_egress.set_config\" : \"tbl_int373\"\n },\n \"default_entry\" : {\n \"action_id\" : 130,\n \"action_const\" : false,\n \"action_data\" : [\"0xffffff00\", \"0xffffc0000000\"],\n \"action_entry_const\" : false\n }\n },\n {\n \"name\" : \"tbl_int373\",\n \"id\" : 99,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 373,\n \"column\" : 38,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [164],\n \"actions\" : [\"int373\"],\n \"base_default_next\" : \"node_164\",\n \"next_tables\" : {\n \"int373\" : \"node_164\"\n },\n \"default_entry\" : {\n \"action_id\" : 164,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricEgress.int_egress.report\",\n \"id\" : 100,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 260,\n \"column\" : 10,\n \"source_fragment\" : \"report\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"bmd_type\",\n \"target\" : [\"int_egress_fabric_md_int_report_md\", \"bmd_type\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"mirror_type\",\n \"target\" : [\"int_egress_fabric_md_int_report_md\", \"mirror_type\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"int_report_type\",\n \"target\" : [\"int_egress_fabric_md_int_report_md\", \"report_type\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 6,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [131, 132, 133, 134, 109],\n \"actions\" : [\"FabricEgress.int_egress.do_local_report_encap\", \"FabricEgress.int_egress.do_local_report_encap_mpls\", \"FabricEgress.int_egress.do_drop_report_encap\", \"FabricEgress.int_egress.do_drop_report_encap_mpls\", \"nop\"],\n \"base_default_next\" : \"FabricEgress.int_egress.adjust_int_report_hdr_length\",\n \"next_tables\" : {\n \"FabricEgress.int_egress.do_local_report_encap\" : \"FabricEgress.int_egress.adjust_int_report_hdr_length\",\n \"FabricEgress.int_egress.do_local_report_encap_mpls\" : \"FabricEgress.int_egress.adjust_int_report_hdr_length\",\n \"FabricEgress.int_egress.do_drop_report_encap\" : \"FabricEgress.int_egress.adjust_int_report_hdr_length\",\n \"FabricEgress.int_egress.do_drop_report_encap_mpls\" : \"FabricEgress.int_egress.adjust_int_report_hdr_length\",\n \"nop\" : \"FabricEgress.int_egress.adjust_int_report_hdr_length\"\n },\n \"default_entry\" : {\n \"action_id\" : 109,\n \"action_const\" : false,\n \"action_data\" : [],\n \"action_entry_const\" : false\n }\n },\n {\n \"name\" : \"FabricEgress.int_egress.int_metadata\",\n \"id\" : 101,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 315,\n \"column\" : 10,\n \"source_fragment\" : \"int_metadata\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"int_report_type\",\n \"target\" : [\"_egress_bridged36\", \"_int_bmd_report_type21\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"drop_ctl\",\n \"target\" : [\"scalars\", \"userMetadata._drop_ctl2\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"queue_report\",\n \"target\" : [\"scalars\", \"userMetadata._egress_int_md_queue_report43\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 2,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [135, 110],\n \"actions\" : [\"FabricEgress.int_egress.init_int_metadata\", \"nop\"],\n \"base_default_next\" : null,\n \"next_tables\" : {\n \"__HIT__\" : \"tbl_int383\",\n \"__MISS__\" : \"FabricEgress.int_egress.adjust_int_report_hdr_length\"\n },\n \"default_entry\" : {\n \"action_id\" : 110,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n },\n \"entries\" : [\n {\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 327,\n \"column\" : 12,\n \"source_fragment\" : \"(INT_REPORT_TYPE_FLOW, 0, false): init_int_metadata(INT_REPORT_TYPE_FLOW)\"\n },\n \"match_key\" : [\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x00\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x00\"\n }\n ],\n \"action_entry\" : {\n \"action_id\" : 135,\n \"action_data\" : [\"0x1\"]\n },\n \"priority\" : 1\n },\n {\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 329,\n \"column\" : 12,\n \"source_fragment\" : \"(INT_REPORT_TYPE_FLOW, 1, false): init_int_metadata(INT_REPORT_TYPE_DROP)\"\n },\n \"match_key\" : [\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x00\"\n }\n ],\n \"action_entry\" : {\n \"action_id\" : 135,\n \"action_data\" : [\"0x4\"]\n },\n \"priority\" : 2\n }\n ]\n },\n {\n \"name\" : \"tbl_int383\",\n \"id\" : 102,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 383,\n \"column\" : 16,\n \"source_fragment\" : \"clone_preserving_field_list(CloneType.E2E, ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [163],\n \"actions\" : [\"int383\"],\n \"base_default_next\" : \"FabricEgress.int_egress.adjust_int_report_hdr_length\",\n \"next_tables\" : {\n \"int383\" : \"FabricEgress.int_egress.adjust_int_report_hdr_length\"\n },\n \"default_entry\" : {\n \"action_id\" : 163,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricEgress.int_egress.adjust_int_report_hdr_length\",\n \"id\" : 103,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 347,\n \"column\" : 10,\n \"source_fragment\" : \"adjust_int_report_hdr_length\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"is_int_wip\",\n \"target\" : [\"int_egress_fabric_md_bridged\", \"_int_bmd_wip_type26\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 2,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [111, 136],\n \"actions\" : [\"nop\", \"FabricEgress.int_egress.adjust_ip_udp_len\"],\n \"base_default_next\" : \"tbl_slicing189\",\n \"next_tables\" : {\n \"nop\" : \"tbl_slicing189\",\n \"FabricEgress.int_egress.adjust_ip_udp_len\" : \"tbl_slicing189\"\n },\n \"default_entry\" : {\n \"action_id\" : 111,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n },\n \"entries\" : [\n {\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 358,\n \"column\" : 12,\n \"source_fragment\" : \"INT_IS_WIP: adjust_ip_udp_len(INT_WIP_ADJUST_IP_BYTES, INT_WIP_ADJUST_UDP_BYTES)\"\n },\n \"match_key\" : [\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n }\n ],\n \"action_entry\" : {\n \"action_id\" : 136,\n \"action_data\" : [\"0xfff2\", \"0xffde\"]\n },\n \"priority\" : 1\n },\n {\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 359,\n \"column\" : 12,\n \"source_fragment\" : \"INT_IS_WIP_WITH_MPLS: adjust_ip_udp_len(INT_WIP_ADJUST_IP_MPLS_BYTES, INT_WIP_ADJUST_UDP_MPLS_BYTES)\"\n },\n \"match_key\" : [\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x02\"\n }\n ],\n \"action_entry\" : {\n \"action_id\" : 136,\n \"action_data\" : [\"0xffee\", \"0xffda\"]\n },\n \"priority\" : 2\n }\n ]\n },\n {\n \"name\" : \"tbl_slicing189\",\n \"id\" : 104,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 189,\n \"column\" : 4,\n \"source_fragment\" : \"bit<6> tmp_dscp = fabric_md.bridged.base.slice_tc; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [166],\n \"actions\" : [\"slicing189\"],\n \"base_default_next\" : \"FabricEgress.dscp_rewriter.rewriter\",\n \"next_tables\" : {\n \"slicing189\" : \"FabricEgress.dscp_rewriter.rewriter\"\n },\n \"default_entry\" : {\n \"action_id\" : 166,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricEgress.dscp_rewriter.rewriter\",\n \"id\" : 105,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 201,\n \"column\" : 10,\n \"source_fragment\" : \"rewriter\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"eg_port\",\n \"target\" : [\"standard_metadata\", \"egress_port\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 512,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [119, 120, 106],\n \"actions\" : [\"FabricEgress.dscp_rewriter.rewrite\", \"FabricEgress.dscp_rewriter.clear\", \"nop\"],\n \"base_default_next\" : null,\n \"next_tables\" : {\n \"__HIT__\" : \"node_171\",\n \"__MISS__\" : \"node_173\"\n },\n \"default_entry\" : {\n \"action_id\" : 106,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_slicing217\",\n \"id\" : 106,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 217,\n \"column\" : 30,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [165],\n \"actions\" : [\"slicing217\"],\n \"base_default_next\" : \"node_173\",\n \"next_tables\" : {\n \"slicing217\" : \"node_173\"\n },\n \"default_entry\" : {\n \"action_id\" : 165,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_fabric_v1model170\",\n \"id\" : 107,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 170,\n \"column\" : 12,\n \"source_fragment\" : \"recirculate_preserving_field_list(NO_PRESERVATION)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [167],\n \"actions\" : [\"fabric_v1model170\"],\n \"base_default_next\" : \"node_175\",\n \"next_tables\" : {\n \"fabric_v1model170\" : \"node_175\"\n },\n \"default_entry\" : {\n \"action_id\" : 167,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_fabric_v1model174\",\n \"id\" : 108,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 174,\n \"column\" : 12,\n \"source_fragment\" : \"mark_to_drop(standard_md)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [168],\n \"actions\" : [\"fabric_v1model174\"],\n \"base_default_next\" : null,\n \"next_tables\" : {\n \"fabric_v1model174\" : null\n },\n \"default_entry\" : {\n \"action_id\" : 168,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n }\n ],\n \"action_profiles\" : [],\n \"conditionals\" : [\n {\n \"name\" : \"node_97\",\n \"id\" : 31,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 135,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._skip_egress0\"]\n }\n }\n },\n \"true_next\" : \"tbl_fabric_v1model136\",\n \"false_next\" : \"node_99\"\n },\n {\n \"name\" : \"node_99\",\n \"id\" : 32,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 140,\n \"column\" : 13,\n \"source_fragment\" : \"standard_md.instance_type == 2\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"instance_type\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000002\"\n }\n }\n },\n \"true_next\" : \"tbl_int_tna_parser_emulator14\",\n \"false_next\" : \"node_109\"\n },\n {\n \"name\" : \"node_101\",\n \"id\" : 33,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 145,\n \"column\" : 11,\n \"source_fragment\" : \"hdr_v1model.ingress.gtpu.isValid() || hdr_v1model.ingress.vxlan.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"or\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"$valid$\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_vxlan15\", \"$valid$\"]\n }\n }\n }\n }\n },\n \"true_next\" : \"tbl_int_tna_parser_emulator148\",\n \"false_next\" : \"node_103\"\n },\n {\n \"name\" : \"node_103\",\n \"id\" : 34,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 164,\n \"column\" : 12,\n \"source_fragment\" : \"(bit<8>)fabric_md.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_report_type47\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n }\n },\n \"true_next\" : \"tbl_parser_emulator_parse_int_ingress_drop\",\n \"false_next\" : \"tbl_parser_emulator_parse_int_report_mirror\"\n },\n {\n \"name\" : \"node_109\",\n \"id\" : 35,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 150,\n \"column\" : 11,\n \"source_fragment\" : \"(bit<8>)fabric_md.egress.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_int_bmd_report_type21\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n }\n },\n \"true_next\" : \"tbl_int_tna_parser_emulator14_0\",\n \"false_next\" : \"FabricEgress.pkt_io_egress.switch_info\"\n },\n {\n \"name\" : \"node_111\",\n \"id\" : 36,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 145,\n \"column\" : 11,\n \"source_fragment\" : \"hdr_v1model.ingress.gtpu.isValid() || hdr_v1model.ingress.vxlan.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"or\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"$valid$\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_vxlan15\", \"$valid$\"]\n }\n }\n }\n }\n },\n \"true_next\" : \"tbl_int_tna_parser_emulator148_0\",\n \"false_next\" : \"node_113\"\n },\n {\n \"name\" : \"node_113\",\n \"id\" : 37,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 164,\n \"column\" : 12,\n \"source_fragment\" : \"(bit<8>)fabric_md.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_int_bmd_report_type21\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n }\n },\n \"true_next\" : \"tbl_parser_emulator_parse_int_ingress_drop_0\",\n \"false_next\" : \"tbl_parser_emulator_parse_int_report_mirror_0\"\n },\n {\n \"name\" : \"node_120\",\n \"id\" : 38,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 50,\n \"column\" : 12,\n \"source_fragment\" : \"standard_md.egress_port == fabric_md.cpu_port\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_port\"]\n },\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_cpu_port37\"]\n }\n }\n },\n \"true_next\" : \"tbl_packetio51\",\n \"false_next\" : \"node_122\"\n },\n {\n \"name\" : \"node_122\",\n \"id\" : 39,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 58,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.fake_ethernet.isValid() && ...\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"and\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_fake_ethernet2\", \"$valid$\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_fake_ethernet2\", \"ether_type\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf03\"\n }\n }\n }\n }\n },\n \"true_next\" : \"tbl_packetio60\",\n \"false_next\" : \"node_124\"\n },\n {\n \"name\" : \"node_124\",\n \"id\" : 40,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4\",\n \"line\" : 67,\n \"column\" : 12,\n \"source_fragment\" : \"bmd_type == BridgedMdType_t.INGRESS_TO_EGRESS\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_bmd_type0\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n },\n \"true_next\" : \"FabricEgress.stats.flows\",\n \"false_next\" : \"node_126\"\n },\n {\n \"name\" : \"node_126\",\n \"id\" : 41,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 280,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.bridged.base.is_multicast ...\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"and\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_is_multicast4\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_ig_port3\"]\n },\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_port\"]\n }\n }\n }\n }\n },\n \"true_next\" : \"tbl_next283\",\n \"false_next\" : \"node_128\"\n },\n {\n \"name\" : \"node_128\",\n \"id\" : 42,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 288,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.bridged.base.mpls_label == 0\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_mpls_label2\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x000000\"\n }\n }\n },\n \"true_next\" : \"node_129\",\n \"false_next\" : \"tbl_egress_next_set_mpls\"\n },\n {\n \"name\" : \"node_129\",\n \"id\" : 43,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 289,\n \"column\" : 16,\n \"source_fragment\" : \"hdr.mpls.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_egress_next_pop_mpls_if_present\",\n \"false_next\" : \"node_132\"\n },\n {\n \"name\" : \"node_132\",\n \"id\" : 44,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 159,\n \"column\" : 39,\n \"source_fragment\" : \"fabric_md\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_is_int_recirc45\"]\n }\n }\n },\n \"false_next\" : \"FabricEgress.egress_next.egress_vlan\",\n \"true_next\" : \"node_134\"\n },\n {\n \"name\" : \"node_134\",\n \"id\" : 45,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 322,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.mpls.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_next323\",\n \"false_next\" : \"node_138\"\n },\n {\n \"name\" : \"node_136\",\n \"id\" : 46,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 324,\n \"column\" : 16,\n \"source_fragment\" : \"hdr.mpls.ttl == 0\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"ttl\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n }\n },\n \"true_next\" : \"tbl_next325\",\n \"false_next\" : \"node_148\"\n },\n {\n \"name\" : \"node_138\",\n \"id\" : 47,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 331,\n \"column\" : 16,\n \"source_fragment\" : \"hdr.ipv4.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"and\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"$valid$\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"!=\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_fwd_type5\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n }\n }\n }\n },\n \"true_next\" : \"node_139\",\n \"false_next\" : \"node_143\"\n },\n {\n \"name\" : \"node_139\",\n \"id\" : 48,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 319,\n \"column\" : 28,\n \"source_fragment\" : \"(fabric_md.bridged.bmd_type == BridgedMdType_t.INT_INGRESS_DROP) || ...\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"or\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_bmd_type0\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_bmd_type0\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n }\n }\n }\n },\n \"false_next\" : \"tbl_next333\",\n \"true_next\" : \"node_141\"\n },\n {\n \"name\" : \"node_141\",\n \"id\" : 49,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 335,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.ipv4.ttl == 0\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ttl\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n }\n },\n \"true_next\" : \"tbl_next336\",\n \"false_next\" : \"node_148\"\n },\n {\n \"name\" : \"node_143\",\n \"id\" : 50,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 341,\n \"column\" : 23,\n \"source_fragment\" : \"hdr.ipv6.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"and\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv68\", \"$valid$\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"!=\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_fwd_type5\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n }\n }\n }\n },\n \"true_next\" : \"node_144\",\n \"false_next\" : \"node_148\"\n },\n {\n \"name\" : \"node_144\",\n \"id\" : 51,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 319,\n \"column\" : 28,\n \"source_fragment\" : \"(fabric_md.bridged.bmd_type == BridgedMdType_t.INT_INGRESS_DROP) || ...\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"or\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_bmd_type0\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_bmd_type0\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n }\n }\n }\n },\n \"false_next\" : \"tbl_next343\",\n \"true_next\" : \"node_146\"\n },\n {\n \"name\" : \"node_146\",\n \"id\" : 52,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 345,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.ipv6.hop_limit == 0\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv68\", \"hop_limit\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n }\n },\n \"true_next\" : \"tbl_next346\",\n \"false_next\" : \"node_148\"\n },\n {\n \"name\" : \"node_148\",\n \"id\" : 53,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 607,\n \"column\" : 13,\n \"source_fragment\" : \"fabric_md.bridged\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_upf_skip_upf17\"]\n }\n }\n },\n \"false_next\" : \"node_149\",\n \"true_next\" : \"tbl_int128\"\n },\n {\n \"name\" : \"node_149\",\n \"id\" : 54,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 608,\n \"column\" : 16,\n \"source_fragment\" : \"fabric_md.bridged\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_upf_needs_gtpu_encap16\"]\n }\n }\n },\n \"true_next\" : \"node_150\",\n \"false_next\" : \"node_158\"\n },\n {\n \"name\" : \"node_150\",\n \"id\" : 55,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 609,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.udp.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_upf610\",\n \"false_next\" : \"node_152\"\n },\n {\n \"name\" : \"node_152\",\n \"id\" : 56,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 614,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.tcp.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_tcp9\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_upf615\",\n \"false_next\" : \"node_154\"\n },\n {\n \"name\" : \"node_154\",\n \"id\" : 57,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 619,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.icmp.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_icmp11\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_upf620\",\n \"false_next\" : \"FabricEgress.upf.gtpu_encap\"\n },\n {\n \"name\" : \"node_158\",\n \"id\" : 58,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 627,\n \"column\" : 17,\n \"source_fragment\" : \"fabric_md.bridged\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_upf_skip_egress_upf_ctr18\"]\n }\n }\n },\n \"false_next\" : \"tbl_upf628\",\n \"true_next\" : \"tbl_int128\"\n },\n {\n \"name\" : \"node_164\",\n \"id\" : 59,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 375,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.int_report_md.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"FabricEgress.int_egress.report\",\n \"false_next\" : \"FabricEgress.int_egress.int_metadata\"\n },\n {\n \"name\" : \"node_171\",\n \"id\" : 60,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 216,\n \"column\" : 16,\n \"source_fragment\" : \"hdr.ipv4.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_slicing217\",\n \"false_next\" : \"node_173\"\n },\n {\n \"name\" : \"node_173\",\n \"id\" : 61,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 168,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._do_upf_uplink_recirc1\"]\n }\n }\n },\n \"true_next\" : \"tbl_fabric_v1model170\",\n \"false_next\" : \"node_175\"\n },\n {\n \"name\" : \"node_175\",\n \"id\" : 62,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 173,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.drop_ctl == 1\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n },\n \"false_next\" : null,\n \"true_next\" : \"tbl_fabric_v1model174\"\n }\n ]\n }\n ],\n \"checksums\" : [\n {\n \"name\" : \"cksum\",\n \"id\" : 0,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4\",\n \"line\" : 55,\n \"column\" : 8,\n \"source_fragment\" : \"update_checksum(hdr.ingress.ipv4.isValid(), ...\"\n },\n \"target\" : [\"_ingress_ipv47\", \"hdr_checksum\"],\n \"type\" : \"generic\",\n \"calculation\" : \"calc_3\",\n \"verify\" : false,\n \"update\" : true,\n \"if_cond\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"$valid$\"]\n }\n }\n }\n },\n {\n \"name\" : \"cksum_0\",\n \"id\" : 1,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4\",\n \"line\" : 73,\n \"column\" : 8,\n \"source_fragment\" : \"update_checksum(hdr.ingress.inner_ipv4.isValid(), ...\"\n },\n \"target\" : [\"_ingress_inner_ipv418\", \"hdr_checksum\"],\n \"type\" : \"generic\",\n \"calculation\" : \"calc_4\",\n \"verify\" : false,\n \"update\" : true,\n \"if_cond\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"$valid$\"]\n }\n }\n }\n },\n {\n \"name\" : \"cksum_1\",\n \"id\" : 2,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4\",\n \"line\" : 92,\n \"column\" : 8,\n \"source_fragment\" : \"update_checksum(hdr.egress.report_ipv4.isValid(), ...\"\n },\n \"target\" : [\"_egress_report_ipv427\", \"hdr_checksum\"],\n \"type\" : \"generic\",\n \"calculation\" : \"calc_5\",\n \"verify\" : false,\n \"update\" : true,\n \"if_cond\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"$valid$\"]\n }\n }\n }\n },\n {\n \"name\" : \"cksum_2\",\n \"id\" : 3,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4\",\n \"line\" : 13,\n \"column\" : 8,\n \"source_fragment\" : \"verify_checksum(hdr.ingress.ipv4.isValid(), ...\"\n },\n \"target\" : [\"_ingress_ipv47\", \"hdr_checksum\"],\n \"type\" : \"generic\",\n \"calculation\" : \"calc_6\",\n \"verify\" : true,\n \"update\" : false,\n \"if_cond\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"$valid$\"]\n }\n }\n }\n },\n {\n \"name\" : \"cksum_3\",\n \"id\" : 4,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4\",\n \"line\" : 31,\n \"column\" : 8,\n \"source_fragment\" : \"verify_checksum(hdr.ingress.inner_ipv4.isValid(), ...\"\n },\n \"target\" : [\"_ingress_inner_ipv418\", \"hdr_checksum\"],\n \"type\" : \"generic\",\n \"calculation\" : \"calc_7\",\n \"verify\" : true,\n \"update\" : false,\n \"if_cond\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"$valid$\"]\n }\n }\n }\n }\n ],\n \"force_arith\" : [],\n \"extern_instances\" : [],\n \"field_aliases\" : [\n [\n \"queueing_metadata.enq_timestamp\",\n [\"standard_metadata\", \"enq_timestamp\"]\n ],\n [\n \"queueing_metadata.enq_qdepth\",\n [\"standard_metadata\", \"enq_qdepth\"]\n ],\n [\n \"queueing_metadata.deq_timedelta\",\n [\"standard_metadata\", \"deq_timedelta\"]\n ],\n [\n \"queueing_metadata.deq_qdepth\",\n [\"standard_metadata\", \"deq_qdepth\"]\n ],\n [\n \"intrinsic_metadata.ingress_global_timestamp\",\n [\"standard_metadata\", \"ingress_global_timestamp\"]\n ],\n [\n \"intrinsic_metadata.egress_global_timestamp\",\n [\"standard_metadata\", \"egress_global_timestamp\"]\n ],\n [\n \"intrinsic_metadata.mcast_grp\",\n [\"standard_metadata\", \"mcast_grp\"]\n ],\n [\n \"intrinsic_metadata.egress_rid\",\n [\"standard_metadata\", \"egress_rid\"]\n ],\n [\n \"intrinsic_metadata.priority\",\n [\"standard_metadata\", \"priority\"]\n ]\n ],\n \"program\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"__meta__\" : {\n \"version\" : [2, 23],\n \"compiler\" : \"https://github.com/p4lang/p4c\"\n }\n}" + } +} diff --git a/src/tests/p4-sd-fabric-svc-upf/topology/run-stratum.sh b/src/tests/p4-sd-fabric-svc-upf/topology/run-stratum.sh new file mode 100644 index 0000000000000000000000000000000000000000..a537b6e46ae03368be7bf1d9085532167bac71ee --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/topology/run-stratum.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +# You must run this script as root +if [ "$EUID" -ne 0 ]; then + echo "Please run as root" + exit 1 +fi + +source "p4-switch-conf-common.sh" + +LOG_FILE_DIR="/var/log/stratum/" + +sudo mkdir -p "${LOG_FILE_DIR}" + +LOG_LEVEL="info" +READ_LOGS_FILE_PATH=${LOG_FILE_DIR}"p4_reads.pb.txt" +WRITE_LOGS_FILE_PATH=${LOG_FILE_DIR}"p4_writes.pb.txt" +CHASSIS_CONFIG="p4-switch-three-port-chassis-config-phy.pb.txt" + +[ -f ${CHASSIS_CONFIG} ] || { echo "$CHASSIS_CONFIG not found!" ; exit 1 ;} + +rm "${READ_LOGS_FILE_PATH}" +rm "${WRITE_LOGS_FILE_PATH}" + +touch "${READ_LOGS_FILE_PATH}" +touch "${WRITE_LOGS_FILE_PATH}" + +stratum_bmv2 \ + -chassis_config_file=${CHASSIS_CONFIG} \ + -read_req_log_file=${READ_LOGS_FILE_PATH} \ + -write_req_log_file=${WRITE_LOGS_FILE_PATH} \ + -external_stratum_urls="0.0.0.0:"${SW_P4RT_GNMI_PORT}",0.0.0.0:"${SW_P4RT_GRPC_PORT} \ + -local_stratum_url="0.0.0.0:"${SW_P4RT_LOCAL_PORT} \ + -bmv2_log_level=${LOG_LEVEL} +# -forwarding_pipeline_configs_file="pipeline_config.pb.txt" # -forwarding_pipeline_configs_file="/etc/stratum/pipeline_cfg.pb.txt" + +exit 0 diff --git a/src/tests/p4-topologies/README.md b/src/tests/p4-topologies/README.md new file mode 100644 index 0000000000000000000000000000000000000000..22060db4e3c5be46d90045b018786f9bbc6ea366 --- /dev/null +++ b/src/tests/p4-topologies/README.md @@ -0,0 +1,45 @@ +# Emulated Network Topologies for Easy Experimentation + +This repository contains emulated network topology implementations either based on Mininet or native switches that reside in Linux namespaces. + +## Switches in Mininet + +To deploy a Mininet-based network topology, first checkout Mininet: + +```bash +git clone ssh://git@gitlab.ubitech.eu:41621/nsit/etsi-tfs/mininet.git +``` + +This is an extended version of upstream Mininet that also supports: +- Stratum-based P4 switches +- Stratum-based P4 switches with dedicated Inband Network Telemetry (INT) interface. + +Install Mininet as follows: + +```bash +cd mininet/ +PYTHON=python3 util/install.sh -fnv +``` + +**Disclaimer:** When this Mininet branch becomes part of TFS, a new URL will be shared in this file so as everone can checkout this Mininet version. +For now, this remains a closed-source repo in UBITECH's GitLab. + +### Deploy example Mininet topologies + +All of the topologies in the following table employ Stratum-based bmv2 P4 switches within Mininet. +In the topologies that support INT, Stratum bmv2 switch is extended with an additional network interface that dispatches in-band network telemetry packets towards an external collector (e.g., TFS). + +| Topology | File | Command to Deploy | +| -----------------------: | :------------------------------- | :------------------------------------------------------------------ | +| Single switch | topo-mininet/1switch1path.py | sudo python3 topo-mininet/1switch1path.py | +| Single switch with INT | topo-mininet/1switch1path-int.py | sudo python3 topo-mininet/1switch1path-int.py --host-int-iface=eth0 | +| Three switches with INT | topo-mininet/3switch1path-int.py | sudo python3 topo-mininet/3switch1path-int.py --host-int-iface=eth0 | +| Five switches with INT | topo-mininet/5switch3path-int.py | sudo python3 topo-mininet/5switch3path-int.py --host-int-iface=eth0 | + +### Undeploy example Mininet topologies + +Just press Ctrl-D and Mininet stops. + +## Switches in Linux namespaces + +Follow the instruction in `topo-linux-ns/README.md`. diff --git a/src/tests/p4-topologies/test-scripts/p4-upf/README.md b/src/tests/p4-topologies/test-scripts/p4-upf/README.md new file mode 100644 index 0000000000000000000000000000000000000000..577e5dc29e277b91ad56f717802468157eb0038b --- /dev/null +++ b/src/tests/p4-topologies/test-scripts/p4-upf/README.md @@ -0,0 +1,25 @@ +# UPF Test + +If you have already deployed your UPF following the instructions provided in `src/tests/p4-sd-fabric-svc-upf/` and you want to perform a quick test without deploying a fully-fledged 5G system, you may execute the script in this folder. +All you need is to tweak the script's initial variables to fit your setup. + +## Where to deploy the script + +On the network interface that connects the 5G gNB node with the UPF. +Mark this network interface and add its name as a value in variable `GNB_IFACE`. + +## What to configure in the script + +Apart from the `GNB_IFACE` variable, you need to provide: +- `GNB_IP` and `GNB_MAC` addresses that correspond to the interface `GNB_IFACE` +- `DNN_IP` and `DNN_IP` addresses that correspond to the destination of the packet after traversing the UPF. +- `UPF_IP_LEFT` and `UPF_MAC_LEFT` addresses that correspond to the interface of the UPF that talks to te gNB +- a `UE_IP` of your choice if the default value in the script is not what you want. The UE is emulated by this script so you may leave the default IP. + + +## How the script works + +The script employs a traffic sniffer on the `GNB_IFACE` with a timeout. +After the sniffer is employed, the script transmits a GTP-U packet towards the DNN, which encapsulates an ICMP echo request from the UE to the DNN host. +This packet has to pass through your UPF and get back once the kernel of the DNN host responds with an ICMP echo reply. +This reply is captured by the script and printed. diff --git a/src/tests/p4-topologies/test-scripts/p4-upf/packet-gen-5g-ue.py b/src/tests/p4-topologies/test-scripts/p4-upf/packet-gen-5g-ue.py new file mode 100644 index 0000000000000000000000000000000000000000..94bb6e48bd187caed4c1f33ff11067dc8ca03d9e --- /dev/null +++ b/src/tests/p4-topologies/test-scripts/p4-upf/packet-gen-5g-ue.py @@ -0,0 +1,149 @@ +#!/usr/bin/env python3 +import time +from scapy.all import * +from scapy.contrib.gtp import * + +# 5G gNB network interface towards the 5G UPF +GNB_IFACE = "dp-2" +GNB_IP = "10.10.1.2" +GNB_MAC = "50:3e:aa:85:89:09" + +DNN_IP = "10.10.2.2" # DNN IP address +DNN_MAC = "50:3e:aa:96:ba:dd" + +UPF_IP_LEFT = "10.10.1.1" +UPF_MAC_LEFT = "50:3e:aa:52:3e:38" + +UE_IP = "12.1.1.51" # 5G UE IP address +GTPU_PORT = 2152 + +def send_echo_request(): + # Outer IP + outer_ip = IP( + src=GNB_IP, # IP address of the GNB_IFACE above + dst=UPF_IP_LEFT, + ttl=63, + flags="DF", + id=0x2bae + ) + + # UDP + udp = UDP(sport=GTPU_PORT, dport=GTPU_PORT) + + # GTP PDU Session Container (UL, QFI=9) + pdu_sess = GTPPDUSessionContainer( + type=1, # UL PDU SESSION INFORMATION + QFI=9 + ) + + gtp = GTP_U_Header( + version=1, + PT=1, + E=1, + S=0, + PN=0, + teid=1 + ) / pdu_sess + + # Inner ICMP payload (exact bytes) + icmp_payload = bytes.fromhex( + "7c370600000000001011121314151617" + "18191a1b1c1d1e1f2021222324252627" + "28292a2b2c2d2e2f" + ) + + # ICMP + icmp = ICMP( + type=8, + code=0, + id=0x0035, + seq=1 + ) / Raw(load=icmp_payload) + + # Inner IP + inner_ip = IP( + src=UE_IP, + dst=DNN_IP, + ttl=64, + flags="DF", + id=0xa538 + ) + + # Full packet + pkt = ( + Ether(src=GNB_MAC, dst=DNN_MAC) / + outer_ip / + udp / + gtp / + inner_ip / + icmp + ) + + # Freeze computed fields + pkt = pkt.__class__(raw(pkt)) + + # pkt.show2() + sendp(pkt, iface=GNB_IFACE, verbose=True) + print("Packet sent...\n") + +def interface_capture(pkt): + if pkt[IP].src == GNB_IP: + print("\n=== Tx Packet ===") + print("Packet transmitted by the UE\n") + print(f"{pkt}") + return + + print("\n=== Rx Packet ===") + print(f"{pkt}") + if not pkt.haslayer(GTP_U_Header): + print("Packet received by the UPF is not GTP-U encapsulated\n") + return + + if pkt[IP].src != UPF_IP_LEFT: + print("Packet received by the UPF has incorrect source IP\n") + return + + gtp = pkt[GTP_U_Header] + inner = gtp.payload + + if not inner.haslayer(ICMP): + print("Packet received by the UPF is not ICMP\n") + return + + icmp = inner[ICMP] + + if icmp.type != 0: + return + + # print("\n=== Received Echo Reply ===") + # print("DL TEID:", gtp.teid) + # print(" From:", inner.src) + # print(" To:", inner.dst) + # print("ICMP ID:", icmp.id) + # print(" Seq:", icmp.seq) + # print("===========================\n") + + print("--------------> Your UPF works!") + +print("================================================") + +sniffer = AsyncSniffer( + iface=GNB_IFACE, + filter="udp port 2152", + prn=interface_capture +) + +sniffer.start() +print("Sniffer started") +time.sleep(1) + +# Send packet +send_echo_request() + +# Listen for reply +print("Waiting for reply...\n") + +time.sleep(10) +sniffer.stop() +print("Sniffer is torn down") +print("================================================") diff --git a/src/tests/p4-fabric-tna/topology/README.md b/src/tests/p4-topologies/topo-linux-ns/README.md similarity index 86% rename from src/tests/p4-fabric-tna/topology/README.md rename to src/tests/p4-topologies/topo-linux-ns/README.md index 30d4d84bcf2771bb9732e9686a680de0a643fa79..59c1eafef4678b06268b2d1b973cb06c65337470 100644 --- a/src/tests/p4-fabric-tna/topology/README.md +++ b/src/tests/p4-topologies/topo-linux-ns/README.md @@ -1,14 +1,14 @@ # P4 Topology -This directory contains scripts for deploying a single software-based Stratum switch on a VM or bare metal machine. +This directory contains scripts for deploying a single software-based Stratum switch on a Linux namespace. ## Prerequisites The machine on which Stratum will be deployed must have at least 3 network interfaces as follows: - a management interface for the switch to communicate with the control plane (i.e., TFS controller and INT collector) -- a west data plane interface towards a certain subnet (we call it edge subnet in this example) -- an est data plane interface towards another subnet (we call it corporate subnet in this example) +- a west data plane interface towards a certain subnet (we call it left subnet in this example) +- an east data plane interface towards another subnet (we call it right subnet in this example) Also, due to Stratum's restrictions, the desired OS of the machine shall be `Ubuntu server 20.04 LTS`. @@ -23,44 +23,42 @@ The two data plane interfaces of the VM need to be enclosed into this namespace, Follow the steps below to create the environment, deploy Stratum, and restore the VM to its previous state (cleanup). Prior to this take a look at the environment configuration file, where one can change the names of the interfaces, according to your network setup. -```shell +```bash nano p4-switch-conf-common.sh -HOST_IFACE_EXT="ens3" # Interface towards TFS (management) -SW_IFACE_DATA_EDGE="ens4" # Interface towards the edge subnet (data plane) -SW_IFACE_DATA_CORP="ens5" # Interface towards the corporate subnet (data plane) - -... +HOST_IFACE_EXT="ens3" # Interface towards the TFS controller (management) +SW_IFACE_DATA_LEFT="ens4" # Interface towards the left subnet (data plane) +SW_IFACE_DATA_RIGHT="ens5" # Interface towards the right subnet (data plane) ``` ### Step 1: Setup environment -Edit the `setup` script to modify the subnets' information according to your network setup: +Edit the `setup` script to modify the subnets information according to your network setup: -```shell +```bash nano p4-switch-setup.sh # Subnets managed by the switch -DOMAIN_EDGE_IP="10.158.72.0/24" # Left-hand side subnet -DOMAIN_CORP_IP="172.16.10.0/24" # Right-hand side subnet +DOMAIN_LEFT_IP="10.158.72.0/24" # Left-hand side subnet +DOMAIN_RIGHT_IP="172.16.10.0/24" # Right-hand side subnet ``` Once your network setup is applied, run the `setup` script as follows: -```shell +```bash sudo bash p4-switch-setup.sh ``` To verify that the switch namespace is in place, issue the following command: -```shell +```bash sudo ip netns exec ns-switch ip a ``` The output should show 4 network interfaces, i.e., a `loopback` interface, 2 data planes interfaces (e.g., `ens4`, `ens5` in this example), and a virtual interface for sending telemetry data out of the switch (i.e., `veth-int-sw` in this example). From this latter interface you can ping towards the other end of the virtual interface pair (i.e., `veth-int-host`): -```shell +```bash sudo ip netns exec ns-switch ping 10.0.0.254 ``` @@ -76,7 +74,7 @@ First you need to configure the chassis configuration file with the correct netw To do so, modify the `name` field changing `ens4`, `ens5`, and `ens3` to your desired interfaces. These interface names must agree with the ones you added in `p4-switch-conf-common.sh`. -```shell +```bash cat p4-switch-three-port-chassis-config-phy.pb.txt # Copyright 2018-present Open Networking Foundation @@ -132,13 +130,13 @@ singleton_ports { To deploy Stratum, do: -```shell +```bash sudo bash run-stratum.sh ``` To run Stratum will verbose logging, open the `run-stratum.sh` and change: -```shell +```bash LOG_LEVEL="debug" ``` @@ -161,6 +159,6 @@ To verify that Stratum has been correctly deployed, you should see the following When your tests with Stratum and TFS are over, you may want to restore your setup. To do so, execute the following script: -```shell +```bash sudo bash p4-switch-tear-down.sh ``` diff --git a/src/tests/p4-fabric-tna/topology/p4-switch-conf-common.sh b/src/tests/p4-topologies/topo-linux-ns/p4-switch-conf-common.sh similarity index 84% rename from src/tests/p4-fabric-tna/topology/p4-switch-conf-common.sh rename to src/tests/p4-topologies/topo-linux-ns/p4-switch-conf-common.sh index 25da8c4547aa94521fda416db99924d2fa5eb17b..047fa140308351c201638945513ddf0819c99ce2 100644 --- a/src/tests/p4-fabric-tna/topology/p4-switch-conf-common.sh +++ b/src/tests/p4-topologies/topo-linux-ns/p4-switch-conf-common.sh @@ -17,9 +17,9 @@ SWITCH_NS="ns-switch" # Physical interfaces -HOST_IFACE_EXT="ens3" # Interface towards TFS (management) -SW_IFACE_DATA_EDGE="ens4" # Interface towards the edge subnet (data plane) -SW_IFACE_DATA_CORP="ens5" # Interface towards the corporate subnet (data plane) +HOST_IFACE_EXT="ens3" # Interface towards TFS (management) +SW_IFACE_DATA_LEFT="ens4" # Interface towards the edge subnet (data plane) +SW_IFACE_DATA_RIGHT="ens5" # Interface towards the corporate subnet (data plane) # Virtual interfaces for INT SW_IFACE_INT="veth-int-sw" diff --git a/src/tests/p4-fabric-tna/topology/p4-switch-setup.sh b/src/tests/p4-topologies/topo-linux-ns/p4-switch-setup.sh similarity index 83% rename from src/tests/p4-fabric-tna/topology/p4-switch-setup.sh rename to src/tests/p4-topologies/topo-linux-ns/p4-switch-setup.sh index 402e54aebe613070f784a3d0eda51d5c6cfc9499..c0f31c9fc3bdbc88c343e91641118cd13f113350 100644 --- a/src/tests/p4-fabric-tna/topology/p4-switch-setup.sh +++ b/src/tests/p4-topologies/topo-linux-ns/p4-switch-setup.sh @@ -33,8 +33,8 @@ SWITCH_INT_IP_NET=${SWITCH_INT_IP}"/24" HOST_INT_IP_NET=${HOST_INT_IP}"/24" # Subnets managed by the switch -DOMAIN_EDGE_IP="10.158.72.22/24" # Edge domain side IP address -DOMAIN_CORP_IP="172.16.10.4/24" # Corporate domain side IP address +DOMAIN_LEFT_IP="10.158.72.22/24" # Left domain's IP address range +DOMAIN_RIGHT_IP="172.16.10.4/24" # Rigth domain's IP address range # INT subnet MTU MTU_LEN=9000 @@ -52,8 +52,8 @@ create_virtual_interfaces() { } assign_virtual_interfaces() { - ip link set ${SW_IFACE_DATA_EDGE} netns ${SWITCH_NS} - ip link set ${SW_IFACE_DATA_CORP} netns ${SWITCH_NS} + ip link set ${SW_IFACE_DATA_LEFT} netns ${SWITCH_NS} + ip link set ${SW_IFACE_DATA_RIGHT} netns ${SWITCH_NS} ip link set ${SW_IFACE_INT} netns ${SWITCH_NS} } @@ -68,22 +68,22 @@ set_mtu() { } set_ip_addresses() { - ip -n ${SWITCH_NS} addr add ${DOMAIN_EDGE_IP} dev ${SW_IFACE_DATA_EDGE} - ip -n ${SWITCH_NS} addr add ${DOMAIN_CORP_IP} dev ${SW_IFACE_DATA_CORP} + ip -n ${SWITCH_NS} addr add ${DOMAIN_LEFT_IP} dev ${SW_IFACE_DATA_LEFT} + ip -n ${SWITCH_NS} addr add ${DOMAIN_RIGHT_IP} dev ${SW_IFACE_DATA_RIGHT} ip -n ${SWITCH_NS} addr add ${SWITCH_INT_IP_NET} dev ${SW_IFACE_INT} ifconfig ${HOST_IFACE_INT} ${HOST_INT_IP_NET} } bring_interfaces_up() { - ip -n ${SWITCH_NS} link set ${SW_IFACE_DATA_EDGE} up - ip -n ${SWITCH_NS} link set ${SW_IFACE_DATA_CORP} up + ip -n ${SWITCH_NS} link set ${SW_IFACE_DATA_LEFT} up + ip -n ${SWITCH_NS} link set ${SW_IFACE_DATA_RIGHT} up ip -n ${SWITCH_NS} link set ${SW_IFACE_INT} up ifconfig ${HOST_IFACE_INT} up } disable_csum_offloading() { - ip netns exec ${SWITCH_NS} ethtool -K ${SW_IFACE_DATA_EDGE} rx off tx off - ip netns exec ${SWITCH_NS} ethtool -K ${SW_IFACE_DATA_CORP} rx off tx off + ip netns exec ${SWITCH_NS} ethtool -K ${SW_IFACE_DATA_LEFT} rx off tx off + ip netns exec ${SWITCH_NS} ethtool -K ${SW_IFACE_DATA_RIGHT} rx off tx off } switch_default_gw() { diff --git a/src/tests/p4-fabric-tna/topology/p4-switch-tear-down.sh b/src/tests/p4-topologies/topo-linux-ns/p4-switch-tear-down.sh similarity index 96% rename from src/tests/p4-fabric-tna/topology/p4-switch-tear-down.sh rename to src/tests/p4-topologies/topo-linux-ns/p4-switch-tear-down.sh index 1d902319b09326aa9eb0c8c03c6b87ccc29dac65..e1714f6140f93a26dc2db61a6da51dfb99b11adf 100644 --- a/src/tests/p4-fabric-tna/topology/p4-switch-tear-down.sh +++ b/src/tests/p4-topologies/topo-linux-ns/p4-switch-tear-down.sh @@ -34,8 +34,8 @@ delete_namespaces() { } bring_interfaces_up() { - ifconfig ${SW_IFACE_DATA_EDGE} up - ifconfig ${SW_IFACE_DATA_CORP} up + ifconfig ${SW_IFACE_DATA_LEFT} up + ifconfig ${SW_IFACE_DATA_RIGHT} up } cleanup_iptables() { diff --git a/src/tests/p4-fabric-tna/topology/p4-switch-three-port-chassis-config-phy.pb.txt b/src/tests/p4-topologies/topo-linux-ns/p4-switch-three-port-chassis-config-phy.pb.txt similarity index 100% rename from src/tests/p4-fabric-tna/topology/p4-switch-three-port-chassis-config-phy.pb.txt rename to src/tests/p4-topologies/topo-linux-ns/p4-switch-three-port-chassis-config-phy.pb.txt diff --git a/src/tests/p4-fabric-tna/topology/run-stratum.sh b/src/tests/p4-topologies/topo-linux-ns/run-stratum.sh similarity index 100% rename from src/tests/p4-fabric-tna/topology/run-stratum.sh rename to src/tests/p4-topologies/topo-linux-ns/run-stratum.sh diff --git a/src/tests/p4-topologies/topo-mininet/1switch1path-int.py b/src/tests/p4-topologies/topo-mininet/1switch1path-int.py new file mode 100755 index 0000000000000000000000000000000000000000..833d828403719e96109bbd80591260c61f97121e --- /dev/null +++ b/src/tests/p4-topologies/topo-mininet/1switch1path-int.py @@ -0,0 +1,78 @@ +### +# Option 1: Execute via mininet's binary +# > sudo mn --custom 1switch1path-int.py --switch stratum-bmv2-int --topo oneswitchtopoint --link tc --controller none +# In this case, set the correct value to the DEF_HOST_INT_IFACE variable, as this is passed to the Mininet topology as an input argument. + +# Option 2: Execute natively +# > sudo python3 1switch1path-int.py --host-int-iface=eth0 +# In this case, you may pass the variable as an argument +### + +import argparse + +from mininet.cli import CLI +from mininet.link import TCLink +from mininet.log import setLogLevel, info +from mininet.net import Mininet +from mininet.node import IPv4Host +from mininet.topo import Topo +from mininet.util import interfaceExists +from mininet.stratum import StratumBmv2SwitchINT + +CLIENT_NAME = "client" +SERVER_NAME = "server" + +SW_NAME = "sw1" +SW_PORT = 50001 + +CPU_PORT = 255 + +HOST_INT_IFACE = "" +DEF_HOST_INT_IFACE = "eth0" + +class OneSwitchTopoINT(Topo): + """1-switch topology with 2x IPv4 hosts and switch NB interface for INT""" + + def __init__(self, *args, **kwargs): + Topo.__init__(self, *args, **kwargs) + + iface = args[0] + assert iface, "INT-based Stratum topology requires a network interface name towards the collector" + assert interfaceExists(iface), "External host interface (towards collector) for INT does not exist" + + # Switches + info("*** Adding Stratum-based BMv2 switches\n") + sw1 = self.addSwitch(SW_NAME, cls=StratumBmv2SwitchINT, grpcPort=SW_PORT, cpuport=CPU_PORT, hostINTIfaceName=iface) + + # Hosts + info("*** Adding hosts\n") + client = self.addHost(CLIENT_NAME, cls=IPv4Host) + server = self.addHost(SERVER_NAME, cls=IPv4Host) + + # Host links + info("*** Creating links\n") + self.addLink(client, sw1, cls=TCLink) # Switch 1: port 1 + self.addLink(server, sw1, cls=TCLink) # Switch 1: port 2 + +def setup_topology(host_int_iface): + net = Mininet(topo=OneSwitchTopoINT(host_int_iface), link=TCLink, controller=None, autoSetMacs=True, autoStaticArp=True) + + info("*** Starting network\n") + net.start() + + CLI(net) + net.stop() + +if __name__ == "__main__": + setLogLevel('info') + + parser = argparse.ArgumentParser( + description='Mininet topology script for a 1-switch fabric with INT-enabled stratum_bmv2 and 2x IPv4 hosts') + parser.add_argument("--host-int-iface", type=str, default=DEF_HOST_INT_IFACE, help="Host network interface towards INT collector") + args = parser.parse_args() + + host_int_iface = args.host_int_iface + setup_topology(host_int_iface) + +# Required by mn to call this custom topology +topos = { 'oneswitchtopoint': ( lambda: OneSwitchTopoINT(DEF_HOST_INT_IFACE) ) } diff --git a/src/tests/p4-topologies/topo-mininet/1switch1path.py b/src/tests/p4-topologies/topo-mininet/1switch1path.py new file mode 100755 index 0000000000000000000000000000000000000000..24a2704cb9b659cbd69cfde571df041f1d9051db --- /dev/null +++ b/src/tests/p4-topologies/topo-mininet/1switch1path.py @@ -0,0 +1,65 @@ +### +# Execute: sudo mn --custom 1switch1path.py --switch stratum-bmv2 --topo oneswitchtopo --link tc --controller none +# Execute: sudo python3 1switch1path.py +### + +import argparse + +from mininet.cli import CLI +from mininet.link import TCLink +from mininet.log import setLogLevel, info +from mininet.net import Mininet +from mininet.node import IPv4Host +from mininet.topo import Topo +from mininet.stratum import StratumBmv2Switch + +CLIENT_NAME = "client" +SERVER_NAME = "server" + +SW_NAME = "sw1" +SW_PORT = 50001 + +CPU_PORT = 255 + +HOST_INT_IFACE = "" + +class OneSwitchTopo(Topo): + """1-switch topology with 2x IPv4 hosts""" + + def __init__(self, *args, **kwargs): + Topo.__init__(self, *args, **kwargs) + + # Switches + info("*** Adding Stratum-based BMv2 switches\n") + sw1 = self.addSwitch(SW_NAME, cls=StratumBmv2Switch, grpcPort=SW_PORT, cpuport=CPU_PORT) + + # Hosts + info("*** Adding hosts\n") + client = self.addHost(CLIENT_NAME, cls=IPv4Host) + server = self.addHost(SERVER_NAME, cls=IPv4Host) + + # Host links + info("*** Creating links\n") + self.addLink(client, sw1, cls=TCLink) # Switch 1: port 1 + self.addLink(server, sw1, cls=TCLink) # Switch 1: port 2 + +def setup_topology(): + net = Mininet(topo=OneSwitchTopo(), link=TCLink, controller=None, autoSetMacs=True, autoStaticArp=True) + + info("*** Starting network\n") + net.start() + + CLI(net) + net.stop() + +if __name__ == "__main__": + setLogLevel('info') + + parser = argparse.ArgumentParser( + description='Mininet topology script for a 1-switch Stratum BMv2 fabric and 2x IPv4 hosts') + args = parser.parse_args() + + setup_topology() + +# Required by mn to call this custom topology +topos = { 'oneswitchtopo': ( lambda: OneSwitchTopo() ) } diff --git a/src/tests/p4-topologies/topo-mininet/3switch1path-int.py b/src/tests/p4-topologies/topo-mininet/3switch1path-int.py new file mode 100755 index 0000000000000000000000000000000000000000..cc3f55fbed9d19d445ff562ea677d4a591ce0a53 --- /dev/null +++ b/src/tests/p4-topologies/topo-mininet/3switch1path-int.py @@ -0,0 +1,89 @@ +### +# Option 1: Execute via mininet's binary +# > sudo mn --custom 3switch1path-int.py --switch stratum-bmv2-int --topo threeswitchtopoint --link tc --controller none +# In this case, set the correct value to the DEF_HOST_INT_IFACE variable, as this is passed to the Mininet topology as an input argument. + +# Option 2: Execute natively +# > sudo python3 3switch1path-int.py --host-int-iface=eth0 +# In this case, you may pass the variable as an argument +### + +import argparse + +from mininet.cli import CLI +from mininet.link import TCLink +from mininet.log import setLogLevel, info +from mininet.net import Mininet +from mininet.node import IPv4Host +from mininet.topo import Topo +from mininet.util import interfaceExists +from mininet.stratum import StratumBmv2SwitchINT + +CLIENT_NAME = "client" +SERVER_NAME = "server" + +SW1_NAME = "sw1" +SW1_PORT = 50001 + +SW2_NAME = "sw2" +SW2_PORT = 50002 + +SW3_NAME = "sw3" +SW3_PORT = 50003 + +CPU_PORT = 255 + +DEF_HOST_INT_IFACE = "eth0" + +class ThreeSwitchTopoINT(Topo): + """3-switch topology with 2x IPv4 hosts and switch NB interface for INT""" + + def __init__(self, *args, **kwargs): + Topo.__init__(self, *args, **kwargs) + + iface = args[0] + assert iface, "INT-based Stratum topology requires a network interface name towards the collector" + assert interfaceExists(iface), "External host interface (towards collector) for INT does not exist" + + # Switches + info("*** Adding Stratum-based BMv2 switches\n") + sw1 = self.addSwitch(SW1_NAME, cls=StratumBmv2SwitchINT, grpcPort=SW1_PORT, cpuport=CPU_PORT, hostINTIfaceName=iface) + sw2 = self.addSwitch(SW2_NAME, cls=StratumBmv2SwitchINT, grpcPort=SW2_PORT, cpuport=CPU_PORT, hostINTIfaceName=iface) + sw3 = self.addSwitch(SW3_NAME, cls=StratumBmv2SwitchINT, grpcPort=SW3_PORT, cpuport=CPU_PORT, hostINTIfaceName=iface) + + # Hosts + info("*** Adding hosts\n") + client = self.addHost(CLIENT_NAME, cls=IPv4Host) + server = self.addHost(SERVER_NAME, cls=IPv4Host) + + # Switch links + info("*** Creating links\n") + self.addLink(sw1, sw2, cls=TCLink) # Switch1:port 1, Switch2:port 1 + self.addLink(sw2, sw3, cls=TCLink) # Switch2:port 2, Switch3:port 1 + + # Host links + self.addLink(client, sw1, cls=TCLink) # Switch 1: port 2 + self.addLink(server, sw3, cls=TCLink) # Switch 3: port 2 + +def setup_topology(host_int_iface): + net = Mininet(topo=ThreeSwitchTopoINT(host_int_iface), link=TCLink, controller=None, autoSetMacs=True, autoStaticArp=True) + + info("*** Starting network\n") + net.start() + + CLI(net) + net.stop() + +if __name__ == "__main__": + setLogLevel('info') + + parser = argparse.ArgumentParser( + description='Mininet topology script for a 1-switch fabric with INT-enabled stratum_bmv2 and 2x IPv4 hosts') + parser.add_argument("--host-int-iface", type=str, default=DEF_HOST_INT_IFACE, help="Host network interface towards INT collector") + args = parser.parse_args() + + host_int_iface = args.host_int_iface + setup_topology(host_int_iface) + +# Required by mn to call this custom topology +topos = { 'threeswitchtopoint': ( lambda: ThreeSwitchTopoINT(DEF_HOST_INT_IFACE) ) } diff --git a/src/tests/p4-topologies/topo-mininet/5switch3path-int.py b/src/tests/p4-topologies/topo-mininet/5switch3path-int.py new file mode 100755 index 0000000000000000000000000000000000000000..862bc5223c70915c42f76ece8fc24648d3b1a3b6 --- /dev/null +++ b/src/tests/p4-topologies/topo-mininet/5switch3path-int.py @@ -0,0 +1,102 @@ +### +# Option 1: Execute via mininet's binary +# > sudo mn --custom 5switch3path-int.py --switch stratum-bmv2-int --topo fiveswitchtopoint --link tc --controller none +# In this case, set the correct value to the DEF_HOST_INT_IFACE variable, as this is passed to the Mininet topology as an input argument. + +# Option 2: Execute natively +# > sudo python3 5switch3path-int.py --host-int-iface=eth0 +# In this case, you may pass the variable as an argument +### + +import argparse + +from mininet.cli import CLI +from mininet.link import TCLink +from mininet.log import setLogLevel, info +from mininet.net import Mininet +from mininet.node import IPv4Host +from mininet.topo import Topo +from mininet.util import interfaceExists +from mininet.stratum import StratumBmv2SwitchINT + +CLIENT_NAME = "client" +SERVER_NAME = "server" + +SW1_NAME = "sw1" +SW1_PORT = 50001 + +SW2_NAME = "sw2" +SW2_PORT = 50002 + +SW3_NAME = "sw3" +SW3_PORT = 50003 + +SW4_NAME = "sw4" +SW4_PORT = 50004 + +SW5_NAME = "sw5" +SW5_PORT = 50005 + +CPU_PORT = 255 + +DEF_HOST_INT_IFACE = "eth0" + +class FiveSwitchTopoINT(Topo): + """5-switch topology with 2x IPv4 hosts and switch NB interface for INT""" + + def __init__(self, *args, **kwargs): + Topo.__init__(self, *args, **kwargs) + + iface = args[0] + assert iface, "INT-based Stratum topology requires a network interface name towards the collector" + assert interfaceExists(iface), "External host interface (towards collector) for INT does not exist" + + # Switches + info("*** Adding Stratum-based BMv2 switches\n") + sw1 = self.addSwitch(SW1_NAME, cls=StratumBmv2SwitchINT, grpcPort=SW1_PORT, cpuport=CPU_PORT, hostINTIfaceName=iface) + sw2 = self.addSwitch(SW2_NAME, cls=StratumBmv2SwitchINT, grpcPort=SW2_PORT, cpuport=CPU_PORT, hostINTIfaceName=iface) + sw3 = self.addSwitch(SW3_NAME, cls=StratumBmv2SwitchINT, grpcPort=SW3_PORT, cpuport=CPU_PORT, hostINTIfaceName=iface) + sw4 = self.addSwitch(SW4_NAME, cls=StratumBmv2SwitchINT, grpcPort=SW4_PORT, cpuport=CPU_PORT, hostINTIfaceName=iface) + sw5 = self.addSwitch(SW5_NAME, cls=StratumBmv2SwitchINT, grpcPort=SW5_PORT, cpuport=CPU_PORT, hostINTIfaceName=iface) + + # Hosts + info("*** Adding hosts\n") + client = self.addHost(CLIENT_NAME, cls=IPv4Host) + server = self.addHost(SERVER_NAME, cls=IPv4Host) + + # Switch links + info("*** Creating links\n") + self.addLink(sw1, sw2, cls=TCLink) # Switch1:port 1, Switch2:port 1 + self.addLink(sw1, sw3, cls=TCLink) # Switch1:port 2, Switch3:port 1 + self.addLink(sw1, sw4, cls=TCLink) # Switch1:port 3, Switch4:port 1 + + self.addLink(sw2, sw5, cls=TCLink) # Switch2:port 2, Switch5:port 1 + self.addLink(sw3, sw5, cls=TCLink) # Switch3:port 2, Switch5:port 2 + self.addLink(sw4, sw5, cls=TCLink) # Switch4:port 2, Switch5:port 3 + + # Host links + self.addLink(client, sw1, cls=TCLink) # Switch 1: port 4 + self.addLink(server, sw5, cls=TCLink) # Switch 5: port 4 + +def setup_topology(host_int_iface): + net = Mininet(topo=FiveSwitchTopoINT(host_int_iface), link=TCLink, controller=None, autoSetMacs=True, autoStaticArp=True) + + info("*** Starting network\n") + net.start() + + CLI(net) + net.stop() + +if __name__ == "__main__": + setLogLevel('info') + + parser = argparse.ArgumentParser( + description='Mininet topology script for a 1-switch fabric with INT-enabled stratum_bmv2 and 2x IPv4 hosts') + parser.add_argument("--host-int-iface", type=str, default=DEF_HOST_INT_IFACE, help="Host network interface towards INT collector") + args = parser.parse_args() + + host_int_iface = args.host_int_iface + setup_topology(host_int_iface) + +# Required by mn to call this custom topology +topos = { 'fiveswitchtopoint': ( lambda: FiveSwitchTopoINT(DEF_HOST_INT_IFACE) ) } diff --git a/src/tests/qkd_end2end/tests/test_01_onboarding.py b/src/tests/qkd_end2end/tests/test_01_onboarding.py index e609856e72fdc8e391b15be5d99319aaece2b98f..55c6f79b216c5bfddb8dbfe8c7a494959e852085 100644 --- a/src/tests/qkd_end2end/tests/test_01_onboarding.py +++ b/src/tests/qkd_end2end/tests/test_01_onboarding.py @@ -13,13 +13,21 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from .Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/qkd_end2end/tests/test_02_create_links.py b/src/tests/qkd_end2end/tests/test_02_create_links.py index 4d7587cf3bfd4026b14f7814f0e52b11df1fa019..757326389d40578d0c8a9a743b64eb8254927dc8 100644 --- a/src/tests/qkd_end2end/tests/test_02_create_links.py +++ b/src/tests/qkd_end2end/tests/test_02_create_links.py @@ -13,20 +13,25 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, Empty, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, Empty, ServiceStatusEnum, ServiceTypeEnum, +) from common.proto.qkd_app_pb2 import QKDAppStatusEnum, QKDAppTypesEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from qkd_app.client.QKDAppClient import QKDAppClient from service.client.ServiceClient import ServiceClient -from .Fixtures import ( # pylint: disable=unused-import - context_client, device_client, service_client, qkd_app_client -) +from .Fixtures import ( + context_client, device_client, qkd_app_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/qkd_end2end/tests/test_03_create_external_app.py b/src/tests/qkd_end2end/tests/test_03_create_external_app.py index f9efd8aba71057c7b99288afb9821dc11f0d74fa..e51009f7e08d582700eb4fa71ad63b02e403f260 100644 --- a/src/tests/qkd_end2end/tests/test_03_create_external_app.py +++ b/src/tests/qkd_end2end/tests/test_03_create_external_app.py @@ -14,6 +14,7 @@ import json, logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId from common.proto.qkd_app_pb2 import QKDAppStatusEnum, QKDAppTypesEnum @@ -21,9 +22,11 @@ from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from qkd_app.client.QKDAppClient import QKDAppClient -from .Fixtures import context_client, qkd_app_client # pylint: disable=unused-import -from .Tools import do_rest_post_request +from .Fixtures import ( + context_client, qkd_app_client, +) # pylint: disable=unused-import +from .Tools import do_rest_post_request LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/qkd_end2end/tests/test_04_delete_external_app.py b/src/tests/qkd_end2end/tests/test_04_delete_external_app.py index f352498a8e52bc8a321cae0f3a0b15986a50550f..c38740a24444b81bce7aaa951149576f731b9043 100644 --- a/src/tests/qkd_end2end/tests/test_04_delete_external_app.py +++ b/src/tests/qkd_end2end/tests/test_04_delete_external_app.py @@ -14,6 +14,7 @@ import logging from typing import Set + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId from common.proto.qkd_app_pb2 import AppId, QKDAppStatusEnum, QKDAppTypesEnum @@ -21,8 +22,10 @@ from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from qkd_app.client.QKDAppClient import QKDAppClient -from .Fixtures import context_client, qkd_app_client # pylint: disable=unused-import +from .Fixtures import ( + context_client, qkd_app_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/qkd_end2end/tests/test_05_delete_links.py b/src/tests/qkd_end2end/tests/test_05_delete_links.py index 07a85963d11ba2e9d6f6b641942ff3d08258dad3..5613a942bcd607cf965c73a7f431f56bc8835e9a 100644 --- a/src/tests/qkd_end2end/tests/test_05_delete_links.py +++ b/src/tests/qkd_end2end/tests/test_05_delete_links.py @@ -14,6 +14,7 @@ import logging from typing import Set + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, ServiceId from common.proto.qkd_app_pb2 import AppId, QKDAppStatusEnum, QKDAppTypesEnum @@ -22,11 +23,10 @@ from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from qkd_app.client.QKDAppClient import QKDAppClient from service.client.ServiceClient import ServiceClient -from .Fixtures import ( - # pylint: disable=unused-import - context_client, qkd_app_client, service_client -) +from .Fixtures import ( + context_client, qkd_app_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/qkd_end2end/tests/test_06_cleanup.py b/src/tests/qkd_end2end/tests/test_06_cleanup.py index e3c770e7a5e6be012e3311135b6346992eba9939..f99486388c27eb1c2548274b594926b4069cac87 100644 --- a/src/tests/qkd_end2end/tests/test_06_cleanup.py +++ b/src/tests/qkd_end2end/tests/test_06_cleanup.py @@ -13,13 +13,19 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from .Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 42d59538446edd47c1ea16bd202e183d9d8c4c14..0002ff6f57fe66bf2d4eef470e3b65347454a206 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -14,6 +14,7 @@ # Build, tag, and push the Docker image to the GitLab Docker registry build ryu-openflow: + timeout: 20m variables: TEST_NAME: 'ryu-openflow' IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' @@ -21,258 +22,426 @@ build ryu-openflow: before_script: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - docker ps -aq | xargs -r docker rm -f - - containerlab destroy --all --cleanup || true script: - - echo "CI_PIPELINE_SOURCE = $CI_PIPELINE_SOURCE" - - echo "CI_MERGE_REQUEST_ID = $CI_MERGE_REQUEST_ID" - - echo "CI_MERGE_REQUEST_IID = $CI_MERGE_REQUEST_IID" + # Build Ryu container - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-ryu:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/Ryu.Dockerfile . - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}-ryu:${IMAGE_TAG}" + + # Build Mininet container + - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-mininet:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/mininet/Mininet.Dockerfile . + - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}-mininet:${IMAGE_TAG}" + + # Build test container - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-test:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/Test.Dockerfile . - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}-test:${IMAGE_TAG}" after_script: - - docker images --filter="dangling=true" --quiet | xargs -r docker rmi + - 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"' + #- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' - changes: - src/common/**/*.py - proto/*.proto - src/tests/${TEST_NAME}/**/*.{py,in,sh,yml} - - src/tests/${TEST_NAME}/Dockerfile + - src/tests/${TEST_NAME}/*.Dockerfile - .gitlab-ci.yml +# Deploy TeraFlowSDN and Execute end-2-end test +end2end_test ryu-openflow: + timeout: 45m + variables: + TEST_NAME: 'ryu-openflow' + IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' + stage: end2end_test + # Disable to force running it after all other tasks + #needs: + # - build ryu-openflow + before_script: + # Do Docker cleanup + - docker ps --all --quiet | xargs --no-run-if-empty docker stop + - docker container prune --force + - docker ps --all --quiet | xargs --no-run-if-empty docker rm --force + - docker image prune --force + - docker network prune --force + - docker volume prune --all --force + - docker buildx prune --force -# - docker rm -f na-t1 na-t2 na-r1 na-r2 -# - docker network rm -f na-br -# -# - > -# docker network create -d bridge --subnet=172.254.253.0/24 --gateway=172.254.253.254 -# --ip-range=172.254.253.0/24 na-br -# - > -# docker run -dit --init --name na-t1 --network=na-br --ip 172.254.253.101 -# --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-tp.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" -# --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_t1.xml:/confd/examples.confd/OC23/platform.xml" -# asgamb1/oc23bgp.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh - - -## Deploy TeraFlowSDN and Execute end-2-end test -#end2end_test ryu-openflow: -# timeout: 90m -# variables: -# TEST_NAME: 'ryu-openflow' -# stage: end2end_test -# # Disable to force running it after all other tasks -# #needs: -# # - build ryu-openflow -# before_script: -# - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY -# - docker ps -aq | xargs -r docker rm -f -# - containerlab destroy --all --cleanup || true -# script: -# # Download Docker image to run the test -# - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}:latest" -# -# # Check MicroK8s is ready -# - microk8s status --wait-ready -# - kubectl get pods --all-namespaces -# -# # Deploy ContainerLab Scenario -# - RUNNER_PATH=`pwd` -# #- cd $PWD/src/tests/${TEST_NAME} -# - mkdir -p /tmp/clab/${TEST_NAME} -# - cp -R src/tests/${TEST_NAME}/clab/* /tmp/clab/${TEST_NAME} -# - tree -la /tmp/clab/${TEST_NAME} -# - cd /tmp/clab/${TEST_NAME} -# - containerlab deploy --reconfigure --topo ryu-openflow.clab.yml -# - cd $RUNNER_PATH -# -# # Wait for initialization of Device NOSes -# - sleep 3 -# - docker ps -a -# -# # Dump configuration of the routers (before any configuration) -# - containerlab exec --name ryu-openflow --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# -# # Configure TeraFlowSDN deployment -# # Uncomment if DEBUG log level is needed for the components -# #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/contextservice.yaml -# #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/deviceservice.yaml -# #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="frontend").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/pathcompservice.yaml -# #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/serviceservice.yaml -# #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/nbiservice.yaml -# #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/monitoringservice.yaml -# -# - source src/tests/${TEST_NAME}/deploy_specs.sh -# #- export TFS_REGISTRY_IMAGES="${CI_REGISTRY_IMAGE}" -# #- export TFS_SKIP_BUILD="YES" -# #- export TFS_IMAGE_TAG="latest" -# #- echo "TFS_REGISTRY_IMAGES=${CI_REGISTRY_IMAGE}" -# -# # Deploy TeraFlowSDN -# - ./deploy/crdb.sh -# - ./deploy/nats.sh -# - ./deploy/kafka.sh -# - ./deploy/qdb.sh -# - ./deploy/tfs.sh -# - ./deploy/show.sh -# -# ## Wait for Context to be subscribed to NATS -# ## WARNING: this loop is infinite if there is no subscriber (such as monitoring). -# ## Investigate if we can use a counter to limit the number of iterations. -# ## For now, keep it commented out. -# #- LOOP_MAX_ATTEMPTS=180 -# #- LOOP_COUNTER=0 -# #- > -# # while ! kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server 2>&1 | grep -q 'Subscriber is Ready? True'; do -# # echo "Attempt: $LOOP_COUNTER" -# # kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server 2>&1; -# # sleep 1; -# # LOOP_COUNTER=$((LOOP_COUNTER + 1)) -# # if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then -# # echo "Max attempts reached, exiting the loop." -# # break -# # fi -# # done -# - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server -# -# # Run end-to-end test: onboard scenario -# - > -# docker run -t --rm --name ${TEST_NAME} --network=host -# --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" -# --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" -# $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-onboarding.sh -# -# # Run end-to-end test: configure service TFS -# - > -# docker run -t --rm --name ${TEST_NAME} --network=host -# --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" -# --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" -# $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-tfs-create.sh -# -# # Dump configuration of the routers (after configure TFS service) -# - containerlab exec --name ryu-openflow --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# -# # Run end-to-end test: test connectivity with ping -# - export TEST1_10=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.10' --format json) -# - echo $TEST1_10 -# - echo $TEST1_10 | grep -E '3 packets transmitted, 3 received, 0\% packet loss' -# - export TEST1_1=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.1' --format json) -# - echo $TEST1_1 -# - echo $TEST1_1 | grep -E '3 packets transmitted, 3 received, 0\% packet loss' -# - export TEST2_1=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.2.1' --format json) -# - echo $TEST2_1 -# - echo $TEST2_1 | grep -E '3 packets transmitted, 3 received, 0\% packet loss' -# - export TEST2_10=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.2.10' --format json) -# - echo $TEST2_10 -# - echo $TEST2_10 | grep -E '3 packets transmitted, 3 received, 0\% packet loss' -# - export TEST3_1=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.3.1' --format json) -# - echo $TEST3_1 -# - echo $TEST3_1 | grep -E '3 packets transmitted, 0 received, 100\% packet loss' -# - export TEST3_10=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.3.10' --format json) -# - echo $TEST3_10 -# - echo $TEST3_10 | grep -E '3 packets transmitted, 0 received, 100\% packet loss' -# -# # Run end-to-end test: deconfigure service TFS -# - > -# docker run -t --rm --name ${TEST_NAME} --network=host -# --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" -# --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" -# $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-tfs-remove.sh -# -# # Dump configuration of the routers (after deconfigure TFS service) -# - containerlab exec --name ryu-openflow --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# -# # Run end-to-end test: configure service IETF -# - > -# docker run -t --rm --name ${TEST_NAME} --network=host -# --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" -# --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" -# $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-ietf-create.sh -# -# # Dump configuration of the routers (after configure IETF service) -# - containerlab exec --name ryu-openflow --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# -# # Run end-to-end test: test connectivity with ping -# - export TEST1_10=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.10' --format json) -# - echo $TEST1_10 -# - echo $TEST1_10 | grep -E '3 packets transmitted, 3 received, 0\% packet loss' -# - export TEST1_1=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.1' --format json) -# - echo $TEST1_1 -# - echo $TEST1_1 | grep -E '3 packets transmitted, 3 received, 0\% packet loss' -# - export TEST2_1=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.2.1' --format json) -# - echo $TEST2_1 -# - echo $TEST2_1 | grep -E '3 packets transmitted, 3 received, 0\% packet loss' -# - export TEST2_10=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.2.10' --format json) -# - echo $TEST2_10 -# - echo $TEST2_10 | grep -E '3 packets transmitted, 3 received, 0\% packet loss' -# - export TEST3_1=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.3.1' --format json) -# - echo $TEST3_1 -# - echo $TEST3_1 | grep -E '3 packets transmitted, 0 received, 100\% packet loss' -# - export TEST3_10=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.3.10' --format json) -# - echo $TEST3_10 -# - echo $TEST3_10 | grep -E '3 packets transmitted, 0 received, 100\% packet loss' -# -# # Run end-to-end test: deconfigure service IETF -# - > -# docker run -t --rm --name ${TEST_NAME} --network=host -# --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" -# --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" -# $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-ietf-remove.sh -# -# # Dump configuration of the routers (after deconfigure IETF service) -# - containerlab exec --name ryu-openflow --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# -# # Run end-to-end test: cleanup scenario -# - > -# docker run -t --rm --name ${TEST_NAME} --network=host -# --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" -# --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" -# $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-cleanup.sh -# -# after_script: -# # Dump configuration of the routers (on after_script) -# - containerlab exec --name ryu-openflow --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# -# # Dump TeraFlowSDN component logs -# - source src/tests/${TEST_NAME}/deploy_specs.sh -# - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server -# - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/deviceservice -c server -# - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/pathcompservice -c frontend -# - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/serviceservice -c server -# - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/nbiservice -c server -# #- kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/monitoringservice -c server -# -# # Destroy Scenario -# - docker rm -f ${TEST_NAME} || true -# - RUNNER_PATH=`pwd` -# #- cd $PWD/src/tests/${TEST_NAME} -# - cd /tmp/clab/${TEST_NAME} -# - containerlab destroy --topo ryu-openflow.clab.yml --cleanup || true -# - sudo rm -rf clab-ryu-openflow/ .ryu-openflow.clab.yml.bak || true -# - cd $RUNNER_PATH -# - kubectl delete namespaces tfs || true -# -# # Clean old docker images -# - docker images --filter="dangling=true" --quiet | xargs -r docker rmi -# -# #coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' -# rules: -# - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' -# - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' -# artifacts: -# when: always -# reports: -# junit: ./src/tests/${TEST_NAME}/report_*.xml + # Check MicroK8s is ready + - microk8s status --wait-ready + - LOOP_MAX_ATTEMPTS=10 + - LOOP_COUNTER=0 + - > + while ! kubectl get pods --all-namespaces &> /dev/null; do + printf "%c" "." + sleep 1 + LOOP_COUNTER=$((LOOP_COUNTER + 1)) + if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then + echo "Max attempts reached, exiting the loop." + exit 1 + fi + done + - kubectl get pods --all-namespaces + + # Always delete Kubernetes namespaces + - export K8S_NAMESPACES=$(kubectl get namespace -o jsonpath='{.items[*].metadata.name}') + - echo "K8S_NAMESPACES=${K8S_NAMESPACES}" + + - export OLD_NATS_NAMESPACES=$(echo "${K8S_NAMESPACES}" | tr ' ' '\n' | grep -E '^nats') + - echo "OLD_NATS_NAMESPACES=${OLD_NATS_NAMESPACES}" + - > + for ns in ${OLD_NATS_NAMESPACES}; do + if [[ "$ns" == nats* ]]; then + if helm3 status "$ns" &>/dev/null; then + helm3 uninstall "$ns" -n "$ns" + else + echo "Release '$ns' not found, skipping..." + fi + fi + done + - export OLD_NAMESPACES=$(echo "${K8S_NAMESPACES}" | tr ' ' '\n' | grep -E '^(tfs|crdb|qdb|kafka|nats)') + - echo "OLD_NAMESPACES=${OLD_NAMESPACES}" + - kubectl delete namespace ${OLD_NAMESPACES} || true + + # Clean-up Kubernetes Failed pods + - > + kubectl get pods --all-namespaces --no-headers --field-selector=status.phase=Failed + -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name | + xargs --no-run-if-empty --max-args=2 kubectl delete pod --namespace + + # Login Docker repository + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + + script: + # Download Docker images to run the test + - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" + - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" + - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" + + # Check MicroK8s is ready + - microk8s status --wait-ready + - LOOP_MAX_ATTEMPTS=10 + - LOOP_COUNTER=0 + - > + while ! kubectl get pods --all-namespaces &> /dev/null; do + printf "%c" "." + sleep 1 + LOOP_COUNTER=$((LOOP_COUNTER + 1)) + if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then + echo "Max attempts reached, exiting the loop." + exit 1 + fi + done + - kubectl get pods --all-namespaces + + # Deploy Docker network + - > + docker network create --driver bridge --subnet=172.254.252.0/24 --gateway=172.254.252.254 + --ip-range=172.254.252.0/24 ryu-of-br + + # Deploy Ryu + - > + docker run --detach --name ryu --network ryu-of-br --ip 172.254.252.10 --publish 8080 + "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" + + # Wait for Ryu to get initialized + - sleep 3 + - docker ps -a +# - docker logs ryu + - LOOP_MAX_ATTEMPTS=180 + - LOOP_COUNTER=0 + - echo "Waiting for Ryu to be ready..." + - > + until curl -s 'http://172.254.252.10:8080/'; do + echo "Attempt: $LOOP_COUNTER" + sleep 5; + LOOP_COUNTER=$((LOOP_COUNTER + 1)) + if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then + echo "Max attempts reached, exiting the loop." + break + fi + done + - echo "Ryu is ready!" +# - docker logs ryu + + # Deploy Mininet + # --ulimit memlock=-1:-1 --ulimit nofile=65536:65536 --ulimit nproc=65536:65536 + - > + docker run --detach --name mininet --network ryu-of-br --ip 172.254.252.11 --publish 5000 + --privileged --volume /lib/modules:/lib/modules + "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" + + # Wait for initialization of Mininet + - sleep 10 + - docker ps -a +# - docker logs mininet + - LOOP_MAX_ATTEMPTS=180 + - LOOP_COUNTER=0 + - echo "Waiting for Mininet to be ready..." + - > + until docker logs mininet 2>&1 | grep -q 'Enabling remote OVSDB managers'; do + echo "Attempt: $LOOP_COUNTER" + docker logs mininet 2>&1; + sleep 1; + LOOP_COUNTER=$((LOOP_COUNTER + 1)) + if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then + echo "Max attempts reached, exiting the loop." + break + fi + done + - echo "Mininet is ready!" +# - docker logs mininet + + # Dump configuration of the switches (OpenFlow rules configured) (after starting Mininet) + - docker exec mininet bash -c "ovs-vsctl show" + - docker exec mininet bash -c "ovs-ofctl dump-flows s1" + - docker exec mininet bash -c "ovs-ofctl dump-flows s2" + - docker exec mininet bash -c "ovs-ofctl dump-flows s3" + - docker exec mininet bash -c "ovs-ofctl dump-flows s4" + - docker exec mininet bash -c "ovs-ofctl dump-flows s5" + + # Configure TeraFlowSDN deployment + # Uncomment if DEBUG log level is needed for the components + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/contextservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/deviceservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="frontend").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/pathcompservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/serviceservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/nbiservice.yaml + + - source src/tests/${TEST_NAME}/deploy_specs.sh + #- export TFS_REGISTRY_IMAGES="${CI_REGISTRY_IMAGE}" + #- export TFS_SKIP_BUILD="YES" + #- export TFS_IMAGE_TAG="latest" + #- echo "TFS_REGISTRY_IMAGES=${CI_REGISTRY_IMAGE}" + + # Deploy TeraFlowSDN + - ./deploy/crdb.sh + - ./deploy/nats.sh + - ./deploy/kafka.sh + #- ./deploy/qdb.sh + - ./deploy/tfs.sh + - ./deploy/show.sh + + ## Wait for Context to be subscribed to NATS + ## WARNING: this loop is infinite if there is no subscriber (such as monitoring). + ## Investigate if we can use a counter to limit the number of iterations. + ## For now, keep it commented out. + #- LOOP_MAX_ATTEMPTS=180 + #- LOOP_COUNTER=0 + #- > + # while ! kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server 2>&1 | grep -q 'Subscriber is Ready? True'; do + # echo "Attempt: $LOOP_COUNTER" + # kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server 2>&1; + # sleep 1; + # LOOP_COUNTER=$((LOOP_COUNTER + 1)) + # if [ "$LOOP_COUNTER" -ge "$LOOP_MAX_ATTEMPTS" ]; then + # echo "Max attempts reached, exiting the loop." + # break + # fi + # done + #- kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server + + # Run end-to-end test: onboard scenario + - > + docker run -t --rm --name ${TEST_NAME} --network=host + --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" /var/teraflow/run-onboarding.sh + + # Dump configuration of the switches (OpenFlow rules configured) (before configure IETF L3VPN services) + - docker exec mininet bash -c "ovs-vsctl show" + - docker exec mininet ovs-ofctl dump-flows s1 + - docker exec mininet ovs-ofctl dump-flows s2 + - docker exec mininet ovs-ofctl dump-flows s3 + - docker exec mininet ovs-ofctl dump-flows s4 + - docker exec mininet ovs-ofctl dump-flows s5 + + - | + ping_check() { + local src=$1 dst=$2 pattern=$3 + local output + output=$(curl -s "http://172.254.252.11:5000/ping?source=${src}&target=${dst}&count=3") + echo "$output" + if echo "$output" | grep -E "$pattern" >/dev/null; then + echo "PASSED ${src}->${dst} + else + echo "FAILED ${src}->${dst} + fi + echo "$output" | grep -E "$pattern" + } + + # Run end-to-end test: test no connectivity with ping + - ping_check h1 h2 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h1 h3 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h1 h4 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h2 h1 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h2 h3 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h2 h4 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h3 h1 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h3 h2 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h3 h4 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h4 h1 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h4 h2 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h4 h3 '3 packets transmitted, 0 received, 100% packet loss' + + # Run end-to-end test: configure IETF L3VPN service between h1-h3 + - > + docker run -t --rm --name ${TEST_NAME} --network=host + --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" /var/teraflow/run-service-ietf-create-h1-h3.sh + + # Dump configuration of the switches (OpenFlow rules configured) (after configure IETF L3VPN service between h1-h3) + - docker exec mininet bash -c "ovs-vsctl show" + - docker exec mininet ovs-ofctl dump-flows s1 + - docker exec mininet ovs-ofctl dump-flows s2 + - docker exec mininet ovs-ofctl dump-flows s3 + - docker exec mininet ovs-ofctl dump-flows s4 + - docker exec mininet ovs-ofctl dump-flows s5 + + # Run end-to-end test: test connectivity with ping (h1-h3 should work, rest should not work) + - ping_check h1 h2 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h1 h3 '3 packets transmitted, 3 received, 0% packet loss' + - ping_check h1 h4 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h2 h1 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h2 h3 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h2 h4 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h3 h1 '3 packets transmitted, 3 received, 0% packet loss' + - ping_check h3 h2 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h3 h4 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h4 h1 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h4 h2 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h4 h3 '3 packets transmitted, 0 received, 100% packet loss' + + # Run end-to-end test: configure IETF L3VPN service between h2-h4 + - > + docker run -t --rm --name ${TEST_NAME} --network=host + --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" /var/teraflow/run-service-ietf-create-h2-h4.sh + + # Dump configuration of the switches (OpenFlow rules configured) (after configure IETF L3VPN service between h2-h4) + - docker exec mininet bash -c "ovs-vsctl show" + - docker exec mininet ovs-ofctl dump-flows s1 + - docker exec mininet ovs-ofctl dump-flows s2 + - docker exec mininet ovs-ofctl dump-flows s3 + - docker exec mininet ovs-ofctl dump-flows s4 + - docker exec mininet ovs-ofctl dump-flows s5 + + # Run end-to-end test: test connectivity with ping (h1-h3 should work, h2-h4 should work, rest should not work) + - ping_check h1 h2 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h1 h3 '3 packets transmitted, 3 received, 0% packet loss' + - ping_check h1 h4 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h2 h1 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h2 h3 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h2 h4 '3 packets transmitted, 3 received, 0% packet loss' + - ping_check h3 h1 '3 packets transmitted, 3 received, 0% packet loss' + - ping_check h3 h2 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h3 h4 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h4 h1 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h4 h2 '3 packets transmitted, 3 received, 0% packet loss' + - ping_check h4 h3 '3 packets transmitted, 0 received, 100% packet loss' + + # Run end-to-end test: deconfigure IETF L3VPN service h1-h3 + - > + docker run -t --rm --name ${TEST_NAME} --network=host + --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" /var/teraflow/run-service-ietf-remove-h1-h3.sh + + # Dump configuration of the switches (OpenFlow rules configured) (after deconfigure IETF L3VPN service between h1-h3) + - docker exec mininet bash -c "ovs-vsctl show" + - docker exec mininet ovs-ofctl dump-flows s1 + - docker exec mininet ovs-ofctl dump-flows s2 + - docker exec mininet ovs-ofctl dump-flows s3 + - docker exec mininet ovs-ofctl dump-flows s4 + - docker exec mininet ovs-ofctl dump-flows s5 + + # Run end-to-end test: test connectivity with ping (h2-h4 should work, rest should not work) + - ping_check h1 h2 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h1 h3 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h1 h4 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h2 h1 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h2 h3 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h2 h4 '3 packets transmitted, 3 received, 0% packet loss' + - ping_check h3 h1 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h3 h2 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h3 h4 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h4 h1 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h4 h2 '3 packets transmitted, 3 received, 0% packet loss' + - ping_check h4 h3 '3 packets transmitted, 0 received, 100% packet loss' + + # Run end-to-end test: deconfigure IETF L3VPN service h2-h4 + - > + docker run -t --rm --name ${TEST_NAME} --network=host + --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" /var/teraflow/run-service-ietf-remove-h2-h4.sh + + # Dump configuration of the switches (OpenFlow rules configured) (after deconfigure IETF L3VPN service between h2-h4) + - docker exec mininet bash -c "ovs-vsctl show" + - docker exec mininet ovs-ofctl dump-flows s1 + - docker exec mininet ovs-ofctl dump-flows s2 + - docker exec mininet ovs-ofctl dump-flows s3 + - docker exec mininet ovs-ofctl dump-flows s4 + - docker exec mininet ovs-ofctl dump-flows s5 + + # Run end-to-end test: test no connectivity with ping + - ping_check h1 h2 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h1 h3 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h1 h4 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h2 h1 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h2 h3 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h2 h4 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h3 h1 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h3 h2 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h3 h4 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h4 h1 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h4 h2 '3 packets transmitted, 0 received, 100% packet loss' + - ping_check h4 h3 '3 packets transmitted, 0 received, 100% packet loss' + + # Run end-to-end test: cleanup scenario + - > + docker run -t --rm --name ${TEST_NAME} --network=host + --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" /var/teraflow/run-cleanup.sh + + after_script: + # Dump configuration of the switches (OpenFlow rules configured) (on after_script) + - docker exec mininet bash -c "ovs-vsctl show" || true + - docker exec mininet ovs-ofctl dump-flows s1 || true + - docker exec mininet ovs-ofctl dump-flows s2 || true + - docker exec mininet ovs-ofctl dump-flows s3 || true + - docker exec mininet ovs-ofctl dump-flows s4 || true + - docker exec mininet ovs-ofctl dump-flows s5 || true + + # Dump Ryu and Mininet logs (on after_script) + - docker ps -a + #- docker logs mininet + - docker logs ryu + + # Dump TeraFlowSDN component logs + - source src/tests/${TEST_NAME}/deploy_specs.sh + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server || true + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/deviceservice -c server || true + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/pathcompservice -c frontend || true + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/serviceservice -c server || true + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/nbiservice -c server || true + + # Clean up + - kubectl delete namespaces tfs || true + - docker ps --all --quiet | xargs --no-run-if-empty docker stop + - docker container prune --force + - docker ps --all --quiet | xargs --no-run-if-empty docker rm --force + - docker network prune --force + - docker volume prune --all --force + - docker image prune --force + + #coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' + #- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' + artifacts: + when: always + reports: + junit: ./src/tests/${TEST_NAME}/report_*.xml diff --git a/src/tests/ryu-openflow/Ryu.Dockerfile b/src/tests/ryu-openflow/Ryu.Dockerfile index 38df9d9117cfe8a9e548283bd18b6222b8b758c9..4934626d464bd22fc89771a430471626121d0885 100644 --- a/src/tests/ryu-openflow/Ryu.Dockerfile +++ b/src/tests/ryu-openflow/Ryu.Dockerfile @@ -14,14 +14,24 @@ FROM python:3.9-slim -RUN apt-get update && apt-get install -y --no-install-recommends git iproute2 && rm -rf /var/lib/apt/lists/* +# Install dependencies +RUN apt-get --yes --quiet --quiet update && \ + apt-get --yes --quiet --quiet install --no-install-recommends git iproute2 && \ + rm -rf /var/lib/apt/lists/* + +# Set Python to show logs as they occur +ENV PYTHONUNBUFFERED=0 + +# Get generic Python packages +RUN python3 -m pip install --upgrade 'pip==25.2' +RUN python3 -m pip install --upgrade 'setuptools==67.6.1' 'wheel==0.45.1' -RUN pip install --no-cache-dir --upgrade pip # NOTE: Ryu 4.34 expects eventlet.wsgi.ALREADY_HANDLED, which disappears in Eventlet ≥ 0.30.3. -RUN pip install --no-cache-dir "setuptools" "wheel" "git+https://github.com/faucetsdn/ryu.git@v4.34" "eventlet<0.30.3" +RUN pip install --no-build-isolation \ + "git+https://github.com/faucetsdn/ryu.git@v4.34" "eventlet<0.30.3" #COPY apps/ /opt/ryu-apps/ # Copy Ryu Apps, if any -WORKDIR /opt/ryu-apps +#WORKDIR /opt/ryu-apps # --- OpenFlow & Ryu REST API ports --- EXPOSE 6653/tcp 8080/tcp diff --git a/src/tests/ryu-openflow/Test.Dockerfile b/src/tests/ryu-openflow/Test.Dockerfile index ea3d4bec3ea99f5f3d007095171da895ef9ceb1c..84c2a886927c4452367c608608310477cec04b87 100644 --- a/src/tests/ryu-openflow/Test.Dockerfile +++ b/src/tests/ryu-openflow/Test.Dockerfile @@ -16,7 +16,7 @@ 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 --no-install-recommends wget g++ git && \ rm -rf /var/lib/apt/lists/* # Set Python to show logs as they occur diff --git a/src/tests/ryu-openflow/custom_pentagon_topology.py b/src/tests/ryu-openflow/custom_pentagon_topology.py deleted file mode 100644 index 03605f24a50c81fc2313c329acb3674487270f67..0000000000000000000000000000000000000000 --- a/src/tests/ryu-openflow/custom_pentagon_topology.py +++ /dev/null @@ -1,55 +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 mininet.topo import Topo -from mininet.net import Mininet -from mininet.node import RemoteController -from mininet.cli import CLI -from mininet.link import TCLink - -class PentagonTopo(Topo): - def build(self): - sw1 = self.addSwitch('s1') - sw2 = self.addSwitch('s2') - sw3 = self.addSwitch('s3') - sw4 = self.addSwitch('s4') - sw5 = self.addSwitch('s5') - - h1 = self.addHost('h1', ip='10.0.0.1', mac='00:00:00:00:00:01') - h2 = self.addHost('h2', ip='10.0.0.2', mac='00:00:00:00:00:02') - h3 = self.addHost('h3', ip='10.0.0.3', mac='00:00:00:00:00:03') - h4 = self.addHost('h4', ip='10.0.0.4', mac='00:00:00:00:00:04') - - self.addLink(sw1, sw2) - self.addLink(sw2, sw3) - self.addLink(sw3, sw4) - self.addLink(sw4, sw5) - self.addLink(sw5, sw1) - - self.addLink(h1, sw2) - self.addLink(h2, sw2) - self.addLink(h3, sw5) - self.addLink(h4, sw5) - -if __name__ == '__main__': - topo = PentagonTopo() - net = Mininet(topo=topo, controller=lambda name: RemoteController(name, ip='127.0.0.1'), link=TCLink) - - net.start() - net.staticArp() - - print('Custom Pentagon Topology is up with static ARP.') - CLI(net) - net.stop() diff --git a/src/tests/ryu-openflow/data/ietf-l3vpn-service.json b/src/tests/ryu-openflow/data/ietf-l3vpn-service-h1-h3.json similarity index 91% rename from src/tests/ryu-openflow/data/ietf-l3vpn-service.json rename to src/tests/ryu-openflow/data/ietf-l3vpn-service-h1-h3.json index eb86c359bbab1feeba0f570be165f5f18349d2b8..ceafe66c893bc116a5196f1cd603d32305e8727a 100644 --- a/src/tests/ryu-openflow/data/ietf-l3vpn-service.json +++ b/src/tests/ryu-openflow/data/ietf-l3vpn-service-h1-h3.json @@ -2,7 +2,7 @@ "ietf-l3vpn-svc:l3vpn-svc": { "vpn-services": { "vpn-service": [ - {"vpn-id": "ietf-l3vpn-svc"} + {"vpn-id": "svc-h1-h3"} ] }, "sites": { @@ -18,7 +18,7 @@ "site-network-access-id": "h1-eth0", "site-network-access-type": "ietf-l3vpn-svc:multipoint", "device-reference": "h1", - "vpn-attachment": {"vpn-id": "ietf-l3vpn-svc", "site-role": "ietf-l3vpn-svc:spoke-role"}, + "vpn-attachment": {"vpn-id": "svc-h1-h3", "site-role": "ietf-l3vpn-svc:spoke-role"}, "ip-connection": { "ipv4": { "address-allocation-type": "ietf-l3vpn-svc:static-address", @@ -53,22 +53,22 @@ } }, { - "site-id": "site_DC2", + "site-id": "site_DC3", "management": {"type": "ietf-l3vpn-svc:provider-managed"}, - "locations": {"location": [{"location-id": "DC2"}]}, - "devices": {"device": [{"device-id": "h3", "location": "DC2"}]}, + "locations": {"location": [{"location-id": "DC3"}]}, + "devices": {"device": [{"device-id": "h3", "location": "DC3"}]}, "site-network-accesses": { "site-network-access": [ { "site-network-access-id": "h3-eth0", "site-network-access-type": "ietf-l3vpn-svc:multipoint", "device-reference": "h3", - "vpn-attachment": {"vpn-id": "ietf-l3vpn-svc", "site-role": "ietf-l3vpn-svc:hub-role"}, + "vpn-attachment": {"vpn-id": "svc-h1-h3", "site-role": "ietf-l3vpn-svc:hub-role"}, "ip-connection": { "ipv4": { "address-allocation-type": "ietf-l3vpn-svc:static-address", "addresses": { - "provider-address": "10.0.0.1", + "provider-address": "10.0.0.3", "customer-address": "10.0.0.3", "prefix-length": 8 } diff --git a/src/tests/ryu-openflow/data/ietf-l3vpn-service-h2-h4.json b/src/tests/ryu-openflow/data/ietf-l3vpn-service-h2-h4.json new file mode 100644 index 0000000000000000000000000000000000000000..3f38ce5d24682ccca3d4df900f28c1e9f55a53a6 --- /dev/null +++ b/src/tests/ryu-openflow/data/ietf-l3vpn-service-h2-h4.json @@ -0,0 +1,103 @@ +{ + "ietf-l3vpn-svc:l3vpn-svc": { + "vpn-services": { + "vpn-service": [ + {"vpn-id": "svc-h2-h4"} + ] + }, + "sites": { + "site": [ + { + "site-id": "site_DC2", + "management": {"type": "ietf-l3vpn-svc:provider-managed"}, + "locations": {"location": [{"location-id": "DC2"}]}, + "devices": {"device": [{"device-id": "h2","location": "DC2"}]}, + "site-network-accesses": { + "site-network-access": [ + { + "site-network-access-id": "h2-eth0", + "site-network-access-type": "ietf-l3vpn-svc:multipoint", + "device-reference": "h2", + "vpn-attachment": {"vpn-id": "svc-h2-h4", "site-role": "ietf-l3vpn-svc:spoke-role"}, + "ip-connection": { + "ipv4": { + "address-allocation-type": "ietf-l3vpn-svc:static-address", + "addresses": { + "provider-address": "10.0.0.2", + "customer-address": "10.0.0.2", + "prefix-length": 8 + } + } + }, + "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} + } + ] + } + } + } + } + } + ] + } + }, + { + "site-id": "site_DC4", + "management": {"type": "ietf-l3vpn-svc:provider-managed"}, + "locations": {"location": [{"location-id": "DC4"}]}, + "devices": {"device": [{"device-id": "h4", "location": "DC4"}]}, + "site-network-accesses": { + "site-network-access": [ + { + "site-network-access-id": "h4-eth0", + "site-network-access-type": "ietf-l3vpn-svc:multipoint", + "device-reference": "h4", + "vpn-attachment": {"vpn-id": "svc-h2-h4", "site-role": "ietf-l3vpn-svc:hub-role"}, + "ip-connection": { + "ipv4": { + "address-allocation-type": "ietf-l3vpn-svc:static-address", + "addresses": { + "provider-address": "10.0.0.4", + "customer-address": "10.0.0.4", + "prefix-length": 8 + } + } + }, + "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} + } + ] + } + } + } + } + } + ] + } + } + ] + } + } +} diff --git a/src/tests/ryu-openflow/data/tfs-topology.json b/src/tests/ryu-openflow/data/tfs-topology.json index e427f16ea95833a1480a84c4fe83d7539c2707ac..b6cea1e9a60051e0054fd5065ce681a860b1b97e 100644 --- a/src/tests/ryu-openflow/data/tfs-topology.json +++ b/src/tests/ryu-openflow/data/tfs-topology.json @@ -14,7 +14,7 @@ { "device_id": {"device_uuid": {"uuid": "RYU"}}, "device_type": "openflow-ryu-controller", "device_drivers": ["DEVICEDRIVER_RYU"], "device_config": {"config_rules": [ - {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.10"}}, + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.254.252.10"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "8080"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"timeout": 120}}} ]} diff --git a/src/tests/ryu-openflow/mininet/Mininet.Dockerfile b/src/tests/ryu-openflow/mininet/Mininet.Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..ccdcf337dd92882df69b789f7e509d9012d02154 --- /dev/null +++ b/src/tests/ryu-openflow/mininet/Mininet.Dockerfile @@ -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. + +# Based on: https://github.com/iwaseyusuke/docker-mininet + +FROM ubuntu:22.04 + +USER root +WORKDIR /root + +# Install dependencies +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get --yes --quiet --quiet update && \ + apt-get install --yes --no-install-recommends iproute2 net-tools openvswitch-switch ca-certificates && \ + apt-get install --yes --no-install-recommends mininet=2.3.0-1ubuntu1 && \ + apt-get autoremove --yes && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +RUN apt-get --yes --quiet --quiet update && \ + apt-get install --yes --no-install-recommends iputils-ping && \ + apt-get autoremove --yes && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +COPY src/tests/ryu-openflow/mininet/custom_pentagon_topology.py /opt/custom_pentagon_topology.py +COPY src/tests/ryu-openflow/mininet/mininet-entrypoint.sh /mininet-entrypoint.sh + +EXPOSE 6633 6653 6640 5000 + +ENTRYPOINT ["/mininet-entrypoint.sh"] diff --git a/src/tests/ryu-openflow/mininet/README.md b/src/tests/ryu-openflow/mininet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..8cc1065555929700dc266561c4c91daec048a645 --- /dev/null +++ b/src/tests/ryu-openflow/mininet/README.md @@ -0,0 +1,3 @@ +# Docker-containerized Mininet environment + +- Based on: https://github.com/iwaseyusuke/docker-mininet diff --git a/src/tests/ryu-openflow/mininet/custom_pentagon_topology.py b/src/tests/ryu-openflow/mininet/custom_pentagon_topology.py new file mode 100644 index 0000000000000000000000000000000000000000..46d4e6825765b5e3c9046f9446c2baf676dfc0e5 --- /dev/null +++ b/src/tests/ryu-openflow/mininet/custom_pentagon_topology.py @@ -0,0 +1,156 @@ +# 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, socketserver, threading, time +from http.server import BaseHTTPRequestHandler, HTTPServer +from urllib.parse import parse_qs, urlparse +from mininet.topo import Topo +from mininet.net import Mininet +from mininet.node import RemoteController +#from mininet.cli import CLI +from mininet.link import TCLink + +logging.basicConfig(level=logging.INFO) +LOGGER = logging.getLogger(__name__) + +class PentagonTopo(Topo): + def build(self): + sw1 = self.addSwitch('s1') + sw2 = self.addSwitch('s2') + sw3 = self.addSwitch('s3') + sw4 = self.addSwitch('s4') + sw5 = self.addSwitch('s5') + + h1 = self.addHost('h1', ip='10.0.0.1', mac='00:00:00:00:00:01') + h2 = self.addHost('h2', ip='10.0.0.2', mac='00:00:00:00:00:02') + h3 = self.addHost('h3', ip='10.0.0.3', mac='00:00:00:00:00:03') + h4 = self.addHost('h4', ip='10.0.0.4', mac='00:00:00:00:00:04') + + self.addLink(sw1, sw2) + self.addLink(sw2, sw3) + self.addLink(sw3, sw4) + self.addLink(sw4, sw5) + self.addLink(sw5, sw1) + + self.addLink(h1, sw2) + self.addLink(h2, sw2) + self.addLink(h3, sw5) + self.addLink(h4, sw5) + + +def build_ping_handler(net: Mininet): + """ + Create a HTTP request handler that performs pings between hosts. + """ + class PingHandler(BaseHTTPRequestHandler): + #def log_message(self, *args, **kwargs): + # # Silence default stdout logging. + # return + + def _send_json(self, status: int, payload: dict): + body = json.dumps(payload).encode() + self.send_response(status) + self.send_header('Content-Type', 'application/json') + self.send_header('Content-Length', str(len(body))) + self.end_headers() + self.wfile.write(body) + + def do_GET(self): + parsed = urlparse(self.path) + if parsed.path != '/ping': + self._send_json(404, {'error': 'not found'}) + return + + params = parse_qs(parsed.query) + source = params.get('source', [None])[0] + target = params.get('target', [None])[0] + count_val = params.get('count', ['3'])[0] + + if not source or not target: + self._send_json(400, { + 'error': 'source and target query parameters are required', + 'params': str(params), + }) + return + + count = None + try: + count = int(count_val) + if count <= 0: + raise ValueError() + except ValueError: + self._send_json(400, { + 'error': 'count must be a positive integer', + 'params': str(params), + }) + return + + src_host = None + dst_host = None + try: + src_host = net.get(source) + dst_host = net.get(target) + except KeyError as exc: + self._send_json(404, { + 'error': f'Unknown host: {exc}', + 'params': str(params), + }) + return + + destination_ip = dst_host.IP() + output = src_host.cmd(f'ping -c {count} {destination_ip}') + + self._send_json(200, { + 'source': source, + 'target': target, + 'destination_ip': destination_ip, + 'count': count, + 'output': output, + }) + + return PingHandler + + +class ThreadingHTTPServer(socketserver.ThreadingMixIn, HTTPServer): + daemon_threads = True + +if __name__ == '__main__': + topo = PentagonTopo() + ctrl = RemoteController('ryu', ip='172.254.252.10', port=6653) + net = Mininet( + topo=topo, + controller=ctrl, + link=TCLink + ) + + net.start() + net.staticArp() + + ping_handler = build_ping_handler(net) + http_server = ThreadingHTTPServer(('0.0.0.0', 5000), ping_handler) + server_thread = threading.Thread(target=http_server.serve_forever, daemon=True) + server_thread.start() + + print('Custom Pentagon Topology is up with static ARP.') + print('HTTP ping server running at http://0.0.0.0:5000/ping?source=h1&target=h2&count=3') + + try: + while True: + time.sleep(60) + except KeyboardInterrupt: + print('Stopping Mininet...') + http_server.shutdown() + http_server.server_close() + net.stop() diff --git a/src/tests/ryu-openflow/mininet/mininet-entrypoint.sh b/src/tests/ryu-openflow/mininet/mininet-entrypoint.sh new file mode 100755 index 0000000000000000000000000000000000000000..525e89d0a59eac7eb0508318bc7eddeecd556f8c --- /dev/null +++ b/src/tests/ryu-openflow/mininet/mininet-entrypoint.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. + +# Based on: https://github.com/iwaseyusuke/docker-mininet + +service openvswitch-switch start +ovs-vsctl set-manager ptcp:6640 + +python3 /opt/custom_pentagon_topology.py + +service openvswitch-switch stop diff --git a/src/tests/ryu-openflow/scripts/run-service-ietf-create-h1-h3.sh b/src/tests/ryu-openflow/scripts/run-service-ietf-create-h1-h3.sh new file mode 100755 index 0000000000000000000000000000000000000000..e4eaf465d017c89c4c5ba062d1b9c8bfbf966b68 --- /dev/null +++ b/src/tests/ryu-openflow/scripts/run-service-ietf-create-h1-h3.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. + +source /var/teraflow/tfs_runtime_env_vars.sh +export PYTHONPATH=/var/teraflow +pytest --verbose --log-level=INFO \ + --junitxml=/opt/results/report_service_ietf_create_h1_h3.xml \ + /var/teraflow/tests/ryu-openflow/tests/test_service_ietf_create_h1_h3.py diff --git a/src/tests/ryu-openflow/scripts/run-service-ietf-create-h2-h4.sh b/src/tests/ryu-openflow/scripts/run-service-ietf-create-h2-h4.sh new file mode 100755 index 0000000000000000000000000000000000000000..cc3277a663440b15b9d78a7e3047b1d19b1713c6 --- /dev/null +++ b/src/tests/ryu-openflow/scripts/run-service-ietf-create-h2-h4.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. + +source /var/teraflow/tfs_runtime_env_vars.sh +export PYTHONPATH=/var/teraflow +pytest --verbose --log-level=INFO \ + --junitxml=/opt/results/report_service_ietf_create_h2_h4.xml \ + /var/teraflow/tests/ryu-openflow/tests/test_service_ietf_create_h2_h4.py diff --git a/src/tests/ryu-openflow/scripts/run-service-ietf-remove-h1-h3.sh b/src/tests/ryu-openflow/scripts/run-service-ietf-remove-h1-h3.sh new file mode 100755 index 0000000000000000000000000000000000000000..b6662cb8183edee1b69c208d0210831b55a02fe6 --- /dev/null +++ b/src/tests/ryu-openflow/scripts/run-service-ietf-remove-h1-h3.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. + +source /var/teraflow/tfs_runtime_env_vars.sh +export PYTHONPATH=/var/teraflow +pytest --verbose --log-level=INFO \ + --junitxml=/opt/results/report_service_ietf_remove_h1_h3.xml \ + /var/teraflow/tests/ryu-openflow/tests/test_service_ietf_remove_h1_h3.py diff --git a/src/tests/ryu-openflow/scripts/run-service-ietf-remove-h2-h4.sh b/src/tests/ryu-openflow/scripts/run-service-ietf-remove-h2-h4.sh new file mode 100755 index 0000000000000000000000000000000000000000..cfd850262d42c2da5b05c5d07d62c74bb7067f2f --- /dev/null +++ b/src/tests/ryu-openflow/scripts/run-service-ietf-remove-h2-h4.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. + +source /var/teraflow/tfs_runtime_env_vars.sh +export PYTHONPATH=/var/teraflow +pytest --verbose --log-level=INFO \ + --junitxml=/opt/results/report_service_ietf_remove_h2_h4.xml \ + /var/teraflow/tests/ryu-openflow/tests/test_service_ietf_remove_h2_h4.py diff --git a/src/tests/ryu-openflow/tests/test_cleanup.py b/src/tests/ryu-openflow/tests/test_cleanup.py index 20afb5fe02d63f64de45fe87830e8996302c4395..2cb728e05bf9c17664cec25bdd6baebc31f23bd3 100644 --- a/src/tests/ryu-openflow/tests/test_cleanup.py +++ b/src/tests/ryu-openflow/tests/test_cleanup.py @@ -12,14 +12,20 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, os +import graphlib, logging, os +from typing import Dict, List, Tuple + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.proto.context_pb2 import ContextId, DeviceId, Empty +from common.tools.descriptor.Loader import validate_empty_scenario +from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from .Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -36,9 +42,56 @@ def test_scenario_cleanup( assert len(response.service_ids) == 0 assert len(response.slice_ids) == 0 - # Load descriptors and validate the base scenario - descriptor_loader = DescriptorLoader( - descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client) - descriptor_loader.validate() - descriptor_loader.unload() + # Automatic scenario cleanup does not work due to addition of virtual devices. + # Doing it manually... + + link_ids = context_client.ListLinkIds(Empty()) + LOGGER.info('Link Ids: {:s}'.format(grpc_message_to_json_string(link_ids))) + for link_id in link_ids.link_ids: + context_client.RemoveLink(link_id) + + devices = context_client.ListDevices(Empty()) + LOGGER.info('Devices: {:s}'.format(grpc_message_to_json_string(devices))) + + dag_device_uuids = graphlib.TopologicalSorter() + device_uuid_to_data : Dict[str, Tuple[DeviceId, str]] = dict() + + for device in devices.devices: + device_id = device.device_id + device_uuid = device_id.device_uuid.uuid + dag_device_uuids.add(device_uuid) + + device_uuid_to_data[device_uuid] = (device_id, device.name) + + controller_uuid = device.controller_id.device_uuid.uuid + if len(controller_uuid) == 0: continue + dag_device_uuids.add(controller_uuid, device_uuid) + + sorted_device_uuids = list(dag_device_uuids.static_order()) + + LOGGER.info('device_uuid_to_data: {:s}'.format(str(device_uuid_to_data))) + LOGGER.info('sorted_device_uuids: {:s}'.format(str(sorted_device_uuids))) + + for device_uuid in sorted_device_uuids: + device_id = device_uuid_to_data[device_uuid][0] + context_client.RemoveDevice(device_id) + + context_ids = context_client.ListContextIds(Empty()) + LOGGER.info('Context Ids: {:s}'.format(grpc_message_to_json_string(context_ids))) + for context_id in context_ids.context_ids: + topology_ids = context_client.ListTopologyIds(context_id) + LOGGER.info('Topology Ids: {:s}'.format(grpc_message_to_json_string(topology_ids))) + for topology_id in topology_ids.topology_ids: + context_client.RemoveTopology(topology_id) + context_client.RemoveContext(context_id) + + response = context_client.ListLinks(Empty()) + LOGGER.info('Links: {:s}'.format(grpc_message_to_json_string(response))) + + response = context_client.ListDevices(Empty()) + LOGGER.info('Devices: {:s}'.format(grpc_message_to_json_string(response))) + + response = context_client.ListContexts(Empty()) + LOGGER.info('Contexts: {:s}'.format(grpc_message_to_json_string(response))) + validate_empty_scenario(context_client) diff --git a/src/tests/ryu-openflow/tests/test_onboarding.py b/src/tests/ryu-openflow/tests/test_onboarding.py index 763d7da171c99b781a6d25fc01e3c10c340bfb43..3aab877da1e72161e69fe88ae92687aad3d37237 100644 --- a/src/tests/ryu-openflow/tests/test_onboarding.py +++ b/src/tests/ryu-openflow/tests/test_onboarding.py @@ -13,13 +13,22 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) +#from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from .Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -32,12 +41,26 @@ def test_scenario_onboarding( device_client : DeviceClient, # pylint: disable=redefined-outer-name ) -> None: validate_empty_scenario(context_client) - descriptor_loader = DescriptorLoader( - descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client) + descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client + ) results = descriptor_loader.process() check_descriptor_load_results(results, descriptor_loader) - descriptor_loader.validate() + + # Requires manual validation as number of onboarded devices is higher than those in descriptor; + # the controller exposes underlying devices that are imported on the topology. + #descriptor_loader.validate() + + response = context_client.ListDevices(Empty()) + #LOGGER.debug('Devices: {:s}'.format(grpc_message_to_json_string(response))) + num_openvswitches = 5 # OpenVSwitch in Mininet + assert len(response.devices) == descriptor_loader.num_devices + num_openvswitches + + response = context_client.ListLinks(Empty()) + #LOGGER.debug('Links: {:s}'.format(grpc_message_to_json_string(response))) + num_mgmt_links = num_openvswitches + num_ovs_2_ovs_links = 2*num_openvswitches # pentagon with bidirectional links + assert len(response.links) == descriptor_loader.num_links + num_mgmt_links + num_ovs_2_ovs_links # Verify the scenario has no services/slices response = context_client.GetContext(ADMIN_CONTEXT_ID) diff --git a/src/tests/ryu-openflow/tests/test_service_ietf_create_h1_h3.py b/src/tests/ryu-openflow/tests/test_service_ietf_create_h1_h3.py new file mode 100644 index 0000000000000000000000000000000000000000..84fdd34eb3df2c6610319010df110ba0374038ed --- /dev/null +++ b/src/tests/ryu-openflow/tests/test_service_ietf_create_h1_h3.py @@ -0,0 +1,80 @@ +# 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 +from typing import Dict, Set + +from common.Constants import DEFAULT_CONTEXT_NAME +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.object_factory.Context import json_context_id +from context.client.ContextClient import ContextClient + +from .Fixtures import context_client # pylint: disable=unused-import +from .Tools import do_rest_get_request, do_rest_post_request + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +REQUEST_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'data', 'ietf-l3vpn-service-h1-h3.json') +ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) + + +# pylint: disable=redefined-outer-name, unused-argument +def test_service_ietf_creation( + context_client : ContextClient, +): + # Issue service creation request + with open(REQUEST_FILE, 'r', encoding='UTF-8') as f: + svc1_data = json.load(f) + URL = '/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services' + do_rest_post_request(URL, body=svc1_data, logger=LOGGER, expected_status_codes={201}) + vpn_id = svc1_data['ietf-l3vpn-svc:l3vpn-svc']['vpn-services']['vpn-service'][0]['vpn-id'] + + URL = '/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services/vpn-service={:s}/'.format(vpn_id) + service_data = do_rest_get_request(URL, logger=LOGGER, expected_status_codes={200}) + service_uuid = service_data['service-id'] + + # Verify service was created + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 1 + assert len(response.slice_ids) == 0 + + # Check there is 1 service + response = context_client.ListServices(ADMIN_CONTEXT_ID) + LOGGER.info('Services[{:d}] = {:s}'.format( + len(response.services), grpc_message_to_json_string(response) + )) + assert len(response.services) == 1 + + service_uuids : Set[str] = set() + for service in response.services: + if 'h1-h3' not in service.name: continue + service_id = service.service_id + assert service_id.service_uuid.uuid == service_uuid + assert service.service_status.service_status == ServiceStatusEnum.SERVICESTATUS_ACTIVE + assert service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM + + response = context_client.ListConnections(service_id) + LOGGER.info(' ServiceId[{:s}] => Connections[{:d}] = {:s}'.format( + grpc_message_to_json_string(service_id), len(response.connections), + grpc_message_to_json_string(response) + )) + assert len(response.connections) == 1 + + service_uuids.add(service_id.service_uuid.uuid) + + assert len(service_uuids) == 1 diff --git a/src/tests/ryu-openflow/tests/test_service_ietf_create_h2_h4.py b/src/tests/ryu-openflow/tests/test_service_ietf_create_h2_h4.py new file mode 100644 index 0000000000000000000000000000000000000000..7f9882573f24cb92ae0ab3f1bd09a0d726692c85 --- /dev/null +++ b/src/tests/ryu-openflow/tests/test_service_ietf_create_h2_h4.py @@ -0,0 +1,80 @@ +# 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 +from typing import Dict, Set + +from common.Constants import DEFAULT_CONTEXT_NAME +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.object_factory.Context import json_context_id +from context.client.ContextClient import ContextClient + +from .Fixtures import context_client # pylint: disable=unused-import +from .Tools import do_rest_get_request, do_rest_post_request + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +REQUEST_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'data', 'ietf-l3vpn-service-h2-h4.json') +ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) + + +# pylint: disable=redefined-outer-name, unused-argument +def test_service_ietf_creation( + context_client : ContextClient, +): + # Issue service creation request + with open(REQUEST_FILE, 'r', encoding='UTF-8') as f: + svc1_data = json.load(f) + URL = '/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services' + do_rest_post_request(URL, body=svc1_data, logger=LOGGER, expected_status_codes={201}) + vpn_id = svc1_data['ietf-l3vpn-svc:l3vpn-svc']['vpn-services']['vpn-service'][0]['vpn-id'] + + URL = '/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services/vpn-service={:s}/'.format(vpn_id) + service_data = do_rest_get_request(URL, logger=LOGGER, expected_status_codes={200}) + service_uuid = service_data['service-id'] + + # Verify service was created + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 2 + assert len(response.slice_ids) == 0 + + # Check there are 2 services + response = context_client.ListServices(ADMIN_CONTEXT_ID) + LOGGER.info('Services[{:d}] = {:s}'.format( + len(response.services), grpc_message_to_json_string(response) + )) + assert len(response.services) == 2 + + service_uuids : Set[str] = set() + for service in response.services: + if 'h2-h4' not in service.name: continue + service_id = service.service_id + assert service_id.service_uuid.uuid == service_uuid + assert service.service_status.service_status == ServiceStatusEnum.SERVICESTATUS_ACTIVE + assert service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM + + response = context_client.ListConnections(service_id) + LOGGER.info(' ServiceId[{:s}] => Connections[{:d}] = {:s}'.format( + grpc_message_to_json_string(service_id), len(response.connections), + grpc_message_to_json_string(response) + )) + assert len(response.connections) == 1 + + service_uuids.add(service_id.service_uuid.uuid) + + assert len(service_uuids) == 1 diff --git a/src/tests/ryu-openflow/tests/test_service_ietf_remove_h1_h3.py b/src/tests/ryu-openflow/tests/test_service_ietf_remove_h1_h3.py new file mode 100644 index 0000000000000000000000000000000000000000..168057c42d1a803fc2614a30c4e966bca8acf066 --- /dev/null +++ b/src/tests/ryu-openflow/tests/test_service_ietf_remove_h1_h3.py @@ -0,0 +1,84 @@ +# 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, os +from typing import Dict, Set, Tuple + +from common.Constants import DEFAULT_CONTEXT_NAME +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.object_factory.Context import json_context_id +from context.client.ContextClient import ContextClient + +from .Fixtures import context_client # pylint: disable=unused-import +from .Tools import do_rest_delete_request + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) + + +# pylint: disable=redefined-outer-name, unused-argument +def test_service_ietf_removal( + context_client : ContextClient, # pylint: disable=redefined-outer-name +): + # Verify the scenario has 2 services and 0 slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 2 + assert len(response.slice_ids) == 0 + + # Check there are no slices + response = context_client.ListSlices(ADMIN_CONTEXT_ID) + LOGGER.info('Slices[{:d}] = {:s}'.format( + len(response.slices), grpc_message_to_json_string(response) + )) + assert len(response.slices) == 0 + + # Check there are 2 services + response = context_client.ListServices(ADMIN_CONTEXT_ID) + LOGGER.info('Services[{:d}] = {:s}'.format( + len(response.services), grpc_message_to_json_string(response) + )) + assert len(response.services) == 2 + + service_uuids : Set[str] = set() + for service in response.services: + if 'h1-h3' not in service.name: continue + service_id = service.service_id + assert service.service_status.service_status == ServiceStatusEnum.SERVICESTATUS_ACTIVE + assert service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM + + response = context_client.ListConnections(service_id) + LOGGER.info(' ServiceId[{:s}] => Connections[{:d}] = {:s}'.format( + grpc_message_to_json_string(service_id), len(response.connections), + grpc_message_to_json_string(response) + )) + assert len(response.connections) == 1 + + service_uuids.add(service_id.service_uuid.uuid) + + # Identify service to delete + assert len(service_uuids) == 1 + service_uuid = set(service_uuids).pop() + + URL = '/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services/vpn-service={:s}/'.format(service_uuid) + do_rest_delete_request(URL, logger=LOGGER, expected_status_codes={204}) + + # Verify the scenario has 1 service and 0 slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 1 + assert len(response.slice_ids) == 0 diff --git a/src/tests/ryu-openflow/tests/test_service_ietf_remove_h2_h4.py b/src/tests/ryu-openflow/tests/test_service_ietf_remove_h2_h4.py new file mode 100644 index 0000000000000000000000000000000000000000..8c977ae66bb75f648a5cabf25cf5ab110c3d28cb --- /dev/null +++ b/src/tests/ryu-openflow/tests/test_service_ietf_remove_h2_h4.py @@ -0,0 +1,84 @@ +# 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, os +from typing import Dict, Set, Tuple + +from common.Constants import DEFAULT_CONTEXT_NAME +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.object_factory.Context import json_context_id +from context.client.ContextClient import ContextClient + +from .Fixtures import context_client # pylint: disable=unused-import +from .Tools import do_rest_delete_request + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) + + +# pylint: disable=redefined-outer-name, unused-argument +def test_service_ietf_removal( + context_client : ContextClient, # pylint: disable=redefined-outer-name +): + # Verify the scenario has 1 service and 0 slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 1 + assert len(response.slice_ids) == 0 + + # Check there are no slices + response = context_client.ListSlices(ADMIN_CONTEXT_ID) + LOGGER.info('Slices[{:d}] = {:s}'.format( + len(response.slices), grpc_message_to_json_string(response) + )) + assert len(response.slices) == 0 + + # Check there is 1 service + response = context_client.ListServices(ADMIN_CONTEXT_ID) + LOGGER.info('Services[{:d}] = {:s}'.format( + len(response.services), grpc_message_to_json_string(response) + )) + assert len(response.services) == 1 + + service_uuids : Set[str] = set() + for service in response.services: + if 'h2-h4' not in service.name: continue + service_id = service.service_id + assert service.service_status.service_status == ServiceStatusEnum.SERVICESTATUS_ACTIVE + assert service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM + + response = context_client.ListConnections(service_id) + LOGGER.info(' ServiceId[{:s}] => Connections[{:d}] = {:s}'.format( + grpc_message_to_json_string(service_id), len(response.connections), + grpc_message_to_json_string(response) + )) + assert len(response.connections) == 1 + + service_uuids.add(service_id.service_uuid.uuid) + + # Identify service to delete + assert len(service_uuids) == 1 + service_uuid = set(service_uuids).pop() + + URL = '/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services/vpn-service={:s}/'.format(service_uuid) + do_rest_delete_request(URL, logger=LOGGER, expected_status_codes={204}) + + # Verify the scenario has no services/slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 0 + assert len(response.slice_ids) == 0 diff --git a/src/tests/scenario2/old_tests/tests/Fixtures.py b/src/tests/scenario2/old_tests/tests/Fixtures.py index d2220db5c516843e930e0cab3294ae2fbca12ee6..f5d671bf5a2a739fb3055d2b9a8fe6472088a90e 100644 --- a/src/tests/scenario2/old_tests/tests/Fixtures.py +++ b/src/tests/scenario2/old_tests/tests/Fixtures.py @@ -15,37 +15,61 @@ import pytest from common.Settings import get_setting from common.proto.monitoring_pb2 import AlarmDescriptor, AlarmSubscription +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from monitoring.client.MonitoringClient import MonitoringClient from nbi.tests.mock_osm.MockOSM import MockOSM from .Objects import WIM_MAPPING, WIM_PASSWORD, WIM_USERNAME +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def monitoring_client(): + _client = MonitoringClient() + yield _client + _client.close() + + @pytest.fixture(scope='session') def osm_wim(): wim_url = 'http://{:s}:{:s}'.format( get_setting('NBISERVICE_SERVICE_HOST'), str(get_setting('NBISERVICE_SERVICE_PORT_HTTP'))) return MockOSM(wim_url, WIM_MAPPING, WIM_USERNAME, WIM_PASSWORD) + @pytest.fixture(scope='session') def alarm_descriptor(): - alarm_descriptor = AlarmDescriptor() - alarm_descriptor.alarm_description = "Default Alarm Description" - alarm_descriptor.name = "Default Alarm Name" - alarm_descriptor.kpi_value_range.kpiMinValue.floatVal = 0.0 - alarm_descriptor.kpi_value_range.kpiMaxValue.floatVal = 250.0 - alarm_descriptor.kpi_value_range.inRange = True - alarm_descriptor.kpi_value_range.includeMinValue = False - alarm_descriptor.kpi_value_range.includeMaxValue = True + alarm_descriptor.alarm_description = 'Default Alarm Description' + alarm_descriptor.name = 'Default Alarm Name' + alarm_descriptor.kpi_value_range.kpiMinValue.floatVal = 0.0 + alarm_descriptor.kpi_value_range.kpiMaxValue.floatVal = 250.0 + alarm_descriptor.kpi_value_range.inRange = True + alarm_descriptor.kpi_value_range.includeMinValue = False + alarm_descriptor.kpi_value_range.includeMaxValue = True return alarm_descriptor + @pytest.fixture(scope='session') def alarm_subscription(): - alarm_subscription = AlarmSubscription() - alarm_subscription.subscription_timeout_s = 10 - alarm_subscription.subscription_frequency_ms = 2000 + alarm_subscription.subscription_timeout_s = 10 + alarm_subscription.subscription_frequency_ms = 2000 - return alarm_subscription \ No newline at end of file + return alarm_subscription diff --git a/src/tests/scenario2/old_tests/tests/test_functional_bootstrap.py b/src/tests/scenario2/old_tests/tests/test_functional_bootstrap.py index 6d9f5f53a05bf7240287b38a9e323479c6bb9eaf..e2f5946f7032c5ecd8ab8443002c89d2e80699b3 100644 --- a/src/tests/scenario2/old_tests/tests/test_functional_bootstrap.py +++ b/src/tests/scenario2/old_tests/tests/test_functional_bootstrap.py @@ -13,22 +13,28 @@ # limitations under the License. import copy, logging, pytest + +from common.proto.context_pb2 import ( + Context, ContextId, Device, Empty, Link, Topology, +) +from common.proto.monitoring_pb2 import ( + AlarmDescriptor, AlarmList, KpiDescriptorList, +) from common.Settings import get_setting -from common.proto.monitoring_pb2 import KpiDescriptorList from common.tests.EventTools import EVENT_CREATE, EVENT_UPDATE, check_events from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Device import json_device_id from common.tools.object_factory.Link import json_link_id from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient -from monitoring.client.MonitoringClient import MonitoringClient from context.client.EventsCollector import EventsCollector -from common.proto.context_pb2 import Context, ContextId, Device, Empty, Link, Topology -from common.proto.monitoring_pb2 import AlarmDescriptor, AlarmList from device.client.DeviceClient import DeviceClient +from monitoring.client.MonitoringClient import MonitoringClient + +from .Fixtures import ( + alarm_descriptor, context_client, device_client, monitoring_client, +) # pylint: disable=unused-import from .Objects import CONTEXT_ID, CONTEXTS, DEVICES, LINKS, TOPOLOGIES -from tests.Fixtures import context_client, device_client, monitoring_client -from .Fixtures import alarm_descriptor LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/scenario2/old_tests/tests/test_functional_cleanup.py b/src/tests/scenario2/old_tests/tests/test_functional_cleanup.py index 6b157cefa288f3084c6b908235535e89942367af..dc1ec2562f94c811058f87beccf33d25f38ffd17 100644 --- a/src/tests/scenario2/old_tests/tests/test_functional_cleanup.py +++ b/src/tests/scenario2/old_tests/tests/test_functional_cleanup.py @@ -13,6 +13,13 @@ # limitations under the License. import logging, pytest + +from common.proto.context_pb2 import ( + ContextId, DeviceId, Empty, LinkId, TopologyId, +) +from common.proto.monitoring_pb2 import ( + AlarmID, AlarmList, KpiDescriptorList, KpiId, +) from common.Settings import get_setting from common.tests.EventTools import EVENT_REMOVE, check_events from common.tools.object_factory.Context import json_context_id @@ -21,11 +28,12 @@ from common.tools.object_factory.Link import json_link_id from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient from context.client.EventsCollector import EventsCollector -from common.proto.context_pb2 import ContextId, DeviceId, Empty, LinkId, TopologyId -from common.proto.monitoring_pb2 import KpiId, KpiDescriptorList, AlarmList, AlarmID from device.client.DeviceClient import DeviceClient from monitoring.client.MonitoringClient import MonitoringClient -from tests.Fixtures import context_client, device_client, monitoring_client + +from .Fixtures import ( + context_client, device_client, monitoring_client, +) # pylint: disable=unused-import from .Objects import CONTEXT_ID, CONTEXTS, DEVICES, LINKS, TOPOLOGIES LOGGER = logging.getLogger(__name__) diff --git a/src/tests/scenario2/old_tests/tests/test_functional_create_service.py b/src/tests/scenario2/old_tests/tests/test_functional_create_service.py index 4485ce3ed1b5321bd538e62ed326326d7894899e..db490bd51b7067d866984fb23b14b5ca61919e50 100644 --- a/src/tests/scenario2/old_tests/tests/test_functional_create_service.py +++ b/src/tests/scenario2/old_tests/tests/test_functional_create_service.py @@ -13,25 +13,30 @@ # limitations under the License. import logging, pytest, random, time + from grpc._channel import _MultiThreadedRendezvous + from common.DeviceTypes import DeviceTypeEnum +from common.proto.context_pb2 import ContextId, Empty +from common.proto.monitoring_pb2 import AlarmList, AlarmSubscription from common.Settings import get_setting from common.tests.EventTools import EVENT_CREATE, EVENT_UPDATE, check_events +from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Connection import json_connection_id from common.tools.object_factory.Device import json_device_id from common.tools.object_factory.Service import json_service_id -from common.tools.grpc.Tools import grpc_message_to_json_string -from nbi.tests.mock_osm.MockOSM import MockOSM from context.client.ContextClient import ContextClient -from monitoring.client.MonitoringClient import MonitoringClient from context.client.EventsCollector import EventsCollector -from common.proto.context_pb2 import ContextId, Empty -from common.proto.monitoring_pb2 import AlarmList, AlarmSubscription -from tests.Fixtures import context_client, monitoring_client -from .Fixtures import osm_wim, alarm_subscription +from monitoring.client.MonitoringClient import MonitoringClient +from nbi.tests.mock_osm.MockOSM import MockOSM + +from .Fixtures import ( + alarm_subscription, context_client, monitoring_client, osm_wim, +) # pylint: disable=unused-import from .Objects import ( - CONTEXT_ID, CONTEXTS, DEVICE_O1_UUID, DEVICE_R1_UUID, DEVICE_R3_UUID, DEVICES, LINKS, TOPOLOGIES, - WIM_SERVICE_CONNECTION_POINTS, WIM_SERVICE_TYPE) + CONTEXT_ID, CONTEXTS, DEVICE_O1_UUID, DEVICE_R1_UUID, DEVICE_R3_UUID, + DEVICES, LINKS, TOPOLOGIES, WIM_SERVICE_CONNECTION_POINTS, WIM_SERVICE_TYPE, +) LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/scenario2/old_tests/tests/test_functional_delete_service.py b/src/tests/scenario2/old_tests/tests/test_functional_delete_service.py index 42a9456e09b5b426e7f09df8432497c44058cf82..da6cce21c173dc843af9e1800a38101c59647963 100644 --- a/src/tests/scenario2/old_tests/tests/test_functional_delete_service.py +++ b/src/tests/scenario2/old_tests/tests/test_functional_delete_service.py @@ -13,23 +13,24 @@ # limitations under the License. import logging, pytest + from common.DeviceTypes import DeviceTypeEnum +from common.proto.context_pb2 import ContextId, Empty, ServiceTypeEnum from common.Settings import get_setting from common.tests.EventTools import EVENT_REMOVE, EVENT_UPDATE, check_events +from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Connection import json_connection_id from common.tools.object_factory.Device import json_device_id from common.tools.object_factory.Service import json_service_id -from common.tools.grpc.Tools import grpc_message_to_json_string -from nbi.tests.mock_osm.MockOSM import MockOSM from context.client.ContextClient import ContextClient from context.client.EventsCollector import EventsCollector -from common.proto.context_pb2 import ContextId, Empty, ServiceTypeEnum -from tests.Fixtures import context_client -from .Fixtures import osm_wim -from .Objects import ( - CONTEXT_ID, CONTEXTS, DEVICE_O1_UUID, DEVICE_R1_UUID, DEVICE_R3_UUID, DEVICES, LINKS, TOPOLOGIES, WIM_MAPPING, - WIM_PASSWORD, WIM_USERNAME) +from nbi.tests.mock_osm.MockOSM import MockOSM +from .Fixtures import context_client, osm_wim # pylint: disable=unused-import +from .Objects import ( + CONTEXT_ID, CONTEXTS, DEVICE_O1_UUID, DEVICE_R1_UUID, DEVICE_R3_UUID, + DEVICES, LINKS, TOPOLOGIES, WIM_MAPPING, WIM_PASSWORD, WIM_USERNAME, +) LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/tools/firewall_agent/DeploymentSet.yaml b/src/tests/tools/firewall_agent/DeploymentSet.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f23b33f26c4a4d63c23d20a0c06e75160cc1354e --- /dev/null +++ b/src/tests/tools/firewall_agent/DeploymentSet.yaml @@ -0,0 +1,73 @@ +# 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 + imagePullPolicy: Always + 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 + readinessProbe: + httpGet: + path: /restconf/data + port: 8888 + initialDelaySeconds: 5 + timeoutSeconds: 1 + livenessProbe: + httpGet: + path: /restconf/data + 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 diff --git a/src/tests/tools/firewall_agent/Dockerfile b/src/tests/tools/firewall_agent/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..3207a5fff7f0140414f480ba1ebe2cfb5b44fcc8 --- /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 --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 ./ +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 0000000000000000000000000000000000000000..2f07034de861091f89d23d02e21161fb7eb493cf --- /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/docs/Docs-and-Commands.md b/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md new file mode 100644 index 0000000000000000000000000000000000000000..2c133c875f897457ade5438f9803c8c052ceeb37 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md @@ -0,0 +1,1009 @@ +# 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 --interactive --handle + +# 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; } +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 0000000000000000000000000000000000000000..30f02e67edd7c0ae617149ec1fa5aeee2636ab80 --- /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 0000000000000000000000000000000000000000..7bfee36478edc7c65677cfe48b2630bffff791cb --- /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 0000000000000000000000000000000000000000..f66c205ce076e65b2ded1d388c944a91829a48b5 --- /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 0000000000000000000000000000000000000000..ee58fa3ab0042120d5607b8713d21fa0ba845895 --- /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 0000000000000000000000000000000000000000..74ce02934ae9a8443d13780849ea04b9774f2313 --- /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 0000000000000000000000000000000000000000..885a0947ebdf00744e603cff61451c18b76315b6 --- /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 0000000000000000000000000000000000000000..0d780d63c23a47b09c0f83104ced748edbb81a72 --- /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 0000000000000000000000000000000000000000..6b3977907d1a0ec3c64f704b23b5da2b101cbfc2 --- /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 0000000000000000000000000000000000000000..486f3e157f6073da30dddafd369c96df8eac99d3 --- /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 0000000000000000000000000000000000000000..ecd77cabf64b25071ccba6a76c0e1bc88d783fde --- /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 0000000000000000000000000000000000000000..b5f467a74278c5179aab0ede32b05e4280309081 --- /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 0000000000000000000000000000000000000000..c287986642cc5bccfd1273570a84f77f1a4b0fcd --- /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 0000000000000000000000000000000000000000..0c2a92bece702ae8208d70176b66f0a1342d15e6 --- /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 0000000000000000000000000000000000000000..f6a577bb0e8625572a3d32da8ee2ac6780bba7ed --- /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 0000000000000000000000000000000000000000..3991923f620eeb45326951e971312814f87f08c3 --- /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 0000000000000000000000000000000000000000..8aebaaa068ae3ef2605c09af280d6d61399b16aa --- /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 0000000000000000000000000000000000000000..2cf2bdc84f11d0688eb56574620cd787f2d5c56f --- /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 0000000000000000000000000000000000000000..765e467cf8cc7d10950753160a90fee321016a94 --- /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 0000000000000000000000000000000000000000..2e0fd9f075b235e90ebc58a5f56072cbaceccb56 --- /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 0000000000000000000000000000000000000000..dc56998428f8facb7e810249bb8b9ecff51f6005 --- /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 0000000000000000000000000000000000000000..afb5330674db317a3cd71bedc911d4913ac59b8e --- /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 0000000000000000000000000000000000000000..effb85bb761105620bba88c8578d101e57179c30 --- /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 0000000000000000000000000000000000000000..d28881f9e23327e82d281f3f76d7abe8f376df57 --- /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 0000000000000000000000000000000000000000..bbcf931a6deb0beeb891ed8327f40786f565cd7b --- /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 0000000000000000000000000000000000000000..c4617b5e6b3dbe07df47799086b93475f36a59e2 --- /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 0000000000000000000000000000000000000000..ff74c428763ec0ab07ac2866363ba06a03b022f9 --- /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 0000000000000000000000000000000000000000..a146b9b7682ecd30521506943aa64fdfcbf67689 --- /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 0000000000000000000000000000000000000000..c978cd049c3f3043d84d3b0a9944e77c7f50d3a8 --- /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 0000000000000000000000000000000000000000..09af39887c820af15e92ef237025cb1997b5b537 --- /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 0000000000000000000000000000000000000000..905d4815026574a2813d14f977c2b328bdd13cc0 --- /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 NFTables: + 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 == rule_comment: 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) + + return nft + + +class ACL(Resource): + def get(self, name : str): + nft = load_nftables_by_rule_comment(name) + return nft.to_openconfig(), 200 + + def delete(self, name : str): + nft = load_nftables_by_rule_comment(name) + 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/AclRuleToInterfaceDirection.py b/src/tests/tools/firewall_agent/firewall_agent/resources/AclRuleToInterfaceDirection.py new file mode 100644 index 0000000000000000000000000000000000000000..6f2668fd06ed41613775846cc728c89d02abe70d --- /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/Components.py b/src/tests/tools/firewall_agent/firewall_agent/resources/Components.py new file mode 100644 index 0000000000000000000000000000000000000000..a00f6d54e7c59005fbf4a8cdb7b4a07c7553ae1b --- /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 0000000000000000000000000000000000000000..1ef52084bd97cb7cbe15e9b28b9c4619f5d4a9b0 --- /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 0000000000000000000000000000000000000000..4c8d9e307bd1f69d60212fa87af5fdfee7a1fdc8 --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/Interfaces.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. + + +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} + if_list.append(if_data) + + 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 0000000000000000000000000000000000000000..951a3c888547ce622f2b4576880a43b5347cb52c --- /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 0000000000000000000000000000000000000000..3ccc21c7db78aac26daa1f8c5ff8e1ffd3f35460 --- /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/nbi/service/ietf_l2vpn/schemas/Common.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/ActionEnum.py similarity index 74% rename from src/nbi/service/ietf_l2vpn/schemas/Common.py rename to src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/ActionEnum.py index b18c54a0c58f247e60f8985985fabc2a411fdd36..6db7d15e01bbe3abc850f0f9eb4b37b10cd130d4 100644 --- a/src/nbi/service/ietf_l2vpn/schemas/Common.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/ActionEnum.py @@ -12,5 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -# String pattern for UUIDs such as '3fd942ee-2dc3-41d1-aeec-65aa85d117b2' -REGEX_UUID = r'[a-fA-F0-9]{8}\-[a-fA-F0-9]{4}\-[a-fA-F0-9]{4}\-[a-fA-F0-9]{4}\-[a-fA-F0-9]{12}' + +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 0000000000000000000000000000000000000000..3cd0ff76947ac6842f876f8d4d96e73424bb4634 --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py @@ -0,0 +1,143 @@ +# 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 +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 + 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: chain.type = str(table.value).lower() + if hook is None: chain.hook = str(name).lower() + chain.prio = prio + chain.policy = policy.value + 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.FILTER.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 + self.rules.append(rule) + + 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[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: + parts = [ + 'add', 'chain', self.family.value, self.table.value, self.chain, + '{', + 'type', self.type, 'hook', self.hook, 'priority', str(self.prio), ';', + 'policy', self.policy, ';', + '}' + ] + commands.append((-1, ' '.join(parts))) + + for rule in self.rules: + 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/DirectionEnum.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/DirectionEnum.py new file mode 100644 index 0000000000000000000000000000000000000000..dec3813dc435c39962a14b43216a1e4a3cda5038 --- /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 0000000000000000000000000000000000000000..17bb3441e6b49944c1524babad1c42b6c576448c --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py @@ -0,0 +1,91 @@ +# 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 : 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: + 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 0000000000000000000000000000000000000000..f0e2a933ad5846da52d80de18a7f2f1da9d0d9fa --- /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 0000000000000000000000000000000000000000..7c3aea14bc9927ded3067f3501866d6b099c287d --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py @@ -0,0 +1,162 @@ +# 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 +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 + + +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, skip_rules : bool = False + ) -> None: + entries = NFTablesCommand.list(family=family, table=table, chain=chain) + 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, skip_rules : bool = False) -> 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'}: + if skip_rules: return + 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 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() + 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[Tuple[int, str]]: + commands : List[Tuple[int, str]] = list() + for table in self.tables.values(): + commands.extend(table.get_commands(removal=removal)) + # 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 new file mode 100644 index 0000000000000000000000000000000000000000..983acf506981aac5ef40ec8950fe3d84b39641b6 --- /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, Tuple +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[Tuple[int, str]], verbose : bool = True) -> None: + nft = nftables.Nftables() + nft.set_json_output(True) + for priority, command in commands: + if verbose: + 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)}') + 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 0000000000000000000000000000000000000000..0546787d8bf9252c8bd79e21b78c2c13ea5a733a --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py @@ -0,0 +1,90 @@ +# 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) -> 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: + 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) + 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) + elif '&' in match_left: + # matches on masks and marks are skipped + pass + 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/ProtocolEnum.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/ProtocolEnum.py new file mode 100644 index 0000000000000000000000000000000000000000..c54ed6365d801e0cd39ee397accc005539479fdc --- /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 0000000000000000000000000000000000000000..040a03ca8dedf8bc72488b690bf4b123c48258de --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py @@ -0,0 +1,280 @@ +# 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__) + + +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 + table : TableEnum + 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 + 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': + rule : 'Rule' = cls(family, table, chain) + + if 'expr' not in entry: raise MissingFieldException('rule.expr', entry) + expr_list : List[Dict] = entry['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'] + 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', 'jump', 'xt'}: + pass # ignore these entry types + else: + raise UnsupportedElementException('expr_entry', expr_entry) + + if num_fields_updated == 0: + # Ignoring empty/unsupported rule... + return None + + rule.comment = entry.pop('comment', None) + 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: + 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') + + action = acl_entry['actions']['config']['forwarding-action'] + rule.action = get_nft_action_from_openconfig(action) + + 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) -> Optional[Tuple[int, 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) + ] + 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. + 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]) + 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 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 new file mode 100644 index 0000000000000000000000000000000000000000..85512f352489f315e22ac5bb62f87e3d3999020a --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py @@ -0,0 +1,96 @@ +# 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_chain(self, name : str) -> Chain: + return self.chains[name] + + def get_or_create_chain(self, name : str) -> Chain: + 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['name'] + if name.lower() not in {'input', 'output', 'forward', 'prerouting'}: return None + 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_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[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 new file mode 100644 index 0000000000000000000000000000000000000000..8388b2abe7486166e7209919c571c2e50a7abe5b --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/TableEnum.py @@ -0,0 +1,26 @@ +# 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' + MANGLE = 'mangle' + NAT = 'nat' + RAW = 'raw' + 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 0000000000000000000000000000000000000000..3ccc21c7db78aac26daa1f8c5ff8e1ffd3f35460 --- /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 0000000000000000000000000000000000000000..dc838bd264ab69d029993d6838c41e180a88ccc0 --- /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-docker.sh b/src/tests/tools/firewall_agent/redeploy-docker.sh new file mode 100755 index 0000000000000000000000000000000000000000..62dada77b6a2383cda12990004f886cb7b28f07e --- /dev/null +++ b/src/tests/tools/firewall_agent/redeploy-docker.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/redeploy-kubernetes.sh b/src/tests/tools/firewall_agent/redeploy-kubernetes.sh new file mode 100755 index 0000000000000000000000000000000000000000..ad42c14c4a365d83e010bb0d4cb28073729a32b0 --- /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 diff --git a/src/tests/tools/firewall_agent/requirements.txt b/src/tests/tools/firewall_agent/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..4ed5d0f4ee2a1554935e5a5f505b4b069974b9a9 --- /dev/null +++ b/src/tests/tools/firewall_agent/requirements.txt @@ -0,0 +1,19 @@ +# 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 diff --git a/src/tests/tools/firewall_agent/scripts/data/accept_30435_from_10_0_2_10.json b/src/tests/tools/firewall_agent/scripts/data/accept_30435_from_10_0_2_10.json new file mode 100644 index 0000000000000000000000000000000000000000..e46bd1f268c211ebab5cae4ad4da1d2febab6cfe --- /dev/null +++ b/src/tests/tools/firewall_agent/scripts/data/accept_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": "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": "ACCEPT"}} + } + ]} + }]}, + "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/accept_30435_from_10_0_2_2.json b/src/tests/tools/firewall_agent/scripts/data/accept_30435_from_10_0_2_2.json new file mode 100644 index 0000000000000000000000000000000000000000..df18d93c1265ffa9e93a8d70335e6fc4b85f2ea8 --- /dev/null +++ b/src/tests/tools/firewall_agent/scripts/data/accept_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": "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": "ACCEPT"}} + } + ]} + }]}, + "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/reject_30435_from_all.json b/src/tests/tools/firewall_agent/scripts/data/reject_30435_from_all.json new file mode 100644 index 0000000000000000000000000000000000000000..99ac22dd0a8c17f5ade2846f2dcff61b8bcd9def --- /dev/null +++ b/src/tests/tools/firewall_agent/scripts/data/reject_30435_from_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": 10000, + "config": {"sequence-id": 10000, "description": "reject-30435-from-all"}, + "ipv4": {"config": {"protocol": "IP_TCP"}}, + "transport": {"config": {"destination-port": 30435}}, + "actions": {"config": {"forwarding-action": "REJECT"}} + } + ]} + }]}, + "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": 10000}]} + } + ]} + }]} +}} 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 0000000000000000000000000000000000000000..d57ad29f95d118cbbba0fa8b484d6935864dcad9 --- /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 0000000000000000000000000000000000000000..22da27d928200b93490956bac183cff93978dc56 --- /dev/null +++ b/src/tests/tools/firewall_agent/scripts/test_commands.sh @@ -0,0 +1,31 @@ +#!/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 + +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=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 diff --git a/src/tests/tools/firewall_agent/tests/docker-compose-down.sh b/src/tests/tools/firewall_agent/tests/docker-compose-down.sh new file mode 100755 index 0000000000000000000000000000000000000000..edae64d04e60d16a04a09c4c7183b361bb3193e1 --- /dev/null +++ b/src/tests/tools/firewall_agent/tests/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/tests/docker-compose-up.sh b/src/tests/tools/firewall_agent/tests/docker-compose-up.sh new file mode 100755 index 0000000000000000000000000000000000000000..43687694ba617e54ef396aa36675ab23b37ccd33 --- /dev/null +++ b/src/tests/tools/firewall_agent/tests/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/ryu-openflow/Mininet.Dockerfile b/src/tests/tools/firewall_agent/tests/docker-compose.yml similarity index 54% rename from src/tests/ryu-openflow/Mininet.Dockerfile rename to src/tests/tools/firewall_agent/tests/docker-compose.yml index a465297e42eb87a4f19cc1b5c07f111feed4fccd..596ae4d5111ccbe6a59aff478583766816db01f8 100644 --- a/src/tests/ryu-openflow/Mininet.Dockerfile +++ b/src/tests/tools/firewall_agent/tests/docker-compose.yml @@ -12,16 +12,26 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM ubuntu:22.04 -ENV DEBIAN_FRONTEND=noninteractive -RUN apt-get update && \ - apt-get install -y --no-install-recommends iproute2 net-tools openvswitch-switch ca-certificates && \ - apt-get install -y --no-install-recommends mininet=2.3.0-1ubuntu1 && \ - apt-get autoremove -y && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* +services: + firewall_agent: + build: + context: . + dockerfile: Dockerfile + container_name: firewall-agent + network_mode: host + cap_add: + - NET_ADMIN + - NET_RAW -COPY custom_pentagon_topology.py /opt/custom_pentagon_topology.py + public_server: + image: python:3.11-slim + container_name: public-server + network_mode: host + command: ["python", "-u", "-m", "http.server", "8001"] -CMD ["python3", "/opt/custom_pentagon_topology.py"] + 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/tests/oc_acl_block_8001.json b/src/tests/tools/firewall_agent/tests/oc_acl_block_8001.json new file mode 100644 index 0000000000000000000000000000000000000000..70efb0d4ba2dbe780a12c26508c5e6d1cc0a8834 --- /dev/null +++ b/src/tests/tools/firewall_agent/tests/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/tests/oc_acl_block_8002.json b/src/tests/tools/firewall_agent/tests/oc_acl_block_8002.json new file mode 100644 index 0000000000000000000000000000000000000000..2d20df7b220e394e3ba62f1cd9a15f4c1d506d5a --- /dev/null +++ b/src/tests/tools/firewall_agent/tests/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/tests/oc_acl_multi_rule.json b/src/tests/tools/firewall_agent/tests/oc_acl_multi_rule.json new file mode 100644 index 0000000000000000000000000000000000000000..55f41c03305e539024a9b12644448705455fba62 --- /dev/null +++ b/src/tests/tools/firewall_agent/tests/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/tests/test_commands.sh b/src/tests/tools/firewall_agent/tests/test_commands.sh new file mode 100755 index 0000000000000000000000000000000000000000..5e82b091372b6820f17044ebb019f2c416559aab --- /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 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 1c6996581b023c7a858a2f9e3020556ec6690194..622e03fbf7cf5942e4bab4b7e5a9ff94e74aed78 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 ea2e7f748ee154e6cee02a7fee6b127e1333d2ce..d2c2b5c2f37ec115fba9382cd988d73a7c63384f 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: diff --git a/src/tests/tools/mock_osm/Tools.py b/src/tests/tools/mock_osm/Tools.py index 56b0c11d2ad5ae044380fca190fcf1f48d771e8a..4ddc7974da5dc618f72d74bf98995fa0ddd5d830 100644 --- a/src/tests/tools/mock_osm/Tools.py +++ b/src/tests/tools/mock_osm/Tools.py @@ -12,14 +12,17 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Dict, Optional +from typing import Dict, Optional, Tuple def compose_service_endpoint_id(site_id : str, endpoint_id : Dict): device_uuid = endpoint_id['device_id']['device_uuid']['uuid'] endpoint_uuid = endpoint_id['endpoint_uuid']['uuid'] return ':'.join([site_id, device_uuid, endpoint_uuid]) -def wim_mapping(site_id, ce_endpoint_id, pe_device_id : Optional[Dict] = None, priority=None, redundant=[]): +def wim_mapping( + site_id, ce_endpoint_id, pe_device_id : Optional[Dict] = None, + bearer_prefix : Optional[str] = None, priority=None, redundant=[] +) -> Tuple[str, Dict]: ce_device_uuid = ce_endpoint_id['device_id']['device_uuid']['uuid'] ce_endpoint_uuid = ce_endpoint_id['endpoint_uuid']['uuid'] service_endpoint_id = compose_service_endpoint_id(site_id, ce_endpoint_id) @@ -28,6 +31,8 @@ def wim_mapping(site_id, ce_endpoint_id, pe_device_id : Optional[Dict] = None, p else: pe_device_uuid = pe_device_id['device_uuid']['uuid'] bearer = '{:s}:{:s}'.format(ce_device_uuid, pe_device_uuid) + if bearer_prefix is not None: + bearer = '{:s}:{:s}'.format(bearer_prefix, bearer) mapping = { 'service_endpoint_id': service_endpoint_id, 'datacenter_id': site_id, 'device_id': ce_device_uuid, 'device_interface_id': ce_endpoint_uuid, diff --git a/src/tests/tools/mock_osm/WimconnectorIETFL2VPN.py b/src/tests/tools/mock_osm/WimconnectorIETFL2VPN.py index aa4ca045f41ffdc69d2ebf2fcd9b5db99ce45dbe..de940a7d2546885fe50dedbe8aa7d402730f6aa6 100644 --- a/src/tests/tools/mock_osm/WimconnectorIETFL2VPN.py +++ b/src/tests/tools/mock_osm/WimconnectorIETFL2VPN.py @@ -193,7 +193,7 @@ class WimconnectorIETFL2VPN(SdnConnectorBase): vpn_service_l = {"ietf-l2vpn-svc:vpn-service": vpn_service_list} response_service_creation = None conn_info = [] - self.logger.info("Sending vpn-service :{}".format(vpn_service_l)) + self.logger.info("Sending vpn-service : {:s}".format(str(vpn_service_l))) try: endpoint_service_creation = ( @@ -319,6 +319,8 @@ class WimconnectorIETFL2VPN(SdnConnectorBase): conn_info_d["mapping"] = None conn_info.append(conn_info_d) + self.logger.info("Sending site_network_accesses : {:s}".format(str(site_network_accesses))) + try: endpoint_site_network_access_creation = ( "{}/restconf/data/ietf-l2vpn-svc:l2vpn-svc/" diff --git a/src/tests/tools/test_tools_p4.py b/src/tests/tools/test_tools_p4.py index e770037caad109ba3ad45b68fff91b02997c84c3..276cc57a3c2fda5218ce45f12ed57a4d6ac63392 100644 --- a/src/tests/tools/test_tools_p4.py +++ b/src/tests/tools/test_tools_p4.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import os from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum,\ DeviceDriverEnum, ServiceTypeEnum, ServiceStatusEnum @@ -25,89 +24,12 @@ ADMIN_CONTEXT_ID = ContextId(**json_context_id(CONTEXT_NAME_P4)) # Device and rule cardinality variables DEV_NB = 4 P4_DEV_NB = 1 -CONNECTION_RULES = 3 -ENDPOINT_RULES = 3 -INT_RULES = 19 -L2_RULES = 10 -L3_RULES = 4 -ACL_RULES = 1 - -DATAPLANE_RULES_NB_INT_B1 = 5 -DATAPLANE_RULES_NB_INT_B2 = 6 -DATAPLANE_RULES_NB_INT_B3 = 8 -DATAPLANE_RULES_NB_RT_WEST = 7 -DATAPLANE_RULES_NB_RT_EAST = 7 -DATAPLANE_RULES_NB_ACL = 1 -DATAPLANE_RULES_NB_TOT = \ - DATAPLANE_RULES_NB_INT_B1 +\ - DATAPLANE_RULES_NB_INT_B2 +\ - DATAPLANE_RULES_NB_INT_B3 +\ - DATAPLANE_RULES_NB_RT_WEST +\ - DATAPLANE_RULES_NB_RT_EAST +\ - DATAPLANE_RULES_NB_ACL # Service-related variables SVC_NB = 1 NO_SERVICES = 0 NO_SLICES = 0 -TEST_PATH = os.path.join( - os.path.dirname(os.path.dirname( - os.path.abspath(__file__) - )) + '/p4-fabric-tna/descriptors') -assert os.path.exists(TEST_PATH), "Invalid path to P4 SD-Fabric tests" - -# Topology descriptor -DESC_TOPO = os.path.join(TEST_PATH, 'topology.json') -assert os.path.exists(DESC_TOPO), "Invalid path to the SD-Fabric topology descriptor" - -# SBI descriptors -# The switch cannot digest all rules at once, hence we insert in batches -DESC_FILE_RULES_INSERT_INT_B1 = os.path.join(TEST_PATH, 'sbi-rules-insert-int-b1.json') -assert os.path.exists(DESC_FILE_RULES_INSERT_INT_B1),\ - "Invalid path to the SD-Fabric INT SBI descriptor (batch #1)" - -DESC_FILE_RULES_INSERT_INT_B2 = os.path.join(TEST_PATH, 'sbi-rules-insert-int-b2.json') -assert os.path.exists(DESC_FILE_RULES_INSERT_INT_B2),\ - "Invalid path to the SD-Fabric INT SBI descriptor (batch #2)" - -DESC_FILE_RULES_INSERT_INT_B3 = os.path.join(TEST_PATH, 'sbi-rules-insert-int-b3.json') -assert os.path.exists(DESC_FILE_RULES_INSERT_INT_B3),\ - "Invalid path to the SD-Fabric INT SBI descriptor (batch #3)" - -DESC_FILE_RULES_INSERT_ROUTING_WEST = os.path.join(TEST_PATH, 'sbi-rules-insert-routing-west.json') -assert os.path.exists(DESC_FILE_RULES_INSERT_ROUTING_WEST),\ - "Invalid path to the SD-Fabric routing SBI descriptor (domain1-side)" - -DESC_FILE_RULES_INSERT_ROUTING_EAST = os.path.join(TEST_PATH, 'sbi-rules-insert-routing-east.json') -assert os.path.exists(DESC_FILE_RULES_INSERT_ROUTING_EAST),\ - "Invalid path to the SD-Fabric routing SBI descriptor (domain2-side)" - -DESC_FILE_RULES_INSERT_ACL = os.path.join(TEST_PATH, 'sbi-rules-insert-acl.json') -assert os.path.exists(DESC_FILE_RULES_INSERT_ACL),\ - "Invalid path to the SD-Fabric ACL SBI descriptor" - -DESC_FILE_RULES_DELETE_ALL = os.path.join(TEST_PATH, 'sbi-rules-remove.json') -assert os.path.exists(DESC_FILE_RULES_DELETE_ALL),\ - "Invalid path to the SD-Fabric rule removal SBI descriptor" - -# Service descriptors -DESC_FILE_SERVICE_P4_INT = os.path.join(TEST_PATH, 'service-p4-int.json') -assert os.path.exists(DESC_FILE_SERVICE_P4_INT),\ - "Invalid path to the SD-Fabric INT service descriptor" - -DESC_FILE_SERVICE_P4_L2_SIMPLE = os.path.join(TEST_PATH, 'service-p4-l2-simple.json') -assert os.path.exists(DESC_FILE_SERVICE_P4_L2_SIMPLE),\ - "Invalid path to the SD-Fabric L2 simple service descriptor" - -DESC_FILE_SERVICE_P4_L3 = os.path.join(TEST_PATH, 'service-p4-l3.json') -assert os.path.exists(DESC_FILE_SERVICE_P4_L3),\ - "Invalid path to the SD-Fabric L3 service descriptor" - -DESC_FILE_SERVICE_P4_ACL = os.path.join(TEST_PATH, 'service-p4-acl.json') -assert os.path.exists(DESC_FILE_SERVICE_P4_ACL),\ - "Invalid path to the SD-Fabric ACL service descriptor" - def identify_number_of_p4_devices(devices) -> int: p4_dev_no = 0 diff --git a/src/tests/tools/traffic_changer/templates/affect_form.html b/src/tests/tools/traffic_changer/templates/affect_form.html index cfdb0296d637d357e3baea5101c9e0ea241cdbab..204d6ebb2d35551323a7af954f775b1e90a02218 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 @@ + + diff --git a/src/webui/service/device/forms.py b/src/webui/service/device/forms.py index be6bda21b4653de02f8856684cc208fe51f3e5a7..6c2cbe361215358c0392a476f3897845566a5ffa 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_openroadm = 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 f48d5d30069b4835e221623d1143ea3a5ebe5a5e..d2975a75f0949d69545e82fb9e76dd53d7fe160f 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/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/oran-cn.png b/src/webui/service/static/topology_icons/oran-cn.png new file mode 100644 index 0000000000000000000000000000000000000000..f1555434f9db8e4268b6544933069601bb79eeab Binary files /dev/null and b/src/webui/service/static/topology_icons/oran-cn.png differ diff --git a/src/webui/service/static/topology_icons/oran-cu.png b/src/webui/service/static/topology_icons/oran-cu.png new file mode 100644 index 0000000000000000000000000000000000000000..aff6986e3800b4184d942f9a8edb24a406db1ccc Binary files /dev/null and b/src/webui/service/static/topology_icons/oran-cu.png differ diff --git a/src/webui/service/static/topology_icons/oran-du.png b/src/webui/service/static/topology_icons/oran-du.png new file mode 100644 index 0000000000000000000000000000000000000000..d486305cf02b0fe1ed6c92f38ce1cb21887cd3bc Binary files /dev/null and b/src/webui/service/static/topology_icons/oran-du.png differ 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 diff --git a/src/webui/service/templates/device/add.html b/src/webui/service/templates/device/add.html index 24c0dd949bb805b787e409a733ae19207e8ac035..1c01f22926dac4e338665bbe0d5fee78e4881e33 100644 --- a/src/webui/service/templates/device/add.html +++ b/src/webui/service/templates/device/add.html @@ -107,6 +107,7 @@
{{ form.device_drivers_ryu }} {{ form.device_drivers_ryu.label(class="col-sm-3 col-form-label") }} {{ form.device_drivers_gnmi_nokia_srlinux }} {{ form.device_drivers_gnmi_nokia_srlinux.label(class="col-sm-3 col-form-label") }} + {{ form.device_drivers_openroadm }} {{ form.device_drivers_openroadm.label(class="col-sm-3 col-form-label") }} {% endif %} diff --git a/src/webui/service/templates/js/topology.js b/src/webui/service/templates/js/topology.js index dcbbc51be4fe53f000206401f4c77ef18b53b9c4..d1266909193c2286a21f77454e3f9d5f73ddd545 100644 --- a/src/webui/service/templates/js/topology.js +++ b/src/webui/service/templates/js/topology.js @@ -31,24 +31,39 @@ const margin = {top: 5, right: 5, bottom: 5, left: 5}; const icon_width = 40; const icon_height = 40; -width = 1400 - margin.left - margin.right; -height = 800 - margin.top - margin.bottom; - -//function handleZoom(e) { -// console.dir(e); -// d3.select('svg g').attr('transform', e.transform); -//} -//let zoom = d3.zoom().scaleExtent([0.01, 10]).translateExtent([[0, 0], [width, height]]).on('zoom', handleZoom); - -// append the svg object to the body of the page -const svg = d3.select('#topology') - .append('svg') +const topologyContainer = d3.select('#topology'); +const svg = topologyContainer.append('svg'); +const zoomLayer = svg.append('g'); +const graphLayer = zoomLayer.append('g') + .attr('transform', `translate(${margin.left}, ${margin.top})`); + +let width = 0; +let height = 0; +let graphInitialized = false; + +function updateCanvasSize() { + const bounds = topologyContainer.node().getBoundingClientRect(); + width = Math.max(bounds.width - margin.left - margin.right, 200); + height = Math.max(bounds.height - margin.top - margin.bottom, 200); + svg .attr('width', width + margin.left + margin.right) - .attr('height', height + margin.top + margin.bottom) - //.call(zoom) - .append('g') - .attr('transform', `translate(${margin.left}, ${margin.top})`) - ; + .attr('height', height + margin.top + margin.bottom); +} +updateCanvasSize(); + +function handleZoom() { + zoomLayer.attr('transform', d3.event.transform); +} + +const zoom = d3.zoom() + .scaleExtent([0.2, 8]) + .on('zoom', handleZoom); + +svg.call(zoom); + +const ZOOM_DURATION_MS = 250; +const ZOOM_SCALE_STEP = 1.2; +const PAN_OFFSET = 80; // svg objects var link, node, optical_link, labels; @@ -67,10 +82,21 @@ forceProperties = { var simulation = d3.forceSimulation(); +function applyDirectionalForces() { + simulation + .force("center", d3.forceCenter(width * forceProperties.center.x, height * forceProperties.center.y)) + .force("forceX", d3.forceX() + .strength(forceProperties.forceX.strength * forceProperties.forceX.enabled) + .x(width * forceProperties.forceX.x)) + .force("forceY", d3.forceY() + .strength(forceProperties.forceY.strength * forceProperties.forceY.enabled) + .y(height * forceProperties.forceY.y)); +} + // load the data d3.json("{{ url_for('main.topology') }}", function(data) { // set the data and properties of link lines and node circles - link = svg.append("g").attr("class", "links")//.style('stroke', '#aaa') + link = graphLayer.append("g").attr("class", "links")//.style('stroke', '#aaa') .selectAll("line") .data(data.links) .enter() @@ -86,7 +112,7 @@ d3.json("{{ url_for('main.topology') }}", function(data) { return l.name.toLowerCase().includes('mgmt') ? "5,5" : "0"; }); - optical_link = svg.append("g").attr("class", "links")//.style('stroke', '#aaa') + optical_link = graphLayer.append("g").attr("class", "links")//.style('stroke', '#aaa') .selectAll("line") .data(data.optical_links) .enter() @@ -102,7 +128,7 @@ d3.json("{{ url_for('main.topology') }}", function(data) { return l.name.toLowerCase().includes('mgmt') ? "5,5" : "0"; }); - node = svg.append("g").attr("class", "devices").attr('r', 20).style('fill', '#69b3a2') + node = graphLayer.append("g").attr("class", "devices").attr('r', 20).style('fill', '#69b3a2') .selectAll("circle") .data(data.devices) .enter() @@ -117,7 +143,7 @@ d3.json("{{ url_for('main.topology') }}", function(data) { // node tooltip //node.append("title").text(function(n) { return n.name; }); // persistent node labels - labels = svg.append("g").attr("class", "labels") + labels = graphLayer.append("g").attr("class", "labels") .selectAll("text") .data(data.devices) .enter() @@ -142,7 +168,7 @@ d3.json("{{ url_for('main.topology') }}", function(data) { // add forces, associate each with a name, and set their properties // Experimental : Optical link part - all_links = data.links.concat(data.optical_links) + const all_links = data.links.concat(data.optical_links); simulation .force("link", d3.forceLink() .id(function(d) {return d.id;}) @@ -162,19 +188,13 @@ d3.json("{{ url_for('main.topology') }}", function(data) { .force("collide", d3.forceCollide() .strength(forceProperties.collide.strength * forceProperties.collide.enabled) .radius(forceProperties.collide.radius) - .iterations(forceProperties.collide.iterations)) - .force("center", d3.forceCenter() - .x(width * forceProperties.center.x) - .y(height * forceProperties.center.y)) - .force("forceX", d3.forceX() - .strength(forceProperties.forceX.strength * forceProperties.forceX.enabled) - .x(width * forceProperties.forceX.x)) - .force("forceY", d3.forceY() - .strength(forceProperties.forceY.strength * forceProperties.forceY.enabled) - .y(height * forceProperties.forceY.y)); + .iterations(forceProperties.collide.iterations)); + + applyDirectionalForces(); // after each simulation tick, update the display positions simulation.on("tick", ticked); + graphInitialized = true; }); // update the display positions @@ -221,30 +241,40 @@ function dragended(d) { } // update size-related forces -d3.select(window).on("resize", function(){ - width = +svg.node().getBoundingClientRect().width; - height = +svg.node().getBoundingClientRect().height; - simulation.alpha(1).restart(); -}); +function handleResize() { + updateCanvasSize(); + if (graphInitialized) { + applyDirectionalForces(); + simulation.alpha(0.3).restart(); + } +} -///******************** UI ACTIONS *******************/ -// -//function resetZoom() { -// d3.select('svg').transition().call(zoom.scaleTo, 1.0); -//} -//function zoomIn() { -// d3.select('svg').transition().call(zoom.scaleBy, 2.0); -//} -//function zoomOut() { -// d3.select('svg').transition().call(zoom.scaleBy, 0.5); -//} -// -//function center() { -// d3.select('svg').transition().call(zoom.translateTo, 0.5 * width, 0.5 * height); -//} -//function panLeft() { -// d3.select('svg').transition().call(zoom.translateBy, -50, 0); -//} -//function panRight() { -// d3.select('svg').transition().call(zoom.translateBy, 50, 0); -//} +d3.select(window).on("resize", handleResize); + +/******************** UI ACTIONS *******************/ + +function resetZoom() { + svg.transition().duration(ZOOM_DURATION_MS).call(zoom.transform, d3.zoomIdentity); +} + +function zoomIn() { + svg.transition().duration(ZOOM_DURATION_MS).call(zoom.scaleBy, ZOOM_SCALE_STEP); +} + +function zoomOut() { + svg.transition().duration(ZOOM_DURATION_MS).call(zoom.scaleBy, 1 / ZOOM_SCALE_STEP); +} + +function center() { + const centerX = margin.left + width / 2; + const centerY = margin.top + height / 2; + svg.transition().duration(ZOOM_DURATION_MS).call(zoom.translateTo, centerX, centerY); +} + +function panLeft() { + svg.transition().duration(ZOOM_DURATION_MS).call(zoom.translateBy, -PAN_OFFSET, 0); +} + +function panRight() { + svg.transition().duration(ZOOM_DURATION_MS).call(zoom.translateBy, PAN_OFFSET, 0); +} diff --git a/src/webui/service/templates/main/home.html b/src/webui/service/templates/main/home.html index 5a5c439e1cce66433a984e3ab11ba01544a7f461..4b66463ca15052f85575b573b0cd4e8244f6e516 100644 --- a/src/webui/service/templates/main/home.html +++ b/src/webui/service/templates/main/home.html @@ -18,6 +18,17 @@ {% block content %}

ETSI TeraFlowSDN Controller

+ {% for field, message in context_topology_form.errors.items() %}