aboutsummaryrefslogtreecommitdiffstats
path: root/adapters/mso-adapter-utils/src/main/java/org
diff options
context:
space:
mode:
Diffstat (limited to 'adapters/mso-adapter-utils/src/main/java/org')
-rw-r--r--adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/cloud/CloudConfig.java421
-rw-r--r--adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/cloud/CloudConfigFactory.java43
-rw-r--r--adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/exceptions/MsoCloudIdentityNotFound.java56
3 files changed, 312 insertions, 208 deletions
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/cloud/CloudConfig.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/cloud/CloudConfig.java
index abcea2d494..929dd5aaba 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/cloud/CloudConfig.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/cloud/CloudConfig.java
@@ -32,19 +32,19 @@ import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.annotate.JsonRootName;
-
+import org.openecomp.mso.logger.MessageEnum;
import org.openecomp.mso.logger.MsoLogger;
+import org.openecomp.mso.openstack.exceptions.MsoCloudIdentityNotFound;
/**
* JavaBean JSON class for a CloudConfig. This bean maps a JSON-format cloud
* configuration file to Java. The CloudConfig contains information about
- * Openstack cloud configurations (in particular for the NVP/AIC cloud).
- * It includes:
- * - CloudIdentity objects, representing DCP nodes (Openstack Identity Service)
+ * Openstack cloud configurations. It includes:
+ * - CloudIdentity objects,representing DCP nodes (Openstack Identity Service)
* - CloudSite objects, representing LCP nodes (Openstack Compute & other services)
*
- * Note that this is only used to access Cloud Configurations loaded from a
- * JSON config file, so there are no explicit property setters.
+ * Note that this is only used to access Cloud Configurations loaded from a JSON
+ * config file, so there are no explicit property setters.
*
* This class also contains methods to query cloud sites and/or identity
* services by ID.
@@ -54,209 +54,246 @@ import org.openecomp.mso.logger.MsoLogger;
@JsonRootName("cloud_config")
public class CloudConfig {
+ private boolean validCloudConfig = false;
@JsonProperty("identity_services")
- private Map <String, CloudIdentity> identityServices = new HashMap <String, CloudIdentity> ();
+ private Map<String, CloudIdentity> identityServices = new HashMap<String, CloudIdentity>();
@JsonProperty("cloud_sites")
- private Map <String, CloudSite> cloudSites = new HashMap <String, CloudSite> ();
+ private Map<String, CloudSite> cloudSites = new HashMap<String, CloudSite>();
- private static ObjectMapper mapper = new ObjectMapper ();
+ private static ObjectMapper mapper = new ObjectMapper();
- private static final MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.RA);
+ private static final MsoLogger LOGGER = MsoLogger.getMsoLogger(MsoLogger.Catalog.RA);
- protected String configFilePath;
+ protected String configFilePath;
- protected int refreshTimerInMinutes;
+ protected int refreshTimerInMinutes;
- public CloudConfig () {
- mapper.enable (DeserializationConfig.Feature.UNWRAP_ROOT_VALUE);
- mapper.enable (DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
+ public CloudConfig() {
+ mapper.enable(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE);
+ mapper.enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
}
- /**
- * Get a Map of all IdentityServices that have been loaded.
- * @return the Map
- */
- public synchronized Map <String, CloudIdentity> getIdentityServices () {
+ /**
+ * Get a Map of all IdentityServices that have been loaded.
+ *
+ * @return the Map
+ */
+ public synchronized Map<String, CloudIdentity> getIdentityServices() {
return identityServices;
}
- /**
- * Get a Map of all CloudSites that have been loaded.
- * @return the Map
- */
- public synchronized Map <String, CloudSite> getCloudSites () {
- return cloudSites;
- }
-
- /**
- * Get a specific CloudSites, based on an ID. The ID is first checked against
- * the regions, and if no match is found there, then against individual entries
- * to try and find one with a CLLI that matches the ID and an AIC version of 2.5.
- * @param id the ID to match
- * @return a CloudSite, or null of no match found
- */
- public synchronized CloudSite getCloudSite (String id) {
- if (id != null) {
- if (cloudSites.containsKey (id)) {
- return cloudSites.get (id);
- }
- // check for id == CLLI now as well
- return getCloudSiteWithClli(id, "2.5");
- }
- return null;
- }
-
- /**
- * Get a specific CloudSites, based on a CLLI and (optional) version, which will be matched
- * against the aic_version field of the CloudSite.
- * @param clli the CLLI to match
- * @param version the version to match; may be null in which case any version matches
- * @return a CloudSite, or null of no match found
- */
- public synchronized CloudSite getCloudSiteWithClli(String clli, String version) {
- if (clli != null) {
- // New with 1610 - find cloud site called "DEFAULT" - return that object,
- // with the name modified to match what they asked for. We're looping thru
- // the cloud sites anyway - so save off the default one in case we need it.
- CloudSite defaultCloudSite = null;
- for (CloudSite cs : cloudSites.values()) {
- if (cs.getClli() != null && clli.equals(cs.getClli())) {
- if (version == null || version.equals(cs.getAic_version())) {
- return cs;
- }
- } else if (cs.getId().equalsIgnoreCase("default")) {
- // save it off in case we need it
- defaultCloudSite = cs.clone();
- }
- }
- // If we get here - we didn't find a match - so return the default cloud site
+ /**
+ * Get a Map of all CloudSites that have been loaded.
+ *
+ * @return the Map
+ */
+ public synchronized Map<String, CloudSite> getCloudSites() {
+ return cloudSites;
+ }
+
+ /**
+ * Get a specific CloudSites, based on an ID. The ID is first checked
+ * against the regions, and if no match is found there, then against
+ * individual entries to try and find one with a CLLI that matches the ID
+ * and an AIC version of 2.5.
+ *
+ * @param id
+ * the ID to match
+ * @return a CloudSite, or null of no match found
+ */
+ public synchronized CloudSite getCloudSite(String id) {
+ if (id != null) {
+ if (cloudSites.containsKey(id)) {
+ return cloudSites.get(id);
+ }
+ // check for id == CLLI now as well
+ return getCloudSiteWithClli(id, "2.5");
+ }
+ return null;
+ }
+
+ /**
+ * Get a specific CloudSites, based on a CLLI and (optional) version, which
+ * will be matched against the aic_version field of the CloudSite.
+ *
+ * @param clli
+ * the CLLI to match
+ * @param version
+ * the version to match; may be null in which case any version
+ * matches
+ * @return a CloudSite, or null of no match found
+ */
+ public synchronized CloudSite getCloudSiteWithClli(String clli, String version) {
+ if (clli != null) {
+ // New with 1610 - find cloud site called "DEFAULT" - return that
+ // object,with the name modified to match what they asked for. We're
+ // looping thru the cloud sites anyway - so save off the default one in case we
+ // need it.
+ CloudSite defaultCloudSite = null;
+ for (CloudSite cs : cloudSites.values()) {
+ if (cs.getClli() != null && clli.equals(cs.getClli())) {
+ if (version == null || version.equals(cs.getAic_version())) {
+ return cs;
+ }
+ } else if (cs.getId().equalsIgnoreCase("default")) {
+ // save it off in case we need it
+ defaultCloudSite = cs.clone();
+ }
+ }
+ // If we get here - we didn't find a match - so return the default
+ // cloud site
if (defaultCloudSite != null) {
defaultCloudSite.setRegionId(clli);
defaultCloudSite.setId(clli);
}
- return defaultCloudSite;
- }
+ return defaultCloudSite;
+ }
return null;
- }
-
- /**
- * Get a specific CloudIdentity, based on an ID.
- * @param id the ID to match
- * @return a CloudIdentity, or null of no match found
- */
- public synchronized CloudIdentity getIdentityService (String id) {
- if (identityServices.containsKey (id)) {
- return identityServices.get (id);
- }
- return null;
- }
-
- protected synchronized void reloadPropertiesFile() throws JsonParseException, JsonMappingException, IOException {
- this.loadCloudConfig(this.configFilePath, this.refreshTimerInMinutes);
- }
-
- protected synchronized void loadCloudConfig (String configFile, int refreshTimer) throws JsonParseException, JsonMappingException, IOException {
-
- FileReader reader=null;
- configFilePath=configFile;
- this.refreshTimerInMinutes = refreshTimer;
-
- CloudConfig cloudConfig = null;
-
- try {
- reader = new FileReader (configFile);
- // Parse the JSON input into a CloudConfig
-
- cloudConfig = mapper.readValue (reader, CloudConfig.class);
-
- this.cloudSites = cloudConfig.cloudSites;
- this.identityServices = cloudConfig.identityServices;
-
- // Copy Cloud Identity IDs to CloudIdentity objects
- for (Entry <String, CloudIdentity> entry : cloudConfig.getIdentityServices ().entrySet ()) {
- entry.getValue ().setId (entry.getKey ());
- }
-
- // Copy Cloud Site IDs to CloudSite objects, and set up internal
- // pointers to their corresponding identity service.
- for (Entry <String, CloudSite> entry : cloudConfig.getCloudSites ().entrySet ()) {
- CloudSite s = entry.getValue ();
- s.setId (entry.getKey ());
- s.setIdentityService (cloudConfig.getIdentityService (s.getIdentityServiceId ()));
- }
- } finally {
- try {
- if (reader != null) {
- reader.close();
- }
- } catch (IOException e) {
- LOGGER.debug("Exception while closing reader for file:" + configFilePath, e);
- }
- }
}
- public String getConfigFilePath() {
- return configFilePath;
- }
-
- @Override
- public synchronized CloudConfig clone() {
- CloudConfig ccCopy = new CloudConfig();
- for (Entry<String,CloudIdentity> e:identityServices.entrySet()) {
-
- ccCopy.identityServices.put(e.getKey(), e.getValue().clone());
- }
-
- for (Entry<String,CloudSite> e:cloudSites.entrySet()) {
-
- ccCopy.cloudSites.put(e.getKey(), e.getValue().clone());
- }
-
- ccCopy.configFilePath = this.configFilePath;
-
- ccCopy.refreshTimerInMinutes = this.refreshTimerInMinutes;
-
- return ccCopy;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((cloudSites == null) ? 0 : cloudSites.hashCode());
- result = prime * result + ((configFilePath == null) ? 0 : configFilePath.hashCode());
- result = prime * result + ((identityServices == null) ? 0 : identityServices.hashCode());
- result = prime * result + refreshTimerInMinutes;
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- CloudConfig other = (CloudConfig) obj;
- if (cloudSites == null) {
- if (other.cloudSites != null)
- return false;
- } else if (!cloudSites.equals(other.cloudSites))
- return false;
- if (configFilePath == null) {
- if (other.configFilePath != null)
- return false;
- } else if (!configFilePath.equals(other.configFilePath))
- return false;
- if (identityServices == null) {
- if (other.identityServices != null)
- return false;
- } else if (!identityServices.equals(other.identityServices))
- return false;
- if (refreshTimerInMinutes != other.refreshTimerInMinutes)
- return false;
- return true;
- }
-}
+ /**
+ * Get a specific CloudIdentity, based on an ID.
+ *
+ * @param id
+ * the ID to match
+ * @return a CloudIdentity, or null of no match found
+ */
+ public synchronized CloudIdentity getIdentityService(String id) {
+ if (identityServices.containsKey(id)) {
+ return identityServices.get(id);
+ }
+ return null;
+ }
+
+ protected synchronized void reloadPropertiesFile() throws JsonParseException, JsonMappingException, IOException, MsoCloudIdentityNotFound {
+ this.loadCloudConfig(this.configFilePath, this.refreshTimerInMinutes);
+ }
+
+ protected synchronized void loadCloudConfig(String configFile, int refreshTimer)
+ throws JsonParseException, JsonMappingException, IOException, MsoCloudIdentityNotFound {
+
+ FileReader reader = null;
+ configFilePath = configFile;
+ this.refreshTimerInMinutes = refreshTimer;
+
+ CloudConfig cloudConfig = null;
+ this.validCloudConfig=false;
+
+ try {
+ reader = new FileReader(configFile);
+ // Parse the JSON input into a CloudConfig
+
+ cloudConfig = mapper.readValue(reader, CloudConfig.class);
+
+ this.cloudSites = cloudConfig.cloudSites;
+ this.identityServices = cloudConfig.identityServices;
+
+ // Copy Cloud Identity IDs to CloudIdentity objects
+ for (Entry<String, CloudIdentity> entry : cloudConfig.getIdentityServices().entrySet()) {
+ entry.getValue().setId(entry.getKey());
+ }
+
+ // Copy Cloud Site IDs to CloudSite objects, and set up internal
+ // pointers to their corresponding identity service.
+ for (Entry<String, CloudSite> entry : cloudConfig.getCloudSites().entrySet()) {
+ CloudSite s = entry.getValue();
+ s.setId(entry.getKey());
+ CloudIdentity cloudIdentity = cloudConfig.getIdentityService(s.getIdentityServiceId());
+ s.setIdentityService(cloudIdentity);
+ if (cloudIdentity == null) {
+ throw new MsoCloudIdentityNotFound(s.getId()+" Cloud site refers to a non-existing identity service: "+s.getIdentityServiceId());
+ }
+ }
+ this.validCloudConfig=true;
+
+ } finally {
+ try {
+ if (reader != null) {
+ reader.close();
+ }
+ } catch (IOException e) {
+ LOGGER.debug("Exception while closing reader for file:" + configFilePath, e);
+ }
+ }
+ }
+
+ public String getConfigFilePath() {
+ return configFilePath;
+ }
+
+ /**
+ * @return the validCouldConfig
+ */
+ public synchronized boolean isValidCloudConfig() {
+ return validCloudConfig;
+ }
+
+ @Override
+ public synchronized CloudConfig clone() {
+ CloudConfig ccCopy = new CloudConfig();
+ for (Entry<String, CloudIdentity> e : identityServices.entrySet()) {
+ ccCopy.identityServices.put(e.getKey(), e.getValue().clone());
+ }
+
+ for (Entry<String, CloudSite> e : cloudSites.entrySet()) {
+
+ ccCopy.cloudSites.put(e.getKey(), e.getValue().clone());
+ }
+ ccCopy.configFilePath = this.configFilePath;
+ ccCopy.refreshTimerInMinutes = this.refreshTimerInMinutes;
+ ccCopy.validCloudConfig = this.validCloudConfig;
+ return ccCopy;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((cloudSites == null) ? 0 : cloudSites.hashCode());
+ result = prime * result + ((configFilePath == null) ? 0 : configFilePath.hashCode());
+ result = prime * result + ((identityServices == null) ? 0 : identityServices.hashCode());
+ result = prime * result + refreshTimerInMinutes;
+ result = prime * result + (validCloudConfig ? 1231 : 1237);
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CloudConfig other = (CloudConfig) obj;
+ if (cloudSites == null) {
+ if (other.cloudSites != null)
+ return false;
+ } else if (!cloudSites.equals(other.cloudSites))
+ return false;
+ if (configFilePath == null) {
+ if (other.configFilePath != null)
+ return false;
+ } else if (!configFilePath.equals(other.configFilePath))
+ return false;
+ if (identityServices == null) {
+ if (other.identityServices != null)
+ return false;
+ } else if (!identityServices.equals(other.identityServices))
+ return false;
+ if (refreshTimerInMinutes != other.refreshTimerInMinutes)
+ return false;
+ if (validCloudConfig != other.validCloudConfig)
+ return false;
+ return true;
+ }
+
+
+}
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/cloud/CloudConfigFactory.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/cloud/CloudConfigFactory.java
index 6ee6721083..688e554161 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/cloud/CloudConfigFactory.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/cloud/CloudConfigFactory.java
@@ -41,6 +41,7 @@ import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.openecomp.mso.logger.MsoLogger;
+import org.openecomp.mso.openstack.exceptions.MsoCloudIdentityNotFound;
import org.openecomp.mso.openstack.utils.MsoHeatUtils;
import org.openecomp.mso.openstack.utils.MsoKeystoneUtils;
import org.openecomp.mso.openstack.utils.MsoNeutronUtils;
@@ -77,7 +78,7 @@ public class CloudConfigFactory implements Serializable {
}
}
- public void initializeCloudConfig (String filePath, int refreshTimer) {
+ public void initializeCloudConfig (String filePath, int refreshTimer) throws MsoCloudIdentityNotFound {
rwl.writeLock ().lock ();
try {
@@ -94,7 +95,7 @@ public class CloudConfigFactory implements Serializable {
}
}
- public void changeMsoPropertiesFilePath (String newMsoPropPath) throws MsoPropertiesException {
+ public void changeMsoPropertiesFilePath (String newMsoPropPath) {
rwl.writeLock ().lock ();
try {
CloudConfigFactory.cloudConfigCache.configFilePath = prefixMsoPropertiesPath + newMsoPropPath;
@@ -109,7 +110,11 @@ public class CloudConfigFactory implements Serializable {
public CloudConfig getCloudConfig () {
rwl.readLock ().lock ();
try {
- return cloudConfigCache.clone ();
+ if (cloudConfigCache.isValidCloudConfig()) {
+ return cloudConfigCache.clone ();
+ } else {
+ return new CloudConfig();
+ }
} finally {
rwl.readLock ().unlock ();
}
@@ -139,7 +144,10 @@ public class CloudConfigFactory implements Serializable {
try {
if (refreshTimer <= 1) {
- CloudConfig oldCloudConfig = cloudConfigCache.clone();
+ CloudConfig oldCloudConfig = null;
+ if (cloudConfigCache.isValidCloudConfig()) {
+ oldCloudConfig = cloudConfigCache.clone();
+ }
cloudConfigCache.reloadPropertiesFile ();
refreshTimer = cloudConfigCache.refreshTimerInMinutes;
if (!cloudConfigCache.equals(oldCloudConfig)) {
@@ -173,19 +181,22 @@ public class CloudConfigFactory implements Serializable {
@Produces("text/plain")
public Response showCloudConfig () {
CloudConfig cloudConfig = this.getCloudConfig ();
-
- StringBuffer response = new StringBuffer ();
- response.append ("Cloud Sites:\n");
- for (CloudSite site : cloudConfig.getCloudSites ().values ()) {
- response.append (site.toString () + "\n");
- }
-
- response.append ("\n\nCloud Identity Services:\n");
- for (CloudIdentity identity : cloudConfig.getIdentityServices ().values ()) {
- response.append (identity.toString () + "\n");
+ if (cloudConfig != null) {
+ StringBuffer response = new StringBuffer ();
+ response.append ("Cloud Sites:\n");
+ for (CloudSite site : cloudConfig.getCloudSites ().values ()) {
+ response.append (site.toString () + "\n");
+ }
+
+ response.append ("\n\nCloud Identity Services:\n");
+ for (CloudIdentity identity : cloudConfig.getIdentityServices ().values ()) {
+ response.append (identity.toString () + "\n");
+ }
+
+ return Response.status (200).entity (response).build ();
+ } else {
+ return Response.status (500).entity ("Cloud Config has not been loaded properly, this could be due to a bad JSON structure (Check the logs for additional details)").build ();
}
-
- return Response.status (200).entity (response).build ();
}
@GET
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/exceptions/MsoCloudIdentityNotFound.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/exceptions/MsoCloudIdentityNotFound.java
new file mode 100644
index 0000000000..b1fb92de11
--- /dev/null
+++ b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/exceptions/MsoCloudIdentityNotFound.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OPENECOMP - MSO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.openecomp.mso.openstack.exceptions;
+
+
+/**
+ * Cloud site not found exception.
+ */
+public class MsoCloudIdentityNotFound extends MsoException {
+
+ /**
+ * Serialization id.
+ */
+ private static final long serialVersionUID = 2583769056266415665L;
+
+ /**
+ * Default constructor (needed for BPEL/JAXB)
+ */
+ public MsoCloudIdentityNotFound () {
+ super("Cloud Identity not found");
+ super.category=MsoExceptionCategory.USERDATA;
+ }
+
+ /**
+ * Constructor to create a new MsoOpenstackException instance
+ * @param cloudSite the cloud site
+ */
+ public MsoCloudIdentityNotFound (String cloudIdentity) {
+ // Set the detailed error as the Exception 'message'
+ super("Cloud Identity [" + cloudIdentity + "] not found");
+ super.category=MsoExceptionCategory.USERDATA;
+ }
+
+ @Override
+ public String toString () {
+ return getMessage();
+ }
+}