From: jh245g Date: Fri, 24 Jan 2020 15:54:54 +0000 (-0500) Subject: Add multi-layer RIC instance selector X-Git-Tag: 2.0.0~2 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=a0180adc6a1e1ec09472549596428b70d48db3fc;p=portal%2Fric-dashboard.git Add multi-layer RIC instance selector Extend for config data that provides a list of regions, each of which contains a list of RIC instances. Change-Id: I61a7b15e20e49d661b7539ba52c3cafa5c44dee2 Signed-off-by: Jun (Nicolas) Hu Signed-off-by: Lott, Christopher (cl778h) --- diff --git a/docs/release-notes.rst b/docs/release-notes.rst index 87fe784d..7da3ca4a 100644 --- a/docs/release-notes.rst +++ b/docs/release-notes.rst @@ -5,7 +5,7 @@ RIC Dashboard Release Notes =========================== -Version 2.0.0, 20 Jan 2020 +Version 2.0.0, 24 Jan 2020 -------------------------- * Change application properties file to YAML format * Add mock list of RIC instances to application properties @@ -21,6 +21,7 @@ Version 2.0.0, 20 Jan 2020 * Upgrade E2 Manager API and submodule to tag 3.0.3 * Add instance selector dialog component and service * Repair onSidenavClose method +* Extend to support selecting a RIC instance within a region Version 1.3.0, 26 Nov 2019 -------------------------- diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/DashboardApplication.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/DashboardApplication.java index 3a6d6a2b..136606bf 100644 --- a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/DashboardApplication.java +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/DashboardApplication.java @@ -24,7 +24,8 @@ import java.lang.invoke.MethodHandles; import java.util.List; import org.oransc.ric.portal.dashboard.model.RicInstance; -import org.oransc.ric.portal.dashboard.model.RicInstanceList; +import org.oransc.ric.portal.dashboard.model.RicRegion; +import org.oransc.ric.portal.dashboard.model.RicRegionList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -42,7 +43,7 @@ public class DashboardApplication implements CommandLineRunner { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); @Autowired - private RicInstanceList instanceConfig; + private RicRegionList instanceConfig; public static void main(String[] args) { SpringApplication.run(DashboardApplication.class, args); @@ -53,15 +54,18 @@ public class DashboardApplication implements CommandLineRunner { // Ensure output appears on the console by using level WARN logger.warn("run: version '{}'", getImplementationVersion(MethodHandles.lookup().lookupClass())); // Validate configuration - List instances = instanceConfig.getInstances(); - Assert.notEmpty(instances, "Instance list empty"); - for (RicInstance it : instances) { - logger.warn("run: RIC instance {}", it); - Assert.hasText(it.getKey(), "Instance key missing"); - Assert.hasText(it.getName(), "Name missing for instance " + it.getKey()); - Assert.hasText(it.getAppUrlPrefix(), "App URL prefix missing for instance " + it.getKey()); - Assert.hasText(it.getCaasUrlPrefix(), "Caas URL prefix missing for instance " + it.getKey()); - Assert.hasText(it.getPltUrlPrefix(), "Plt URL prefix missing for instance " + it.getKey()); + List regions = instanceConfig.getRegions(); + Assert.notEmpty(regions, "Region list empty"); + for (RicRegion r : regions) { + Assert.notEmpty(r.getInstances(), "Instance list empty for region " + r.getName()); + for (RicInstance it : r.getInstances()) { + logger.warn("run: RIC region {} instance {}", r, it); + Assert.hasText(it.getKey(), "Instance key missing"); + Assert.hasText(it.getName(), "Name missing for instance " + it.getKey()); + Assert.hasText(it.getAppUrlPrefix(), "App URL prefix missing for instance " + it.getKey()); + Assert.hasText(it.getCaasUrlPrefix(), "Caas URL prefix missing for instance " + it.getKey()); + Assert.hasText(it.getPltUrlPrefix(), "Plt URL prefix missing for instance " + it.getKey()); + } } } diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/A1MediatorApiBuilder.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/A1MediatorApiBuilder.java index 06fccc15..21f30334 100644 --- a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/A1MediatorApiBuilder.java +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/A1MediatorApiBuilder.java @@ -24,7 +24,7 @@ import java.lang.invoke.MethodHandles; import org.oransc.ric.a1med.client.api.A1MediatorApi; import org.oransc.ric.a1med.client.invoker.ApiClient; import org.oransc.ric.portal.dashboard.model.RicInstance; -import org.oransc.ric.portal.dashboard.model.RicInstanceList; +import org.oransc.ric.portal.dashboard.model.RicRegionList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.client.RestTemplate; @@ -42,9 +42,9 @@ public class A1MediatorApiBuilder { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); private final String urlSuffix; - private final RicInstanceList instanceConfig; + private final RicRegionList instanceConfig; - public A1MediatorApiBuilder(final RicInstanceList instanceConfig, final String urlSuffix) { + public A1MediatorApiBuilder(final RicRegionList instanceConfig, final String urlSuffix) { logger.debug("ctor: suffix {}", urlSuffix); this.instanceConfig = instanceConfig; this.urlSuffix = urlSuffix; diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/A1MediatorConfiguration.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/A1MediatorConfiguration.java index 68538060..2e8efb2b 100644 --- a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/A1MediatorConfiguration.java +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/A1MediatorConfiguration.java @@ -21,7 +21,7 @@ package org.oransc.ric.portal.dashboard.config; import java.lang.invoke.MethodHandles; -import org.oransc.ric.portal.dashboard.model.RicInstanceList; +import org.oransc.ric.portal.dashboard.model.RicRegionList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -42,11 +42,11 @@ public class A1MediatorConfiguration { // Populated by the autowired constructor private final String urlSuffix; - private final RicInstanceList instanceConfig; + private final RicRegionList instanceConfig; @Autowired public A1MediatorConfiguration(@Value("${a1med.url.suffix}") final String urlSuffix, - final RicInstanceList instanceConfig) { + final RicRegionList instanceConfig) { logger.info("ctor: URL suffix {}", urlSuffix); this.urlSuffix = urlSuffix; this.instanceConfig = instanceConfig; diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/AppManagerApiBuilder.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/AppManagerApiBuilder.java index 5081ec8b..c92baa7d 100644 --- a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/AppManagerApiBuilder.java +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/AppManagerApiBuilder.java @@ -25,7 +25,7 @@ import org.oransc.ric.plt.appmgr.client.api.HealthApi; import org.oransc.ric.plt.appmgr.client.api.XappApi; import org.oransc.ric.plt.appmgr.client.invoker.ApiClient; import org.oransc.ric.portal.dashboard.model.RicInstance; -import org.oransc.ric.portal.dashboard.model.RicInstanceList; +import org.oransc.ric.portal.dashboard.model.RicRegionList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.client.RestTemplate; @@ -43,9 +43,9 @@ public class AppManagerApiBuilder { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); private final String urlSuffix; - private final RicInstanceList instanceConfig; + private final RicRegionList instanceConfig; - public AppManagerApiBuilder(final RicInstanceList instanceConfig, final String urlSuffix) { + public AppManagerApiBuilder(final RicRegionList instanceConfig, final String urlSuffix) { logger.debug("ctor: suffix {}", urlSuffix); this.instanceConfig = instanceConfig; this.urlSuffix = urlSuffix; diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/AppManagerConfiguration.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/AppManagerConfiguration.java index ffb5db64..e4e37514 100644 --- a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/AppManagerConfiguration.java +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/AppManagerConfiguration.java @@ -21,7 +21,7 @@ package org.oransc.ric.portal.dashboard.config; import java.lang.invoke.MethodHandles; -import org.oransc.ric.portal.dashboard.model.RicInstanceList; +import org.oransc.ric.portal.dashboard.model.RicRegionList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -42,11 +42,11 @@ public class AppManagerConfiguration { // Populated by the autowired constructor private final String urlSuffix; - private final RicInstanceList instanceConfig; + private final RicRegionList instanceConfig; @Autowired public AppManagerConfiguration(@Value("${appmgr.url.suffix}") final String urlSuffix, - final RicInstanceList instanceConfig) { + final RicRegionList instanceConfig) { logger.info("ctor: URL suffix {}", urlSuffix); this.urlSuffix = urlSuffix; this.instanceConfig = instanceConfig; diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/CaasIngressConfiguration.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/CaasIngressConfiguration.java index 7bb31493..648a8473 100644 --- a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/CaasIngressConfiguration.java +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/CaasIngressConfiguration.java @@ -23,7 +23,7 @@ import java.lang.invoke.MethodHandles; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; -import org.oransc.ric.portal.dashboard.model.RicInstanceList; +import org.oransc.ric.portal.dashboard.model.RicRegionList; import org.oransc.ric.portal.dashboard.util.HttpsURLConnectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,13 +44,13 @@ public class CaasIngressConfiguration { // Populated by the autowired constructor private final String urlSuffix; - private final RicInstanceList instanceConfig; + private final RicRegionList instanceConfig; @Autowired public CaasIngressConfiguration( // @Value("${caasingress.plt.url.suffix}") final String pltUrlSuffix, // @Value("${caasingress.insecure}") final Boolean insecureFlag, // - final RicInstanceList instanceConfig) throws KeyManagementException, NoSuchAlgorithmException { + final RicRegionList instanceConfig) throws KeyManagementException, NoSuchAlgorithmException { logger.debug("ctor: suffix {} insecure flag {}", pltUrlSuffix, insecureFlag); this.urlSuffix = pltUrlSuffix; this.instanceConfig = instanceConfig; diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/E2ManagerApiBuilder.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/E2ManagerApiBuilder.java index 858a51b7..c0291842 100644 --- a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/E2ManagerApiBuilder.java +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/E2ManagerApiBuilder.java @@ -25,7 +25,7 @@ import org.oransc.ric.e2mgr.client.api.HealthCheckApi; import org.oransc.ric.e2mgr.client.api.NodebApi; import org.oransc.ric.e2mgr.client.invoker.ApiClient; import org.oransc.ric.portal.dashboard.model.RicInstance; -import org.oransc.ric.portal.dashboard.model.RicInstanceList; +import org.oransc.ric.portal.dashboard.model.RicRegionList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.client.RestTemplate; @@ -43,9 +43,9 @@ public class E2ManagerApiBuilder { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); private final String urlSuffix; - private final RicInstanceList instanceConfig; + private final RicRegionList instanceConfig; - public E2ManagerApiBuilder(final RicInstanceList instanceConfig, final String urlSuffix) { + public E2ManagerApiBuilder(final RicRegionList instanceConfig, final String urlSuffix) { logger.debug("ctor: suffix {}", urlSuffix); this.instanceConfig = instanceConfig; this.urlSuffix = urlSuffix; diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/E2ManagerConfiguration.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/E2ManagerConfiguration.java index 4b25622a..ef9ab45e 100644 --- a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/E2ManagerConfiguration.java +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/E2ManagerConfiguration.java @@ -21,7 +21,7 @@ package org.oransc.ric.portal.dashboard.config; import java.lang.invoke.MethodHandles; -import org.oransc.ric.portal.dashboard.model.RicInstanceList; +import org.oransc.ric.portal.dashboard.model.RicRegionList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -42,11 +42,11 @@ public class E2ManagerConfiguration { // Populated by the autowired constructor private final String urlSuffix; - private final RicInstanceList instanceConfig; + private final RicRegionList instanceConfig; @Autowired public E2ManagerConfiguration(@Value("${e2mgr.url.suffix}") final String urlSuffix, - final RicInstanceList instanceConfig) { + final RicRegionList instanceConfig) { logger.info("ctor: URL suffix {}", urlSuffix); this.urlSuffix = urlSuffix; this.instanceConfig = instanceConfig; diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/RICInstanceConfiguration.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/RICInstanceConfiguration.java index 6159e4d6..0e34bcf6 100644 --- a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/RICInstanceConfiguration.java +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/RICInstanceConfiguration.java @@ -20,11 +20,14 @@ package org.oransc.ric.portal.dashboard.config; +import java.lang.invoke.MethodHandles; import java.util.ArrayList; import java.util.List; -import org.oransc.ric.portal.dashboard.model.RicInstance; -import org.oransc.ric.portal.dashboard.model.RicInstanceList; +import org.oransc.ric.portal.dashboard.model.RicRegion; +import org.oransc.ric.portal.dashboard.model.RicRegionList; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -35,16 +38,26 @@ import org.springframework.context.annotation.Profile; * in application properties like this: * *
- * ricinstances:
-    instances:
-        -
-          key: key1
-          name: Friendly Name One
-          urlPrefix: http://foo.bar.one/
-        -
-          key: key2
-          name: Friendly Name Two
-          urlPrefix: http://foo.bar.two/
+  ricinstances:
+    regions:
+      -
+        name: Region ABC
+        instances:
+            -
+              key: key1
+              name: Friendly Name One
+              appUrlPrefix: http://foo.bar.one/
+            -
+              key: key2
+              name: Friendly Name Two
+              appUrlPrefix: http://foo.bar.two/
+      -
+        name: Region DEF
+        instances:
+            -
+              key: key3
+              name: Friendly Name Three
+              appUrlPrefix: http://foo.bar.three/
  * 
*/ @Configuration @@ -52,16 +65,19 @@ import org.springframework.context.annotation.Profile; @Profile("!test") public class RICInstanceConfiguration { - private List instances = new ArrayList<>(); + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + private List regions = new ArrayList<>(); // Called by spring with config data - public void setInstances(List instances) { - this.instances = instances; + public void setRegions(List regions) { + this.regions = regions; } @Bean - public RicInstanceList ricInstanceList() { - return new RicInstanceList(instances); + public RicRegionList ricRegions() { + logger.debug("Creating bean ricRegions"); + return new RicRegionList(regions); } } diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/SimpleKubernetesClientBuilder.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/SimpleKubernetesClientBuilder.java index 50af74f8..84392c76 100644 --- a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/SimpleKubernetesClientBuilder.java +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/config/SimpleKubernetesClientBuilder.java @@ -25,7 +25,7 @@ import java.util.concurrent.ConcurrentHashMap; import org.oransc.ric.portal.dashboard.k8sapi.SimpleKubernetesClient; import org.oransc.ric.portal.dashboard.model.RicInstance; -import org.oransc.ric.portal.dashboard.model.RicInstanceList; +import org.oransc.ric.portal.dashboard.model.RicRegionList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.util.DefaultUriBuilderFactory; @@ -40,9 +40,9 @@ public class SimpleKubernetesClientBuilder { private Map cache = new ConcurrentHashMap<>(); private final String urlSuffix; - private final RicInstanceList instanceConfig; + private final RicRegionList instanceConfig; - public SimpleKubernetesClientBuilder(final RicInstanceList instanceConfig, final String urlSuffix) { + public SimpleKubernetesClientBuilder(final RicRegionList instanceConfig, final String urlSuffix) { logger.debug("ctor: suffix {}", urlSuffix); this.instanceConfig = instanceConfig; this.urlSuffix = urlSuffix; diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/AdminController.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/AdminController.java index ccdf1bcd..ce52f7a0 100644 --- a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/AdminController.java +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/controller/AdminController.java @@ -30,8 +30,9 @@ import org.oransc.ric.portal.dashboard.DashboardConstants; import org.oransc.ric.portal.dashboard.DashboardUserManager; import org.oransc.ric.portal.dashboard.model.ErrorTransport; import org.oransc.ric.portal.dashboard.model.IDashboardResponse; -import org.oransc.ric.portal.dashboard.model.RicInstanceKeyName; -import org.oransc.ric.portal.dashboard.model.RicInstanceList; +import org.oransc.ric.portal.dashboard.model.RicRegion; +import org.oransc.ric.portal.dashboard.model.RicRegionList; +import org.oransc.ric.portal.dashboard.model.RicRegionTransport; import org.oransc.ric.portal.dashboard.model.SuccessTransport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -73,7 +74,7 @@ public class AdminController { private DashboardUserManager dashboardUserManager; @Autowired - private RicInstanceList instanceConfig; + private RicRegionList instanceConfig; @ApiOperation(value = "Gets the Dashboard MANIFEST.MF property Implementation-Version.", response = SuccessTransport.class) @GetMapping(VERSION_METHOD) @@ -102,12 +103,12 @@ public class AdminController { return dashboardUserManager.getUsers(); } - @ApiOperation(value = "Gets the list of RIC instances.", response = RicInstanceKeyName.class, responseContainer = "List") + @ApiOperation(value = "Gets the RIC regions and instances.", response = RicRegion.class, responseContainer = "List") @GetMapping(INSTANCE_METHOD) @Secured({ DashboardConstants.ROLE_ADMIN, DashboardConstants.ROLE_STANDARD }) - public List getInstances() { - logger.debug("getInstances"); - return instanceConfig.getKeyNameList(); + public List getRegionsInstances() { + logger.debug("getRegionsInstances"); + return instanceConfig.getSimpleInstances(); } @ApiOperation(value = "Gets the kibana metrics URL for the specified app.", response = SuccessTransport.class) diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/AppTransport.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/AppTransport.java index abe026ba..68203f26 100644 --- a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/AppTransport.java +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/AppTransport.java @@ -64,7 +64,7 @@ public class AppTransport implements IDashboardResponse { @Override public String toString() { - return this.getClass().getName() + "[name=" + getName() + ", version=" + getVersion() + "]"; + return this.getClass().getSimpleName() + "[name=" + getName() + ", version=" + getVersion() + "]"; } } diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/EcompUserDetails.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/EcompUserDetails.java index 30cab782..22e1a4ac 100644 --- a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/EcompUserDetails.java +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/EcompUserDetails.java @@ -85,8 +85,8 @@ public class EcompUserDetails implements UserDetails { @Override public String toString() { - return this.getClass().getName() + "[ecompUser=" + ecompUser + ", isAccountNonExpired=" + isAccountNonExpired() - + ", isAccountNonLocked=" + isAccountNonLocked() + ", isCredentialsNonExpired=" + return this.getClass().getSimpleName() + "[ecompUser=" + ecompUser + ", isAccountNonExpired=" + + isAccountNonExpired() + ", isAccountNonLocked=" + isAccountNonLocked() + ", isCredentialsNonExpired=" + isCredentialsNonExpired() + "]"; } diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/ErrorTransport.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/ErrorTransport.java index df5c3e40..2a90fca5 100644 --- a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/ErrorTransport.java +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/ErrorTransport.java @@ -132,7 +132,7 @@ public class ErrorTransport implements IDashboardResponse { @Override public String toString() { - return this.getClass().getName() + "[timestamp=" + getTimestamp() + ", error=" + getError() + ", path=" + return this.getClass().getSimpleName() + "[timestamp=" + getTimestamp() + ", error=" + getError() + ", path=" + getPath() + "]"; } diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RanDetailsTransport.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RanDetailsTransport.java index 130a1c56..bb581aa8 100644 --- a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RanDetailsTransport.java +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RanDetailsTransport.java @@ -63,8 +63,8 @@ public class RanDetailsTransport implements IDashboardResponse { @Override public String toString() { - return this.getClass().getName() + "[nodebIdentity=" + getNodebIdentity() + ", nodebStatus=" + getNodebStatus() - + "]"; + return this.getClass().getSimpleName() + "[nodebIdentity=" + getNodebIdentity() + ", nodebStatus=" + + getNodebStatus() + "]"; } } diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RicInstance.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RicInstance.java index ccb224d6..780bffc5 100644 --- a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RicInstance.java +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RicInstance.java @@ -94,8 +94,8 @@ public class RicInstance extends RicInstanceKeyName { @Override public String toString() { - return this.getClass().getName() + "[key=" + getKey() + ", name=" + getName() + ", appUrlPrefix=" + appUrlPrefix - + ", pltUrlPrefix=" + pltUrlPrefix + ", caasUrlPrefix=" + caasUrlPrefix + "]"; + return this.getClass().getSimpleName() + "[key=" + getKey() + ", name=" + getName() + ", appUrlPrefix=" + + appUrlPrefix + ", pltUrlPrefix=" + pltUrlPrefix + ", caasUrlPrefix=" + caasUrlPrefix + "]"; } @Override diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RicInstanceKeyName.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RicInstanceKeyName.java index 97f08fff..6a86ca1e 100644 --- a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RicInstanceKeyName.java +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RicInstanceKeyName.java @@ -78,7 +78,7 @@ public class RicInstanceKeyName implements IDashboardResponse { @Override public String toString() { - return this.getClass().getName() + "[key=" + getKey() + ", name=" + getName() + "]"; + return this.getClass().getSimpleName() + "[key=" + getKey() + ", name=" + getName() + "]"; } @Override diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RicRegion.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RicRegion.java new file mode 100644 index 00000000..58e7e86b --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RicRegion.java @@ -0,0 +1,111 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2020 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +package org.oransc.ric.portal.dashboard.model; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * Transport model for RIC region which has a list of instances. + */ +public class RicRegion implements IDashboardResponse { + + private String name; + private List instances; + + /** + * Builds an empty object. + */ + public RicRegion() { + // no-arg constructor + } + + /** + * Convenience constructor for minimal value set. + * + * @param name + * Name + */ + public RicRegion(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String s) { + this.name = s; + } + + public RicRegion name(String name) { + this.name = name; + return this; + } + + public List getInstances() { + return instances; + } + + public void setInstances(List instances) { + this.instances = instances; + } + + /** + * Gets a list of key-name pairs. + * + * @return List of RicInstanceKeyName objects. + */ + public List getKeyNameList() { + List list = new ArrayList<>(); + for (RicInstance i : instances) + list.add(i.toKeyName()); + return list; + } + + @Override + public String toString() { + return this.getClass().getSimpleName() + "[name=" + getName() + ", instances=" + instances + "]"; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = result * result + ((instances == null) ? 0 : instances.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + RicRegion other = (RicRegion) obj; + return Objects.equals(name, other.name) && instances.size() == other.instances.size(); + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RicInstanceList.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RicRegionList.java similarity index 54% rename from webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RicInstanceList.java rename to webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RicRegionList.java index 4f8d34e5..dc698003 100644 --- a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RicInstanceList.java +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RicRegionList.java @@ -2,7 +2,7 @@ * ========================LICENSE_START================================= * O-RAN-SC * %% - * Copyright (C) 2019 AT&T Intellectual Property + * Copyright (C) 2020 AT&T Intellectual Property * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,36 +25,39 @@ import java.util.List; import org.oransc.ric.portal.dashboard.exception.UnknownInstanceException; -public class RicInstanceList { +/** + * Used as a bean to publish configuration data in a convenient way. + */ +public class RicRegionList { - private final List instances; + private final List regions; - public RicInstanceList() { - this.instances = new ArrayList<>(); + public RicRegionList() { + this.regions = new ArrayList<>(); } - public RicInstanceList(List list) { - this.instances = list; + public RicRegionList(List list) { + this.regions = list; } - public List getInstances() { - return instances; + public List getRegions() { + return regions; } /** - * Gets a list of key-name pairs. + * Builds a response that has only key-name pairs. * - * @return List of RicInstanceKeyName objects. + * @return List of RicRegionTransport objects */ - public List getKeyNameList() { - List list = new ArrayList<>(); - for (RicInstance i : instances) - list.add(i.toKeyName()); - return list; + public List getSimpleInstances() { + List response = new ArrayList<>(); + for (RicRegion r : regions) + response.add(new RicRegionTransport().name(r.getName()).instances(r.getKeyNameList())); + return response; } /** - * Gets the instance with the specified key + * Gets the instance with the specified key in any region * * @param instanceKey * Key to fetch @@ -63,9 +66,16 @@ public class RicInstanceList { * If the key is not known */ public RicInstance getInstance(String instanceKey) { - for (RicInstance i : instances) - if (i.getKey().equals(instanceKey)) - return i; + for (RicRegion r : regions) + for (RicInstance i : r.getInstances()) + if (i.getKey().equals(instanceKey)) + return i; throw new UnknownInstanceException(instanceKey); } + + @Override + public String toString() { + return this.getClass().getSimpleName() + "[regions=" + regions + "]"; + } + } diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RicRegionTransport.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RicRegionTransport.java new file mode 100644 index 00000000..1dfc8214 --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/RicRegionTransport.java @@ -0,0 +1,57 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2020 AT&T Intellectual Property + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================LICENSE_END=================================== + */ + +package org.oransc.ric.portal.dashboard.model; + +import java.util.List; + +/** + * Transport model for RIC region which has a list of instances with ONLY + * key-name pairs. + */ +public class RicRegionTransport implements IDashboardResponse { + + private String name; + private List instances; + + public String getName() { + return name; + } + + public RicRegionTransport name(String name) { + this.name = name; + return this; + } + + public List getInstances() { + return instances; + } + + public RicRegionTransport instances(List instances) { + this.instances = instances; + return this; + } + + @Override + public String toString() { + return this.getClass().getSimpleName() + "[name=" + getName() + ", instances=" + instances + "]"; + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/SuccessTransport.java b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/SuccessTransport.java index c0c9a246..281d72f4 100644 --- a/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/SuccessTransport.java +++ b/webapp-backend/src/main/java/org/oransc/ric/portal/dashboard/model/SuccessTransport.java @@ -62,7 +62,7 @@ public class SuccessTransport implements IDashboardResponse { @Override public String toString() { - return this.getClass().getName() + "[status=" + getStatus() + ", data=" + getData() + "]"; + return this.getClass().getSimpleName() + "[status=" + getStatus() + ", data=" + getData() + "]"; } } diff --git a/webapp-backend/src/main/resources/application.yaml b/webapp-backend/src/main/resources/application.yaml index 83b3b7c4..da8fe99f 100644 --- a/webapp-backend/src/main/resources/application.yaml +++ b/webapp-backend/src/main/resources/application.yaml @@ -85,18 +85,32 @@ metrics: ac: http://jar-app-props-kibana-url-ac mc: http://jar-app-props-kibana-url-mc -# Instances +# Regions and instances +# The regions are a just convenience for users, +# the keys must be unique across all instances. ricinstances: - instances: + regions: - - key: i1 - name: Primary RIC Instance - appUrlPrefix: App prefix 1 - caasUrlPrefix: Caas prefix 1 - pltUrlPrefix: Plt prefix 1 + name: Region AAA + instances: + - + key: i1 + name: Primary RIC Instance + appUrlPrefix: App prefix 1 + caasUrlPrefix: Caas prefix 1 + pltUrlPrefix: Plt prefix 1 + - + key: i2 + name: RIC Instance Nr Two + appUrlPrefix: App prefix 2 + caasUrlPrefix: Caas prefix 2 + pltUrlPrefix: Plt prefix 2 - - key: i2 - name: RIC Instance Nr Two - appUrlPrefix: App prefix 2 - caasUrlPrefix: Caas prefix 2 - pltUrlPrefix: Plt prefix 2 + name: Region DDD + instances: + - + key: i3 + name: RIC Instance in region D + appUrlPrefix: App prefix 3 + caasUrlPrefix: Caas prefix 3 + pltUrlPrefix: Plt prefix 3 diff --git a/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/config/RICInstanceMockConfiguration.java b/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/config/RICInstanceMockConfiguration.java index 15cab074..558ef090 100644 --- a/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/config/RICInstanceMockConfiguration.java +++ b/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/config/RICInstanceMockConfiguration.java @@ -25,11 +25,10 @@ import java.util.ArrayList; import java.util.List; import org.oransc.ric.portal.dashboard.model.RicInstance; -import org.oransc.ric.portal.dashboard.model.RicInstanceList; +import org.oransc.ric.portal.dashboard.model.RicRegion; +import org.oransc.ric.portal.dashboard.model.RicRegionList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; @@ -44,34 +43,37 @@ public class RICInstanceMockConfiguration { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); // Publish constants for use in tests + public static final String REGION_NAME_1 = "Region AAA"; + public static final String REGION_NAME_2 = "Region DDD"; public static final String INSTANCE_KEY_1 = "i1"; public static final String INSTANCE_KEY_2 = "i2"; public static final String[] INSTANCE_KEYS = { INSTANCE_KEY_1, INSTANCE_KEY_2 }; - // Simulate remote method delay for UI testing - private int delayMs; - - @Autowired - public RICInstanceMockConfiguration(@Value("${mock.config.delay:0}") int delayMs) { - logger.debug("ctor: configured with delay {}", delayMs); - this.delayMs = delayMs; - } + // No constructor needed, don't simulate delay from the Dashboard @Bean - public RicInstanceList ricInstanceList() throws InterruptedException { - if (delayMs > 0) { - logger.debug("ricInstanceList sleeping {}", delayMs); - Thread.sleep(delayMs); - } - List instances = new ArrayList<>(); - for (String key : INSTANCE_KEYS) { - RicInstance i = new RicInstance().key(key).name("RIC Instance " + key) - .appUrlPrefix("http://" + key + ".domain.name/app") - .pltUrlPrefix("http://" + key + ".domain.name/plt") - .caasUrlPrefix("http://" + key + ".domain.name/caas"); - instances.add(i); - } - return new RicInstanceList(instances); + public RicRegionList ricRegions() { + logger.debug("Creating mock bean ricRegions"); + List regions = new ArrayList<>(); + RicRegion region1 = new RicRegion().name(REGION_NAME_1); + regions.add(region1); + List instances1 = new ArrayList<>(); + region1.setInstances(instances1); + String key1 = INSTANCE_KEY_1; + instances1.add(new RicInstance().key(key1).name("RIC Instance " + key1) // + .appUrlPrefix("http://" + key1 + ".domain.name/app") // + .pltUrlPrefix("http://" + key1 + ".domain.name/plt") // + .caasUrlPrefix("http://" + key1 + ".domain.name/caas")); + RicRegion region2 = new RicRegion().name(REGION_NAME_2); + regions.add(region2); + List instances2 = new ArrayList<>(); + region2.setInstances(instances2); + String key2 = INSTANCE_KEY_2; + instances2.add(new RicInstance().key(key2).name("RIC Instance " + key2) // + .appUrlPrefix("http://" + key2 + ".domain.name/app") // + .pltUrlPrefix("http://" + key2 + ".domain.name/plt") // + .caasUrlPrefix("http://" + key2 + ".domain.name/caas")); + return new RicRegionList(regions); } } diff --git a/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/config/test/AbstractConfigTest.java b/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/config/test/AbstractConfigTest.java index ebe78043..71a575f8 100644 --- a/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/config/test/AbstractConfigTest.java +++ b/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/config/test/AbstractConfigTest.java @@ -24,7 +24,7 @@ import java.lang.invoke.MethodHandles; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.oransc.ric.portal.dashboard.model.RicInstanceList; +import org.oransc.ric.portal.dashboard.model.RicRegionList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -42,7 +42,7 @@ public class AbstractConfigTest { // Relies on Spring-Boot feature of populating instances data from configuration @Autowired - protected RicInstanceList instanceConfig; + protected RicRegionList instanceConfig; // Sonar finds the annotations on this class and insists on at least one test. @Test diff --git a/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/controller/DefaultContextTest.java b/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/controller/DefaultContextTest.java index 403c33ba..43a77f19 100644 --- a/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/controller/DefaultContextTest.java +++ b/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/controller/DefaultContextTest.java @@ -40,6 +40,11 @@ public class DefaultContextTest { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + // If this test is annotated and run by maven, two cases in + // PortalRestCentralServiceTest fail. I traced it down to a second + // occurrence of the Dashboard user manager bean, which I can only speculate + // gets instantiated when the active profile is not "test". Because I cannot + // explain nor fix the behavior, this remains commented out. // @Test public void contextLoads() { // Silence Sonar warning about missing assertion. diff --git a/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/model/ModelTest.java b/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/model/ModelTest.java index 8d9dd983..c668afc1 100644 --- a/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/model/ModelTest.java +++ b/webapp-backend/src/test/java/org/oransc/ric/portal/dashboard/model/ModelTest.java @@ -175,13 +175,29 @@ public class ModelTest extends AbstractModelTest { logger.info(m.toString()); } + private void checkRicRegion(RicRegion m) { + Assert.assertEquals(s1, m.getName()); + } + + @Test + public void testRicRegion() { + RicRegion m = new RicRegion(); + m.setName(s1); + checkRicRegion(m); + Assert.assertTrue(m.equals(m)); + Assert.assertFalse(m.equals(null)); + Assert.assertFalse(m.equals(new RicRegion())); + Assert.assertNotEquals(1, m.hashCode()); + logger.info(m.toString()); + } + @Test - public void testRicInstanceList() { - RicInstanceList m = new RicInstanceList(); - List list = new ArrayList<>(); - m = new RicInstanceList(list); - Assert.assertEquals(list, m.getInstances()); - Assert.assertNotNull(m.getKeyNameList()); + public void testRicRegionList() { + RicRegionList m = new RicRegionList(); + List list = new ArrayList<>(); + m = new RicRegionList(list); + Assert.assertEquals(list, m.getRegions()); + Assert.assertNotNull(m.getSimpleInstances()); try { m.getInstance(s1); } catch (UnknownInstanceException ex) { diff --git a/webapp-frontend/src/app/interfaces/dashboard.types.ts b/webapp-frontend/src/app/interfaces/dashboard.types.ts index 1c570057..ea0dff10 100644 --- a/webapp-frontend/src/app/interfaces/dashboard.types.ts +++ b/webapp-frontend/src/app/interfaces/dashboard.types.ts @@ -59,4 +59,9 @@ export interface EcompUser { export interface RicInstance { key: string; name: string; -} \ No newline at end of file +} + +export interface RicRegion { + name: string; + instances: Array; +} diff --git a/webapp-frontend/src/app/services/instance-selector/instance-selector.service.ts b/webapp-frontend/src/app/services/instance-selector/instance-selector.service.ts index fbc6bbb1..c1afb182 100644 --- a/webapp-frontend/src/app/services/instance-selector/instance-selector.service.ts +++ b/webapp-frontend/src/app/services/instance-selector/instance-selector.service.ts @@ -22,7 +22,7 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { BehaviorSubject, Observable } from 'rxjs'; import { shareReplay, tap } from 'rxjs/operators'; -import { RicInstance } from '../../interfaces/dashboard.types'; +import { RicInstance, RicRegion } from '../../interfaces/dashboard.types'; import { DashboardService } from '../dashboard/dashboard.service'; @Injectable({ @@ -30,20 +30,20 @@ import { DashboardService } from '../dashboard/dashboard.service'; }) export class InstanceSelectorService { - private instanceArray: Observable; - private selectedInstance: BehaviorSubject = new BehaviorSubject({ key: '', name:''}); + private allInstances: Observable; + private selectedInstance: BehaviorSubject = new BehaviorSubject({ key: '', name: '' }); constructor( private dashboardSvc: DashboardService, private httpClient: HttpClient) { } - getInstanceArray(): Observable { - if (this.instanceArray) { - return this.instanceArray; + getAllInstances(): Observable { + if (this.allInstances) { + return this.allInstances; } const path = this.dashboardSvc.buildPath('admin', null, 'instance'); - return this.instanceArray = this.httpClient.get(path) + return this.allInstances = this.httpClient.get(path) .pipe( shareReplay(1) ); @@ -57,7 +57,7 @@ export class InstanceSelectorService { } updateSelectedInstance(instance: RicInstance) { - this.selectedInstance.next(instance) + this.selectedInstance.next(instance); } } diff --git a/webapp-frontend/src/app/ui/instance-selector-dialog/instance-selector-dialog.component.html b/webapp-frontend/src/app/ui/instance-selector-dialog/instance-selector-dialog.component.html index 2b9d22aa..6df47db8 100644 --- a/webapp-frontend/src/app/ui/instance-selector-dialog/instance-selector-dialog.component.html +++ b/webapp-frontend/src/app/ui/instance-selector-dialog/instance-selector-dialog.component.html @@ -22,11 +22,21 @@ Select RIC Instance
+
+ + Select a region + + + {{region.name}} + + + +
Select an instance - + {{instance.name}} diff --git a/webapp-frontend/src/app/ui/instance-selector-dialog/instance-selector-dialog.component.ts b/webapp-frontend/src/app/ui/instance-selector-dialog/instance-selector-dialog.component.ts index 8c6159c1..c9f927c8 100644 --- a/webapp-frontend/src/app/ui/instance-selector-dialog/instance-selector-dialog.component.ts +++ b/webapp-frontend/src/app/ui/instance-selector-dialog/instance-selector-dialog.component.ts @@ -18,12 +18,11 @@ * ========================LICENSE_END=================================== */ -import { Component, OnDestroy, OnInit } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; import { MatDialogRef } from '@angular/material/dialog'; -import { Subscription } from 'rxjs'; import { finalize } from 'rxjs/operators'; -import { RicInstance } from '../../interfaces/dashboard.types'; +import { RicInstance, RicRegion } from '../../interfaces/dashboard.types'; import { InstanceSelectorService } from '../../services/instance-selector/instance-selector.service'; import { LoadingDialogService } from '../../services/ui/loading-dialog.service'; @@ -31,11 +30,11 @@ import { LoadingDialogService } from '../../services/ui/loading-dialog.service'; selector: 'rd-instance-selector-dialog', templateUrl: './instance-selector-dialog.component.html', }) -export class InstanceSelectorDialogComponent implements OnInit, OnDestroy { +export class InstanceSelectorDialogComponent implements OnInit { - private instanceArray: RicInstance[]; + private allRegions: RicRegion[]; + private regionInstances: RicInstance[]; private instanceForm: FormGroup; - private instanceChange: Subscription; constructor( private dialogRef: MatDialogRef, @@ -44,32 +43,26 @@ export class InstanceSelectorDialogComponent implements OnInit, OnDestroy { ngOnInit() { this.instanceForm = new FormGroup({ - instance: new FormControl('', [Validators.required]), - }) + instance: new FormControl('', [Validators.required]) + }); this.loadingDialogService.startLoading('Loading RIC instances'); - this.instanceSelectorService.getInstanceArray() + this.instanceSelectorService.getAllInstances() .pipe( finalize(() => this.loadingDialogService.stopLoading()) ) - .subscribe((instanceArray: RicInstance[]) => { - this.instanceArray = instanceArray; - }) - - this.instanceChange = this.instanceSelectorService.getSelectedInstance().subscribe((selectedInstance: RicInstance) => { - if (selectedInstance.key) { - this.instanceForm.setValue({ instance: selectedInstance }) - } - }); + .subscribe((regArray: RicRegion[]) => { + this.allRegions = regArray; + }); } - ngOnDestroy() { - this.instanceChange.unsubscribe(); - } - - changeInstance(selectedInstance) { + changeInstance(selectedInstance: RicInstance) { this.instanceSelectorService.updateSelectedInstance(selectedInstance); this.dialogRef.close(true); } + changeRegion(selectedRegion: RicRegion) { + this.instanceForm.setValue({ instance: '' }); + this.regionInstances = selectedRegion.instances; + } }