summaryrefslogtreecommitdiffstats
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/onap/clamp/clds/Application.java57
-rw-r--r--src/main/java/org/onap/clamp/clds/config/CamelConfiguration.java7
-rw-r--r--src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponse.java5
-rw-r--r--src/main/java/org/onap/clamp/clds/model/dcae/DcaeLinks.java60
-rw-r--r--src/main/java/org/onap/clamp/clds/model/dcae/DcaeOperationStatusResponse.java88
-rw-r--r--src/main/java/org/onap/clamp/clds/util/LoggingUtils.java66
-rw-r--r--src/main/java/org/onap/clamp/loop/Loop.java92
-rw-r--r--src/main/java/org/onap/clamp/loop/LoopOperation.java265
-rw-r--r--src/main/java/org/onap/clamp/loop/LoopService.java15
-rw-r--r--src/main/java/org/onap/clamp/loop/components/external/DcaeComponent.java162
-rw-r--r--src/main/java/org/onap/clamp/loop/components/external/ExternalComponent.java61
-rw-r--r--src/main/java/org/onap/clamp/loop/components/external/ExternalComponentState.java61
-rw-r--r--src/main/java/org/onap/clamp/loop/components/external/PolicyComponent.java123
-rw-r--r--src/main/java/org/onap/clamp/loop/log/LoopLog.java31
-rw-r--r--src/main/java/org/onap/clamp/loop/log/LoopLogService.java6
15 files changed, 720 insertions, 379 deletions
diff --git a/src/main/java/org/onap/clamp/clds/Application.java b/src/main/java/org/onap/clamp/clds/Application.java
index f6dfdc0c3..bac328d6d 100644
--- a/src/main/java/org/onap/clamp/clds/Application.java
+++ b/src/main/java/org/onap/clamp/clds/Application.java
@@ -29,15 +29,21 @@ import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import java.io.IOException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.Enumeration;
import org.apache.catalina.connector.Connector;
import org.onap.clamp.clds.model.properties.Holmes;
import org.onap.clamp.clds.model.properties.ModelProperties;
import org.onap.clamp.clds.util.ClampVersioning;
import org.onap.clamp.clds.util.ResourceFileUtil;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@@ -51,6 +57,7 @@ import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
+import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
@@ -82,6 +89,9 @@ public class Application extends SpringBootServletInitializer {
@Value("${server.ssl.key-store:none}")
private String sslKeystoreFile;
+ @Autowired
+ private Environment env;
+
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
@@ -102,14 +112,15 @@ public class Application extends SpringBootServletInitializer {
* This method is used to declare the camel servlet.
*
* @return A servlet bean
- * @throws IOException IO Exception
+ * @throws IOException
+ * IO Exception
*/
@Bean
public ServletRegistrationBean camelServletRegistrationBean() throws IOException {
- eelfLogger.info(ResourceFileUtil.getResourceAsString("boot-message.txt") + "(v"
- + ClampVersioning.getCldsVersionFromProps() + ")" + System.getProperty("line.separator"));
- ServletRegistrationBean registration = new ServletRegistrationBean(new ClampServlet(),
- "/restservices/clds/*");
+ eelfLogger.info(
+ ResourceFileUtil.getResourceAsString("boot-message.txt") + "(v" + ClampVersioning.getCldsVersionFromProps()
+ + ")" + System.getProperty("line.separator") + getSslExpirationDate());
+ ServletRegistrationBean registration = new ServletRegistrationBean(new ClampServlet(), "/restservices/clds/*");
registration.setName("CamelServlet");
return registration;
}
@@ -135,9 +146,8 @@ public class Application extends SpringBootServletInitializer {
private Connector createRedirectConnector(int redirectSecuredPort) {
if (redirectSecuredPort <= 0) {
- eelfLogger.warn(
- "HTTP port redirection to HTTPS is disabled because the HTTPS port is 0 (random port) or -1"
- + " (Connector disabled)");
+ eelfLogger.warn("HTTP port redirection to HTTPS is disabled because the HTTPS port is 0 (random port) or -1"
+ + " (Connector disabled)");
return null;
}
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
@@ -147,4 +157,33 @@ public class Application extends SpringBootServletInitializer {
connector.setRedirectPort(redirectSecuredPort);
return connector;
}
+
+ private String getSslExpirationDate() throws IOException {
+ StringBuilder result = new StringBuilder(" :: SSL Certificates :: ");
+ try {
+ if (env.getProperty("server.ssl.key-store") != null) {
+
+ KeyStore keystore = KeyStore.getInstance(env.getProperty("server.ssl.key-store-type"));
+ keystore.load(
+ ResourceFileUtil
+ .getResourceAsStream(env.getProperty("server.ssl.key-store").replaceAll("classpath:", "")),
+ env.getProperty("server.ssl.key-store-password").toCharArray());
+ Enumeration<String> aliases = keystore.aliases();
+ while (aliases.hasMoreElements()) {
+ String alias = aliases.nextElement();
+ if ("X.509".equals(keystore.getCertificate(alias).getType())) {
+ result.append("* " + alias + " expires "
+ + ((X509Certificate) keystore.getCertificate(alias)).getNotAfter()
+ + System.getProperty("line.separator"));
+ }
+ }
+ } else {
+ result.append("* NONE HAS been configured");
+ }
+ } catch (CertificateException | NoSuchAlgorithmException | KeyStoreException e) {
+ eelfLogger.warn("SSL certificate access error ", e);
+
+ }
+ return result.toString();
+ }
}
diff --git a/src/main/java/org/onap/clamp/clds/config/CamelConfiguration.java b/src/main/java/org/onap/clamp/clds/config/CamelConfiguration.java
index 3dc807388..271dc84ff 100644
--- a/src/main/java/org/onap/clamp/clds/config/CamelConfiguration.java
+++ b/src/main/java/org/onap/clamp/clds/config/CamelConfiguration.java
@@ -63,13 +63,13 @@ public class CamelConfiguration extends RouteBuilder {
private void configureDefaultSslProperties() {
if (env.getProperty("server.ssl.trust-store") != null) {
- URL storeResource = CamelConfiguration.class
+ URL storeResource = Thread.currentThread().getContextClassLoader()
.getResource(env.getProperty("server.ssl.trust-store").replaceAll("classpath:", ""));
System.setProperty("javax.net.ssl.trustStore", storeResource.getPath());
System.setProperty("javax.net.ssl.trustStorePassword", env.getProperty("server.ssl.trust-store-password"));
System.setProperty("javax.net.ssl.trustStoreType", "jks");
System.setProperty("ssl.TrustManagerFactory.algorithm", "PKIX");
- storeResource = CamelConfiguration.class
+ storeResource = Thread.currentThread().getContextClassLoader()
.getResource(env.getProperty("server.ssl.key-store").replaceAll("classpath:", ""));
System.setProperty("javax.net.ssl.keyStore", storeResource.getPath());
System.setProperty("javax.net.ssl.keyStorePassword", env.getProperty("server.ssl.key-store-password"));
@@ -82,7 +82,7 @@ public class CamelConfiguration extends RouteBuilder {
if (env.getProperty("server.ssl.trust-store") != null) {
KeyStore truststore = KeyStore.getInstance("JKS");
truststore.load(
- getClass().getClassLoader()
+ Thread.currentThread().getContextClassLoader()
.getResourceAsStream(env.getProperty("server.ssl.trust-store").replaceAll("classpath:", "")),
env.getProperty("server.ssl.trust-store-password").toCharArray());
@@ -118,6 +118,7 @@ public class CamelConfiguration extends RouteBuilder {
.apiContextPath("api-doc").apiVendorExtension(true).apiProperty("api.title", "Clamp Rest API")
.apiProperty("api.version", ClampVersioning.getCldsVersionFromProps())
.apiProperty("base.path", "/restservices/clds/");
+
// camelContext.setTracing(true);
configureDefaultSslProperties();
diff --git a/src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponse.java b/src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponse.java
index 74582a865..972450665 100644
--- a/src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponse.java
+++ b/src/main/java/org/onap/clamp/clds/model/dcae/DcaeInventoryResponse.java
@@ -24,12 +24,17 @@
package org.onap.clamp.clds.model.dcae;
+import com.google.gson.annotations.Expose;
+
/**
* This class maps the DCAE inventory answer to a nice pojo.
*/
public class DcaeInventoryResponse {
+ @Expose
private String typeName;
+
+ @Expose
private String typeId;
public String getTypeName() {
diff --git a/src/main/java/org/onap/clamp/clds/model/dcae/DcaeLinks.java b/src/main/java/org/onap/clamp/clds/model/dcae/DcaeLinks.java
new file mode 100644
index 000000000..368e1b8e6
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/model/dcae/DcaeLinks.java
@@ -0,0 +1,60 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2019 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.onap.clamp.clds.model.dcae;
+
+import com.google.gson.annotations.Expose;
+
+public class DcaeLinks {
+ @Expose
+ private String self;
+ @Expose
+ private String status;
+ @Expose
+ private String uninstall;
+
+ public String getSelf() {
+ return self;
+ }
+
+ public void setSelf(String self) {
+ this.self = self;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getUninstall() {
+ return uninstall;
+ }
+
+ public void setUninstall(String uninstall) {
+ this.uninstall = uninstall;
+ }
+
+}
diff --git a/src/main/java/org/onap/clamp/clds/model/dcae/DcaeOperationStatusResponse.java b/src/main/java/org/onap/clamp/clds/model/dcae/DcaeOperationStatusResponse.java
new file mode 100644
index 000000000..aee7d0613
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/model/dcae/DcaeOperationStatusResponse.java
@@ -0,0 +1,88 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2019 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.onap.clamp.clds.model.dcae;
+
+import com.google.gson.annotations.Expose;
+
+/**
+ * This class maps the DCAE deployment handler response to a nice pojo.
+ */
+public class DcaeOperationStatusResponse {
+
+ @Expose
+ private String operationType;
+
+ @Expose
+ private String status;
+
+ @Expose
+ private String requestId;
+
+ @Expose
+ private String error;
+
+ @Expose
+ private DcaeLinks links;
+
+ public String getOperationType() {
+ return operationType;
+ }
+
+ public void setOperationType(String operationType) {
+ this.operationType = operationType;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+ public String getError() {
+ return error;
+ }
+
+ public void setError(String error) {
+ this.error = error;
+ }
+
+ public DcaeLinks getLinks() {
+ return links;
+ }
+
+ public void setLinks(DcaeLinks links) {
+ this.links = links;
+ }
+
+}
diff --git a/src/main/java/org/onap/clamp/clds/util/LoggingUtils.java b/src/main/java/org/onap/clamp/clds/util/LoggingUtils.java
index cbe7eba96..163ab6913 100644
--- a/src/main/java/org/onap/clamp/clds/util/LoggingUtils.java
+++ b/src/main/java/org/onap/clamp/clds/util/LoggingUtils.java
@@ -28,6 +28,7 @@ import com.att.eelf.configuration.EELFManager;
import java.net.HttpURLConnection;
import java.net.InetAddress;
+import java.net.URLConnection;
import java.net.UnknownHostException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
@@ -114,7 +115,7 @@ public class LoggingUtils {
*/
public static void setResponseContext(String code, String description, String className) {
MDC.put("ResponseCode", code);
- MDC.put("StatusCode", code.equals("0") ? "COMPLETE" : "ERROR");
+ MDC.put("StatusCode", "0".equals(code) ? "COMPLETE" : "ERROR");
MDC.put("ResponseDescription", description != null ? description : "");
MDC.put("ClassName", className != null ? className : "");
}
@@ -167,8 +168,6 @@ public class LoggingUtils {
return dateFormat;
}
-
-
/*********************************************************************************************
* Method for ONAP Application Logging Specification v1.2
********************************************************************************************/
@@ -256,7 +255,7 @@ public class LoggingUtils {
public String getProperties(String name) {
return MDC.get(name);
}
-
+
/**
* Report pending invocation with <tt>INVOKE</tt> marker,
* setting standard ONAP logging headers automatically.
@@ -267,24 +266,7 @@ public class LoggingUtils {
* @return The HTTP url connection
*/
public HttpURLConnection invoke(final HttpURLConnection con, String targetEntity, String targetServiceName) {
- final String invocationId = UUID.randomUUID().toString();
-
- // Set standard HTTP headers on (southbound request) builder.
- con.setRequestProperty(ONAPLogConstants.Headers.REQUEST_ID,
- defaultToEmpty(MDC.get(ONAPLogConstants.MDCs.REQUEST_ID)));
- con.setRequestProperty(ONAPLogConstants.Headers.INVOCATION_ID,
- invocationId);
- con.setRequestProperty(ONAPLogConstants.Headers.PARTNER_NAME,
- defaultToEmpty(MDC.get(ONAPLogConstants.MDCs.PARTNER_NAME)));
-
- invokeContext(targetEntity, targetServiceName, invocationId);
-
- // Log INVOKE*, with the invocationID as the message body.
- // (We didn't really want this kind of behavior in the standard,
- // but is it worse than new, single-message MDC?)
- this.mlogger.info(ONAPLogConstants.Markers.INVOKE);
- this.mlogger.info(ONAPLogConstants.Markers.INVOKE_SYNC + "{" + invocationId + "}");
- return con;
+ return this.invokeGeneric(con, targetEntity, targetServiceName);
}
/**
@@ -316,24 +298,7 @@ public class LoggingUtils {
* @return The HTTPS url connection
*/
public HttpsURLConnection invokeHttps(final HttpsURLConnection con, String targetEntity, String targetServiceName) {
- final String invocationId = UUID.randomUUID().toString();
-
- // Set standard HTTP headers on (southbound request) builder.
- con.setRequestProperty(ONAPLogConstants.Headers.REQUEST_ID,
- defaultToEmpty(MDC.get(ONAPLogConstants.MDCs.REQUEST_ID)));
- con.setRequestProperty(ONAPLogConstants.Headers.INVOCATION_ID,
- invocationId);
- con.setRequestProperty(ONAPLogConstants.Headers.PARTNER_NAME,
- defaultToEmpty(MDC.get(ONAPLogConstants.MDCs.PARTNER_NAME)));
-
- invokeContext(targetEntity, targetServiceName, invocationId);
-
- // Log INVOKE*, with the invocationID as the message body.
- // (We didn't really want this kind of behavior in the standard,
- // but is it worse than new, single-message MDC?)
- this.mlogger.info(ONAPLogConstants.Markers.INVOKE);
- this.mlogger.info(ONAPLogConstants.Markers.INVOKE_SYNC + "{" + invocationId + "}");
- return con;
+ return this.invokeGeneric(con, targetEntity, targetServiceName);
}
/**
@@ -410,4 +375,25 @@ public class LoggingUtils {
MDC.remove(ONAPLogConstants.MDCs.INVOCATIONID_OUT);
MDC.remove(ONAPLogConstants.MDCs.INVOKE_TIMESTAMP);
}
+
+ private <T extends URLConnection> T invokeGeneric(final T con, String targetEntity, String targetServiceName) {
+ final String invocationId = UUID.randomUUID().toString();
+
+ // Set standard HTTP headers on (southbound request) builder.
+ con.setRequestProperty(ONAPLogConstants.Headers.REQUEST_ID,
+ defaultToEmpty(MDC.get(ONAPLogConstants.MDCs.REQUEST_ID)));
+ con.setRequestProperty(ONAPLogConstants.Headers.INVOCATION_ID,
+ invocationId);
+ con.setRequestProperty(ONAPLogConstants.Headers.PARTNER_NAME,
+ defaultToEmpty(MDC.get(ONAPLogConstants.MDCs.PARTNER_NAME)));
+
+ invokeContext(targetEntity, targetServiceName, invocationId);
+
+ // Log INVOKE*, with the invocationID as the message body.
+ // (We didn't really want this kind of behavior in the standard,
+ // but is it worse than new, single-message MDC?)
+ this.mlogger.info(ONAPLogConstants.Markers.INVOKE);
+ this.mlogger.info(ONAPLogConstants.Markers.INVOKE_SYNC + "{" + invocationId + "}");
+ return con;
+ }
}
diff --git a/src/main/java/org/onap/clamp/loop/Loop.java b/src/main/java/org/onap/clamp/loop/Loop.java
index 6de2863ea..2393f2498 100644
--- a/src/main/java/org/onap/clamp/loop/Loop.java
+++ b/src/main/java/org/onap/clamp/loop/Loop.java
@@ -23,18 +23,16 @@
package org.onap.clamp.loop;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.annotations.Expose;
import java.io.Serializable;
-import java.util.ArrayList;
+import java.util.HashMap;
import java.util.HashSet;
-import java.util.List;
+import java.util.Map;
import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
import javax.persistence.CascadeType;
import javax.persistence.Column;
@@ -47,14 +45,17 @@ import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
-import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Transient;
+import org.hibernate.annotations.SortNatural;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;
import org.onap.clamp.dao.model.jsontype.StringJsonUserType;
+import org.onap.clamp.loop.components.external.DcaeComponent;
+import org.onap.clamp.loop.components.external.ExternalComponent;
+import org.onap.clamp.loop.components.external.PolicyComponent;
import org.onap.clamp.loop.log.LoopLog;
import org.onap.clamp.policy.microservice.MicroServicePolicy;
import org.onap.clamp.policy.operational.OperationalPolicy;
@@ -69,9 +70,6 @@ public class Loop implements Serializable {
*/
private static final long serialVersionUID = -286522707701388642L;
- @Transient
- private static final EELFLogger logger = EELFManager.getInstance().getLogger(Loop.class);
-
@Id
@Expose
@Column(nullable = false, name = "name", unique = true)
@@ -111,6 +109,10 @@ public class Loop implements Serializable {
private LoopState lastComputedState;
@Expose
+ @Transient
+ private final Map<String, ExternalComponent> components = new HashMap<>();
+
+ @Expose
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "loop")
private Set<OperationalPolicy> operationalPolicies = new HashSet<>();
@@ -121,10 +123,16 @@ public class Loop implements Serializable {
@Expose
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "loop")
- @OrderBy("id DESC")
- private Set<LoopLog> loopLogs = new HashSet<>();
+ @SortNatural
+ private SortedSet<LoopLog> loopLogs = new TreeSet<>();
+
+ private void initializeExternalComponents() {
+ this.addComponent(new PolicyComponent());
+ this.addComponent(new DcaeComponent());
+ }
public Loop() {
+ initializeExternalComponents();
}
/**
@@ -136,6 +144,7 @@ public class Loop implements Serializable {
this.blueprint = blueprint;
this.lastComputedState = LoopState.DESIGN;
this.globalPropertiesJson = new JsonObject();
+ initializeExternalComponents();
}
public String getName() {
@@ -214,7 +223,7 @@ public class Loop implements Serializable {
return loopLogs;
}
- void setLoopLogs(Set<LoopLog> loopLogs) {
+ void setLoopLogs(SortedSet<LoopLog> loopLogs) {
this.loopLogs = loopLogs;
}
@@ -228,9 +237,9 @@ public class Loop implements Serializable {
microServicePolicy.getUsedByLoops().add(this);
}
- void addLog(LoopLog log) {
- loopLogs.add(log);
+ public void addLog(LoopLog log) {
log.setLoop(this);
+ this.loopLogs.add(log);
}
public String getDcaeBlueprintId() {
@@ -249,6 +258,18 @@ public class Loop implements Serializable {
this.modelPropertiesJson = modelPropertiesJson;
}
+ public Map<String, ExternalComponent> getComponents() {
+ return components;
+ }
+
+ public ExternalComponent getComponent(String componentName) {
+ return this.components.get(componentName);
+ }
+
+ public void addComponent(ExternalComponent component) {
+ this.components.put(component.getComponentName(), component);
+ }
+
/**
* Generate the loop name.
*
@@ -269,47 +290,6 @@ public class Loop implements Serializable {
return buffer.toString().replace('.', '_').replaceAll(" ", "");
}
- /**
- * Generates the Json that must be sent to policy to add all policies to Active
- * PDP group.
- *
- * @return The json, payload to send
- */
- public String createPoliciesPayloadPdpGroup() {
- JsonObject jsonObject = new JsonObject();
- JsonArray jsonArray = new JsonArray();
- jsonObject.add("policies", jsonArray);
-
- for (String policyName : this.listPolicyNamesPdpGroup()) {
- JsonObject policyNode = new JsonObject();
- jsonArray.add(policyNode);
- policyNode.addProperty("policy-id", policyName);
- }
- String payload = new GsonBuilder().setPrettyPrinting().create().toJson(jsonObject);
- logger.info("PdpGroup policy payload: " + payload);
- return payload;
- }
-
- /**
- * Generates the list of policy names that must be send/remove to/from active
- * PDP group.
- *
- * @return A list of policy names
- */
- public List<String> listPolicyNamesPdpGroup() {
- List<String> policyNamesList = new ArrayList<>();
- for (OperationalPolicy opPolicy : this.getOperationalPolicies()) {
- policyNamesList.add(opPolicy.getName());
- for (String guardName : opPolicy.createGuardPolicyPayloads().keySet()) {
- policyNamesList.add(guardName);
- }
- }
- for (MicroServicePolicy microServicePolicy : this.getMicroServicePolicies()) {
- policyNamesList.add(microServicePolicy.getName());
- }
- return policyNamesList;
- }
-
@Override
public int hashCode() {
final int prime = 31;
diff --git a/src/main/java/org/onap/clamp/loop/LoopOperation.java b/src/main/java/org/onap/clamp/loop/LoopOperation.java
deleted file mode 100644
index 87effa5fd..000000000
--- a/src/main/java/org/onap/clamp/loop/LoopOperation.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP CLAMP
- * ================================================================================
- * Copyright (C) 2019 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.onap.clamp.loop;
-
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-import com.google.gson.JsonObject;
-
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.UUID;
-
-import org.apache.camel.Exchange;
-import org.apache.camel.Message;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
-import org.json.simple.parser.ParseException;
-import org.onap.clamp.policy.operational.OperationalPolicy;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-/**
- * Closed loop operations.
- */
-@Component
-public class LoopOperation {
-
- protected static final EELFLogger logger = EELFManager.getInstance().getLogger(LoopOperation.class);
- protected static final EELFLogger auditLogger = EELFManager.getInstance().getMetricsLogger();
- private static final String DCAE_LINK_FIELD = "links";
- private static final String DCAE_STATUS_FIELD = "status";
- private static final String DCAE_SERVICETYPE_ID = "serviceTypeId";
- private static final String DCAE_INPUTS = "inputs";
- private static final String DCAE_DEPLOYMENT_PREFIX = "CLAMP_";
- private static final String DEPLOYMENT_PARA = "dcaeDeployParameters";
- private final LoopService loopService;
-
- public enum TempLoopState {
- NOT_SUBMITTED, SUBMITTED, DEPLOYED, NOT_DEPLOYED, PROCESSING, IN_ERROR;
- }
-
- /**
- * The constructor.
- *
- * @param loopService
- * The loop service
- * @param refProp
- * The clamp properties
- */
- @Autowired
- public LoopOperation(LoopService loopService) {
- this.loopService = loopService;
- }
-
- /**
- * Get the payload used to send the deploy closed loop request.
- *
- * @param loop
- * The loop
- * @return The payload used to send deploy closed loop request
- * @throws IOException
- * IOException
- */
- public String getDeployPayload(Loop loop) throws IOException {
- JsonObject globalProp = loop.getGlobalPropertiesJson();
- JsonObject deploymentProp = globalProp.getAsJsonObject(DEPLOYMENT_PARA);
-
- String serviceTypeId = loop.getDcaeBlueprintId();
-
- JsonObject rootObject = new JsonObject();
- rootObject.addProperty(DCAE_SERVICETYPE_ID, serviceTypeId);
- if (deploymentProp != null) {
- rootObject.add(DCAE_INPUTS, deploymentProp);
- }
- String apiBodyString = rootObject.toString();
- logger.info("Dcae api Body String - " + apiBodyString);
-
- return apiBodyString;
- }
-
- /**
- * Get the deployment id.
- *
- * @param loop
- * The loop
- * @return The deployment id
- * @throws IOException
- * IOException
- */
- public String getDeploymentId(Loop loop) {
- // Set the deploymentId if not present yet
- String deploymentId = "";
- // If model is already deployed then pass same deployment id
- if (loop.getDcaeDeploymentId() != null && !loop.getDcaeDeploymentId().isEmpty()) {
- deploymentId = loop.getDcaeDeploymentId();
- } else {
- deploymentId = DCAE_DEPLOYMENT_PREFIX + UUID.randomUUID();
- }
- return deploymentId;
- }
-
- /**
- * Update the loop info.
- *
- * @param camelExchange
- * The camel exchange
- * @param loop
- * The loop
- * @param deploymentId
- * The deployment id
- * @throws ParseException
- * The parse exception
- */
- public void updateLoopInfo(Exchange camelExchange, Loop loop, String deploymentId) throws ParseException {
- Message in = camelExchange.getIn();
- String msg = in.getBody(String.class);
-
- JSONParser parser = new JSONParser();
- Object obj0 = parser.parse(msg);
- JSONObject jsonObj = (JSONObject) obj0;
-
- JSONObject linksObj = (JSONObject) jsonObj.get(DCAE_LINK_FIELD);
- String statusUrl = (String) linksObj.get(DCAE_STATUS_FIELD);
-
- if (deploymentId == null) {
- loop.setDcaeDeploymentId(null);
- loop.setDcaeDeploymentStatusUrl(null);
- } else {
- loop.setDcaeDeploymentId(deploymentId);
- loop.setDcaeDeploymentStatusUrl(statusUrl.replaceAll("http:", "http4:").replaceAll("https:", "https4:"));
- }
- loopService.saveOrUpdateLoop(loop);
- }
-
- /**
- * Get the Closed Loop status based on the reply from Policy.
- *
- * @param statusCode
- * The status code
- * @return The state based on policy response
- * @throws ParseException
- * The parse exception
- */
- public String analysePolicyResponse(int statusCode) {
- if (statusCode == 200) {
- return TempLoopState.SUBMITTED.toString();
- } else if (statusCode == 404) {
- return TempLoopState.NOT_SUBMITTED.toString();
- }
- return TempLoopState.IN_ERROR.toString();
- }
-
- /**
- * Get the name of the first Operational policy.
- *
- * @param loop
- * The closed loop
- * @return The name of the first operational policy
- */
- public String getOperationalPolicyName(Loop loop) {
- Set<OperationalPolicy> opSet = loop.getOperationalPolicies();
- Iterator<OperationalPolicy> iterator = opSet.iterator();
- while (iterator.hasNext()) {
- OperationalPolicy policy = iterator.next();
- return policy.getName();
- }
- return null;
- }
-
- /**
- * Get the Closed Loop status based on the reply from DCAE.
- *
- * @param camelExchange
- * The camel exchange
- * @return The state based on DCAE response
- * @throws ParseException
- * The parse exception
- */
- public String analyseDcaeResponse(Exchange camelExchange, Integer statusCode) throws ParseException {
- if (statusCode == null) {
- return TempLoopState.NOT_DEPLOYED.toString();
- }
- if (statusCode == 200) {
- Message in = camelExchange.getIn();
- String msg = in.getBody(String.class);
-
- JSONParser parser = new JSONParser();
- Object obj0 = parser.parse(msg);
- JSONObject jsonObj = (JSONObject) obj0;
-
- String opType = (String) jsonObj.get("operationType");
- String status = (String) jsonObj.get("status");
-
- // status = processing/successded/failed
- if (status.equals("succeeded")) {
- if (opType.equals("install")) {
- return TempLoopState.DEPLOYED.toString();
- } else if (opType.equals("uninstall")) {
- return TempLoopState.NOT_DEPLOYED.toString();
- }
- } else if (status.equals("processing")) {
- return TempLoopState.PROCESSING.toString();
- }
- } else if (statusCode == 404) {
- return TempLoopState.NOT_DEPLOYED.toString();
- }
- return TempLoopState.IN_ERROR.toString();
- }
-
- /**
- * Update the status of the closed loop based on the response from Policy and
- * DCAE.
- *
- * @param loop
- * The closed loop
- * @param policyState
- * The state get from Policy
- * @param dcaeState
- * The state get from DCAE
- * @throws ParseException
- * The parse exception
- */
- public LoopState updateLoopStatus(Loop loop, TempLoopState policyState, TempLoopState dcaeState) {
- LoopState clState = LoopState.IN_ERROR;
- if (policyState == TempLoopState.SUBMITTED) {
- if (dcaeState == TempLoopState.DEPLOYED) {
- clState = LoopState.DEPLOYED;
- } else if (dcaeState == TempLoopState.PROCESSING) {
- clState = LoopState.WAITING;
- } else if (dcaeState == TempLoopState.NOT_DEPLOYED) {
- clState = LoopState.SUBMITTED;
- }
- } else if (policyState == TempLoopState.NOT_SUBMITTED) {
- if (dcaeState == TempLoopState.NOT_DEPLOYED) {
- clState = LoopState.DESIGN;
- }
- }
- loop.setLastComputedState(clState);
- loopService.saveOrUpdateLoop(loop);
- return clState;
- }
-
-}
diff --git a/src/main/java/org/onap/clamp/loop/LoopService.java b/src/main/java/org/onap/clamp/loop/LoopService.java
index 4c1392253..d1ab0e396 100644
--- a/src/main/java/org/onap/clamp/loop/LoopService.java
+++ b/src/main/java/org/onap/clamp/loop/LoopService.java
@@ -71,6 +71,17 @@ public class LoopService {
loopsRepository.deleteById(loopName);
}
+ public void updateDcaeDeploymentFields(Loop loop, String deploymentId, String deploymentUrl) {
+ loop.setDcaeDeploymentId(deploymentId);
+ loop.setDcaeDeploymentStatusUrl(deploymentUrl);
+ loopsRepository.save(loop);
+ }
+
+ public void updateLoopState(Loop loop, String newState) {
+ loop.setLastComputedState(LoopState.valueOf(newState));
+ loopsRepository.save(loop);
+ }
+
Loop updateAndSaveOperationalPolicies(String loopName, List<OperationalPolicy> newOperationalPolicies) {
Loop loop = findClosedLoopByName(loopName);
Set<OperationalPolicy> newPolicies = operationalPolicyService.updatePolicies(loop, newOperationalPolicies);
@@ -93,9 +104,7 @@ public class LoopService {
MicroServicePolicy updateMicroservicePolicy(String loopName, MicroServicePolicy newMicroservicePolicy) {
Loop loop = findClosedLoopByName(loopName);
- MicroServicePolicy newPolicies = microservicePolicyService.getAndUpdateMicroServicePolicy(loop,
- newMicroservicePolicy);
- return newPolicies;
+ return microservicePolicyService.getAndUpdateMicroServicePolicy(loop, newMicroservicePolicy);
}
private Loop findClosedLoopByName(String loopName) {
diff --git a/src/main/java/org/onap/clamp/loop/components/external/DcaeComponent.java b/src/main/java/org/onap/clamp/loop/components/external/DcaeComponent.java
new file mode 100644
index 000000000..35b3a454b
--- /dev/null
+++ b/src/main/java/org/onap/clamp/loop/components/external/DcaeComponent.java
@@ -0,0 +1,162 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2019 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.onap.clamp.loop.components.external;
+
+import com.google.gson.JsonObject;
+
+import java.util.UUID;
+
+import org.apache.camel.Exchange;
+import org.onap.clamp.clds.model.dcae.DcaeOperationStatusResponse;
+import org.onap.clamp.clds.util.JsonUtils;
+import org.onap.clamp.loop.Loop;
+
+public class DcaeComponent extends ExternalComponent {
+
+ private static final String DCAE_DEPLOYMENT_PREFIX = "CLAMP_";
+ private static final String DEPLOYMENT_PARAMETER = "dcaeDeployParameters";
+ private static final String DCAE_SERVICETYPE_ID = "serviceTypeId";
+ private static final String DCAE_INPUTS = "inputs";
+
+ public static final ExternalComponentState BLUEPRINT_DEPLOYED = new ExternalComponentState("BLUEPRINT_DEPLOYED",
+ "The DCAE blueprint has been found in the DCAE inventory but not yet instancianted for this loop");
+ public static final ExternalComponentState PROCESSING_MICROSERVICE_INSTALLATION = new ExternalComponentState(
+ "PROCESSING_MICROSERVICE_INSTALLATION",
+ "Clamp has requested DCAE to install the microservices defined in the DCAE blueprint and it's currently processing the request");
+ public static final ExternalComponentState MICROSERVICE_INSTALLATION_FAILED = new ExternalComponentState(
+ "MICROSERVICE_INSTALLATION_FAILED",
+ "Clamp has requested DCAE to install the microservices defined in the DCAE blueprint and it failed");
+ public static final ExternalComponentState MICROSERVICE_INSTALLED_SUCCESSFULLY = new ExternalComponentState(
+ "MICROSERVICE_INSTALLED_SUCCESSFULLY",
+ "Clamp has requested DCAE to install the DCAE blueprint and it has been installed successfully");
+ public static final ExternalComponentState PROCESSING_MICROSERVICE_UNINSTALLATION = new ExternalComponentState(
+ "PROCESSING_MICROSERVICE_UNINSTALLATION",
+ "Clamp has requested DCAE to uninstall the microservices defined in the DCAE blueprint and it's currently processing the request");
+ public static final ExternalComponentState MICROSERVICE_UNINSTALLATION_FAILED = new ExternalComponentState(
+ "MICROSERVICE_UNINSTALLATION_FAILED",
+ "Clamp has requested DCAE to uninstall the microservices defined in the DCAE blueprint and it failed");
+ public static final ExternalComponentState MICROSERVICE_UNINSTALLED_SUCCESSFULLY = new ExternalComponentState(
+ "MICROSERVICE_UNINSTALLED_SUCCESSFULLY",
+ "Clamp has requested DCAE to uninstall the DCAE blueprint and it has been uninstalled successfully");
+ public static final ExternalComponentState IN_ERROR = new ExternalComponentState("IN_ERROR",
+ "There was an error during the request done to DCAE, look at the logs or try again");
+
+ public DcaeComponent() {
+ super(BLUEPRINT_DEPLOYED);
+ }
+
+ @Override
+ public String getComponentName() {
+ return "DCAE";
+ }
+
+ public static DcaeOperationStatusResponse convertDcaeResponse(String responseBody) {
+ if (responseBody != null && !responseBody.isEmpty()) {
+ return JsonUtils.GSON_JPA_MODEL.fromJson(responseBody, DcaeOperationStatusResponse.class);
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Generate the deployment id, it's random
+ *
+ * @return The deployment id
+ */
+ public static String generateDeploymentId() {
+ return DCAE_DEPLOYMENT_PREFIX + UUID.randomUUID();
+ }
+
+ /**
+ * This method prepare the url returned by DCAE to check the status if fine.
+ *
+ * @param statusUrl
+ * @return the Right Url modified if needed
+ */
+ public static String getStatusUrl(DcaeOperationStatusResponse dcaeResponse) {
+ return dcaeResponse.getLinks().getStatus().replaceAll("http:", "http4:").replaceAll("https:", "https4:");
+ }
+
+ /**
+ * Return the deploy payload for DCAE.
+ *
+ * @param loop
+ * The loop object
+ * @return The payload used to send deploy closed loop request
+ */
+ public static String getDeployPayload(Loop loop) {
+ JsonObject globalProp = loop.getGlobalPropertiesJson();
+ JsonObject deploymentProp = globalProp.getAsJsonObject(DEPLOYMENT_PARAMETER);
+
+ String serviceTypeId = loop.getDcaeBlueprintId();
+
+ JsonObject rootObject = new JsonObject();
+ rootObject.addProperty(DCAE_SERVICETYPE_ID, serviceTypeId);
+ if (deploymentProp != null) {
+ rootObject.add(DCAE_INPUTS, deploymentProp);
+ }
+ return rootObject.toString();
+ }
+
+ /**
+ * Return the uninstallation payload for DCAE.
+ *
+ * @param loop
+ * The loop object
+ * @return The payload in string (json)
+ */
+ public static String getUndeployPayload(Loop loop) {
+ JsonObject rootObject = new JsonObject();
+ rootObject.addProperty(DCAE_SERVICETYPE_ID, loop.getDcaeBlueprintId());
+ return rootObject.toString();
+ }
+
+ @Override
+ public ExternalComponentState computeState(Exchange camelExchange) {
+
+ DcaeOperationStatusResponse dcaeResponse = (DcaeOperationStatusResponse) camelExchange.getIn().getExchange()
+ .getProperty("dcaeResponse");
+
+ if (dcaeResponse == null) {
+ setState(BLUEPRINT_DEPLOYED);
+ } else if (dcaeResponse.getOperationType().equals("install") && dcaeResponse.getStatus().equals("succeeded")) {
+ setState(MICROSERVICE_INSTALLED_SUCCESSFULLY);
+ } else if (dcaeResponse.getOperationType().equals("install") && dcaeResponse.getStatus().equals("processing")) {
+ setState(PROCESSING_MICROSERVICE_INSTALLATION);
+ } else if (dcaeResponse.getOperationType().equals("install") && dcaeResponse.getStatus().equals("failed")) {
+ setState(MICROSERVICE_INSTALLATION_FAILED);
+ } else if (dcaeResponse.getOperationType().equals("uninstall")
+ && dcaeResponse.getStatus().equals("succeeded")) {
+ setState(MICROSERVICE_UNINSTALLED_SUCCESSFULLY);
+ } else if (dcaeResponse.getOperationType().equals("uninstall")
+ && dcaeResponse.getStatus().equals("processing")) {
+ setState(PROCESSING_MICROSERVICE_UNINSTALLATION);
+ } else if (dcaeResponse.getOperationType().equals("uninstall") && dcaeResponse.getStatus().equals("failed")) {
+ setState(MICROSERVICE_UNINSTALLATION_FAILED);
+ } else {
+ setState(IN_ERROR);
+ }
+ return this.getState();
+ }
+}
diff --git a/src/main/java/org/onap/clamp/loop/components/external/ExternalComponent.java b/src/main/java/org/onap/clamp/loop/components/external/ExternalComponent.java
new file mode 100644
index 000000000..a8aae2038
--- /dev/null
+++ b/src/main/java/org/onap/clamp/loop/components/external/ExternalComponent.java
@@ -0,0 +1,61 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2019 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.onap.clamp.loop.components.external;
+
+import com.google.gson.annotations.Expose;
+
+import org.apache.camel.Exchange;
+
+/**
+ *
+ * SHould be abstract but Gson can't instantiate it if it's an abstract
+ *
+ */
+public class ExternalComponent {
+ @Expose
+ private ExternalComponentState componentState;
+
+ public void setState(ExternalComponentState newState) {
+ this.componentState = newState;
+ }
+
+ public ExternalComponentState getState() {
+ return this.componentState;
+ }
+
+ public String getComponentName() {
+ return null;
+ }
+
+ public ExternalComponentState computeState(Exchange camelExchange) {
+ return new ExternalComponentState("INIT", "no desc");
+ }
+
+ public ExternalComponent(ExternalComponentState initialState) {
+ setState(initialState);
+ }
+
+ public ExternalComponent() {
+ }
+}
diff --git a/src/main/java/org/onap/clamp/loop/components/external/ExternalComponentState.java b/src/main/java/org/onap/clamp/loop/components/external/ExternalComponentState.java
new file mode 100644
index 000000000..6a723c24e
--- /dev/null
+++ b/src/main/java/org/onap/clamp/loop/components/external/ExternalComponentState.java
@@ -0,0 +1,61 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2019 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.onap.clamp.loop.components.external;
+
+import com.google.gson.annotations.Expose;
+
+/**
+ * This is a transient state reflecting the deployment status of a component. It
+ * can be Policy, DCAE, or whatever... This is object is generic. Clamp is now
+ * stateless, so it triggers the different components at runtime, the status per
+ * component is stored here.
+ *
+ */
+public class ExternalComponentState {
+ @Expose
+ private String stateName;
+ @Expose
+ private String description;
+
+ public ExternalComponentState(String stateName, String description) {
+ this.stateName = stateName;
+ this.description = description;
+ }
+
+ public ExternalComponentState() {
+ }
+
+ public String getStateName() {
+ return stateName;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ @Override
+ public String toString() {
+ return stateName;
+ }
+}
diff --git a/src/main/java/org/onap/clamp/loop/components/external/PolicyComponent.java b/src/main/java/org/onap/clamp/loop/components/external/PolicyComponent.java
new file mode 100644
index 000000000..acd6115fe
--- /dev/null
+++ b/src/main/java/org/onap/clamp/loop/components/external/PolicyComponent.java
@@ -0,0 +1,123 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2019 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.onap.clamp.loop.components.external;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.Transient;
+
+import org.apache.camel.Exchange;
+import org.onap.clamp.loop.Loop;
+import org.onap.clamp.policy.microservice.MicroServicePolicy;
+import org.onap.clamp.policy.operational.OperationalPolicy;
+
+public class PolicyComponent extends ExternalComponent {
+
+ @Transient
+ private static final EELFLogger logger = EELFManager.getInstance().getLogger(PolicyComponent.class);
+
+ public static final ExternalComponentState NOT_SENT = new ExternalComponentState("NOT_SENT",
+ "The policies defined have NOT yet been created on the policy engine");
+ public static final ExternalComponentState SENT = new ExternalComponentState("SENT",
+ "The policies defined have been created but NOT deployed on the policy engine");
+ public static final ExternalComponentState SENT_AND_DEPLOYED = new ExternalComponentState("SENT_AND_DEPLOYED",
+ "The policies defined have been created and deployed on the policy engine");
+ public static final ExternalComponentState IN_ERROR = new ExternalComponentState("IN_ERROR",
+ "There was an error during the sending to policy, the policy engine may be corrupted or inconsistent");
+
+ public PolicyComponent() {
+ super(NOT_SENT);
+ }
+
+ @Override
+ public String getComponentName() {
+ return "POLICY";
+ }
+
+ /**
+ * Generates the Json that must be sent to policy to add all policies to Active
+ * PDP group.
+ *
+ * @return The json, payload to send
+ */
+ public static String createPoliciesPayloadPdpGroup(Loop loop) {
+ JsonObject jsonObject = new JsonObject();
+ JsonArray jsonArray = new JsonArray();
+ jsonObject.add("policies", jsonArray);
+
+ for (String policyName : PolicyComponent.listPolicyNamesPdpGroup(loop)) {
+ JsonObject policyNode = new JsonObject();
+ jsonArray.add(policyNode);
+ policyNode.addProperty("policy-id", policyName);
+ }
+ String payload = new GsonBuilder().setPrettyPrinting().create().toJson(jsonObject);
+ logger.info("PdpGroup policy payload: " + payload);
+ return new GsonBuilder().setPrettyPrinting().create().toJson(jsonObject);
+ }
+
+ /**
+ * Generates the list of policy names that must be send/remove to/from active
+ * PDP group.
+ *
+ * @return A list of policy names
+ */
+ public static List<String> listPolicyNamesPdpGroup(Loop loop) {
+ List<String> policyNamesList = new ArrayList<>();
+ for (OperationalPolicy opPolicy : loop.getOperationalPolicies()) {
+ policyNamesList.add(opPolicy.getName());
+ for (String guardName : opPolicy.createGuardPolicyPayloads().keySet()) {
+ policyNamesList.add(guardName);
+ }
+ }
+ for (MicroServicePolicy microServicePolicy : loop.getMicroServicePolicies()) {
+ policyNamesList.add(microServicePolicy.getName());
+ }
+ return policyNamesList;
+ }
+
+ @Override
+ public ExternalComponentState computeState(Exchange camelExchange) {
+ boolean oneNotFound = (boolean) camelExchange.getIn().getExchange().getProperty("atLeastOnePolicyNotFound");
+ boolean oneNotDeployed = (boolean) camelExchange.getIn().getExchange()
+ .getProperty("atLeastOnePolicyNotDeployed");
+
+ if (oneNotFound && oneNotDeployed) {
+ this.setState(NOT_SENT);
+ } else if (!oneNotFound && oneNotDeployed) {
+ this.setState(SENT);
+ } else if (!oneNotFound && !oneNotDeployed) {
+ this.setState(SENT_AND_DEPLOYED);
+ } else {
+ this.setState(IN_ERROR);
+ }
+ return this.getState();
+ }
+}
diff --git a/src/main/java/org/onap/clamp/loop/log/LoopLog.java b/src/main/java/org/onap/clamp/loop/log/LoopLog.java
index cea495712..3feff254d 100644
--- a/src/main/java/org/onap/clamp/loop/log/LoopLog.java
+++ b/src/main/java/org/onap/clamp/loop/log/LoopLog.java
@@ -52,7 +52,7 @@ import org.onap.clamp.loop.Loop;
*/
@Entity
@Table(name = "loop_logs")
-public class LoopLog implements Serializable {
+public class LoopLog implements Serializable, Comparable<LoopLog> {
/**
* The serial version ID.
*/
@@ -69,6 +69,10 @@ public class LoopLog implements Serializable {
private LogType logType;
@Expose
+ @Column(name = "log_component", nullable = false)
+ private String logComponent;
+
+ @Expose
@Column(name = "message", columnDefinition = "MEDIUMTEXT", nullable = false)
private String message;
@@ -83,10 +87,11 @@ public class LoopLog implements Serializable {
public LoopLog() {
}
- public LoopLog(String message, LogType logType, Loop loop) {
+ public LoopLog(String message, LogType logType, String logComponent, Loop loop) {
this.message = message;
this.logType = logType;
this.loop = loop;
+ this.logComponent = logComponent;
}
public Long getId() {
@@ -129,6 +134,14 @@ public class LoopLog implements Serializable {
this.logInstant = logInstant.truncatedTo(ChronoUnit.SECONDS);
}
+ public String getLogComponent() {
+ return logComponent;
+ }
+
+ public void setLogComponent(String logComponent) {
+ this.logComponent = logComponent;
+ }
+
@Override
public int hashCode() {
final int prime = 31;
@@ -159,4 +172,18 @@ public class LoopLog implements Serializable {
return true;
}
+ @Override
+ public int compareTo(LoopLog arg0) {
+ // Reverse it, so that by default we have the latest
+ if (getId() == null) {
+ return 1;
+ }
+ if (arg0.getId() == null) {
+ return -1;
+ }
+
+ return arg0.getId().compareTo(this.getId());
+
+ }
+
}
diff --git a/src/main/java/org/onap/clamp/loop/log/LoopLogService.java b/src/main/java/org/onap/clamp/loop/log/LoopLogService.java
index b02bc11c4..d02d0b278 100644
--- a/src/main/java/org/onap/clamp/loop/log/LoopLogService.java
+++ b/src/main/java/org/onap/clamp/loop/log/LoopLogService.java
@@ -38,7 +38,11 @@ public class LoopLogService {
}
public void addLog(String message, String logType, Loop loop) {
- repository.save(new LoopLog(message, LogType.valueOf(logType), loop));
+ this.addLogForComponent(message, logType, "CLAMP", loop);
+ }
+
+ public void addLogForComponent(String message, String logType, String component, Loop loop) {
+ loop.addLog(repository.save(new LoopLog(message, LogType.valueOf(logType), component, loop)));
}
public boolean isExisting(Long logId) {