Upgrade client API versions to R3 latest 62/2262/3
authorLott, Christopher (cl778h) <cl778h@att.com>
Fri, 17 Jan 2020 15:57:43 +0000 (10:57 -0500)
committerLott, Christopher (cl778h) <cl778h@att.com>
Mon, 20 Jan 2020 14:39:14 +0000 (09:39 -0500)
Upgrade A1 Mediator API and submodule to tag 2.1.0
Upgrade App Manager API and submodule to tag 0.3.3
Upgrade E2 Manager API and submodule to tag 3.0.3
Submodules pinned; using tags as listed above where possible
Remove mock config data for ANR

Change-Id: I7c7c70fb003c31fe18a24074563163a48a557b83
Signed-off-by: Lott, Christopher (cl778h) <cl778h@att.com>
14 files changed:
a1-med-client/pom.xml
a1-med-client/ric-plt-a1
app-mgr-client/pom.xml
app-mgr-client/ric-plt-appmgr
docs/config-deploy.rst
docs/overview.rst
docs/release-notes.rst
e2-mgr-client/pom.xml
e2-mgr-client/ric-plt-e2mgr
webapp-backend/pom.xml
webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/AppManagerController.java
webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/config/AppManagerMockConfiguration.java
webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/controller/AppManagerControllerTest.java
webapp-frontend/src/assets/mockdata/config.json

index 1400012..5f28e66 100644 (file)
@@ -32,7 +32,7 @@ limitations under the License.
        <artifactId>a1-med-client</artifactId>
        <name>RIC A1 Mediator client</name>
        <!-- Update to match submodule tag -->
-       <version>1.0.4-SNAPSHOT</version>
+       <version>2.1.0-SNAPSHOT</version>
        <properties>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
index 0b42dfc..ccb4a69 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 0b42dfc507b22b49669f360883a1cecaa50cda7b
+Subproject commit ccb4a69e473cab6db7e8d52a04f9b4922528e24f
index ec7f56b..341ab37 100644 (file)
@@ -32,7 +32,7 @@ limitations under the License.
        <artifactId>app-mgr-client</artifactId>
        <name>RIC App Manager client</name>
         <!-- Update to match submodule tag -->
-       <version>0.1.10-SNAPSHOT</version>
+       <version>0.3.3-SNAPSHOT</version>
        <properties>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
index 4703b1a..aca8f3c 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 4703b1a7457cf072640adbc0f5487a0675f5b6d3
+Subproject commit aca8f3cfeaa7e6af5245c2f0370ef517254d62f2
index bdadbe1..ddf164f 100644 (file)
@@ -46,15 +46,6 @@ like ``http://ricplt-entry/a1mediator``
 
 A1 Mediator URL suffix. Default is the empty string.
 
-``anrxapp.url.prefix``
-
-ANR Application URL prefix.  No useful default. Usually a service name
-like ``http://ricxapp-entry/anr``
-
-``anrxapp.url.suffix``
-
-ANR Application URL suffix. Default is the empty string.
-
 ``appmgr.url.prefix``
 
 Application Manager URL prefix. No useful default. Usually a service
index 2352587..77e1220 100644 (file)
@@ -58,19 +58,6 @@ configuring applications in the RIC. The Dashboard UI provides screens
 for these functions.
 
 
-Automatic Neighbor Relation Application
----------------------------------------
-
-The Dashboard interfaces with the Automatic Neighbor Relation (ANR)
-application.  This RIC application is accessed via HTTP/REST requests
-using a client that is generated from an API specification published
-by the ANR team.
-
-This RIC application discovers and manages the Neighbor Cell Relation
-Table (NCRT). The Dashboard UI provides screens to view and modify
-NCRT data.
-
-
 E2 Manager
 ----------
 
index 39587c7..55202c8 100644 (file)
@@ -5,7 +5,7 @@
 RIC Dashboard Release Notes
 ===========================
 
-Version 2.0.0, 26 Dec 2019
+Version 2.0.0, 20 Jan 2020
 --------------------------
 * Change application properties file to YAML format
 * Add mock list of RIC instances to application properties
@@ -16,9 +16,9 @@ Version 2.0.0, 26 Dec 2019
 * Add instance-selector service
 * Revise ac-xapp, app-mgr, caas-ingress, e2-mgr service to support multiple ric instances
 * Revise ac-xapp, app-control, catalog, caas-ingress, ran-control components to listen to the instance change
-* Upgrade A1 Mediator API and submodule to tag 1.0.4
-* Upgrade App Manager API and submodule to tag 0.1.10
-* Upgrade E2 Manager API and submodule to tag 2.0.10
+* Upgrade A1 Mediator API and submodule to tag 2.1.0
+* Upgrade App Manager API and submodule to tag 0.3.3
+* Upgrade E2 Manager API and submodule to tag 3.0.3
 
 Version 1.3.0, 26 Nov 2019
 --------------------------
@@ -28,7 +28,7 @@ Version 1.3.0, 26 Nov 2019
 * Silence many Sonar complaints
 * Revise license statements in documentation files
 * Revise stats screen to drop mock load, pendulum, reporting items
-* Remove ANR xApp
+* Remove ANR xApp and mock configuration
 
 Version 1.2.4, 24 Oct 2019
 --------------------------
index ccc3b68..531bc10 100644 (file)
@@ -31,7 +31,7 @@ limitations under the License.
        <groupId>org.o-ran-sc.ric.plt.e2mgr.client</groupId>
        <artifactId>e2-mgr-client</artifactId>
        <name>RIC E2 Manager client</name>
-       <version>2.0.10-SNAPSHOT</version>
+       <version>3.0.3-SNAPSHOT</version>
        <properties>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
index bc966a7..380b7a2 160000 (submodule)
@@ -1 +1 @@
-Subproject commit bc966a778e96ab13590722c140489e8ef053a6f0
+Subproject commit 380b7a2a46087a054ebfac57f3dbf7949d318cc6
index 7c3a2dd..5c827ec 100644 (file)
@@ -42,22 +42,21 @@ limitations under the License.
                </repository>
        </repositories>
        <dependencies>
-               <!-- xApps -->
                <!-- Platform components -->
                <dependency>
                        <groupId>org.o-ran-sc.ric.plt.a1med.client</groupId>
                        <artifactId>a1-med-client</artifactId>
-                       <version>1.0.4-SNAPSHOT</version>
+                       <version>2.1.0-SNAPSHOT</version>
                </dependency>
                <dependency>
                        <groupId>org.o-ran-sc.ric.plt.appmgr.client</groupId>
                        <artifactId>app-mgr-client</artifactId>
-                       <version>0.1.10-SNAPSHOT</version>
+                       <version>0.3.3-SNAPSHOT</version>
                </dependency>
                <dependency>
                        <groupId>org.o-ran-sc.ric.plt.e2mgr.client</groupId>
                        <artifactId>e2-mgr-client</artifactId>
-                       <version>2.0.10-SNAPSHOT</version>
+                       <version>3.0.3-SNAPSHOT</version>
                </dependency>
                <dependency>
                        <groupId>org.onap.portal.sdk</groupId>
index 2dcc7d5..0a9d0c8 100644 (file)
@@ -28,10 +28,10 @@ import org.oransc.ric.plt.appmgr.client.api.XappApi;
 import org.oransc.ric.plt.appmgr.client.model.AllDeployableXapps;
 import org.oransc.ric.plt.appmgr.client.model.AllDeployedXapps;
 import org.oransc.ric.plt.appmgr.client.model.AllXappConfig;
-import org.oransc.ric.plt.appmgr.client.model.ConfigMetadata;
+import org.oransc.ric.plt.appmgr.client.model.ConfigValidationErrors;
 import org.oransc.ric.plt.appmgr.client.model.XAppConfig;
-import org.oransc.ric.plt.appmgr.client.model.XAppInfo;
 import org.oransc.ric.plt.appmgr.client.model.Xapp;
+import org.oransc.ric.plt.appmgr.client.model.XappDescriptor;
 import org.oransc.ric.portal.dashboard.DashboardApplication;
 import org.oransc.ric.portal.dashboard.DashboardConstants;
 import org.oransc.ric.portal.dashboard.config.AppManagerApiBuilder;
@@ -136,35 +136,15 @@ public class AppManagerController {
                return appManagerApiBuilder.getXappApi(instanceKey).getAllXappConfig();
        }
 
-       @ApiOperation(value = "Create XApp config.", response = XAppConfig.class)
-       @PostMapping(CONFIG_METHOD_PATH)
-       @Secured({ DashboardConstants.ROLE_ADMIN })
-       public XAppConfig createXappConfig(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey,
-                       @RequestBody XAppConfig xAppConfig) {
-               logger.debug("createXappConfig instance {} config {}", instanceKey, xAppConfig);
-               return appManagerApiBuilder.getXappApi(instanceKey).createXappConfig(xAppConfig);
-       }
-
-       @ApiOperation(value = "Modify XApp config.", response = XAppConfig.class)
+       @ApiOperation(value = "Modify XApp config.", response = ConfigValidationErrors.class)
        @PutMapping(CONFIG_METHOD_PATH)
        @Secured({ DashboardConstants.ROLE_ADMIN })
-       public XAppConfig modifyXappConfig(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey,
-                       @RequestBody XAppConfig xAppConfig) {
+       public ConfigValidationErrors modifyXappConfig(
+                       @PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey, @RequestBody XAppConfig xAppConfig) {
                logger.debug("modifyXappConfig instance {} config {}", instanceKey, xAppConfig);
                return appManagerApiBuilder.getXappApi(instanceKey).modifyXappConfig(xAppConfig);
        }
 
-       @ApiOperation(value = "Delete XApp configuration.")
-       @DeleteMapping(CONFIG_METHOD_PATH + "/{" + PP_XAPP_NAME + "}")
-       @Secured({ DashboardConstants.ROLE_ADMIN })
-       public void deleteXappConfig(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey,
-                       @RequestBody ConfigMetadata configMetadata, HttpServletResponse response) {
-               logger.debug("deleteXappConfig instance {} config {}", instanceKey, configMetadata);
-               XappApi api = appManagerApiBuilder.getXappApi(instanceKey);
-               api.deleteXappConfig(configMetadata);
-               response.setStatus(api.getApiClient().getStatusCode().value());
-       }
-
        @ApiOperation(value = "Returns a list of deployable xapps.", response = DashboardDeployableXapps.class)
        @GetMapping(DashboardConstants.RIC_INSTANCE_KEY + "/{" + DashboardConstants.RIC_INSTANCE_KEY + "}/"
                        + XAPPS_LIST_METHOD)
@@ -172,12 +152,12 @@ public class AppManagerController {
        public DashboardDeployableXapps getAvailableXapps(
                        @PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey) {
                logger.debug("getAvailableXapps instance {}", instanceKey);
-               AllDeployableXapps appNames = appManagerApiBuilder.getXappApi(instanceKey).listAllDeployableXapps();
+               AllDeployableXapps deployableXapps = appManagerApiBuilder.getXappApi(instanceKey).listAllXapps();
                // Answer a collection of structure instead of string
                // because I expect the AppMgr to be extended with
                // additional properties for each one.
                DashboardDeployableXapps apps = new DashboardDeployableXapps();
-               for (String n : appNames)
+               for (String n : deployableXapps)
                        apps.add(new AppTransport(n));
                return apps;
        }
@@ -203,9 +183,9 @@ public class AppManagerController {
        @PostMapping(XAPPS_METHOD_PATH)
        @Secured({ DashboardConstants.ROLE_ADMIN })
        public Xapp deployXapp(@PathVariable(DashboardConstants.RIC_INSTANCE_KEY) String instanceKey,
-                       @RequestBody XAppInfo appInfo) {
-               logger.debug("deployXapp instance {} info {}", instanceKey, appInfo);
-               return appManagerApiBuilder.getXappApi(instanceKey).deployXapp(appInfo);
+                       @RequestBody XappDescriptor appDescriptor) {
+               logger.debug("deployXapp instance {} descriptor {}", instanceKey, appDescriptor);
+               return appManagerApiBuilder.getXappApi(instanceKey).deployXapp(appDescriptor);
        }
 
        @ApiOperation(value = "Undeploy an existing xapp.")
index 3e27120..36f6ff3 100644 (file)
@@ -25,7 +25,6 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import java.lang.invoke.MethodHandles;
-import java.util.Arrays;
 
 import org.oransc.ric.plt.appmgr.client.api.HealthApi;
 import org.oransc.ric.plt.appmgr.client.api.XappApi;
@@ -34,12 +33,15 @@ import org.oransc.ric.plt.appmgr.client.model.AllDeployableXapps;
 import org.oransc.ric.plt.appmgr.client.model.AllDeployedXapps;
 import org.oransc.ric.plt.appmgr.client.model.AllXappConfig;
 import org.oransc.ric.plt.appmgr.client.model.ConfigMetadata;
+import org.oransc.ric.plt.appmgr.client.model.ConfigValidationError;
+import org.oransc.ric.plt.appmgr.client.model.ConfigValidationErrors;
+import org.oransc.ric.plt.appmgr.client.model.EventType;
 import org.oransc.ric.plt.appmgr.client.model.SubscriptionRequest;
 import org.oransc.ric.plt.appmgr.client.model.SubscriptionResponse;
 import org.oransc.ric.plt.appmgr.client.model.XAppConfig;
-import org.oransc.ric.plt.appmgr.client.model.XAppInfo;
 import org.oransc.ric.plt.appmgr.client.model.Xapp;
 import org.oransc.ric.plt.appmgr.client.model.Xapp.StatusEnum;
+import org.oransc.ric.plt.appmgr.client.model.XappDescriptor;
 import org.oransc.ric.plt.appmgr.client.model.XappInstance;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -96,18 +98,15 @@ public class AppManagerMockConfiguration {
                logger.debug("Creating XappApi for instance {}", instanceKey);
                // Create instance-specific objects
                String[] appNames = { "AdmissionControl " + instanceKey, "UE Event Collector " + instanceKey };
-               if (RICInstanceMockConfiguration.INSTANCE_KEY_1.equals(instanceKey)) {
-                       appNames = Arrays.copyOf(appNames, appNames.length + 1);
-                       appNames[appNames.length - 1] = "ANR " + instanceKey;
-               }
                final String configJson = " { \"config\" : \"example-" + instanceKey + "\"}";
-               final String descriptorJson = " { \"descriptor\" : \"example-" + instanceKey + "\"}";
+               final ConfigValidationErrors configValErrs = new ConfigValidationErrors();
+               configValErrs.add(new ConfigValidationError().field("mock error"));
                final AllXappConfig allXappConfigs = new AllXappConfig();
                final AllDeployableXapps deployableApps = new AllDeployableXapps();
                final AllDeployedXapps deployedXapps = new AllDeployedXapps();
                for (String n : appNames) {
-                       ConfigMetadata metadata = new ConfigMetadata().configName("config-" + n).name(n).namespace("namespace");
-                       XAppConfig config = new XAppConfig().config(configJson).descriptor(descriptorJson).metadata(metadata);
+                       ConfigMetadata metadata = new ConfigMetadata().xappName(n).namespace("namespace");
+                       XAppConfig config = new XAppConfig().config(configJson).metadata(metadata);
                        allXappConfigs.add(config);
                        deployableApps.add(n);
                        Xapp xapp = new Xapp().name(n).version("version").status(StatusEnum.UNKNOWN);
@@ -115,8 +114,7 @@ public class AppManagerMockConfiguration {
                                        .status(XappInstance.StatusEnum.RUNNING));
                        deployedXapps.add(xapp);
                }
-               final SubscriptionResponse subRes = new SubscriptionResponse().eventType(SubscriptionResponse.EventTypeEnum.ALL)
-                               .id("subid").version(1);
+               final SubscriptionResponse subRes = new SubscriptionResponse().eventType(EventType.ALL).id("subid").version(1);
                // Mock the methods to return the instance-specific objects
                ApiClient mockClient = mock(ApiClient.class);
                when(mockClient.getStatusCode()).thenReturn(HttpStatus.OK);
@@ -129,41 +127,27 @@ public class AppManagerMockConfiguration {
                        }
                        return allXappConfigs;
                }).when(mockApi).getAllXappConfig();
-               doAnswer(inv -> {
-                       if (delayMs > 0) {
-                               logger.debug("createXappConfig sleeping {}", delayMs);
-                               Thread.sleep(delayMs);
-                       }
-                       return allXappConfigs.get(0);
-               }).when(mockApi).createXappConfig(any(XAppConfig.class));
                doAnswer(inv -> {
                        if (delayMs > 0) {
                                logger.debug("modifyXappConfig sleeping {}", delayMs);
                                Thread.sleep(delayMs);
                        }
-                       return allXappConfigs.get(0);
+                       return configValErrs;
                }).when(mockApi).modifyXappConfig(any(XAppConfig.class));
-               doAnswer(inv -> {
-                       if (delayMs > 0) {
-                               logger.debug("deleteXappConfig sleeping {}", delayMs);
-                               Thread.sleep(delayMs);
-                       }
-                       return null;
-               }).when(mockApi).deleteXappConfig(any(ConfigMetadata.class));
                doAnswer(inv -> {
                        if (delayMs > 0) {
                                logger.debug("deployXapp of {} sleeping {}", inv.getArgument(0), delayMs);
                                Thread.sleep(delayMs);
                        }
                        return deployedXapps.get(0);
-               }).when(mockApi).deployXapp(any(XAppInfo.class));
+               }).when(mockApi).deployXapp(any(XappDescriptor.class));
                doAnswer(inv -> {
                        if (delayMs > 0) {
                                logger.debug("listAllDeployableXapps sleeping {}", delayMs);
                                Thread.sleep(delayMs);
                        }
                        return deployableApps;
-               }).when(mockApi).listAllDeployableXapps();
+               }).when(mockApi).listAllXapps();
                doAnswer(inv -> {
                        if (delayMs > 0) {
                                logger.debug("getAllXapps sleeping {}", delayMs);
index fcc0566..52a383e 100644 (file)
@@ -26,10 +26,9 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.oransc.ric.plt.appmgr.client.model.AllDeployedXapps;
 import org.oransc.ric.plt.appmgr.client.model.AllXappConfig;
-import org.oransc.ric.plt.appmgr.client.model.ConfigMetadata;
 import org.oransc.ric.plt.appmgr.client.model.XAppConfig;
-import org.oransc.ric.plt.appmgr.client.model.XAppInfo;
 import org.oransc.ric.plt.appmgr.client.model.Xapp;
+import org.oransc.ric.plt.appmgr.client.model.XappDescriptor;
 import org.oransc.ric.portal.dashboard.DashboardConstants;
 import org.oransc.ric.portal.dashboard.config.RICInstanceMockConfiguration;
 import org.oransc.ric.portal.dashboard.model.DashboardDeployableXapps;
@@ -103,8 +102,8 @@ public class AppManagerControllerTest extends AbstractControllerTest {
                URI uri = buildUri(null, AppManagerController.CONTROLLER_PATH, DashboardConstants.RIC_INSTANCE_KEY,
                                RICInstanceMockConfiguration.INSTANCE_KEY_1, AppManagerController.XAPPS_METHOD);
                logger.info("Invoking {}", uri);
-               XAppInfo info = new XAppInfo();
-               Xapp app = testRestTemplateAdminRole().postForObject(uri, info, Xapp.class);
+               XappDescriptor descr = new XappDescriptor();
+               Xapp app = testRestTemplateAdminRole().postForObject(uri, descr, Xapp.class);
                Assertions.assertFalse(app.getName().isEmpty());
        }
 
@@ -128,23 +127,13 @@ public class AppManagerControllerTest extends AbstractControllerTest {
        }
 
        @Test
-       public void createConfigTest() {
+       public void modifyConfigTest() {
                URI uri = buildUri(null, AppManagerController.CONTROLLER_PATH, DashboardConstants.RIC_INSTANCE_KEY,
                                RICInstanceMockConfiguration.INSTANCE_KEY_1, AppManagerController.CONFIG_METHOD);
                logger.info("Invoking {}", uri);
-               XAppConfig newConfig = new XAppConfig();
-               XAppConfig response = testRestTemplateAdminRole().postForObject(uri, newConfig, XAppConfig.class);
-               Assertions.assertNotNull(response.getConfig());
-       }
-
-       @Test
-       public void deleteConfigTest() {
-               URI uri = buildUri(null, AppManagerController.CONTROLLER_PATH, DashboardConstants.RIC_INSTANCE_KEY,
-                               RICInstanceMockConfiguration.INSTANCE_KEY_1, AppManagerController.CONFIG_METHOD, "app");
-               logger.info("Invoking {}", uri);
-               ConfigMetadata delConfig = new ConfigMetadata();
-               HttpEntity<ConfigMetadata> entity = new HttpEntity<>(delConfig);
-               ResponseEntity<Void> voidResponse = testRestTemplateAdminRole().exchange(uri, HttpMethod.DELETE, entity,
+               XAppConfig modConfig = new XAppConfig();
+               HttpEntity<XAppConfig> entity = new HttpEntity<>(modConfig);
+               ResponseEntity<Void> voidResponse = testRestTemplateAdminRole().exchange(uri, HttpMethod.PUT, entity,
                                Void.class);
                Assertions.assertTrue(voidResponse.getStatusCode().is2xxSuccessful());
        }
index 255b3fe..eb39742 100644 (file)
@@ -1,456 +1,4 @@
 [
-  {
-    "metadata": {
-      "name": "Automatic Neighbor Relation",
-      "configName": "anr-appconfig",
-      "namespace": "ricxapp"
-    },
-    "descriptor": {
-      "$id": "http://example.com/root.json",
-      "$schema": "http://json-schema.org/draft-07/schema#",
-      "definitions": {},
-      "properties": {
-        "controls": {
-          "$id": "#/properties/controls",
-          "properties": {
-            "active": {
-              "$id": "#/properties/controls/properties/active",
-              "default": false,
-              "examples": [
-                true
-              ],
-              "title": "The Active Schema",
-              "type": "boolean"
-            },
-            "interfaceId": {
-              "$id": "#/properties/controls/properties/interfaceId",
-              "properties": {
-                "globalENBId": {
-                  "$id": "#/properties/controls/properties/interfaceId/properties/globalENBId",
-                  "properties": {
-                    "bits": {
-                      "$id": "#/properties/controls/properties/interfaceId/properties/globalENBId/properties/bits",
-                      "default": 0,
-                      "examples": [
-                        28
-                      ],
-                      "title": "The Bits Schema",
-                      "maximum": 1024,
-                      "type": "integer"
-                    },
-                    "id": {
-                      "$id": "#/properties/controls/properties/interfaceId/properties/globalENBId/properties/id",
-                      "default": 0,
-                      "examples": [
-                        202251
-                      ],
-                      "title": "The Id Schema",
-                      "type": "integer"
-                    },
-                    "plmnid": {
-                      "$id": "#/properties/controls/properties/interfaceId/properties/globalENBId/properties/plmnid",
-                      "default": "",
-                      "examples": [
-                        "310150"
-                      ],
-                      "pattern": "^(.*)$",
-                      "title": "The Plmnid Schema",
-                      "type": "string"
-                    }
-                  },
-                  "required": [
-                    "plmnid",
-                    "id",
-                    "bits"
-                  ],
-                  "title": "The Globalenbid Schema",
-                  "type": "object"
-                }
-              },
-              "required": [
-                "globalENBId"
-              ],
-              "title": "The Interfaceid Schema",
-              "type": "object"
-            },
-            "subscription": {
-              "$id": "#/properties/controls/properties/subscription",
-              "properties": {
-                "retries": {
-                  "$id": "#/properties/controls/properties/subscription/properties/retries",
-                  "default": 0,
-                  "examples": [
-                    1
-                  ],
-                  "title": "The Retries Schema",
-                  "type": "integer"
-                },
-                "retryto": {
-                  "$id": "#/properties/controls/properties/subscription/properties/retryto",
-                  "default": 0,
-                  "examples": [
-                    2
-                  ],
-                  "title": "The Retryto Schema",
-                  "type": "integer"
-                }
-              },
-              "required": [
-                "retries",
-                "retryto"
-              ],
-              "title": "The Subscription Schema",
-              "type": "object"
-            }
-          },
-          "required": [
-            "active",
-            "subscription",
-            "interfaceId"
-          ],
-          "title": "The Controls Schema",
-          "type": "object"
-        },
-        "db": {
-          "$id": "#/properties/db",
-          "properties": {
-            "host": {
-              "$id": "#/properties/db/properties/host",
-              "default": "",
-              "examples": [
-                "localhost"
-              ],
-              "pattern": "^(.*)$",
-              "title": "The Host Schema",
-              "type": "string"
-            },
-            "namespaces": {
-              "$id": "#/properties/db/properties/namespaces",
-              "items": {
-                "$id": "#/properties/db/properties/namespaces/items",
-                "default": "",
-                "examples": [
-                  "sdl",
-                  "rnib"
-                ],
-                "pattern": "^(.*)$",
-                "title": "The Items Schema",
-                "type": "string"
-              },
-              "title": "The Namespaces Schema",
-              "type": "array"
-            },
-            "port": {
-              "$id": "#/properties/db/properties/port",
-              "default": 0,
-              "examples": [
-                6379
-              ],
-              "title": "The Port Schema",
-              "type": "integer"
-            }
-          },
-          "required": [
-            "host",
-            "port",
-            "namespaces"
-          ],
-          "title": "The Db Schema",
-          "type": "object"
-        },
-        "local": {
-          "$id": "#/properties/local",
-          "properties": {
-            "host": {
-              "$id": "#/properties/local/properties/host",
-              "default": "",
-              "examples": [
-                ":8080"
-              ],
-              "pattern": "^(.*)$",
-              "title": "The Host Schema",
-              "type": "string"
-            }
-          },
-          "required": [
-            "host"
-          ],
-          "title": "The Local Schema",
-          "type": "object"
-        },
-        "logger": {
-          "$id": "#/properties/logger",
-          "properties": {
-            "level": {
-              "$id": "#/properties/logger/properties/level",
-              "default": 0,
-              "examples": [
-                3
-              ],
-              "title": "The Level Schema",
-              "type": "integer"
-            }
-          },
-          "required": [
-            "level"
-          ],
-          "title": "The Logger Schema",
-          "type": "object"
-        },
-        "metrics": {
-          "$id": "#/properties/metrics",
-          "items": {
-            "$id": "#/properties/metrics/items",
-            "properties": {
-              "description": {
-                "$id": "#/properties/metrics/items/properties/description",
-                "default": "",
-                "examples": [
-                  "The total number of UE context creation events"
-                ],
-                "pattern": "^(.*)$",
-                "title": "The Description Schema",
-                "type": "string"
-              },
-              "enabled": {
-                "$id": "#/properties/metrics/items/properties/enabled",
-                "default": false,
-                "examples": [
-                  true
-                ],
-                "title": "The Enabled Schema",
-                "type": "boolean"
-              },
-              "name": {
-                "$id": "#/properties/metrics/items/properties/name",
-                "default": "",
-                "examples": [
-                  "UEContextCreated"
-                ],
-                "pattern": "^(.*)$",
-                "title": "The Name Schema",
-                "type": "string"
-              },
-              "type": {
-                "$id": "#/properties/metrics/items/properties/type",
-                "default": "",
-                "examples": [
-                  "counter"
-                ],
-                "pattern": "^(.*)$",
-                "title": "The Type Schema",
-                "type": "string"
-              }
-            },
-            "required": [
-              "name",
-              "type",
-              "enabled",
-              "description"
-            ],
-            "title": "The Items Schema",
-            "type": "object"
-          },
-          "title": "The Metrics Schema",
-          "type": "array"
-        },
-        "rmr": {
-          "$id": "#/properties/rmr",
-          "properties": {
-            "maxSize": {
-              "$id": "#/properties/rmr/properties/maxSize",
-              "default": 0,
-              "examples": [
-                2072
-              ],
-              "title": "The Maxsize Schema",
-              "type": "integer"
-            },
-            "numWorkers": {
-              "$id": "#/properties/rmr/properties/numWorkers",
-              "default": 0,
-              "examples": [
-                1
-              ],
-              "title": "The Numworkers Schema",
-              "type": "integer"
-            },
-            "protPort": {
-              "$id": "#/properties/rmr/properties/protPort",
-              "default": "",
-              "examples": [
-                "tcp:4560"
-              ],
-              "pattern": "^(.*)$",
-              "title": "The Protport Schema",
-              "type": "string"
-            },
-            "rxMessages": {
-              "$id": "#/properties/rmr/properties/rxMessages",
-              "items": {
-                "$id": "#/properties/rmr/properties/rxMessages/items",
-                "default": "",
-                "examples": [
-                  "RIC_SUB_RESP",
-                  "RIC_SUB_FAILURE",
-                  "RIC_SUB_DEL_RESP",
-                  "RIC_SUB_DEL_FAILURE",
-                  "RIC_INDICATION"
-                ],
-                "pattern": "^(.*)$",
-                "title": "The Items Schema",
-                "type": "string"
-              },
-              "title": "The Rxmessages Schema",
-              "type": "array"
-            },
-            "txMessages": {
-              "$id": "#/properties/rmr/properties/txMessages",
-              "items": {
-                "$id": "#/properties/rmr/properties/txMessages/items",
-                "default": "",
-                "examples": [
-                  "RIC_SUB_REQ",
-                  "RIC_SUB_DEL_REQ"
-                ],
-                "pattern": "^(.*)$",
-                "title": "The Items Schema",
-                "type": "string"
-              },
-              "title": "The Txmessages Schema",
-              "type": "array"
-            }
-          },
-          "required": [
-            "protPort",
-            "maxSize",
-            "numWorkers",
-            "txMessages",
-            "rxMessages"
-          ],
-          "title": "The Rmr Schema",
-          "type": "object"
-        }
-      },
-      "required": [
-        "local",
-        "logger",
-        "rmr",
-        "db",
-        "controls",
-        "metrics"
-      ],
-      "title": "The Root Schema",
-      "type": "object"
-    },
-    "config": {
-      "controls": {
-        "active": true,
-        "interfaceId": {
-          "globalENBId": {
-            "bits": 28,
-            "id": 202251,
-            "plmnid": "310150"
-          }
-        },
-        "subscription": {
-          "retries": 1,
-          "retryto": 2
-        }
-      },
-      "db": {
-        "host": "localhost",
-        "namespaces": [
-          "sdl",
-          "rnib"
-        ],
-        "port": 6379
-      },
-      "local": {
-        "host": ":8080"
-      },
-      "logger": {
-        "level": 3
-      },
-      "metrics": [
-        {
-          "description": "The total number of UE context creation events",
-          "enabled": true,
-          "name": "UEContextCreated",
-          "type": "counter"
-        },
-        {
-          "description": "The total number of UE context release events",
-          "enabled": true,
-          "name": "UEContextReleased",
-          "type": "counter"
-        }
-      ],
-      "rmr": {
-        "maxSize": 2072,
-        "numWorkers": 1,
-        "protPort": "tcp:4560",
-        "rxMessages": [
-          "RIC_SUB_RESP",
-          "RIC_SUB_FAILURE",
-          "RIC_SUB_DEL_RESP",
-          "RIC_SUB_DEL_FAILURE",
-          "RIC_INDICATION"
-        ],
-        "txMessages": [
-          "RIC_SUB_REQ",
-          "RIC_SUB_DEL_REQ"
-        ]
-      }
-    },
-    "layout": [
-      {
-        "key": "controls.active",
-        "title": "Active"
-      },
-      {
-        "key": "controls.interfaceId.globalENBId",
-        "title": "Global ENB Id"
-      },
-      {
-        "type": "flex",
-        "flex-flow": "row wrap",
-        "items": [
-          {
-            "key": "controls.interfaceId.globalENBId.plmnid",
-            "title": "Plmn Id"
-          },
-          {
-            "key": "controls.interfaceId.globalENBId.id",
-            "title": "Id"
-
-          },
-          {
-            "key": "controls.interfaceId.globalENBId.bits",
-            "title": "Bits"
-          }
-        ]
-      },
-      {
-        "key": "controls.subscription",
-        "title": "Subscription"
-      },
-      {
-        "type": "flex",
-        "flex-flow": "row wrap",
-        "items": [
-          {
-            "key": "controls.subscription.retries",
-            "title": "Retries"
-          },
-          {
-            "key": "controls.subscription.retryto",
-            "title": "Retry to"
-          }
-        ]
-      }
-    ]
-  },
   {
     "metadata": {
       "name": "UE Event Collector",