From e32b74a595ec5fe48dc04f2bd9556fc509a35d56 Mon Sep 17 00:00:00 2001
From: gifrerenom <lluis.gifre@cttc.es>
Date: Thu, 11 May 2023 17:17:04 +0000
Subject: [PATCH] OECC/PSC'22 - Interdomain test:

- Updated descriptors to release 2
- Updated scripts to release 2
- Updated manifests to release 2
- Added TODO file
---
 src/tests/oeccpsc22/.gitignore                |   1 +
 src/tests/oeccpsc22/TODO.txt                  |   3 +
 src/tests/oeccpsc22/delete_all.sh             |  22 +++
 src/tests/oeccpsc22/deploy_all.sh             |  36 ++++
 src/tests/oeccpsc22/deploy_dom1.sh            |  29 +++
 src/tests/oeccpsc22/deploy_dom2.sh            |  29 +++
 src/tests/oeccpsc22/deploy_specs_dom1.sh      | 127 ++++++++++++++
 src/tests/oeccpsc22/deploy_specs_dom2.sh      | 127 ++++++++++++++
 src/tests/oeccpsc22/descriptors/domain1.json  | 148 ++++++++++++++++
 src/tests/oeccpsc22/descriptors/domain2.json  | 166 ++++++++++++++++++
 src/tests/oeccpsc22/descriptors/domain3.json  | 110 ++++++++++++
 src/tests/oeccpsc22/descriptors/domain4.json  | 101 +++++++++++
 .../descriptors/inter-domain-service.json     |  41 +++++
 src/tests/oeccpsc22/dump_logs.sh              |  45 +++--
 src/tests/oeccpsc22/expose-services-dom1.yaml | 106 +++++++++++
 src/tests/oeccpsc22/expose-services-dom2.yaml | 106 +++++++++++
 .../oeccpsc22/expose_services_teraflow_1.yaml | 106 -----------
 .../oeccpsc22/expose_services_teraflow_2.yaml | 106 -----------
 src/tests/oeccpsc22/fast_redeploy.sh          |  63 +++++++
 .../nginx-ingress-controller-dom1.yaml        | 134 ++++++++++++++
 .../nginx-ingress-controller-dom2.yaml        | 134 ++++++++++++++
 .../oeccpsc22/nginx-ingress-http-dom1.yaml    |  46 +++++
 .../oeccpsc22/nginx-ingress-http-dom2.yaml    |  53 ++++++
 .../{ => old}/deploy_in_kubernetes.sh         |   0
 src/tests/oeccpsc22/show_deploy.sh            |  33 +++-
 25 files changed, 1636 insertions(+), 236 deletions(-)
 create mode 100644 src/tests/oeccpsc22/.gitignore
 create mode 100644 src/tests/oeccpsc22/TODO.txt
 create mode 100755 src/tests/oeccpsc22/delete_all.sh
 create mode 100755 src/tests/oeccpsc22/deploy_all.sh
 create mode 100755 src/tests/oeccpsc22/deploy_dom1.sh
 create mode 100755 src/tests/oeccpsc22/deploy_dom2.sh
 create mode 100755 src/tests/oeccpsc22/deploy_specs_dom1.sh
 create mode 100755 src/tests/oeccpsc22/deploy_specs_dom2.sh
 create mode 100644 src/tests/oeccpsc22/descriptors/domain1.json
 create mode 100644 src/tests/oeccpsc22/descriptors/domain2.json
 create mode 100644 src/tests/oeccpsc22/descriptors/domain3.json
 create mode 100644 src/tests/oeccpsc22/descriptors/domain4.json
 create mode 100644 src/tests/oeccpsc22/descriptors/inter-domain-service.json
 create mode 100644 src/tests/oeccpsc22/expose-services-dom1.yaml
 create mode 100644 src/tests/oeccpsc22/expose-services-dom2.yaml
 delete mode 100644 src/tests/oeccpsc22/expose_services_teraflow_1.yaml
 delete mode 100644 src/tests/oeccpsc22/expose_services_teraflow_2.yaml
 create mode 100755 src/tests/oeccpsc22/fast_redeploy.sh
 create mode 100644 src/tests/oeccpsc22/nginx-ingress-controller-dom1.yaml
 create mode 100644 src/tests/oeccpsc22/nginx-ingress-controller-dom2.yaml
 create mode 100644 src/tests/oeccpsc22/nginx-ingress-http-dom1.yaml
 create mode 100644 src/tests/oeccpsc22/nginx-ingress-http-dom2.yaml
 rename src/tests/oeccpsc22/{ => old}/deploy_in_kubernetes.sh (100%)

diff --git a/src/tests/oeccpsc22/.gitignore b/src/tests/oeccpsc22/.gitignore
new file mode 100644
index 000000000..6b97d6fe3
--- /dev/null
+++ b/src/tests/oeccpsc22/.gitignore
@@ -0,0 +1 @@
+# Add here your files containing confidential testbed details such as IP addresses, ports, usernames, passwords, etc.
diff --git a/src/tests/oeccpsc22/TODO.txt b/src/tests/oeccpsc22/TODO.txt
new file mode 100644
index 000000000..d786eee8b
--- /dev/null
+++ b/src/tests/oeccpsc22/TODO.txt
@@ -0,0 +1,3 @@
+- Update domain descriptors to 2 domains
+- Test scenario deployment
+- Test scenario operation
diff --git a/src/tests/oeccpsc22/delete_all.sh b/src/tests/oeccpsc22/delete_all.sh
new file mode 100755
index 000000000..c0d39fa8b
--- /dev/null
+++ b/src/tests/oeccpsc22/delete_all.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+# Delete old namespaces
+kubectl delete namespace tfs-dom1 tfs-dom2
+
+# Delete secondary ingress controllers
+kubectl delete -f oeccpsc22/nginx-ingress-controller-dom1.yaml
+kubectl delete -f oeccpsc22/nginx-ingress-controller-dom2.yaml
diff --git a/src/tests/oeccpsc22/deploy_all.sh b/src/tests/oeccpsc22/deploy_all.sh
new file mode 100755
index 000000000..737230346
--- /dev/null
+++ b/src/tests/oeccpsc22/deploy_all.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+# Delete old namespaces
+kubectl delete namespace tfs-dom1 tfs-dom2
+
+# Delete secondary ingress controllers
+kubectl delete -f oeccpsc22/nginx-ingress-controller-dom1.yaml
+kubectl delete -f oeccpsc22/nginx-ingress-controller-dom2.yaml
+
+# Create secondary ingress controllers
+kubectl apply -f oeccpsc22/nginx-ingress-controller-dom1.yaml
+kubectl apply -f oeccpsc22/nginx-ingress-controller-dom2.yaml
+
+# Deploy TFS for Domain 1
+source oeccpsc22/deploy_specs_dom1.sh
+./deploy/all.sh
+mv tfs_runtime_env_vars.sh tfs_runtime_env_vars_dom1.sh
+
+# Deploy TFS for Domain 2
+source oeccpsc22/deploy_specs_dom2.sh
+./deploy/all.sh
+mv tfs_runtime_env_vars.sh tfs_runtime_env_vars_dom2.sh
diff --git a/src/tests/oeccpsc22/deploy_dom1.sh b/src/tests/oeccpsc22/deploy_dom1.sh
new file mode 100755
index 000000000..81fb99844
--- /dev/null
+++ b/src/tests/oeccpsc22/deploy_dom1.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+# Delete old namespaces
+kubectl delete namespace tfs-dom1
+
+# Delete secondary ingress controllers
+kubectl delete -f oeccpsc22/nginx-ingress-controller-dom1.yaml
+
+# Create secondary ingress controllers
+kubectl apply -f oeccpsc22/nginx-ingress-controller-dom1.yaml
+
+# Deploy TFS for Domain 1
+source oeccpsc22/deploy_specs_dom1.sh
+./deploy/all.sh
+mv tfs_runtime_env_vars.sh tfs_runtime_env_vars_dom1.sh
diff --git a/src/tests/oeccpsc22/deploy_dom2.sh b/src/tests/oeccpsc22/deploy_dom2.sh
new file mode 100755
index 000000000..93fff1d15
--- /dev/null
+++ b/src/tests/oeccpsc22/deploy_dom2.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+# Delete old namespaces
+kubectl delete namespace tfs-dom2
+
+# Delete secondary ingress controllers
+kubectl delete -f oeccpsc22/nginx-ingress-controller-dom2.yaml
+
+# Create secondary ingress controllers
+kubectl apply -f oeccpsc22/nginx-ingress-controller-dom2.yaml
+
+# Deploy TFS for Domain 2
+source oeccpsc22/deploy_specs_dom2.sh
+./deploy/all.sh
+mv tfs_runtime_env_vars.sh tfs_runtime_env_vars_dom2.sh
diff --git a/src/tests/oeccpsc22/deploy_specs_dom1.sh b/src/tests/oeccpsc22/deploy_specs_dom1.sh
new file mode 100755
index 000000000..8bf7aaeb7
--- /dev/null
+++ b/src/tests/oeccpsc22/deploy_specs_dom1.sh
@@ -0,0 +1,127 @@
+#!/bin/bash
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+# ----- 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 automation monitoring pathcomp service slice compute webui load_generator"
+export TFS_COMPONENTS="context device pathcomp service slice compute webui"
+
+# 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-dom1"
+
+# Set additional manifest files to be applied after the deployment
+export TFS_EXTRA_MANIFESTS="oeccpsc22/nginx-ingress-http-dom1.yaml oeccpsc22/expose-services-dom1.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 the database name to be used by Context.
+export CRDB_DATABASE="tfs_dom1"
+
+# 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-dom1"
+
+# Set the external port NATS Client interface will be exposed to.
+export NATS_EXT_PORT_CLIENT="4223"
+
+# Set the external port NATS HTTP Mgmt GUI interface will be exposed to.
+export NATS_EXT_PORT_HTTP="8223"
+
+# Disable flag for re-deploying NATS from scratch.
+export NATS_REDEPLOY=""
+
+
+# ----- QuestDB ----------------------------------------------------------------
+
+# Set the namespace where QuestDB will be deployed.
+export QDB_NAMESPACE="qdb-dom1"
+
+# Set the external port QuestDB Postgre SQL interface will be exposed to.
+export QDB_EXT_PORT_SQL="8813"
+
+# Set the external port QuestDB Influx Line Protocol interface will be exposed to.
+export QDB_EXT_PORT_ILP="9011"
+
+# Set the external port QuestDB HTTP Mgmt GUI interface will be exposed to.
+export QDB_EXT_PORT_HTTP="9001"
+
+# 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"
diff --git a/src/tests/oeccpsc22/deploy_specs_dom2.sh b/src/tests/oeccpsc22/deploy_specs_dom2.sh
new file mode 100755
index 000000000..41c382409
--- /dev/null
+++ b/src/tests/oeccpsc22/deploy_specs_dom2.sh
@@ -0,0 +1,127 @@
+#!/bin/bash
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+# ----- 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 automation monitoring pathcomp service slice compute webui load_generator"
+export TFS_COMPONENTS="context device pathcomp service slice compute webui"
+
+# 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-dom2"
+
+# Set additional manifest files to be applied after the deployment
+export TFS_EXTRA_MANIFESTS="oeccpsc22/nginx-ingress-http-dom2.yaml oeccpsc22/expose-services-dom2.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="YES"
+
+
+# ----- 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 the database name to be used by Context.
+export CRDB_DATABASE="tfs_dom2"
+
+# 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-dom2"
+
+# Set the external port NATS Client interface will be exposed to.
+export NATS_EXT_PORT_CLIENT="4224"
+
+# Set the external port NATS HTTP Mgmt GUI interface will be exposed to.
+export NATS_EXT_PORT_HTTP="8224"
+
+# Disable flag for re-deploying NATS from scratch.
+export NATS_REDEPLOY=""
+
+
+# ----- QuestDB ----------------------------------------------------------------
+
+# Set the namespace where QuestDB will be deployed.
+export QDB_NAMESPACE="qdb-dom2"
+
+# Set the external port QuestDB Postgre SQL interface will be exposed to.
+export QDB_EXT_PORT_SQL="8814"
+
+# Set the external port QuestDB Influx Line Protocol interface will be exposed to.
+export QDB_EXT_PORT_ILP="9012"
+
+# Set the external port QuestDB HTTP Mgmt GUI interface will be exposed to.
+export QDB_EXT_PORT_HTTP="9002"
+
+# 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"
diff --git a/src/tests/oeccpsc22/descriptors/domain1.json b/src/tests/oeccpsc22/descriptors/domain1.json
new file mode 100644
index 000000000..043b3955f
--- /dev/null
+++ b/src/tests/oeccpsc22/descriptors/domain1.json
@@ -0,0 +1,148 @@
+{
+    "contexts": [
+        {
+            "context_id": {"context_uuid": {"uuid": "admin"}},
+            "topology_ids": [
+                {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}
+            ], "service_ids": []
+        }
+    ],
+    "topologies": [
+        {
+            "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}},
+            "device_ids": [
+                {"device_uuid": {"uuid": "DC1"}},
+                {"device_uuid": {"uuid": "R1@D1"}},
+                {"device_uuid": {"uuid": "R2@D1"}},
+                {"device_uuid": {"uuid": "R3@D1"}},
+                {"device_uuid": {"uuid": "R4@D1"}},
+                {"device_uuid": {"uuid": "R5@D1"}}
+            ], "link_ids": [
+                {"link_uuid": {"uuid": "DC1/D1==R1@D1/DC1"}},
+                {"link_uuid": {"uuid": "R1@D1/2==R2@D1/1"}},
+                {"link_uuid": {"uuid": "R2@D1/3==R3@D1/2"}},
+                {"link_uuid": {"uuid": "R2@D1/5==R5@D1/2"}},
+                {"link_uuid": {"uuid": "R3@D1/4==R4@D1/3"}},
+                {"link_uuid": {"uuid": "R4@D1/5==R5@D1/4"}},
+                {"link_uuid": {"uuid": "R5@D1/1==R1@D1/5"}}
+            ]
+        }
+    ],
+    "devices": [
+        {
+            "device_id": {"device_uuid": {"uuid": "DC1"}}, "device_type": "emu-datacenter", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper/border", "uuid": "D1"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "int"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R1@D1"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "5"},
+                    {"sample_types": [], "type": "copper/border", "uuid": "DC1"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R2@D1"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper/internal", "uuid": "1"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "3"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "5"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R3@D1"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "4"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R4@D1"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper/internal", "uuid": "3"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "5"},
+                    {"sample_types": [], "type": "copper/border", "uuid": "D2"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R5@D1"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper/internal", "uuid": "1"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "4"},
+                    {"sample_types": [], "type": "copper/border", "uuid": "D3"}
+                ]}}}
+            ]}
+        }
+    ],
+    "links": [
+        {
+            "link_id": {"link_uuid": {"uuid": "DC1/D1==R1@D1/DC1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "DC1"}}, "endpoint_uuid": {"uuid": "D1"}},
+                {"device_id": {"device_uuid": {"uuid": "R1@D1"}}, "endpoint_uuid": {"uuid": "DC1"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R1@D1/2==R2@D1/1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R1@D1"}}, "endpoint_uuid": {"uuid": "2"}},
+                {"device_id": {"device_uuid": {"uuid": "R2@D1"}}, "endpoint_uuid": {"uuid": "1"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R2@D1/3==R3@D1/2"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R2@D1"}}, "endpoint_uuid": {"uuid": "3"}},
+                {"device_id": {"device_uuid": {"uuid": "R3@D1"}}, "endpoint_uuid": {"uuid": "2"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R2@D1/5==R5@D1/2"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R2@D1"}}, "endpoint_uuid": {"uuid": "5"}},
+                {"device_id": {"device_uuid": {"uuid": "R5@D1"}}, "endpoint_uuid": {"uuid": "2"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R3@D1/4==R4@D1/3"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R3@D1"}}, "endpoint_uuid": {"uuid": "4"}},
+                {"device_id": {"device_uuid": {"uuid": "R4@D1"}}, "endpoint_uuid": {"uuid": "3"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R4@D1/5==R5@D1/4"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R4@D1"}}, "endpoint_uuid": {"uuid": "5"}},
+                {"device_id": {"device_uuid": {"uuid": "R5@D1"}}, "endpoint_uuid": {"uuid": "4"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R5@D1/1==R1@D1/5"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R5@D1"}}, "endpoint_uuid": {"uuid": "1"}},
+                {"device_id": {"device_uuid": {"uuid": "R1@D1"}}, "endpoint_uuid": {"uuid": "5"}}
+            ]
+        }
+    ]
+}
diff --git a/src/tests/oeccpsc22/descriptors/domain2.json b/src/tests/oeccpsc22/descriptors/domain2.json
new file mode 100644
index 000000000..81d397abf
--- /dev/null
+++ b/src/tests/oeccpsc22/descriptors/domain2.json
@@ -0,0 +1,166 @@
+{
+    "contexts": [
+        {
+            "context_id": {"context_uuid": {"uuid": "admin"}},
+            "topology_ids": [
+                {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D2"}}
+            ], "service_ids": []
+        }
+    ],
+    "topologies": [
+        {
+            "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D2"}},
+            "device_ids": [
+                {"device_uuid": {"uuid": "R1@D2"}},
+                {"device_uuid": {"uuid": "R2@D2"}},
+                {"device_uuid": {"uuid": "R3@D2"}},
+                {"device_uuid": {"uuid": "R4@D2"}},
+                {"device_uuid": {"uuid": "R5@D2"}},
+                {"device_uuid": {"uuid": "R6@D2"}}
+            ], "link_ids": [
+                {"link_uuid": {"uuid": "R1@D2/2==R2@D2/1"}},
+                {"link_uuid": {"uuid": "R1@D2/6==R6@D2/1"}},
+                {"link_uuid": {"uuid": "R1@D2/5==R5@D2/1"}},
+                {"link_uuid": {"uuid": "R2@D2/3==R3@D2/2"}},
+                {"link_uuid": {"uuid": "R2@D2/4==R4@D2/2"}},
+                {"link_uuid": {"uuid": "R2@D2/5==R5@D2/2"}},
+                {"link_uuid": {"uuid": "R2@D2/6==R6@D2/2"}},
+                {"link_uuid": {"uuid": "R3@D2/6==R6@D2/3"}},
+                {"link_uuid": {"uuid": "R4@D2/5==R5@D2/4"}}
+            ]
+        }
+    ],
+    "devices": [
+        {
+            "device_id": {"device_uuid": {"uuid": "R1@D2"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "5"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "6"},
+                    {"sample_types": [], "type": "copper/border", "uuid": "D1"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R2@D2"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper/internal", "uuid": "1"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "3"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "4"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "5"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "6"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R3@D2"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "6"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R4@D2"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "5"},
+                    {"sample_types": [], "type": "copper/border", "uuid": "D4"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R5@D2"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper/internal", "uuid": "1"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "4"},
+                    {"sample_types": [], "type": "copper/border", "uuid": "D3"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R6@D2"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper/internal", "uuid": "1"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "3"}
+                ]}}}
+            ]}
+        }
+    ],
+    "links": [
+        {
+            "link_id": {"link_uuid": {"uuid": "R1@D2/2==R2@D2/1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R1@D2"}}, "endpoint_uuid": {"uuid": "2"}},
+                {"device_id": {"device_uuid": {"uuid": "R2@D2"}}, "endpoint_uuid": {"uuid": "1"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R1@D2/6==R6@D2/1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R1@D2"}}, "endpoint_uuid": {"uuid": "6"}},
+                {"device_id": {"device_uuid": {"uuid": "R6@D2"}}, "endpoint_uuid": {"uuid": "1"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R1@D2/5==R5@D2/1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R1@D2"}}, "endpoint_uuid": {"uuid": "5"}},
+                {"device_id": {"device_uuid": {"uuid": "R5@D2"}}, "endpoint_uuid": {"uuid": "1"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R2@D2/3==R3@D2/2"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R2@D2"}}, "endpoint_uuid": {"uuid": "3"}},
+                {"device_id": {"device_uuid": {"uuid": "R3@D2"}}, "endpoint_uuid": {"uuid": "2"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R2@D2/4==R4@D2/2"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R2@D2"}}, "endpoint_uuid": {"uuid": "4"}},
+                {"device_id": {"device_uuid": {"uuid": "R4@D2"}}, "endpoint_uuid": {"uuid": "2"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R2@D2/5==R5@D2/2"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R2@D2"}}, "endpoint_uuid": {"uuid": "5"}},
+                {"device_id": {"device_uuid": {"uuid": "R5@D2"}}, "endpoint_uuid": {"uuid": "2"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R2@D2/6==R6@D2/2"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R2@D2"}}, "endpoint_uuid": {"uuid": "6"}},
+                {"device_id": {"device_uuid": {"uuid": "R6@D2"}}, "endpoint_uuid": {"uuid": "2"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R3@D2/6==R6@D2/3"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R3@D2"}}, "endpoint_uuid": {"uuid": "6"}},
+                {"device_id": {"device_uuid": {"uuid": "R6@D2"}}, "endpoint_uuid": {"uuid": "3"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R4@D2/5==R5@D2/4"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R4@D2"}}, "endpoint_uuid": {"uuid": "5"}},
+                {"device_id": {"device_uuid": {"uuid": "R5@D2"}}, "endpoint_uuid": {"uuid": "4"}}
+            ]
+        }
+    ]
+}
diff --git a/src/tests/oeccpsc22/descriptors/domain3.json b/src/tests/oeccpsc22/descriptors/domain3.json
new file mode 100644
index 000000000..3a8e47d30
--- /dev/null
+++ b/src/tests/oeccpsc22/descriptors/domain3.json
@@ -0,0 +1,110 @@
+{
+    "contexts": [
+        {
+            "context_id": {"context_uuid": {"uuid": "admin"}},
+            "topology_ids": [
+                {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D3"}}
+            ], "service_ids": []
+        }
+    ],
+    "topologies": [
+        {
+            "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D3"}},
+            "device_ids": [
+                {"device_uuid": {"uuid": "R1@D3"}},
+                {"device_uuid": {"uuid": "R2@D3"}},
+                {"device_uuid": {"uuid": "R3@D3"}},
+                {"device_uuid": {"uuid": "R4@D3"}}
+            ], "link_ids": [
+                {"link_uuid": {"uuid": "R1@D3/2==R2@D3/1"}},
+                {"link_uuid": {"uuid": "R2@D3/3==R3@D3/2"}},
+                {"link_uuid": {"uuid": "R3@D3/4==R4@D3/3"}},
+                {"link_uuid": {"uuid": "R4@D3/1==R1@D3/4"}},
+                {"link_uuid": {"uuid": "R2@D3/4==R4@D3/2"}}                
+            ]
+        }
+    ],
+    "devices": [
+        {
+            "device_id": {"device_uuid": {"uuid": "R1@D3"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "4"},
+                    {"sample_types": [], "type": "copper/border", "uuid": "D1"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R2@D3"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper/internal", "uuid": "1"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "3"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "4"},
+                    {"sample_types": [], "type": "copper/border", "uuid": "D2"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R3@D3"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "4"},
+                    {"sample_types": [], "type": "copper/border", "uuid": "D4"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R4@D3"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper/internal", "uuid": "1"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "3"}
+                ]}}}
+            ]}
+        }
+    ],
+    "links": [
+        {
+            "link_id": {"link_uuid": {"uuid": "R1@D3/2==R2@D3/1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R1@D3"}}, "endpoint_uuid": {"uuid": "2"}},
+                {"device_id": {"device_uuid": {"uuid": "R2@D3"}}, "endpoint_uuid": {"uuid": "1"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R2@D3/3==R3@D3/2"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R2@D3"}}, "endpoint_uuid": {"uuid": "3"}},
+                {"device_id": {"device_uuid": {"uuid": "R3@D3"}}, "endpoint_uuid": {"uuid": "2"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R3@D3/4==R4@D3/3"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R3@D3"}}, "endpoint_uuid": {"uuid": "4"}},
+                {"device_id": {"device_uuid": {"uuid": "R4@D3"}}, "endpoint_uuid": {"uuid": "3"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R4@D3/1==R1@D3/4"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R4@D3"}}, "endpoint_uuid": {"uuid": "1"}},
+                {"device_id": {"device_uuid": {"uuid": "R1@D3"}}, "endpoint_uuid": {"uuid": "4"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R2@D3/4==R4@D3/2"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R2@D3"}}, "endpoint_uuid": {"uuid": "4"}},
+                {"device_id": {"device_uuid": {"uuid": "R4@D3"}}, "endpoint_uuid": {"uuid": "2"}}
+            ]
+        }
+    ]
+}
diff --git a/src/tests/oeccpsc22/descriptors/domain4.json b/src/tests/oeccpsc22/descriptors/domain4.json
new file mode 100644
index 000000000..d9e2d049a
--- /dev/null
+++ b/src/tests/oeccpsc22/descriptors/domain4.json
@@ -0,0 +1,101 @@
+{
+    "contexts": [
+        {
+            "context_id": {"context_uuid": {"uuid": "admin"}},
+            "topology_ids": [
+                {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D4"}}
+            ], "service_ids": []
+        }
+    ],
+    "topologies": [
+        {
+            "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D4"}},
+            "device_ids": [
+                {"device_uuid": {"uuid": "DC2"}},
+                {"device_uuid": {"uuid": "R1@D4"}},
+                {"device_uuid": {"uuid": "R2@D4"}},
+                {"device_uuid": {"uuid": "R3@D4"}}
+            ], "link_ids": [
+                {"link_uuid": {"uuid": "R3@D4/DC2==DC2/D4"}},
+                {"link_uuid": {"uuid": "R1@D4/2==R2@D4/1"}},
+                {"link_uuid": {"uuid": "R1@D4/3==R3@D4/1"}},
+                {"link_uuid": {"uuid": "R2@D4/3==R3@D4/2"}}
+            ]
+        }
+    ],
+    "devices": [
+        {
+            "device_id": {"device_uuid": {"uuid": "DC2"}}, "device_type": "emu-datacenter", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper/border", "uuid": "D4"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "int"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R1@D4"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "3"},
+                    {"sample_types": [], "type": "copper/border", "uuid": "D3"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R2@D4"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper/internal", "uuid": "1"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "3"},
+                    {"sample_types": [], "type": "copper/border", "uuid": "D2"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R3@D4"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper/internal", "uuid": "1"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2"},
+                    {"sample_types": [], "type": "copper/border", "uuid": "DC2"}
+                ]}}}
+            ]}
+        }
+    ],
+    "links": [
+        {
+            "link_id": {"link_uuid": {"uuid": "R3@D4/DC2==DC2/D4"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "DC2"}}, "endpoint_uuid": {"uuid": "D4"}},
+                {"device_id": {"device_uuid": {"uuid": "R3@D4"}}, "endpoint_uuid": {"uuid": "DC2"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R1@D4/2==R2@D4/1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R1@D4"}}, "endpoint_uuid": {"uuid": "2"}},
+                {"device_id": {"device_uuid": {"uuid": "R2@D4"}}, "endpoint_uuid": {"uuid": "1"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R1@D4/3==R3@D4/1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R1@D4"}}, "endpoint_uuid": {"uuid": "3"}},
+                {"device_id": {"device_uuid": {"uuid": "R3@D4"}}, "endpoint_uuid": {"uuid": "1"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R2@D4/3==R3@D4/2"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R2@D4"}}, "endpoint_uuid": {"uuid": "3"}},
+                {"device_id": {"device_uuid": {"uuid": "R3@D4"}}, "endpoint_uuid": {"uuid": "2"}}
+            ]
+        }
+    ]
+}
diff --git a/src/tests/oeccpsc22/descriptors/inter-domain-service.json b/src/tests/oeccpsc22/descriptors/inter-domain-service.json
new file mode 100644
index 000000000..40a1f0101
--- /dev/null
+++ b/src/tests/oeccpsc22/descriptors/inter-domain-service.json
@@ -0,0 +1,41 @@
+{
+    "services": [
+        {
+            "service_id": {
+                "context_id": {"context_uuid": {"uuid": "admin"}}, "service_uuid": {"uuid": "inter-dom-svc"}
+            },
+            "service_type": 2,
+            "service_status": {"service_status": 1},
+            "service_endpoint_ids": [
+                {"device_id":{"device_uuid":{"uuid":"DC1"}},"endpoint_uuid":{"uuid":"int"}},
+                {"device_id":{"device_uuid":{"uuid":"DC2"}},"endpoint_uuid":{"uuid":"int"}}
+            ],
+            "service_constraints": [
+                {"sla_capacity": {"capacity_gbps": 10.0}},
+                {"sla_latency": {"e2e_latency_ms": 15.2}}
+            ],
+            "service_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "/settings", "resource_value": {
+                    "address_families": ["IPV4"], "bgp_as": 65000, "bgp_route_target": "65000:123",
+                    "mtu": 1512, "vlan_id": 300
+                }}},
+                {"action": 1, "custom": {"resource_key": "/device[PE1]/endpoint[1/1]/settings", "resource_value": {
+                    "route_distinguisher": "65000:123", "router_id": "10.0.0.1",
+                    "address_ip": "3.3.1.1", "address_prefix": 24, "sub_interface_index": 1, "vlan_id": 300
+                }}},
+                {"action": 1, "custom": {"resource_key": "/device[PE2]/endpoint[1/1]/settings", "resource_value": {
+                    "route_distinguisher": "65000:123", "router_id": "10.0.0.2",
+                    "address_ip": "3.3.2.1", "address_prefix": 24, "sub_interface_index": 1, "vlan_id": 300
+                }}},
+                {"action": 1, "custom": {"resource_key": "/device[PE3]/endpoint[1/1]/settings", "resource_value": {
+                    "route_distinguisher": "65000:123", "router_id": "10.0.0.3",
+                    "address_ip": "3.3.3.1", "address_prefix": 24, "sub_interface_index": 1, "vlan_id": 300
+                }}},
+                {"action": 1, "custom": {"resource_key": "/device[PE4]/endpoint[1/1]/settings", "resource_value": {
+                    "route_distinguisher": "65000:123", "router_id": "10.0.0.4",
+                    "address_ip": "3.3.4.1", "address_prefix": 24, "sub_interface_index": 1, "vlan_id": 300
+                }}}
+            ]}
+        }
+    ]
+}
diff --git a/src/tests/oeccpsc22/dump_logs.sh b/src/tests/oeccpsc22/dump_logs.sh
index a2180f6df..3a2e51a56 100755
--- a/src/tests/oeccpsc22/dump_logs.sh
+++ b/src/tests/oeccpsc22/dump_logs.sh
@@ -5,7 +5,7 @@
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
 #
-#      http://www.apache.org/licenses/LICENSE-2.0
+#     http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
@@ -13,20 +13,33 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-mkdir -p tmp/exec_logs/
 
-kubectl --namespace oeccpsc22-1 logs deployment/computeservice -c server > tmp/exec_logs/d1_compute.log
-kubectl --namespace oeccpsc22-1 logs deployment/contextservice -c server > tmp/exec_logs/d1_context.log
-kubectl --namespace oeccpsc22-1 logs deployment/deviceservice -c server > tmp/exec_logs/d1_device.log
-kubectl --namespace oeccpsc22-1 logs deployment/interdomainservice -c server > tmp/exec_logs/d1_interdomain.log
-kubectl --namespace oeccpsc22-1 logs deployment/monitoringservice -c server > tmp/exec_logs/d1_monitoring.log
-kubectl --namespace oeccpsc22-1 logs deployment/serviceservice -c server > tmp/exec_logs/d1_service.log
-kubectl --namespace oeccpsc22-1 logs deployment/sliceservice -c server > tmp/exec_logs/d1_slice.log
+rm -rf tmp/exec
 
-kubectl --namespace oeccpsc22-2 logs deployment/computeservice -c server > tmp/exec_logs/d2_compute.log
-kubectl --namespace oeccpsc22-2 logs deployment/contextservice -c server > tmp/exec_logs/d2_context.log
-kubectl --namespace oeccpsc22-2 logs deployment/deviceservice -c server > tmp/exec_logs/d2_device.log
-kubectl --namespace oeccpsc22-2 logs deployment/interdomainservice -c server > tmp/exec_logs/d2_interdomain.log
-kubectl --namespace oeccpsc22-2 logs deployment/monitoringservice -c server > tmp/exec_logs/d2_monitoring.log
-kubectl --namespace oeccpsc22-2 logs deployment/serviceservice -c server > tmp/exec_logs/d2_service.log
-kubectl --namespace oeccpsc22-2 logs deployment/sliceservice -c server > tmp/exec_logs/d2_slice.log
+echo "Collecting logs for Domain 1..."
+mkdir -p tmp/exec/dom1
+kubectl --namespace tfs-dom1 logs deployments/contextservice server > tmp/exec/dom1/context.log
+kubectl --namespace tfs-dom1 logs deployments/deviceservice server > tmp/exec/dom1/device.log
+kubectl --namespace tfs-dom1 logs deployments/serviceservice server > tmp/exec/dom1/service.log
+kubectl --namespace tfs-dom1 logs deployments/pathcompservice frontend > tmp/exec/dom1/pathcomp-frontend.log
+kubectl --namespace tfs-dom1 logs deployments/pathcompservice backend > tmp/exec/dom1/pathcomp-backend.log
+kubectl --namespace tfs-dom1 logs deployments/sliceservice server > tmp/exec/dom1/slice.log
+kubectl --namespace tfs-dom1 logs deployment/computeservice server > tmp/exec/dom1/compute.log
+kubectl --namespace tfs-dom1 logs deployment/interdomainservice server > tmp/exec/dom1/interdomain.log
+kubectl --namespace tfs-dom1 logs deployment/monitoringservice server > tmp/exec/dom1/monitoring.log
+printf "\n"
+
+echo "Collecting logs for Domain 2..."
+mkdir -p tmp/exec/dom2
+kubectl --namespace tfs-dom2 logs deployments/contextservice server > tmp/exec/dom2/context.log
+kubectl --namespace tfs-dom2 logs deployments/deviceservice server > tmp/exec/dom2/device.log
+kubectl --namespace tfs-dom2 logs deployments/serviceservice server > tmp/exec/dom2/service.log
+kubectl --namespace tfs-dom2 logs deployments/pathcompservice frontend > tmp/exec/dom2/pathcomp-frontend.log
+kubectl --namespace tfs-dom2 logs deployments/pathcompservice backend > tmp/exec/dom2/pathcomp-backend.log
+kubectl --namespace tfs-dom2 logs deployments/sliceservice server > tmp/exec/dom2/slice.log
+kubectl --namespace tfs-dom2 logs deployment/computeservice server > tmp/exec/dom2/compute.log
+kubectl --namespace tfs-dom2 logs deployment/interdomainservice server > tmp/exec/dom2/interdomain.log
+kubectl --namespace tfs-dom2 logs deployment/monitoringservice server > tmp/exec/dom2/monitoring.log
+printf "\n"
+
+echo "Done!"
diff --git a/src/tests/oeccpsc22/expose-services-dom1.yaml b/src/tests/oeccpsc22/expose-services-dom1.yaml
new file mode 100644
index 000000000..ebfb38fc4
--- /dev/null
+++ b/src/tests/oeccpsc22/expose-services-dom1.yaml
@@ -0,0 +1,106 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: remote-teraflow
+spec:
+  type: ExternalName
+  externalName: interdomainservice.dom2.svc.cluster.local
+  ports:
+  - name: grpc
+    protocol: TCP
+    port: 10010
+#---
+#apiVersion: v1
+#kind: Service
+#metadata:
+#  name: contextservice-public
+#  labels:
+#    app: contextservice
+#spec:
+#  type: NodePort
+#  selector:
+#    app: contextservice
+#  ports:
+#  - name: grpc
+#    protocol: TCP
+#    port: 1010
+#    targetPort: 1010
+#    nodePort: 30111
+#  - name: rest
+#    protocol: TCP
+#    port: 8080
+#    targetPort: 8080
+#    nodePort: 30001
+#  - name: redis
+#    protocol: TCP
+#    port: 6379
+#    targetPort: 6379
+#    nodePort: 30631
+#---
+#apiVersion: v1
+#kind: Service
+#metadata:
+#  name: deviceservice-public
+#  labels:
+#    app: deviceservice
+#spec:
+#  type: NodePort
+#  selector:
+#    app: deviceservice
+#  ports:
+#  - name: grpc
+#    protocol: TCP
+#    port: 2020
+#    targetPort: 2020
+#    nodePort: 30221
+#---
+#apiVersion: v1
+#kind: Service
+#metadata:
+#  name: computeservice-public
+#spec:
+#  type: NodePort
+#  selector:
+#    app: computeservice
+#  ports:
+#  - name: http
+#    protocol: TCP
+#    port: 8080
+#    targetPort: 8080
+#    nodePort: 30881
+#---
+#apiVersion: v1
+#kind: Service
+#metadata:
+#  name: webuiservice-public
+#  labels:
+#    app: webuiservice
+#spec:
+#  type: NodePort
+#  selector:
+#    app: webuiservice
+#  ports:
+#  - name: http
+#    protocol: TCP
+#    port: 8004
+#    targetPort: 8004
+#    nodePort: 30801
+#  - name: grafana
+#    protocol: TCP
+#    port: 3000
+#    targetPort: 3000
+#    nodePort: 30301
diff --git a/src/tests/oeccpsc22/expose-services-dom2.yaml b/src/tests/oeccpsc22/expose-services-dom2.yaml
new file mode 100644
index 000000000..cf04f3f5e
--- /dev/null
+++ b/src/tests/oeccpsc22/expose-services-dom2.yaml
@@ -0,0 +1,106 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: remote-teraflow
+spec:
+  type: ExternalName
+  externalName: interdomainservice.dom1.svc.cluster.local
+  ports:
+  - name: grpc
+    protocol: TCP
+    port: 10010
+#---
+#apiVersion: v1
+#kind: Service
+#metadata:
+#  name: contextservice-public
+#  labels:
+#    app: contextservice
+#spec:
+#  type: NodePort
+#  selector:
+#    app: contextservice
+#  ports:
+#  - name: grpc
+#    protocol: TCP
+#    port: 1010
+#    targetPort: 1010
+#    nodePort: 30112
+#  - name: rest
+#    protocol: TCP
+#    port: 8080
+#    targetPort: 8080
+#    nodePort: 30002
+#  - name: redis
+#    protocol: TCP
+#    port: 6379
+#    targetPort: 6379
+#    nodePort: 30632
+#---
+#apiVersion: v1
+#kind: Service
+#metadata:
+#  name: deviceservice-public
+#  labels:
+#    app: deviceservice
+#spec:
+#  type: NodePort
+#  selector:
+#    app: deviceservice
+#  ports:
+#  - name: grpc
+#    protocol: TCP
+#    port: 2020
+#    targetPort: 2020
+#    nodePort: 30222
+#---
+#apiVersion: v1
+#kind: Service
+#metadata:
+#  name: computeservice-public
+#spec:
+#  type: NodePort
+#  selector:
+#    app: computeservice
+#  ports:
+#  - name: http
+#    protocol: TCP
+#    port: 8080
+#    targetPort: 8080
+#    nodePort: 30882
+#---
+#apiVersion: v1
+#kind: Service
+#metadata:
+#  name: webuiservice-public
+#  labels:
+#    app: webuiservice
+#spec:
+#  type: NodePort
+#  selector:
+#    app: webuiservice
+#  ports:
+#  - name: http
+#    protocol: TCP
+#    port: 8004
+#    targetPort: 8004
+#    nodePort: 30802
+#  - name: grafana
+#    protocol: TCP
+#    port: 3000
+#    targetPort: 3000
+#    nodePort: 30302
diff --git a/src/tests/oeccpsc22/expose_services_teraflow_1.yaml b/src/tests/oeccpsc22/expose_services_teraflow_1.yaml
deleted file mode 100644
index d956db1a7..000000000
--- a/src/tests/oeccpsc22/expose_services_teraflow_1.yaml
+++ /dev/null
@@ -1,106 +0,0 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-apiVersion: v1
-kind: Service
-metadata:
-  name: remote-teraflow
-spec:
-  type: ExternalName
-  externalName: interdomainservice.oeccpsc22-2.svc.cluster.local
-  ports:
-  - name: grpc
-    protocol: TCP
-    port: 10010
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: contextservice-public
-  labels:
-    app: contextservice
-spec:
-  type: NodePort
-  selector:
-    app: contextservice
-  ports:
-  - name: grpc
-    protocol: TCP
-    port: 1010
-    targetPort: 1010
-    nodePort: 30111
-  - name: rest
-    protocol: TCP
-    port: 8080
-    targetPort: 8080
-    nodePort: 30001
-  - name: redis
-    protocol: TCP
-    port: 6379
-    targetPort: 6379
-    nodePort: 30631
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: deviceservice-public
-  labels:
-    app: deviceservice
-spec:
-  type: NodePort
-  selector:
-    app: deviceservice
-  ports:
-  - name: grpc
-    protocol: TCP
-    port: 2020
-    targetPort: 2020
-    nodePort: 30221
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: computeservice-public
-spec:
-  type: NodePort
-  selector:
-    app: computeservice
-  ports:
-  - name: http
-    protocol: TCP
-    port: 8080
-    targetPort: 8080
-    nodePort: 30881
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: webuiservice-public
-  labels:
-    app: webuiservice
-spec:
-  type: NodePort
-  selector:
-    app: webuiservice
-  ports:
-  - name: http
-    protocol: TCP
-    port: 8004
-    targetPort: 8004
-    nodePort: 30801
-  - name: grafana
-    protocol: TCP
-    port: 3000
-    targetPort: 3000
-    nodePort: 30301
diff --git a/src/tests/oeccpsc22/expose_services_teraflow_2.yaml b/src/tests/oeccpsc22/expose_services_teraflow_2.yaml
deleted file mode 100644
index d8acb9653..000000000
--- a/src/tests/oeccpsc22/expose_services_teraflow_2.yaml
+++ /dev/null
@@ -1,106 +0,0 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-apiVersion: v1
-kind: Service
-metadata:
-  name: remote-teraflow
-spec:
-  type: ExternalName
-  externalName: interdomainservice.oeccpsc22-1.svc.cluster.local
-  ports:
-  - name: grpc
-    protocol: TCP
-    port: 10010
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: contextservice-public
-  labels:
-    app: contextservice
-spec:
-  type: NodePort
-  selector:
-    app: contextservice
-  ports:
-  - name: grpc
-    protocol: TCP
-    port: 1010
-    targetPort: 1010
-    nodePort: 30112
-  - name: rest
-    protocol: TCP
-    port: 8080
-    targetPort: 8080
-    nodePort: 30002
-  - name: redis
-    protocol: TCP
-    port: 6379
-    targetPort: 6379
-    nodePort: 30632
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: deviceservice-public
-  labels:
-    app: deviceservice
-spec:
-  type: NodePort
-  selector:
-    app: deviceservice
-  ports:
-  - name: grpc
-    protocol: TCP
-    port: 2020
-    targetPort: 2020
-    nodePort: 30222
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: computeservice-public
-spec:
-  type: NodePort
-  selector:
-    app: computeservice
-  ports:
-  - name: http
-    protocol: TCP
-    port: 8080
-    targetPort: 8080
-    nodePort: 30882
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: webuiservice-public
-  labels:
-    app: webuiservice
-spec:
-  type: NodePort
-  selector:
-    app: webuiservice
-  ports:
-  - name: http
-    protocol: TCP
-    port: 8004
-    targetPort: 8004
-    nodePort: 30802
-  - name: grafana
-    protocol: TCP
-    port: 3000
-    targetPort: 3000
-    nodePort: 30302
diff --git a/src/tests/oeccpsc22/fast_redeploy.sh b/src/tests/oeccpsc22/fast_redeploy.sh
new file mode 100755
index 000000000..f4e909eef
--- /dev/null
+++ b/src/tests/oeccpsc22/fast_redeploy.sh
@@ -0,0 +1,63 @@
+#!/bin/bash
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+kubectl delete namespace tfs-dom1 tfs-dom2
+
+echo "Deploying tfs-dom1 ..."
+kubectl delete -f oeccpsc22/nginx-ingress-controller-dom1.yaml             > ./tmp/logs/deploy-tfs-dom1.log
+kubectl create namespace tfs-dom1                                          > ./tmp/logs/deploy-tfs-dom1.log
+kubectl apply -f oeccpsc22/nginx-ingress-controller-dom1.yaml              > ./tmp/logs/deploy-tfs-dom1.log
+kubectl --namespace tfs-dom1 apply -f ./tmp/manifests/contextservice.yaml  > ./tmp/logs/deploy-tfs-dom1.log
+kubectl --namespace tfs-dom1 apply -f ./tmp/manifests/deviceservice.yaml   > ./tmp/logs/deploy-tfs-dom1.log
+kubectl --namespace tfs-dom1 apply -f ./tmp/manifests/pathcompservice.yaml > ./tmp/logs/deploy-tfs-dom1.log
+kubectl --namespace tfs-dom1 apply -f ./tmp/manifests/serviceservice.yaml  > ./tmp/logs/deploy-tfs-dom1.log
+kubectl --namespace tfs-dom1 apply -f ./tmp/manifests/sliceservice.yaml    > ./tmp/logs/deploy-tfs-dom1.log
+kubectl --namespace tfs-dom1 apply -f ./tmp/manifests/webuiservice.yaml    > ./tmp/logs/deploy-tfs-dom1.log
+kubectl --namespace tfs-dom1 apply -f oeccpsc22/tfs-ingress-dom1.yaml      > ./tmp/logs/deploy-tfs-dom1.log
+printf "\n"
+
+echo "Deploying tfs-dom2 ..."
+kubectl delete -f oeccpsc22/nginx-ingress-controller-dom2.yaml              > ./tmp/logs/deploy-tfs-dom2.log
+kubectl create namespace tfs-dom2                                           > ./tmp/logs/deploy-tfs-dom2.log
+kubectl apply -f oeccpsc22/nginx-ingress-controller-dom2.yaml               > ./tmp/logs/deploy-tfs-dom2.log
+kubectl --namespace tfs-dom2 apply -f ./tmp/manifests/contextservice.yaml   > ./tmp/logs/deploy-tfs-dom2.log
+kubectl --namespace tfs-dom2 apply -f ./tmp/manifests/deviceservice.yaml    > ./tmp/logs/deploy-tfs-dom2.log
+kubectl --namespace tfs-dom2 apply -f ./tmp/manifests/pathcompservice.yaml  > ./tmp/logs/deploy-tfs-dom2.log
+kubectl --namespace tfs-dom2 apply -f ./tmp/manifests/serviceservice.yaml   > ./tmp/logs/deploy-tfs-dom2.log
+kubectl --namespace tfs-dom2 apply -f ./tmp/manifests/sliceservice.yaml     > ./tmp/logs/deploy-tfs-dom2.log
+kubectl --namespace tfs-dom2 apply -f ./tmp/manifests/webuiservice.yaml     > ./tmp/logs/deploy-tfs-dom2.log
+kubectl --namespace tfs-dom2 apply -f oeccpsc22/tfs-ingress-dom2.yaml       > ./tmp/logs/deploy-tfs-dom2.log
+printf "\n"
+
+echo "Waiting tfs-dom1 ..."
+kubectl wait --namespace tfs-dom1 --for='condition=available' --timeout=300s deployment/contextservice
+kubectl wait --namespace tfs-dom1 --for='condition=available' --timeout=300s deployment/deviceservice
+kubectl wait --namespace tfs-dom1 --for='condition=available' --timeout=300s deployment/pathcompservice
+kubectl wait --namespace tfs-dom1 --for='condition=available' --timeout=300s deployment/serviceservice
+kubectl wait --namespace tfs-dom1 --for='condition=available' --timeout=300s deployment/sliceservice
+kubectl wait --namespace tfs-dom1 --for='condition=available' --timeout=300s deployment/webuiservice
+printf "\n"
+
+echo "Waiting tfs-dom2 ..."
+kubectl wait --namespace tfs-dom2 --for='condition=available' --timeout=300s deployment/contextservice
+kubectl wait --namespace tfs-dom2 --for='condition=available' --timeout=300s deployment/deviceservice
+kubectl wait --namespace tfs-dom2 --for='condition=available' --timeout=300s deployment/pathcompservice
+kubectl wait --namespace tfs-dom2 --for='condition=available' --timeout=300s deployment/serviceservice
+kubectl wait --namespace tfs-dom2 --for='condition=available' --timeout=300s deployment/sliceservice
+kubectl wait --namespace tfs-dom2 --for='condition=available' --timeout=300s deployment/webuiservice
+printf "\n"
+
+echo "Done!"
diff --git a/src/tests/oeccpsc22/nginx-ingress-controller-dom1.yaml b/src/tests/oeccpsc22/nginx-ingress-controller-dom1.yaml
new file mode 100644
index 000000000..1815bfbaa
--- /dev/null
+++ b/src/tests/oeccpsc22/nginx-ingress-controller-dom1.yaml
@@ -0,0 +1,134 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: nginx-load-balancer-microk8s-conf-dom1
+  namespace: ingress
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: nginx-ingress-udp-microk8s-conf-dom1
+  namespace: ingress
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: nginx-ingress-tcp-microk8s-conf-dom1
+  namespace: ingress
+---
+apiVersion: networking.k8s.io/v1
+kind: IngressClass
+metadata:
+  name: tfs-ingress-class-dom1
+  annotations:
+    ingressclass.kubernetes.io/is-default-class: "false"
+spec:
+  controller: tfs.etsi.org/controller-class-dom1
+---
+apiVersion: apps/v1
+kind: DaemonSet
+metadata:
+  name: nginx-ingress-microk8s-controller-dom1
+  namespace: ingress
+  labels:
+    microk8s-application: nginx-ingress-microk8s-dom1
+spec:
+  selector:
+    matchLabels:
+      name: nginx-ingress-microk8s-dom1
+  updateStrategy:
+    rollingUpdate:
+      maxSurge: 0
+      maxUnavailable: 1
+    type: RollingUpdate
+  template:
+    metadata:
+      labels:
+        name: nginx-ingress-microk8s-dom1
+    spec:
+      terminationGracePeriodSeconds: 60
+      restartPolicy: Always
+      serviceAccountName: nginx-ingress-microk8s-serviceaccount
+      containers:
+      - image: k8s.gcr.io/ingress-nginx/controller:v1.2.0
+        imagePullPolicy: IfNotPresent
+        name: nginx-ingress-microk8s
+        livenessProbe:
+          httpGet:
+            path: /healthz
+            port: 10254
+            scheme: HTTP
+          initialDelaySeconds: 10
+          periodSeconds: 10
+          successThreshold: 1
+          failureThreshold: 3
+          timeoutSeconds: 5
+        readinessProbe:
+          httpGet:
+            path: /healthz
+            port: 10254
+            scheme: HTTP
+          periodSeconds: 10
+          successThreshold: 1
+          failureThreshold: 3
+          timeoutSeconds: 5
+        lifecycle:
+          preStop:
+            exec:
+              command:
+                - /wait-shutdown
+        securityContext:
+          capabilities:
+            add:
+            - NET_BIND_SERVICE
+            drop:
+            - ALL
+          runAsUser: 101 # www-data
+        env:
+          - name: POD_NAME
+            valueFrom:
+              fieldRef:
+                apiVersion: v1
+                fieldPath: metadata.name
+          - name: POD_NAMESPACE
+            valueFrom:
+              fieldRef:
+                apiVersion: v1
+                fieldPath: metadata.namespace
+        ports:
+        - name: http
+          containerPort: 80
+          hostPort: 8001
+          protocol: TCP
+        - name: https
+          containerPort: 443
+          hostPort: 4431
+          protocol: TCP
+        - name: health
+          containerPort: 10254
+          hostPort: 12541
+          protocol: TCP
+        args:
+        - /nginx-ingress-controller
+        - --configmap=$(POD_NAMESPACE)/nginx-load-balancer-microk8s-conf-dom1
+        - --tcp-services-configmap=$(POD_NAMESPACE)/nginx-ingress-tcp-microk8s-conf-dom1
+        - --udp-services-configmap=$(POD_NAMESPACE)/nginx-ingress-udp-microk8s-conf-dom1
+        - --election-id=ingress-controller-leader-dom1
+        - --controller-class=tfs.etsi.org/controller-class-dom1
+        - --ingress-class=tfs-ingress-class-dom1
+        - ' '
+        - --publish-status-address=127.0.0.1
diff --git a/src/tests/oeccpsc22/nginx-ingress-controller-dom2.yaml b/src/tests/oeccpsc22/nginx-ingress-controller-dom2.yaml
new file mode 100644
index 000000000..dede03285
--- /dev/null
+++ b/src/tests/oeccpsc22/nginx-ingress-controller-dom2.yaml
@@ -0,0 +1,134 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: nginx-load-balancer-microk8s-conf-dom2
+  namespace: ingress
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: nginx-ingress-udp-microk8s-conf-dom2
+  namespace: ingress
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: nginx-ingress-tcp-microk8s-conf-dom2
+  namespace: ingress
+---
+apiVersion: networking.k8s.io/v1
+kind: IngressClass
+metadata:
+  name: tfs-ingress-class-dom2
+  annotations:
+    ingressclass.kubernetes.io/is-default-class: "false"
+spec:
+  controller: tfs.etsi.org/controller-class-dom2
+---
+apiVersion: apps/v1
+kind: DaemonSet
+metadata:
+  name: nginx-ingress-microk8s-controller-dom2
+  namespace: ingress
+  labels:
+    microk8s-application: nginx-ingress-microk8s-dom2
+spec:
+  selector:
+    matchLabels:
+      name: nginx-ingress-microk8s-dom2
+  updateStrategy:
+    rollingUpdate:
+      maxSurge: 0
+      maxUnavailable: 1
+    type: RollingUpdate
+  template:
+    metadata:
+      labels:
+        name: nginx-ingress-microk8s-dom2
+    spec:
+      terminationGracePeriodSeconds: 60
+      restartPolicy: Always
+      serviceAccountName: nginx-ingress-microk8s-serviceaccount
+      containers:
+      - image: k8s.gcr.io/ingress-nginx/controller:v1.2.0
+        imagePullPolicy: IfNotPresent
+        name: nginx-ingress-microk8s
+        livenessProbe:
+          httpGet:
+            path: /healthz
+            port: 10254
+            scheme: HTTP
+          initialDelaySeconds: 10
+          periodSeconds: 10
+          successThreshold: 1
+          failureThreshold: 3
+          timeoutSeconds: 5
+        readinessProbe:
+          httpGet:
+            path: /healthz
+            port: 10254
+            scheme: HTTP
+          periodSeconds: 10
+          successThreshold: 1
+          failureThreshold: 3
+          timeoutSeconds: 5
+        lifecycle:
+          preStop:
+            exec:
+              command:
+                - /wait-shutdown
+        securityContext:
+          capabilities:
+            add:
+            - NET_BIND_SERVICE
+            drop:
+            - ALL
+          runAsUser: 101 # www-data
+        env:
+          - name: POD_NAME
+            valueFrom:
+              fieldRef:
+                apiVersion: v1
+                fieldPath: metadata.name
+          - name: POD_NAMESPACE
+            valueFrom:
+              fieldRef:
+                apiVersion: v1
+                fieldPath: metadata.namespace
+        ports:
+        - name: http
+          containerPort: 80
+          hostPort: 8002
+          protocol: TCP
+        - name: https
+          containerPort: 443
+          hostPort: 4432
+          protocol: TCP
+        - name: health
+          containerPort: 10254
+          hostPort: 12542
+          protocol: TCP
+        args:
+        - /nginx-ingress-controller
+        - --configmap=$(POD_NAMESPACE)/nginx-load-balancer-microk8s-conf-dom2
+        - --tcp-services-configmap=$(POD_NAMESPACE)/nginx-ingress-tcp-microk8s-conf-dom2
+        - --udp-services-configmap=$(POD_NAMESPACE)/nginx-ingress-udp-microk8s-conf-dom2
+        - --election-id=ingress-controller-leader-dom2
+        - --controller-class=tfs.etsi.org/controller-class-dom2
+        - --ingress-class=tfs-ingress-class-dom2
+        - ' '
+        - --publish-status-address=127.0.0.1
diff --git a/src/tests/oeccpsc22/nginx-ingress-http-dom1.yaml b/src/tests/oeccpsc22/nginx-ingress-http-dom1.yaml
new file mode 100644
index 000000000..b03699946
--- /dev/null
+++ b/src/tests/oeccpsc22/nginx-ingress-http-dom1.yaml
@@ -0,0 +1,46 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  name: tfs-ingress-dom1
+  annotations:
+    nginx.ingress.kubernetes.io/rewrite-target: /$2
+spec:
+  ingressClassName: tfs-ingress-class-dom1
+  rules:
+  - http:
+      paths:
+        - path: /webui(/|$)(.*)
+          pathType: Prefix
+          backend:
+            service:
+              name: webuiservice
+              port:
+                number: 8004
+        - path: /grafana(/|$)(.*)
+          pathType: Prefix
+          backend:
+            service:
+              name: webuiservice
+              port:
+                number: 3000
+        - path: /()(restconf/.*)
+          pathType: Prefix
+          backend:
+            service:
+              name: computeservice
+              port:
+                number: 8080
diff --git a/src/tests/oeccpsc22/nginx-ingress-http-dom2.yaml b/src/tests/oeccpsc22/nginx-ingress-http-dom2.yaml
new file mode 100644
index 000000000..d07b73ee2
--- /dev/null
+++ b/src/tests/oeccpsc22/nginx-ingress-http-dom2.yaml
@@ -0,0 +1,53 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  name: tfs-ingress-dom2
+  annotations:
+    nginx.ingress.kubernetes.io/rewrite-target: /$2
+spec:
+  ingressClassName: tfs-ingress-class-dom2
+  rules:
+  - http:
+      paths:
+        - path: /webui(/|$)(.*)
+          pathType: Prefix
+          backend:
+            service:
+              name: webuiservice
+              port:
+                number: 8004
+        - path: /grafana(/|$)(.*)
+          pathType: Prefix
+          backend:
+            service:
+              name: webuiservice
+              port:
+                number: 3000
+        - path: /context(/|$)(.*)
+          pathType: Prefix
+          backend:
+            service:
+              name: contextservice
+              port:
+                number: 8080
+        - path: /()(restconf/.*)
+          pathType: Prefix
+          backend:
+            service:
+              name: computeservice
+              port:
+                number: 8080
diff --git a/src/tests/oeccpsc22/deploy_in_kubernetes.sh b/src/tests/oeccpsc22/old/deploy_in_kubernetes.sh
similarity index 100%
rename from src/tests/oeccpsc22/deploy_in_kubernetes.sh
rename to src/tests/oeccpsc22/old/deploy_in_kubernetes.sh
diff --git a/src/tests/oeccpsc22/show_deploy.sh b/src/tests/oeccpsc22/show_deploy.sh
index d5e9346e5..77a8b8781 100755
--- a/src/tests/oeccpsc22/show_deploy.sh
+++ b/src/tests/oeccpsc22/show_deploy.sh
@@ -13,14 +13,31 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# Deploy TeraFlow instance 1
-printf "TeraFlow Instance 1:\n--------------------\n"
-export K8S_NAMESPACE="oeccpsc22-1"
-kubectl --namespace $K8S_NAMESPACE get all
+
+########################################################################################################################
+# Automated steps start here
+########################################################################################################################
+
+# Deploy TeraFlow Domain 1
+printf "TeraFlow Domain 1:\n--------------------\n"
+
+echo "Deployment Resources:"
+kubectl --namespace tfs-dom1 get all
+printf "\n"
+
+echo "Deployment Ingress:"
+kubectl --namespace tfs-dom1 get ingress
+printf "\n"
 
 printf "\n\n"
 
-# Deploy TeraFlow instance 2
-printf "TeraFlow Instance 2:\n--------------------\n"
-export K8S_NAMESPACE="oeccpsc22-2"
-kubectl --namespace $K8S_NAMESPACE get all
+# Deploy TeraFlow Domain 2
+printf "TeraFlow Domain 2:\n--------------------\n"
+
+echo "Deployment Resources:"
+kubectl --namespace tfs-dom2 get all
+printf "\n"
+
+echo "Deployment Ingress:"
+kubectl --namespace tfs-dom2 get ingress
+printf "\n"
-- 
GitLab