diff options
47 files changed, 2188 insertions, 1515 deletions
@@ -106,7 +106,7 @@ Once the image has been built and is available locally, you can use the `docker- ### Logs -Clamp uses logback framework to generate logs. The logback.xml file cand be found under the [src/main/resources/ folder](src/main/resources). +Clamp uses logback framework to generate logs. The logback.xml file can be found under the [src/main/resources/ folder](src/main/resources). With the default log settings, all logs will be generated into console and into root.log file under the Clamp root folder. The root.log file is not allowed to be appended, thus restarting the clamp will result in cleaning of the old log files. @@ -173,4 +173,4 @@ To use it just add --spring.config.name=application-noaaf -to the jvm parameters. This file is available by default in the java classpath resource folder.
\ No newline at end of file +to the jvm parameters. This file is available by default in the java classpath resource folder. diff --git a/docs/index.rst b/docs/index.rst index 61e49c6b..1f41485e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,7 +3,7 @@ .. Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved. CLAMP - Control Loop Automation Management Platform -================================================== +=================================================== .. High level architecture, design, and packaging information for release planning and delivery. .. include:: architecture.rst diff --git a/docs/swagger/swagger.pdf b/docs/swagger/swagger.pdf index 7a9c85ec..0ef34fe5 100644 --- a/docs/swagger/swagger.pdf +++ b/docs/swagger/swagger.pdf @@ -4,8 +4,8 @@ << /Title (Clamp Rest API) /Creator (Asciidoctor PDF 1.5.0.alpha.10, based on Prawn 1.3.0) /Producer (Asciidoctor PDF 1.5.0.alpha.10, based on Prawn 1.3.0) -/CreationDate (D:20190529175837+02'00') -/ModDate (D:20190529175837+02'00') +/CreationDate (D:20190613105324+02'00') +/ModDate (D:20190613105324+02'00') >> endobj 2 0 obj diff --git a/extra/sql/bulkload/create-tables.sql b/extra/sql/bulkload/create-tables.sql index da39ca5f..121c5e68 100644 --- a/extra/sql/bulkload/create-tables.sql +++ b/extra/sql/bulkload/create-tables.sql @@ -7,6 +7,7 @@ create table loop_logs ( id bigint not null, + log_component varchar(255) not null, log_instant datetime(6) not null, log_type varchar(255) not null, message MEDIUMTEXT not null, @@ -24,15 +24,15 @@ <modelVersion>4.0.0</modelVersion> <groupId>org.onap.clamp</groupId> <artifactId>clds</artifactId> - <version>4.0.3-SNAPSHOT</version> + <version>4.1.0-SNAPSHOT</version> <name>clamp</name> -<!-- --> -<!-- <parent> --> -<!-- <groupId>org.onap.oparent</groupId> --> -<!-- <artifactId>oparent</artifactId> --> -<!-- <version>1.2.3</version> --> -<!-- </parent> --> + + <parent> + <groupId>org.onap.oparent</groupId> + <artifactId>oparent</artifactId> + <version>2.0.0</version> + </parent> <description> This project build the ONAP CLAMP JAR that contains CLAMP back-end code and its UI part. @@ -61,12 +61,9 @@ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <project.scm.id>git-server</project.scm.id> - <java.version>1.8</java.version> - <eelf.core.version>1.0.0</eelf.core.version> - <camel.version>2.23.2</camel.version> - <springboot.version>2.1.4.RELEASE</springboot.version> + <camel.version>2.24.0</camel.version> + <springboot.version>2.1.5.RELEASE</springboot.version> <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin> <sonar.surefire.reportsPath>${project.build.directory}/surefire-reports</sonar.surefire.reportsPath> @@ -89,7 +86,7 @@ <docker.skip.tag>true</docker.skip.tag> <skip.staging.artifacts>false</skip.staging.artifacts> <python.http.proxy.param/> - <tomcat.version>9.0.16</tomcat.version> + <tomcat.version>9.0.20</tomcat.version> </properties> <profiles> @@ -922,19 +919,6 @@ </executions> </plugin> <plugin> - <groupId>org.sonatype.plugins</groupId> - <artifactId>nexus-staging-maven-plugin</artifactId> - <version>1.6.7</version> - <extensions>true</extensions> - <configuration> - <nexusUrl>https://nexus.onap.org</nexusUrl> - <stagingProfileId>176c31dfe190a</stagingProfileId> - <serverId>ecomp-staging</serverId> - <skipNexusStagingDeployMojo>${skip.staging.artifacts}</skipNexusStagingDeployMojo> - </configuration> - </plugin> - - <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> diff --git a/src/main/java/org/onap/clamp/clds/Application.java b/src/main/java/org/onap/clamp/clds/Application.java index f6dfdc0c..bac328d6 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 3dc80738..271dc84f 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 74582a86..97245066 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 00000000..368e1b8e --- /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 00000000..aee7d061 --- /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 cbe7eba9..163ab691 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 6de2863e..2393f249 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 87effa5f..00000000 --- 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 4c139225..d1ab0e39 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 00000000..35b3a454 --- /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 00000000..a8aae203 --- /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 00000000..6a723c24 --- /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 00000000..acd6115f --- /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 cea49571..3feff254 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 b02bc11c..d02d0b27 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) { diff --git a/src/main/resources/META-INF/resources/designer/modeler/dist/index.html b/src/main/resources/META-INF/resources/designer/modeler/dist/index.html index ab337de8..cd7d6668 100644 --- a/src/main/resources/META-INF/resources/designer/modeler/dist/index.html +++ b/src/main/resources/META-INF/resources/designer/modeler/dist/index.html @@ -59,15 +59,17 @@ <thead> <tr> <th><span align="left" class="text">Date</span></th> - <th><span align="center" class="text">Type</span></th> + <th><span align="left" class="text">Type</span></th> + <th><span align="left" class="text">Component</span></th> <th><span align="right" class="text">Log</span></th> </tr> </thead> <tbody> <tr ng-repeat="log in loop_logs" ng-class="{reverse: reverse}"> - <td width="20%">{{log.logInstant}}</td> + <td width="10%">{{log.logInstant}}</td> <td width="10%" ng-class="log.logType">{{log.logType}}</td> - <td width="70">{{log.message}}</td> + <td width="10%">{{log.logComponent}}</td> + <td width="70%">{{log.message}}</td> </tr> </tbody> </table> diff --git a/src/main/resources/META-INF/resources/designer/partials/portfolios/operational_policy_window.html b/src/main/resources/META-INF/resources/designer/partials/portfolios/operational_policy_window.html index db127f7d..7b13615a 100644 --- a/src/main/resources/META-INF/resources/designer/partials/portfolios/operational_policy_window.html +++ b/src/main/resources/META-INF/resources/designer/partials/portfolios/operational_policy_window.html @@ -165,12 +165,12 @@ label { <form class="policyProperties" class="form-horizontal" style="border: 2px dotted gray;" title="Operational Policy Properties"> - <div class="form-group clearfix"> <label class="col-sm-4 control-label" for="id">ID</label> <div class="col-sm-8"> - <input type="text" class="form-control" name="id" id="id" + <input type="text" class="form-control" name="id" id="id" ng-model="duplicated" ng-init="duplicated = false" ng-keyup="updateTabLabel($event)" /> + <span >ID must be unique</span> </div> </div> <div class="form-group clearfix"> @@ -247,6 +247,7 @@ label { ng-options="policy for policy in policy_ids track by policy"> <option value="">-- choose an option --</option> </select> + </div> </div> <div class="form-group clearfix"> @@ -481,7 +482,7 @@ label { </div> <div attribute-test="policywindowpropertiesf" class="modal-footer"> - <button id="savePropsBtn" class="btn btn-primary">Close</button> + <button id="savePropsBtn" class="btn btn-primary" ng-disabled="duplicated">Close</button> <button ng-click="close(true)" id="close_button" class="btn btn-primary">Cancel</button> </div> diff --git a/src/main/resources/META-INF/resources/designer/scripts/CldsModelService.js b/src/main/resources/META-INF/resources/designer/scripts/CldsModelService.js index 0cc5c38f..2b27a7fd 100644 --- a/src/main/resources/META-INF/resources/designer/scripts/CldsModelService.js +++ b/src/main/resources/META-INF/resources/designer/scripts/CldsModelService.js @@ -41,32 +41,8 @@ app ToscaModelWindow(); } } - this.toggleDeploy = function(uiAction, modelName) { - var svcAction = uiAction.toLowerCase(); - var deployUrl = "/restservices/clds/v2/loop/" + svcAction + "Loop/" + modelName; - var def = $q.defer(); - var sets = []; - $http.put(deployUrl).success( - function(data) { - def.resolve(data); - alertService.alertMessage("Action Successful: " + svcAction, 1) - // update deploymentID, lastUpdatedStatus - setLastComputedState(data.lastComputedState); - setDeploymentStatusURL(data.dcaeDeploymentStatusUrl); - setDeploymentID(data.dcaeDeploymentId); - setStatus(data.lastComputedState); - enableDisableMenuOptions(); - }).error( - function(data) { - def.resolve(data); - alertService.alertMessage("Action Failure: " + svcAction, 2); - def.reject(svcAction + " not successful"); - }); - return def.promise; - } this.getModel = function(modelName) { var def = $q.defer(); - var sets = []; var svcUrl = "/restservices/clds/v2/loop/" + modelName; $http.get(svcUrl).success(function(data) { cl_props = data; @@ -79,7 +55,6 @@ app }; this.getSavedModel = function() { var def = $q.defer(); - var sets = []; var svcUrl = "/restservices/clds/v2/loop/getAllNames"; $http.get(svcUrl).success(function(data) { @@ -92,7 +67,6 @@ app }; this.processAction = function(uiAction, modelName) { var def = $q.defer(); - var sets = []; var svcAction = uiAction.toLowerCase(); var svcUrl = "/restservices/clds/v2/loop/" + svcAction + "/" + modelName; @@ -100,10 +74,6 @@ app function(data) { def.resolve(data); alertService.alertMessage("Action Successful: " + svcAction, 1) - // update deploymentID, lastUpdatedStatus - setLastComputedState(data.lastComputedState); - setDeploymentStatusURL(data.dcaeDeploymentStatusUrl); - setDeploymentID(data.dcaeDeploymentId); }).error( function(data) { def.resolve(data); @@ -116,7 +86,6 @@ app this.manageAction = function(modelName, typeId, typeName) { var def = $q.defer(); - var sets = []; var config = { url : "/restservices/clds/v1/clds/getDispatcherInfo", method : "GET", @@ -143,37 +112,34 @@ app }; this.refreshStatus = function(modelName) { var def = $q.defer(); - var sets = []; var svcUrl = "/restservices/clds/v2/loop/getstatus/" + modelName; $http.get(svcUrl).success(function(data) { + cl_props = data; setStatus(data.lastComputedState); def.resolve(data); }).error(function(data) { def.reject("Refresh Status not successful"); }); return def.promise; - enableDisableMenuOptions(); } function setStatus(status) { // apply color to status var statusColor = 'white'; if (status.trim() === "DESIGN") { statusColor = 'gray' - } else if (status.trim() === "DISTRIBUTED") { - statusColor = 'blue' } else if (status.trim() === "SUBMITTED") { + statusColor = 'blue' + } else if (status.trim() === "DEPLOYED") { + statusColor = 'blue' + } else if (status.trim() === "RUNNING") { statusColor = 'green' } else if (status.trim() === "STOPPED") { - statusColor = 'red' - } else if (status.trim() === "DELETING") { - statusColor = 'pink' - } else if (status.trim() === "ERROR") { statusColor = 'orange' - } else if (status.trim() === "UNKNOWN") { - statusColor = 'blue' - } else { - statusColor = null; - } + } else if (status.trim() === "IN_ERROR") { + statusColor = 'red' + } else if (status.trim() === "WAITING") { + statusColor = 'greenyellow' + } var statusMsg = '<span style="background-color:' + statusColor + ';-moz-border-radius: 50px; -webkit-border-radius: 50px; border-radius: 50px;"> ' @@ -185,6 +151,22 @@ app .append( '<span id="status_clds" style="position: absolute; left: 61%;top: 151px; font-size:20px;">Status: ' + statusMsg + '</span>'); + + var statusTable = '<table id="status_components_table" style="width:100%"><tr><th><span align="left" class="text">Component</span></th><th><span align="center" class="text">State</span></th><th><span align="right" class="text">Description</span></th></tr>'; + + $.each(cl_props['components'], function(componentIndex, componentValue) { + statusTable+='<tr><td>'+componentIndex+'</td>'; + statusTable+='<td>'+componentValue['componentState']['stateName']+'</td>'; + statusTable+='<td>'+componentValue['componentState']['description']+'</td></tr>'; + }); + statusTable+= '</table>'; + if ($("#status_components").length >= 1) + $("#status_components").remove(); + $("#activity_modeler") + .append( + '<span id="status_components" style="position: absolute; left: 61%;top: 191px; font-size:10px;">' + + statusTable + '</span>'); + } function manageCLImage(modelName) { getModelImage(modelName).then(function(pars) { @@ -203,13 +185,12 @@ app }, function(data) { }); } - enableDisableMenuOptions = function() { + function enableDisableMenuOptions () { enableDefaultMenu(); enableAllActionMenu(); } - getModelImage = function(modelName) { + function getModelImage(modelName) { var def = $q.defer(); - var sets = []; var svcUrl = "/restservices/clds/v2/loop/svgRepresentation/" + modelName; $http.get(svcUrl).success(function(data) { def.resolve(data); diff --git a/src/main/resources/META-INF/resources/designer/scripts/OperationalPolicyCtrl.js b/src/main/resources/META-INF/resources/designer/scripts/OperationalPolicyCtrl.js index 0f9b62ff..806cfea9 100644 --- a/src/main/resources/META-INF/resources/designer/scripts/OperationalPolicyCtrl.js +++ b/src/main/resources/META-INF/resources/designer/scripts/OperationalPolicyCtrl.js @@ -39,6 +39,8 @@ app $scope.number = 0; $scope.clname = ""; $scope.guard_ids = []; + $scope.duplicated = false; + function getAllFormId() { return Array.from(document.getElementsByClassName("formId")); @@ -400,15 +402,22 @@ app $($("#formId" + formNum + " #actor")[1]).val($(event.target).val()); } // When we change the name of a policy - $scope.updateTabLabel = function(event) { - - // update policy id structure - var formNum = $(event.target).closest('.formId').attr('id').substring(6); - $scope.policy_ids.splice($scope.policy_ids.indexOf($("#formId" + formNum + " #id").val()), 1); - $scope.policy_ids.push($(event.target).val()); - // Update the tab now - $("#go_properties_tab" + formNum).text($(event.target).val()); - } + $scope.updateTabLabel = function (event) { + + // update policy id structure + var formNum = $(event.target).closest('.formId').attr('id').substring(6); + var policyId = $(event.target).val(); + if ($scope.policy_ids.includes(policyId)) { + console.log("Duplicated ID, cannot proceed"); + $scope.duplicated = true; + } else { + $scope.duplicated = false; + $scope.policy_ids.splice($scope.policy_ids.indexOf($("#formId" + formNum + " #id").val()), 1); + $scope.policy_ids.push($(event.target).val()); + // Update the tab now + $("#go_properties_tab" + formNum).text($(event.target).val()); + } + }; $scope.close = function() { console.log("close"); diff --git a/src/main/resources/META-INF/resources/designer/scripts/app.js b/src/main/resources/META-INF/resources/designer/scripts/app.js index 5597bd99..7dda8479 100644 --- a/src/main/resources/META-INF/resources/designer/scripts/app.js +++ b/src/main/resources/META-INF/resources/designer/scripts/app.js @@ -388,7 +388,7 @@ function($scope, $rootScope, $timeout, dialogs) { }; $scope.propertyExplorerErrorMessage = function(msg) { - var dlg = dialogs.notify('Error', msg); + dialogs.notify('Error', msg); } $scope.activityModelling = function() { @@ -505,7 +505,8 @@ function($scope, $rootScope, $timeout, dialogs) { cldsModelService.processAction(uiAction, modelName).then(function(pars) { console.log("cldsPerformAction: pars=" + pars); - cldsModelService.getModel(modelName).then(function(pars) { + cldsModelService.refreshStatus(modelName).then(function(pars) { + console.log("refreshStatus: pars=" + pars); $rootScope.refreshLoopLog(); }, function(data) { }); @@ -514,9 +515,10 @@ function($scope, $rootScope, $timeout, dialogs) { }; $scope.refreshStatus = function() { var modelName = selected_model; - console.log("refreStatus modelName=" + modelName); + console.log("refreshStatus modelName=" + modelName); cldsModelService.refreshStatus(modelName).then(function(pars) { - console.log("refreStatus: pars=" + pars); + console.log("refreshStatus: pars=" + pars); + $rootScope.refreshLoopLog(); }, function(data) { }); @@ -547,7 +549,7 @@ function($scope, $rootScope, $timeout, dialogs) { 'Are you sure you want to deploy the closed loop?'); confirm.result.then(function() { - cldsToggleDeploy("deploy"); + $scope.cldsPerformAction("deploy"); }); }); }; @@ -557,24 +559,12 @@ function($scope, $rootScope, $timeout, dialogs) { + uiAction.toLowerCase() + ' the closed loop?'); dlg.result.then(function(btn) { - cldsToggleDeploy(uiAction.toLowerCase()); + $scope.cldsPerformAction(uiAction.toLowerCase()); }, function(btn) { }); }; - function cldsToggleDeploy(uiAction) { - console.log("cldsPerformAction: " + uiAction + " modelName=" - + selected_model); - cldsModelService.toggleDeploy(uiAction, selected_model).then( - function(pars) { - cldsModelService.getModel(selected_model).then(function(pars) { - $rootScope.refreshLoopLog(); - }, function(data) { - }); - }, function(data) { - }); - - } + $scope.ToscaModelWindow = function (tosca_model) { var dlg = dialogs.create('partials/portfolios/tosca_model_properties.html','ToscaModelCtrl',{closable:true,draggable:true},{size:'lg',keyboard: true,backdrop: 'static',windowClass: 'my-class'}); diff --git a/src/main/resources/META-INF/resources/designer/scripts/propertyController.js b/src/main/resources/META-INF/resources/designer/scripts/propertyController.js index a8aa83c0..0323529e 100644 --- a/src/main/resources/META-INF/resources/designer/scripts/propertyController.js +++ b/src/main/resources/META-INF/resources/designer/scripts/propertyController.js @@ -91,30 +91,6 @@ function getMsUI(type) { return null; } -function getLastUpdatedStatus() { - return cl_props["lastComputedState"]; -} - -function setLastComputedState(status) { - cl_props["lastComputedState"] = status; -} - -function getDeploymentID() { - return cl_props["dcaeDeploymentId"]; -} - -function setDeploymentID(deploymentId) { - cl_props["dcaeDeploymentId"] = deploymentId; -} - -function getDeploymentStatusURL() { - return cl_props["dcaeDeploymentStatusUrl"]; -} - -function setDeploymentStatusURL(deploymentStatusURL) { - cl_props["dcaeDeploymentStatusUrl"] = deploymentStatusURL; -} - function getResourceDetailsVfProperty() { return cl_props["modelPropertiesJson"]["resourceDetails"]["VF"]; } @@ -127,4 +103,8 @@ function getLoopLogsArray() { return cl_props.loopLogs; } -module.exports = { getOperationalPolicyProperty,getGlobalProperty,getMsProperty,getMsUI,getLastUpdatedStatus,getDeploymentID,getDeploymentStatusURL,getResourceDetailsVfProperty,getResourceDetailsVfModuleProperty }; +function getComponentStates() { + return cl_props.components; +} + +module.exports = { getOperationalPolicyProperty,getGlobalProperty,getMsProperty,getMsUI,getResourceDetailsVfProperty,getResourceDetailsVfModuleProperty }; diff --git a/src/main/resources/clds/camel/rest/clamp-api-v2.xml b/src/main/resources/clds/camel/rest/clamp-api-v2.xml index da856e94..6ee44cad 100644 --- a/src/main/resources/clds/camel/rest/clamp-api-v2.xml +++ b/src/main/resources/clds/camel/rest/clamp-api-v2.xml @@ -193,7 +193,7 @@ </route> </post> <put - uri="/v2/loop/deployLoop/{loopName}" + uri="/v2/loop/deploy/{loopName}" outType="org.onap.clamp.loop.Loop" produces="application/json"> <route> @@ -211,28 +211,9 @@ <to uri="direct:load-loop" /> <to uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('DCAE DEPLOY request','INFO',${exchangeProperty[loopObject]})" /> - - <to uri="direct:get-status-from-policy" /> - <to uri="direct:get-status-from-dcae" /> - <log - loggingLevel="INFO" - message="Policy deployment status: ${exchangeProperty[policyStatus]}"></log> - <choice> - <when> - <simple> ${exchangeProperty[policyStatus]} == 'SUBMITTED' and - ${exchangeProperty[dcaeStatus]} == 'NOT_DEPLOYED' - </simple> - <to uri="direct:deploy-loop" /> - </when> - <otherwise> - <log - loggingLevel="INFO" - message="POLICY status ${exchangeProperty[policyStatus]}/DCAE status ${exchangeProperty[dcaeStatus]}, DCAE deployment will be started anyway" /> - <to - uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('POLICY status ${exchangeProperty[policyStatus]}/DCAE status ${exchangeProperty[dcaeStatus]}, DCAE deployment will be started anyway','ERROR',${exchangeProperty[loopObject]})" /> - <to uri="direct:deploy-loop" /> - </otherwise> - </choice> + + <to uri="direct:deploy-loop" /> + <log loggingLevel="INFO" message="DEPLOY request successfully executed for loop: ${header.loopName}" /> @@ -251,13 +232,13 @@ loggingLevel="ERROR" message="DEPLOY request failed for loop: ${header.loopName}" /> <to - uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('DEPLOY request failed, Error reported: ${exception}','ERROR',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('DEPLOY request failed, Error reported: ${exception} - Body: ${exception.responseBody}','ERROR',${exchangeProperty[loopObject]})" /> </doCatch> </doTry> </route> </put> <put - uri="/v2/loop/undeployLoop/{loopName}" + uri="/v2/loop/undeploy/{loopName}" outType="org.onap.clamp.loop.Loop" produces="application/json"> <route> @@ -275,21 +256,8 @@ <to uri="direct:load-loop" /> <to uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('DCAE UNDEPLOY request','INFO',${exchangeProperty[loopObject]})" /> - <to uri="direct:get-status-from-dcae" /> - <choice> - <when> - <simple> ${exchangeProperty[dcaeStatus]} == 'DEPLOYED' or ${exchangeProperty[dcaeStatus]} == 'IN_ERROR' or ${exchangeProperty[dcaeStatus]} == 'PROCESSING' - </simple> - <to uri="direct:undeploy-loop" /> - </when> - <otherwise> - <log - loggingLevel="INFO" - message="Loop is in state ${exchangeProperty[dcaeStatus]}, it can only be undeployed when in state DEPLOYED/IN_ERROR/PROCESSING" /> - <to - uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('Loop is in state ${exchangeProperty[dcaeStatus]}, it can only be deployed when in state DEPLOYED','ERROR',${exchangeProperty[loopObject]})" /> - </otherwise> - </choice> + <to uri="direct:undeploy-loop" /> + <log loggingLevel="INFO" message="UNDEPLOY request successfully executed for loop: ${header.loopName}" /> @@ -308,7 +276,7 @@ loggingLevel="ERROR" message="UNDEPLOY request failed for loop: ${header.loopName}" /> <to - uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('UNDEPLOY request failed, Error reported: ${exception}','ERROR',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('UNDEPLOY request failed, Error reported: ${exception} - Body: ${exception.responseBody}','ERROR',${exchangeProperty[loopObject]})" /> </doCatch> </doTry> </route> @@ -332,7 +300,7 @@ <to uri="direct:load-loop" /> <to uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('STOP request','INFO',${exchangeProperty[loopObject]})" /> - + <to uri="direct:remove-all-policy-from-active-pdp-group" /> <log loggingLevel="INFO" @@ -352,7 +320,7 @@ loggingLevel="ERROR" message="STOP request failed for loop: $${header.loopName}" /> <to - uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('STOP request failed, Error reported: ${exception}','ERROR',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('STOP request failed, Error reported: ${exception} - Body: ${exception.responseBody}','ERROR',${exchangeProperty[loopObject]})" /> </doCatch> </doTry> </route> @@ -397,7 +365,7 @@ loggingLevel="ERROR" message="RESTART request failed for loop: ${header.loopName}" /> <to - uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('RESTART request failed, Error reported: ${exception}','INFO',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('RESTART request failed, Error reported: ${exception} - Body: ${exception.responseBody}','INFO',${exchangeProperty[loopObject]})" /> </doCatch> </doTry> </route> @@ -483,6 +451,10 @@ </split> </split> + <delay> + <constant>3000</constant> + </delay> + <to uri="direct:add-all-to-active-pdp-group" /> <log @@ -503,7 +475,7 @@ loggingLevel="ERROR" message="SUBMIT request failed for loop: ${header.loopName}" /> <to - uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('SUBMIT request failed, Error reported: ${exception}','ERROR',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('SUBMIT request failed, Error reported: ${exception} - Body: ${exception.responseBody}','ERROR',${exchangeProperty[loopObject]})" /> </doCatch> </doTry> </route> @@ -524,6 +496,7 @@ <to uri="direct:load-loop" /> <to uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('DELETE request','INFO',${exchangeProperty[loopObject]})" /> + <to uri="direct:undeploy-loop" /> <to uri="direct:remove-all-policy-from-active-pdp-group" /> <split> <simple>${exchangeProperty[loopObject].getMicroServicePolicies()} @@ -585,7 +558,7 @@ loggingLevel="ERROR" message="DELETE request failed for loop: ${header.loopName}" /> <to - uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('DELETE request failed, Error reported: ${exception}','ERROR',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('DELETE request failed, Error reported: ${exception} - Body: ${exception.responseBody}','ERROR',${exchangeProperty[loopObject]})" /> </doCatch> </doTry> </route> @@ -609,20 +582,16 @@ <to uri="direct:load-loop" /> <to uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('GET STATUS request','INFO',${exchangeProperty[loopObject]})" /> - <setProperty propertyName="raiseHttpExceptionFlag"> - <simple resultType="java.lang.Boolean">false</simple> - </setProperty> - <to uri="direct:get-status-from-policy" /> - <to uri="direct:get-status-from-dcae" /> - <to - uri="bean:org.onap.clamp.loop.LoopOperation?method=updateLoopStatus(${exchangeProperty[loopObject]},${exchangeProperty[policyStatus]}, ${exchangeProperty[dcaeStatus]})" /> - <log - loggingLevel="INFO" - message="Get Status request successfully executed. The new state is: ${body}" /> - <to - uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('Get Status request successfully executed','INFO',${exchangeProperty[loopObject]})" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=endLog()" /> + <doTry> + <to uri="direct:update-policy-status-for-loop" /> + <to uri="direct:update-dcae-status-for-loop" /> + <to uri="direct:update-loop-state" /> + + <to + uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('Get Status request successfully executed','INFO',${exchangeProperty[loopObject]})" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=endLog()" /> + </doTry> <doCatch> <exception>java.lang.Exception</exception> <handled> @@ -634,11 +603,12 @@ loggingLevel="ERROR" message="Get Status request failed for loop: ${header.loopName}" /> <to - uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('Get Status request failed, Error reported: ${exception}','ERROR',${exchangeProperty[loopObject]})" /> + uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('Get Status request failed, Error reported: ${exception} - Body: ${exception.responseBody}','ERROR',${exchangeProperty[loopObject]})" /> </doCatch> <doFinally> - <to - uri="bean:org.onap.clamp.loop.LoopController?method=getLoop(${header.loopName})" /> + <setBody> + <simple>${exchangeProperty[loopObject]}</simple> + </setBody> </doFinally> </doTry> </route> diff --git a/src/main/resources/clds/camel/routes/dcae-flows.xml b/src/main/resources/clds/camel/routes/dcae-flows.xml new file mode 100644 index 00000000..395077a8 --- /dev/null +++ b/src/main/resources/clds/camel/routes/dcae-flows.xml @@ -0,0 +1,187 @@ +<routes xmlns="http://camel.apache.org/schema/spring"> + <route id="deploy-loop"> + <from uri="direct:deploy-loop" /> + <doTry> + <log + loggingLevel="INFO" + message="Deploying the loop: ${exchangeProperty[loopObject].getName()}" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Deploying the loop')" /> + <setBody> + <method + ref="org.onap.clamp.loop.components.external.DcaeComponent" + method="getDeployPayload(${exchangeProperty[loopObject]})" /> + </setBody> + <setProperty propertyName="dcaeDeploymentId"> + <method + ref="org.onap.clamp.loop.components.external.DcaeComponent" + method="generateDeploymentId()" /> + </setProperty> + <setHeader headerName="CamelHttpMethod"> + <constant>PUT</constant> + </setHeader> + <setHeader headerName="Content-Type"> + <constant>application/json</constant> + </setHeader> + <setHeader headerName="X-ONAP-RequestID"> + <simple>${exchangeProperty[X-ONAP-RequestID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-InvocationID"> + <simple>${exchangeProperty[X-ONAP-InvocationID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-PartnerName"> + <simple>${exchangeProperty[X-ONAP-PartnerName]} + </simple> + </setHeader> + <log + loggingLevel="INFO" + message="Endpoint to deploy loop: {{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[dcaeDeploymentId]}"></log> + <toD + uri="{{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[dcaeDeploymentId]}?bridgeEndpoint=true&useSystemProperties=true&mapHttpMessageHeaders=false&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&authUsername={{clamp.config.dcae.deployment.userName}}&authPassword={{clamp.config.dcae.deployment.password}}&connectionTimeToLive=5000&httpClient.connectTimeout=10000&httpClient.socketTimeout=300000&authenticationPreemptive=true&connectionClose=true" /> + <convertBodyTo type="java.lang.String" /> + <setProperty propertyName="dcaeResponse"> + <method + ref="org.onap.clamp.loop.components.external.DcaeComponent" + method="convertDcaeResponse(${body})" /> + </setProperty> + <setProperty propertyName="dcaeStatusUrl"> + <method + ref="org.onap.clamp.loop.components.external.DcaeComponent" + method="getStatusUrl(${exchangeProperty[dcaeResponse]})" /> + </setProperty> + <to + uri="bean:org.onap.clamp.loop.LoopService?method=updateDcaeDeploymentFields(${exchangeProperty[loopObject]},${exchangeProperty[dcaeDeploymentId]},${exchangeProperty[dcaeStatusUrl]})" /> + <doFinally> + <to uri="direct:reset-raise-http-exception-flag" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> + <setProperty propertyName="logMessage"> + <simple>DEPLOY loop status + (Dep-id:${exchangeProperty[dcaeDeploymentId]}, + StatusUrl:${exchangeProperty[dcaeStatusUrl]}) + </simple> + </setProperty> + <to uri="direct:dump-loop-log-http-response" /> + </doFinally> + </doTry> + </route> + + <route id="undeploy-loop"> + <from uri="direct:undeploy-loop" /> + <log + loggingLevel="INFO" + message="Undeploying the loop: ${exchangeProperty[loopObject].getName()} : ${exchangeProperty[loopObject].getDcaeDeploymentId()}" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Undeploying the loop')" /> + <choice> + <when> + <simple>${exchangeProperty[loopObject].getDcaeDeploymentId()} + != null + </simple> + <doTry> + <setBody> + <method + ref="org.onap.clamp.loop.components.external.DcaeComponent" + method="getUndeployPayload(${exchangeProperty[loopObject]})" /> + </setBody> + <setHeader headerName="CamelHttpMethod"> + <constant>DELETE</constant> + </setHeader> + <setHeader headerName="Content-Type"> + <constant>application/json</constant> + </setHeader> + + <setHeader headerName="X-ONAP-RequestID"> + <simple>${exchangeProperty[X-ONAP-RequestID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-InvocationID"> + <simple>${exchangeProperty[X-ONAP-InvocationID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-PartnerName"> + <simple>${exchangeProperty[X-ONAP-PartnerName]} + </simple> + </setHeader> + <log + loggingLevel="INFO" + message="Endpoint to undeploy loop: {{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[loopObject].getDcaeDeploymentId()}"></log> + <toD + uri="{{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[loopObject].getDcaeDeploymentId()}?bridgeEndpoint=true&useSystemProperties=true&mapHttpMessageHeaders=false&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&authUsername={{clamp.config.dcae.deployment.userName}}&authPassword={{clamp.config.dcae.deployment.password}}&connectionTimeToLive=5000&httpClient.connectTimeout=10000&httpClient.socketTimeout=300000&authenticationPreemptive=true&connectionClose=true" /> + <convertBodyTo type="java.lang.String" /> + <setProperty propertyName="dcaeResponse"> + <method + ref="org.onap.clamp.loop.components.external.DcaeComponent" + method="convertDcaeResponse(${body})" /> + </setProperty> + <setProperty propertyName="dcaeStatusUrl"> + <method + ref="org.onap.clamp.loop.components.external.DcaeComponent" + method="getStatusUrl(${exchangeProperty[dcaeResponse]})" /> + </setProperty> + <to + uri="bean:org.onap.clamp.loop.LoopService?method=updateDcaeDeploymentFields(${exchangeProperty[loopObject]},${exchangeProperty[loopObject].getDcaeDeploymentId()},${exchangeProperty[dcaeStatusUrl]})" /> + <doFinally> + <to uri="direct:reset-raise-http-exception-flag" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> + <setProperty propertyName="logMessage"> + <simple>UNDEPLOY loop status</simple> + </setProperty> + <to uri="direct:dump-loop-log-http-response" /> + </doFinally> + </doTry> + </when> + <otherwise> + <log + loggingLevel="WARNING" + message="Cannot Undeploy for the loop: ${exchangeProperty[loopObject].getName()}, the Deployment ID does not exist !" /> + <to + uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('Cannot Undeploy for the loop: ${exchangeProperty[loopObject].getName()}, the Deployment ID does not exist !','WARNING',${exchangeProperty[loopObject]})" /> + + </otherwise> + </choice> + </route> + <route id="get-dcae-deployment-status"> + <from uri="direct:get-dcae-deployment-status" /> + <log + loggingLevel="INFO" + message="Getting DCAE deployment status for loop: ${exchangeProperty[loopObject].getName()}" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Getting Deployment status')" /> + <doTry> + <setHeader headerName="CamelHttpMethod"> + <constant>GET</constant> + </setHeader> + <setHeader headerName="X-ONAP-RequestID"> + <simple>${exchangeProperty[X-ONAP-RequestID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-InvocationID"> + <simple>${exchangeProperty[X-ONAP-InvocationID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-PartnerName"> + <simple>${exchangeProperty[X-ONAP-PartnerName]} + </simple> + </setHeader> + <log + loggingLevel="INFO" + message="Endpoint to query Closed Loop status: ${exchangeProperty[loopObject].getDcaeDeploymentStatusUrl()}"></log> + <toD + uri="${exchangeProperty[loopObject].getDcaeDeploymentStatusUrl()}?bridgeEndpoint=true&useSystemProperties=true&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&authMethod=Basic&authUsername={{clamp.config.dcae.deployment.userName}}&authPassword={{clamp.config.dcae.deployment.password}}&connectionTimeToLive=5000&httpClient.connectTimeout=10000&httpClient.socketTimeout=30000&authenticationPreemptive=true&connectionClose=true" /> + <doFinally> + <to uri="direct:reset-raise-http-exception-flag" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> + <setProperty propertyName="logMessage"> + <simple>DCAE deployment status</simple> + </setProperty> + <to uri="direct:dump-loop-log-http-response" /> + </doFinally> + </doTry> + + </route> +</routes>
\ No newline at end of file diff --git a/src/main/resources/clds/camel/routes/flexible-flow.xml b/src/main/resources/clds/camel/routes/flexible-flow.xml index 1bad5fbb..bc79fc21 100644 --- a/src/main/resources/clds/camel/routes/flexible-flow.xml +++ b/src/main/resources/clds/camel/routes/flexible-flow.xml @@ -75,642 +75,4 @@ </when> </choice> </route> - - <route id="load-loop"> - <from uri="direct:load-loop" /> - <setBody> - <simple>${header.loopName}</simple> - </setBody> - <setProperty propertyName="loopObject"> - <method - ref="org.onap.clamp.loop.LoopService" - method="getLoop" /> - </setProperty> - - <when> - <simple>${exchangeProperty[loopObject]} == null</simple> - <setHeader headerName="CamelHttpResponseCode"> - <constant>404</constant> - </setHeader> - <log - loggingLevel="WARNING" - message="Loop not found in database: ${body}" /> - <stop /> - </when> - </route> - - <route id="create-micro-service-policy"> - <from uri="direct:create-micro-service-policy" /> - <doTry> - <log - loggingLevel="INFO" - message="Creating Micro Service Policy: ${exchangeProperty[microServicePolicy].getName()}" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Create Micro Service Policy')" /> - <setBody> - <simple>${exchangeProperty[microServicePolicy].createPolicyPayload()} - </simple> - </setBody> - <setHeader headerName="CamelHttpMethod"> - <constant>POST</constant> - </setHeader> - <setHeader headerName="Content-Type"> - <constant>application/json</constant> - </setHeader> - <setHeader headerName="X-ONAP-RequestID"> - <simple>${exchangeProperty[X-ONAP-RequestID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-InvocationID"> - <simple>${exchangeProperty[X-ONAP-InvocationID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-PartnerName"> - <simple>${exchangeProperty[X-ONAP-PartnerName]} - </simple> - </setHeader> - <log - loggingLevel="INFO" - message="Endpoint to create microservice policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[microServicePolicy].getModelType()}/versions/1.0.0/policies"></log> - <toD - uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[microServicePolicy].getModelType()}/versions/1.0.0/policies?bridgeEndpoint=true&useSystemProperties=true&mapHttpMessageHeaders=false&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&httpClient.connectTimeout=20000&httpClient.socketTimeout=20000&authUsername={{clamp.config.policy.api.userName}}&authPassword={{clamp.config.policy.api.password}}" /> - <doFinally> - <to uri="direct:reset-raise-http-exception-flag" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> - <setProperty propertyName="logMessage"> - <simple>${exchangeProperty[microServicePolicy].getName()} creation - status - </simple> - </setProperty> - <to uri="direct:dump-loop-log-http-response" /> - </doFinally> - </doTry> - </route> - - <route id="delete-micro-service-policy"> - <from uri="direct:delete-micro-service-policy" /> - <doTry> - <log - loggingLevel="INFO" - message="Deleting Micro Service Policy: ${exchangeProperty[microServicePolicy].getName()}" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Delete Micro Service Policy')" /> - <setBody> - <constant>null</constant> - </setBody> - <setHeader headerName="CamelHttpMethod"> - <constant>DELETE</constant> - </setHeader> - <setHeader headerName="X-ONAP-RequestID"> - <simple>${exchangeProperty[X-ONAP-RequestID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-InvocationID"> - <simple>${exchangeProperty[X-ONAP-InvocationID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-PartnerName"> - <simple>${exchangeProperty[X-ONAP-PartnerName]} - </simple> - </setHeader> - <log - loggingLevel="INFO" - message="Endpoint to delete microservice policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[microServicePolicy].getModelType()}/versions/1.0.0/policies/${exchangeProperty[microServicePolicy].getName()}/versions/1.0.0"></log> - <toD - uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[microServicePolicy].getModelType()}/versions/1.0.0/policies/${exchangeProperty[microServicePolicy].getName()}/versions/1.0.0?bridgeEndpoint=true&useSystemProperties=true&mapHttpMessageHeaders=false&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&httpClient.connectTimeout=20000&httpClient.socketTimeout=20000&deleteWithBody=false&mapHttpMessageBody=false&mapHttpMessageFormUrlEncodedBody=false&authUsername={{clamp.config.policy.api.userName}}&authPassword={{clamp.config.policy.api.password}}" /> - - <doFinally> - <to uri="direct:reset-raise-http-exception-flag" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> - <setProperty propertyName="logMessage"> - <simple>${exchangeProperty[microServicePolicy].getName()} removal - status - </simple> - </setProperty> - <to uri="direct:dump-loop-log-http-response" /> - </doFinally> - </doTry> - </route> - - <route id="create-operational-policy"> - <from uri="direct:create-operational-policy" /> - <doTry> - <log - loggingLevel="INFO" - message="Creating Operational Policy: ${exchangeProperty[operationalPolicy].getName()}" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Create Operational Policy')" /> - <setBody> - <simple>${exchangeProperty[operationalPolicy].createPolicyPayload()} - </simple> - </setBody> - <setHeader headerName="CamelHttpMethod"> - <constant>POST</constant> - </setHeader> - <setHeader headerName="Content-Type"> - <constant>application/json</constant> - </setHeader> - <setHeader headerName="X-ONAP-RequestID"> - <simple>${exchangeProperty[X-ONAP-RequestID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-InvocationID"> - <simple>${exchangeProperty[X-ONAP-InvocationID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-PartnerName"> - <simple>${exchangeProperty[X-ONAP-PartnerName]} - </simple> - </setHeader> - <log - loggingLevel="INFO" - message="Endpoint to create operational policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies"></log> - <toD - uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies?bridgeEndpoint=true&useSystemProperties=true&mapHttpMessageHeaders=false&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&httpClient.connectTimeout=20000&httpClient.socketTimeout=20000&authUsername={{clamp.config.policy.api.userName}}&authPassword={{clamp.config.policy.api.password}}" /> - <doFinally> - <to uri="direct:reset-raise-http-exception-flag" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> - <setProperty propertyName="logMessage"> - <simple>${exchangeProperty[operationalPolicy].getName()} creation - status - </simple> - </setProperty> - <to uri="direct:dump-loop-log-http-response" /> - </doFinally> - </doTry> - </route> - - <route id="delete-operational-policy"> - <from uri="direct:delete-operational-policy" /> - <doTry> - <log - loggingLevel="INFO" - message="Deleting Operational Policy: ${exchangeProperty[operationalPolicy].getName()}" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Delete Operational Policy')" /> - <setBody> - <constant>null</constant> - </setBody> - <setHeader headerName="CamelHttpMethod"> - <constant>DELETE</constant> - </setHeader> - <setHeader headerName="X-ONAP-RequestID"> - <simple>${exchangeProperty[X-ONAP-RequestID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-InvocationID"> - <simple>${exchangeProperty[X-ONAP-InvocationID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-PartnerName"> - <simple>${exchangeProperty[X-ONAP-PartnerName]} - </simple> - </setHeader> - <log - loggingLevel="INFO" - message="Endpoint to delete operational policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies/${exchangeProperty[operationalPolicy].getName()}/versions/1"></log> - <toD - uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies/${exchangeProperty[operationalPolicy].getName()}/versions/1?bridgeEndpoint=true&useSystemProperties=true&mapHttpMessageHeaders=false&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&httpClient.connectTimeout=20000&httpClient.socketTimeout=20000&deleteWithBody=false&mapHttpMessageBody=false&mapHttpMessageFormUrlEncodedBody=false&authUsername={{clamp.config.policy.api.userName}}&authPassword={{clamp.config.policy.api.password}}" /> - <doFinally> - <to uri="direct:reset-raise-http-exception-flag" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> - <setProperty propertyName="logMessage"> - <simple>${exchangeProperty[operationalPolicy].getName()} removal - status - </simple> - </setProperty> - <to uri="direct:dump-loop-log-http-response" /> - </doFinally> - </doTry> - </route> - - <route id="create-guard-policy"> - <from uri="direct:create-guard-policy" /> - <doTry> - <log - loggingLevel="INFO" - message="Creating Guard Policy: ${exchangeProperty[guardPolicy].getKey()}" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Create Guard Policy')" /> - <setBody> - <simple>${exchangeProperty[guardPolicy].getValue()} - </simple> - </setBody> - <setHeader headerName="CamelHttpMethod"> - <constant>POST</constant> - </setHeader> - <setHeader headerName="Content-Type"> - <constant>application/json</constant> - </setHeader> - <setHeader headerName="X-ONAP-RequestID"> - <simple>${exchangeProperty[X-ONAP-RequestID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-InvocationID"> - <simple>${exchangeProperty[X-ONAP-InvocationID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-PartnerName"> - <simple>${exchangeProperty[X-ONAP-PartnerName]} - </simple> - </setHeader> - <log - loggingLevel="INFO" - message="Endpoint to create guard policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies"></log> - <toD - uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies?bridgeEndpoint=true&useSystemProperties=true&mapHttpMessageHeaders=false&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&httpClient.connectTimeout=20000&httpClient.socketTimeout=20000&authUsername={{clamp.config.policy.api.userName}}&authPassword={{clamp.config.policy.api.password}}" /> - <doFinally> - <to uri="direct:reset-raise-http-exception-flag" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> - <setProperty propertyName="logMessage"> - <simple>${exchangeProperty[guardPolicy].getKey()} creation status - </simple> - </setProperty> - <to uri="direct:dump-loop-log-http-response" /> - </doFinally> - </doTry> - </route> - - <route id="delete-guard-policy"> - <from uri="direct:delete-guard-policy" /> - <doTry> - <log - loggingLevel="INFO" - message="Deleting Guard Policy: ${exchangeProperty[guardPolicy].getKey()}" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Delete Guard Policy')" /> - <setBody> - <constant>null</constant> - </setBody> - <setHeader headerName="CamelHttpMethod"> - <constant>DELETE</constant> - </setHeader> - <setHeader headerName="X-ONAP-RequestID"> - <simple>${exchangeProperty[X-ONAP-RequestID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-InvocationID"> - <simple>${exchangeProperty[X-ONAP-InvocationID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-PartnerName"> - <simple>${exchangeProperty[X-ONAP-PartnerName]} - </simple> - </setHeader> - <log - loggingLevel="INFO" - message="Endpoint to delete guard policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/${exchangeProperty[guardPolicy].getKey()}/versions/1"></log> - <toD - uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/${exchangeProperty[guardPolicy].getKey()}/versions/1?bridgeEndpoint=true&useSystemProperties=true&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&httpClient.connectTimeout=20000&httpClient.socketTimeout=20000&deleteWithBody=false&mapHttpMessageBody=false&mapHttpMessageFormUrlEncodedBody=false&authUsername={{clamp.config.policy.api.userName}}&authPassword={{clamp.config.policy.api.password}}" /> - - <doFinally> - <to uri="direct:reset-raise-http-exception-flag" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> - <setProperty propertyName="logMessage"> - <simple>${exchangeProperty[guardPolicy].getKey()} removal status - </simple> - </setProperty> - <to uri="direct:dump-loop-log-http-response" /> - </doFinally> - </doTry> - </route> - - <route id="add-all-to-active-pdp-group"> - <from uri="direct:add-all-to-active-pdp-group" /> - <doTry> - <log - loggingLevel="INFO" - message="Adding loop policies to PDP Group: ${exchangeProperty[loopObject].getName()}" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Add policies to PDP group')" /> - <setBody> - <simple>${exchangeProperty[loopObject].createPoliciesPayloadPdpGroup()} - </simple> - </setBody> - <setHeader headerName="CamelHttpMethod"> - <constant>POST</constant> - </setHeader> - <setHeader headerName="Content-Type"> - <constant>application/json</constant> - </setHeader> - <setHeader headerName="X-ONAP-RequestID"> - <simple>${exchangeProperty[X-ONAP-RequestID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-InvocationID"> - <simple>${exchangeProperty[X-ONAP-InvocationID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-PartnerName"> - <simple>${exchangeProperty[X-ONAP-PartnerName]} - </simple> - </setHeader> - <log - loggingLevel="INFO" - message="Endpoint to add policies to PDP Group: {{clamp.config.policy.pap.url}}/policy/pap/v1/pdps/policies"></log> - <toD - uri="{{clamp.config.policy.pap.url}}/policy/pap/v1/pdps/policies?bridgeEndpoint=true&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&httpClient.connectTimeout=20000&httpClient.socketTimeout=20000&useSystemProperties=true&authUsername={{clamp.config.policy.pap.userName}}&authPassword={{clamp.config.policy.pap.password}}" /> - - <doFinally> - <to uri="direct:reset-raise-http-exception-flag" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> - <setProperty propertyName="logMessage"> - <simple>PDP Group push ALL status</simple> - </setProperty> - <to uri="direct:dump-loop-log-http-response" /> - </doFinally> - </doTry> - </route> - - <route id="remove-all-policy-from-active-pdp-group"> - <from uri="direct:remove-all-policy-from-active-pdp-group" /> - <doTry> - <log - loggingLevel="INFO" - message="Removing policies from active PDP group for loop: ${exchangeProperty[loopObject].getName()}" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Removing policies PDP group')" /> - <split> - <simple>${exchangeProperty[loopObject].listPolicyNamesPdpGroup()} - </simple> - <setProperty propertyName="policyName"> - <simple>${body}</simple> - </setProperty> - <setBody> - <constant>null</constant> - </setBody> - <setHeader headerName="CamelHttpMethod"> - <constant>DELETE</constant> - </setHeader> - <setHeader headerName="X-ONAP-RequestID"> - <simple>${exchangeProperty[X-ONAP-RequestID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-InvocationID"> - <simple>${exchangeProperty[X-ONAP-InvocationID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-PartnerName"> - <simple>${exchangeProperty[X-ONAP-PartnerName]} - </simple> - </setHeader> - <log - loggingLevel="INFO" - message="Endpoint to delete policy from PDP Group: {{clamp.config.policy.pap.url}}/pdps/policies/${exchangeProperty[policyName]}/versions/1.0.0"></log> - <toD - uri="{{clamp.config.policy.pap.url}}/policy/pap/v1/pdps/policies/${exchangeProperty[policyName]}/versions/1.0.0?bridgeEndpoint=true&useSystemProperties=true&mapHttpMessageHeaders=false&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&httpClient.connectTimeout=20000&httpClient.socketTimeout=20000&authUsername={{clamp.config.policy.pap.userName}}&authPassword={{clamp.config.policy.pap.password}}" /> - <setProperty propertyName="logMessage"> - <simple>${exchangeProperty[policyName]} PDP Group removal status - </simple> - </setProperty> - <to uri="direct:dump-loop-log-http-response" /> - </split> - <doCatch> - <exception>java.lang.Exception</exception> - <handled> - <constant>false</constant> - </handled> - <setProperty propertyName="logMessage"> - <simple>PDP Group removal, Error reported: ${exception}</simple> - </setProperty> - <to uri="direct:dump-loop-log-http-response" /> - </doCatch> - <doFinally> - <to uri="direct:reset-raise-http-exception-flag" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> - </doFinally> - </doTry> - </route> - <route id="deploy-loop"> - <from uri="direct:deploy-loop" /> - <doTry> - <log - loggingLevel="INFO" - message="Deploying the loop: ${exchangeProperty[loopObject].getName()}" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Deploying the loop')" /> - <setBody> - <method ref="org.onap.clamp.loop.LoopOperation" - method="getDeployPayload(${exchangeProperty[loopObject]})" /> - </setBody> - <setProperty propertyName="deploymentId"> - <method ref="org.onap.clamp.loop.LoopOperation" - method="getDeploymentId(${exchangeProperty[loopObject]})" /> - </setProperty> - <setHeader headerName="CamelHttpMethod"> - <constant>PUT</constant> - </setHeader> - <setHeader headerName="Content-Type"> - <constant>application/json</constant> - </setHeader> - <setHeader headerName="X-ONAP-RequestID"> - <simple>${exchangeProperty[X-ONAP-RequestID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-InvocationID"> - <simple>${exchangeProperty[X-ONAP-InvocationID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-PartnerName"> - <simple>${exchangeProperty[X-ONAP-PartnerName]} - </simple> - </setHeader> - <log - loggingLevel="INFO" - message="Endpoint to deploy loop: {{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[deploymentId]}"></log> - <toD - uri="{{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[deploymentId]}?bridgeEndpoint=true&useSystemProperties=true&mapHttpMessageHeaders=false&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&httpClient.connectTimeout=20000&httpClient.socketTimeout=20000&authUsername={{clamp.config.dcae.deployment.userName}}&authPassword={{clamp.config.dcae.deployment.password}}" /> - <to - uri="bean:org.onap.clamp.loop.LoopOperation?method=updateLoopInfo(*,${exchangeProperty[loopObject]},${exchangeProperty[deploymentId]})" /> - <doFinally> - <to uri="direct:reset-raise-http-exception-flag" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> - <setProperty propertyName="logMessage"> - <simple>DEPLOY loop status (id:${exchangeProperty[deploymentId]})</simple> - </setProperty> - <to uri="direct:dump-loop-log-http-response" /> - </doFinally> - </doTry> - </route> - - <route id="undeploy-loop"> - <from uri="direct:undeploy-loop" /> - <doTry> - <log - loggingLevel="INFO" - message="Undeploying the loop: ${exchangeProperty[loopObject].getName()} : ${exchangeProperty[loopObject].getDcaeDeploymentId()}" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('DCAE', 'Undeploying the loop')" /> - - <setBody> - <simple>{\"serviceTypeId\": \"${exchangeProperty[loopObject].getDcaeBlueprintId()}\"} - </simple> - </setBody> - <setHeader headerName="CamelHttpMethod"> - <constant>DELETE</constant> - </setHeader> - <setHeader headerName="Content-Type"> - <constant>application/json</constant> - </setHeader> - <setHeader headerName="X-ONAP-RequestID"> - <simple>${exchangeProperty[X-ONAP-RequestID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-InvocationID"> - <simple>${exchangeProperty[X-ONAP-InvocationID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-PartnerName"> - <simple>${exchangeProperty[X-ONAP-PartnerName]} - </simple> - </setHeader> - <log - loggingLevel="INFO" - message="Endpoint to undeploy loop: {{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[loopObject].getDcaeDeploymentId()}"></log> - <toD - uri="{{clamp.config.dcae.deployment.url}}/dcae-deployments/${exchangeProperty[loopObject].getDcaeDeploymentId()}?bridgeEndpoint=true&useSystemProperties=true&mapHttpMessageHeaders=false&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&httpClient.connectTimeout=20000&httpClient.socketTimeout=20000&authUsername={{clamp.config.dcae.deployment.userName}}&authPassword={{clamp.config.dcae.deployment.password}}" /> - <to - uri="bean:org.onap.clamp.loop.LoopOperation?method=updateLoopInfo(*,${exchangeProperty[loopObject]},null)" /> - <doFinally> - <to uri="direct:reset-raise-http-exception-flag" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> - <setProperty propertyName="logMessage"> - <simple>UNDEPLOY loop status</simple> - </setProperty> - <to uri="direct:dump-loop-log-http-response" /> - </doFinally> - </doTry> - </route> - <route id="get-status-from-policy"> - <from uri="direct:get-status-from-policy" /> - <doTry> - <log - loggingLevel="INFO" - message="Query Closed Loop status from policy PDP: ${exchangeProperty[loopObject].getName()}" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Query operational policies to PDP group')" /> - <setProperty propertyName="operationalPolicyName"> - <method ref="org.onap.clamp.loop.LoopOperation" - method="getOperationalPolicyName(${exchangeProperty[loopObject]})" /> - </setProperty> - <setHeader headerName="CamelHttpMethod"> - <constant>GET</constant> - </setHeader> - <setHeader headerName="X-ONAP-RequestID"> - <simple>${exchangeProperty[X-ONAP-RequestID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-InvocationID"> - <simple>${exchangeProperty[X-ONAP-InvocationID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-PartnerName"> - <simple>${exchangeProperty[X-ONAP-PartnerName]} - </simple> - </setHeader> - <log - loggingLevel="INFO" - message="Endpoint to query from Policy PDP: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies/${exchangeProperty[operationalPolicyName]}/versions/deployed"></log> - <toD - uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies/${exchangeProperty[operationalPolicyName]}/versions/deployed?bridgeEndpoint=true&useSystemProperties=true&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&httpClient.connectTimeout=20000&httpClient.socketTimeout=20000&authMethod=Basic&authUsername={{clamp.config.policy.pap.userName}}&authPassword={{clamp.config.policy.pap.password}}" /> - <doFinally> - <to uri="direct:reset-raise-http-exception-flag" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> - <setProperty propertyName="logMessage"> - <simple>Policy deployment status</simple> - </setProperty> - <setProperty propertyName="policyStatus"> - <method ref="org.onap.clamp.loop.LoopOperation" - method="analysePolicyResponse(${header.CamelHttpResponseCode})" /> - </setProperty> - <to uri="direct:dump-loop-log-http-response" /> - </doFinally> - </doTry> - </route> - <route id="get-status-from-dcae"> - <from uri="direct:get-status-from-dcae" /> - <log - loggingLevel="INFO" - message="Query Closed Loop status from DCAE ${exchangeProperty[loopObject].getName()}" /> - <choice> - <when> - <simple>${exchangeProperty[loopObject].getDcaeDeploymentStatusUrl()} == null - </simple> - <setProperty propertyName="dcaeStatus"> - <method ref="org.onap.clamp.loop.LoopOperation" - method="analyseDcaeResponse(*,null)" /> - </setProperty> - <log - loggingLevel="INFO" - message="dcae status: ${exchangeProperty[dcaeStatus]}"></log> - </when> - <otherwise> - <doTry> - <log - loggingLevel="INFO" - message="Query Closed Loop status from Dcae" /> - <setHeader headerName="CamelHttpMethod"> - <constant>GET</constant> - </setHeader> - <setHeader headerName="X-ONAP-RequestID"> - <simple>${exchangeProperty[X-ONAP-RequestID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-InvocationID"> - <simple>${exchangeProperty[X-ONAP-InvocationID]} - </simple> - </setHeader> - <setHeader headerName="X-ONAP-PartnerName"> - <simple>${exchangeProperty[X-ONAP-PartnerName]} - </simple> - </setHeader> - <log - loggingLevel="INFO" - message="Endpoint to query Closed Loop status: ${exchangeProperty[loopObject].getDcaeDeploymentStatusUrl()}"></log> - <toD - uri="${exchangeProperty[loopObject].getDcaeDeploymentStatusUrl()}?bridgeEndpoint=true&useSystemProperties=true&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&httpClient.connectTimeout=20000&httpClient.socketTimeout=20000&authMethod=Basic&authUsername={{clamp.config.dcae.deployment.userName}}&authPassword={{clamp.config.dcae.deployment.password}}" /> - <doFinally> - <to uri="direct:reset-raise-http-exception-flag" /> - <to - uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> - <setProperty propertyName="logMessage"> - <simple>DCAE deployment status</simple> - </setProperty> - <setProperty propertyName="dcaeStatus"> - <method ref="org.onap.clamp.loop.LoopOperation" - method="analyseDcaeResponse(*,${header.CamelHttpResponseCode})" /> - </setProperty> - <log - loggingLevel="INFO" - message="dcae status: ${exchangeProperty[dcaeStatus]}"></log> - <to uri="direct:dump-loop-log-http-response" /> - </doFinally> - </doTry> - </otherwise> - </choice> - </route> - <route id="reset-raise-http-exception-flag"> - <from uri="direct:reset-raise-http-exception-flag" /> - <setProperty propertyName="raiseHttpExceptionFlag"> - <simple resultType="java.lang.Boolean">true</simple> - </setProperty> - </route> - - <route id="dump-loop-log-http-response"> - <from uri="direct:dump-loop-log-http-response" /> - <log loggingLevel="INFO" message="${exchangeProperty[logMessage]} - ${header.CamelHttpResponseCode} : ${header.CamelHttpResponseText}" /> - <to - uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('${exchangeProperty[logMessage]} - ${header.CamelHttpResponseCode} : ${header.CamelHttpResponseText}','INFO',${exchangeProperty[loopObject]})" /> - </route> </routes>
\ No newline at end of file diff --git a/src/main/resources/clds/camel/routes/loop-flows.xml b/src/main/resources/clds/camel/routes/loop-flows.xml new file mode 100644 index 00000000..ede899e7 --- /dev/null +++ b/src/main/resources/clds/camel/routes/loop-flows.xml @@ -0,0 +1,250 @@ +<routes xmlns="http://camel.apache.org/schema/spring"> + <route id="load-loop"> + <from uri="direct:load-loop" /> + <setBody> + <simple>${header.loopName}</simple> + </setBody> + <setProperty propertyName="loopObject"> + <method + ref="org.onap.clamp.loop.LoopService" + method="getLoop" /> + </setProperty> + + <when> + <simple>${exchangeProperty[loopObject]} == null</simple> + <setHeader headerName="CamelHttpResponseCode"> + <constant>404</constant> + </setHeader> + <log + loggingLevel="WARNING" + message="Loop not found in database: ${body}" /> + <stop /> + </when> + </route> + <route id="update-policy-status-for-loop"> + <from uri="direct:update-policy-status-for-loop" /> + <setProperty propertyName="atLeastOnePolicyNotFound"> + <simple resultType="java.lang.Boolean">false</simple> + </setProperty> + <setProperty propertyName="atLeastOnePolicyNotDeployed"> + <simple resultType="java.lang.Boolean">false</simple> + </setProperty> + <setProperty propertyName="policyComponent"> + <simple>${exchangeProperty[loopObject].getComponent('POLICY')} + </simple> + </setProperty> + <log + loggingLevel="INFO" + message="Processing all MICRO-SERVICES policies defined in loop ${exchangeProperty[loopObject].getName()}" /> + <split> + <simple>${exchangeProperty[loopObject].getMicroServicePolicies()} + </simple> + <setProperty propertyName="policyName"> + <simple>${body.getName()}</simple> + </setProperty> + <setProperty propertyName="policyType"> + <simple>${body.getModelType()}</simple> + </setProperty> + <setBody> + <constant>null</constant> + </setBody> + <log + loggingLevel="INFO" + message="Processing Micro Service Policy: ${exchangeProperty[policyName]} of type ${exchangeProperty[policyType]}" /> + <setProperty propertyName="raiseHttpExceptionFlag"> + <simple resultType="java.lang.Boolean">false</simple> + </setProperty> + <to uri="direct:get-policy" /> + <when> + <simple> ${header.CamelHttpResponseCode} != 200 </simple> + <setProperty propertyName="atLeastOnePolicyNotFound"> + <simple resultType="java.lang.Boolean">true</simple> + </setProperty> + </when> + <to uri="direct:get-deployment-policy" /> + <when> + <simple> ${header.CamelHttpResponseCode} != 200 </simple> + <setProperty propertyName="atLeastOnePolicyNotDeployed"> + <simple resultType="java.lang.Boolean">true</simple> + </setProperty> + </when> + </split> + <log + loggingLevel="INFO" + message="Processing all OPERATIONAL policies defined in loop ${exchangeProperty[loopObject].getName()}" /> + <split> + <simple>${exchangeProperty[loopObject].getOperationalPolicies()} + </simple> + <setProperty propertyName="policyName"> + <simple>${body.getName()}</simple> + </setProperty> + <setProperty propertyName="policyType"> + <simple>onap.policies.controlloop.Operational</simple> + </setProperty> + <setProperty propertyName="operationalPolicy"> + <simple>${body}</simple> + </setProperty> + <setBody> + <constant>null</constant> + </setBody> + <log + loggingLevel="INFO" + message="Processing Micro Service Policy: ${exchangeProperty[policyName]} of type ${exchangeProperty[policyType]}" /> + <setProperty propertyName="raiseHttpExceptionFlag"> + <simple resultType="java.lang.Boolean">false</simple> + </setProperty> + <to uri="direct:get-policy" /> + <when> + <simple> ${header.CamelHttpResponseCode} != 200 </simple> + <setProperty propertyName="atLeastOnePolicyNotFound"> + <simple resultType="java.lang.Boolean">true</simple> + </setProperty> + </when> + <to uri="direct:get-deployment-policy" /> + <when> + <simple> ${header.CamelHttpResponseCode} != 200 </simple> + <setProperty propertyName="atLeastOnePolicyNotDeployed"> + <simple resultType="java.lang.Boolean">true</simple> + </setProperty> + </when> + + <log + loggingLevel="INFO" + message="Processing all GUARD policies defined in loop ${exchangeProperty[loopObject].getName()}" /> + <split> + <simple>${exchangeProperty[operationalPolicy].createGuardPolicyPayloads().entrySet()} + </simple> + <setProperty propertyName="policyName"> + <simple>${body.getKey()}</simple> + </setProperty> + <setProperty propertyName="policyType"> + <simple>onap.policies.controlloop.Guard</simple> + </setProperty> + <setBody> + <constant>null</constant> + </setBody> + <log + loggingLevel="INFO" + message="Processing Guard Policy: ${exchangeProperty[policyName]} of type ${exchangeProperty[policyType]}" /> + <setProperty propertyName="raiseHttpExceptionFlag"> + <simple resultType="java.lang.Boolean">false</simple> + </setProperty> + <to uri="direct:get-policy" /> + <when> + <simple> ${header.CamelHttpResponseCode} != 200 </simple> + <setProperty propertyName="atLeastOnePolicyNotFound"> + <simple resultType="java.lang.Boolean">true</simple> + </setProperty> + </when> + <to uri="direct:get-deployment-policy" /> + <when> + <simple> ${header.CamelHttpResponseCode} != 200 </simple> + <setProperty propertyName="atLeastOnePolicyNotDeployed"> + <simple resultType="java.lang.Boolean">true</simple> + </setProperty> + </when> + </split> + </split> + <setProperty propertyName="policyState"> + <simple> ${exchangeProperty[policyComponent].computeState(*)} + </simple> + </setProperty> + <log + loggingLevel="INFO" + message="Policy state set to: ${exchangeProperty[policyState].getStateName()}" /> + <to + uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLogForComponent('Policy state set to: ${exchangeProperty[policyState].getStateName()}','INFO','POLICY',${exchangeProperty[loopObject]})" /> + </route> + <route id="update-dcae-status-for-loop"> + <from uri="direct:update-dcae-status-for-loop" /> + <log + loggingLevel="INFO" + message="Updating DCAE status for loop: ${exchangeProperty[loopObject].getName()}" /> + <setProperty propertyName="dcaeComponent"> + <simple>${exchangeProperty[loopObject].getComponent('DCAE')}</simple> + </setProperty> + <when> + <simple>${exchangeProperty[loopObject].getDcaeDeploymentStatusUrl()} + != null + </simple> + <setProperty propertyName="raiseHttpExceptionFlag"> + <simple resultType="java.lang.Boolean">false</simple> + </setProperty> + <to uri="direct:get-dcae-deployment-status" /> + <when> + <simple> ${header.CamelHttpResponseCode} == 200 </simple> + <convertBodyTo type="java.lang.String" /> + <setProperty propertyName="dcaeResponse"> + <method + ref="org.onap.clamp.loop.components.external.DcaeComponent" + method="convertDcaeResponse(${body})" /> + </setProperty> + </when> + </when> + + <setProperty propertyName="dcaeState"> + <simple> ${exchangeProperty[dcaeComponent].computeState(*)} + </simple> + </setProperty> + <log + loggingLevel="INFO" + message="DCAE state set to: ${exchangeProperty[dcaeState].getStateName()} - DCAE message: ${exchangeProperty[dcaeResponse].getError()}" /> + <to + uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLogForComponent('DCAE state set to: ${exchangeProperty[dcaeState].getStateName()} - message: ${exchangeProperty[dcaeResponse].getError()}','INFO','DCAE',${exchangeProperty[loopObject]})" /> + + </route> + <route id="direct:update-loop-state"> + <from uri="direct:update-loop-state" /> + <log + loggingLevel="INFO" + message="Updating status for loop: ${exchangeProperty[loopObject].getName()}" /> + <choice> + <when> + <simple>${exchangeProperty['dcaeState'].getStateName()} == 'BLUEPRINT_DEPLOYED' and ${exchangeProperty['policyState'].getStateName()} == 'NOT_SENT'</simple> + <to + uri="bean:org.onap.clamp.loop.LoopService?method=updateLoopState(${exchangeProperty[loopObject]},'DESIGN')" /> + </when> + <when> + <simple>${exchangeProperty['dcaeState'].getStateName()} == 'IN_ERROR' or ${exchangeProperty['dcaeState'].getStateName()} == 'MICROSERVICE_INSTALLATION_FAILED'</simple> + <to + uri="bean:org.onap.clamp.loop.LoopService?method=updateLoopState(${exchangeProperty[loopObject]},'IN_ERROR')" /> + </when> + <when> + <simple>${exchangeProperty['dcaeState'].getStateName()} == 'MICROSERVICE_UNINSTALLATION_FAILED' or ${exchangeProperty['policyState'].getStateName()} == 'IN_ERROR'</simple> + <to + uri="bean:org.onap.clamp.loop.LoopService?method=updateLoopState(${exchangeProperty[loopObject]},'IN_ERROR')" /> + </when> + <when> + <simple>${exchangeProperty['dcaeState'].getStateName()} == 'MICROSERVICE_INSTALLED_SUCCESSFULLY' and ${exchangeProperty['policyState'].getStateName()} == 'SENT_AND_DEPLOYED'</simple> + <to + uri="bean:org.onap.clamp.loop.LoopService?method=updateLoopState(${exchangeProperty[loopObject]},'RUNNING')" /> + </when> + <when> + <simple>${exchangeProperty['dcaeState'].getStateName()} == 'MICROSERVICE_INSTALLED_SUCCESSFULLY' and ${exchangeProperty['policyState'].getStateName()} == 'SENT'</simple> + <to + uri="bean:org.onap.clamp.loop.LoopService?method=updateLoopState(${exchangeProperty[loopObject]},'STOPPED')" /> + </when> + <when> + <simple>${exchangeProperty['dcaeState'].getStateName()} == 'BLUEPRINT_DEPLOYED' or ${exchangeProperty['dcaeState'].getStateName()} == 'MICROSERVICE_UNINSTALLED_SUCCESSFULLY' and ${exchangeProperty['policyState'].getStateName()} == 'SENT_AND_DEPLOYED'</simple> + <to + uri="bean:org.onap.clamp.loop.LoopService?method=updateLoopState(${exchangeProperty[loopObject]},'SUBMITTED')" /> + </when> + <when> + <simple>${exchangeProperty['dcaeState'].getStateName()} == 'PROCESSING_MICROSERVICE_INSTALLATION' or ${exchangeProperty['dcaeState'].getStateName()} == 'PROCESSING_MICROSERVICE_UNINSTALLATION' and ${exchangeProperty['policyState'].getStateName()} == 'SENT_AND_DEPLOYED'</simple> + <to + uri="bean:org.onap.clamp.loop.LoopService?method=updateLoopState(${exchangeProperty[loopObject]},'WAITING')" /> + </when> + <when> + <simple>${exchangeProperty['dcaeState'].getStateName()} == 'MICROSERVICE_INSTALLED_SUCCESSFULLY' and ${exchangeProperty['policyState'].getStateName()} != 'NOT_SENT'</simple> + <to + uri="bean:org.onap.clamp.loop.LoopService?method=updateLoopState(${exchangeProperty[loopObject]},'DEPLOYED')" /> + </when> + </choice> + <log + loggingLevel="INFO" + message="New loop state is: ${exchangeProperty[loopObject].getLastComputedState().toString()}" /> + <to + uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('New loop state is: ${exchangeProperty[loopObject].getLastComputedState().toString()}','INFO',${exchangeProperty[loopObject]})" /> + + </route> +</routes>
\ No newline at end of file diff --git a/src/main/resources/clds/camel/routes/policy-flows.xml b/src/main/resources/clds/camel/routes/policy-flows.xml new file mode 100644 index 00000000..537354f1 --- /dev/null +++ b/src/main/resources/clds/camel/routes/policy-flows.xml @@ -0,0 +1,476 @@ + +<routes xmlns="http://camel.apache.org/schema/spring"> + <route id="get-policy"> + <from uri="direct:get-policy" /> + <doTry> + <log + loggingLevel="INFO" + message="Getting Policy: ${exchangeProperty[policyName]}" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Get Policy')" /> + <setHeader headerName="CamelHttpMethod"> + <constant>GET</constant> + </setHeader> + <setHeader headerName="X-ONAP-RequestID"> + <simple>${exchangeProperty[X-ONAP-RequestID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-InvocationID"> + <simple>${exchangeProperty[X-ONAP-InvocationID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-PartnerName"> + <simple>${exchangeProperty[X-ONAP-PartnerName]} + </simple> + </setHeader> + <log + loggingLevel="INFO" + message="Endpoint to get policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policyType]}/versions/1.0.0/policies/${exchangeProperty[policyName]}/versions/1.0.0"></log> + <toD + uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policyType]}/versions/1.0.0/policies/${exchangeProperty[policyName]}/versions/1.0.0?bridgeEndpoint=true&useSystemProperties=true&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&authMethod=Basic&authUsername={{clamp.config.policy.api.userName}}&authPassword={{clamp.config.policy.api.password}}&connectionTimeToLive=5000&httpClient.connectTimeout=10000&httpClient.socketTimeout=20000&authenticationPreemptive=true&connectionClose=true" /> + <doFinally> + <to uri="direct:reset-raise-http-exception-flag" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> + <setProperty propertyName="logMessage"> + <simple>${exchangeProperty[policyName]} GET + Policy status + </simple> + </setProperty> + <to uri="direct:dump-loop-log-http-response" /> + </doFinally> + </doTry> + </route> + + <route id="get-deployment-policy"> + <from uri="direct:get-deployment-policy" /> + <doTry> + <log + loggingLevel="INFO" + message="Getting the policy deployment in PDP: ${exchangeProperty[policyName]}" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Getting the policy deployment in PDP')" /> + <setHeader headerName="CamelHttpMethod"> + <constant>GET</constant> + </setHeader> + <setHeader headerName="X-ONAP-RequestID"> + <simple>${exchangeProperty[X-ONAP-RequestID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-InvocationID"> + <simple>${exchangeProperty[X-ONAP-InvocationID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-PartnerName"> + <simple>${exchangeProperty[X-ONAP-PartnerName]} + </simple> + </setHeader> + <log + loggingLevel="INFO" + message="Endpoint to get policy deployment status: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policyType]}/versions/1.0.0/policies/${exchangeProperty[policyName]}/versions/deployed"></log> + <toD + uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[policyType]}/versions/1.0.0/policies/${exchangeProperty[policyName]}/versions/deployed?bridgeEndpoint=true&useSystemProperties=true&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&authMethod=Basic&authUsername={{clamp.config.policy.api.userName}}&authPassword={{clamp.config.policy.api.password}}&connectionTimeToLive=5000&httpClient.connectTimeout=10000&httpClient.socketTimeout=20000&authenticationPreemptive=true&connectionClose=true" /> + <doFinally> + <to uri="direct:reset-raise-http-exception-flag" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> + <setProperty propertyName="logMessage"> + <simple>${exchangeProperty[policyName]} GET Policy deployment + status + </simple> + </setProperty> + <to uri="direct:dump-loop-log-http-response" /> + </doFinally> + </doTry> + </route> + <route id="create-micro-service-policy"> + <from uri="direct:create-micro-service-policy" /> + <doTry> + <log + loggingLevel="INFO" + message="Creating Micro Service Policy: ${exchangeProperty[microServicePolicy].getName()}" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Create Micro Service Policy')" /> + <setBody> + <simple>${exchangeProperty[microServicePolicy].createPolicyPayload()} + </simple> + </setBody> + <setHeader headerName="CamelHttpMethod"> + <constant>POST</constant> + </setHeader> + <setHeader headerName="Content-Type"> + <constant>application/json</constant> + </setHeader> + <setHeader headerName="X-ONAP-RequestID"> + <simple>${exchangeProperty[X-ONAP-RequestID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-InvocationID"> + <simple>${exchangeProperty[X-ONAP-InvocationID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-PartnerName"> + <simple>${exchangeProperty[X-ONAP-PartnerName]} + </simple> + </setHeader> + <log + loggingLevel="INFO" + message="Endpoint to create microservice policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[microServicePolicy].getModelType()}/versions/1.0.0/policies"></log> + <toD + uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[microServicePolicy].getModelType()}/versions/1.0.0/policies?bridgeEndpoint=true&useSystemProperties=true&mapHttpMessageHeaders=false&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&authUsername={{clamp.config.policy.api.userName}}&authPassword={{clamp.config.policy.api.password}}&connectionTimeToLive=5000&httpClient.connectTimeout=10000&httpClient.socketTimeout=20000&authenticationPreemptive=true&connectionClose=true" /> + <doFinally> + <to uri="direct:reset-raise-http-exception-flag" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> + <setProperty propertyName="logMessage"> + <simple>${exchangeProperty[microServicePolicy].getName()} creation + status + </simple> + </setProperty> + <to uri="direct:dump-loop-log-http-response" /> + </doFinally> + </doTry> + </route> + + <route id="delete-micro-service-policy"> + <from uri="direct:delete-micro-service-policy" /> + <doTry> + <log + loggingLevel="INFO" + message="Deleting Micro Service Policy: ${exchangeProperty[microServicePolicy].getName()}" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Delete Micro Service Policy')" /> + <setBody> + <constant>null</constant> + </setBody> + <setHeader headerName="CamelHttpMethod"> + <constant>DELETE</constant> + </setHeader> + <setHeader headerName="X-ONAP-RequestID"> + <simple>${exchangeProperty[X-ONAP-RequestID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-InvocationID"> + <simple>${exchangeProperty[X-ONAP-InvocationID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-PartnerName"> + <simple>${exchangeProperty[X-ONAP-PartnerName]} + </simple> + </setHeader> + <log + loggingLevel="INFO" + message="Endpoint to delete microservice policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[microServicePolicy].getModelType()}/versions/1.0.0/policies/${exchangeProperty[microServicePolicy].getName()}/versions/1.0.0"></log> + <toD + uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/${exchangeProperty[microServicePolicy].getModelType()}/versions/1.0.0/policies/${exchangeProperty[microServicePolicy].getName()}/versions/1.0.0?bridgeEndpoint=true&useSystemProperties=true&mapHttpMessageHeaders=false&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&deleteWithBody=false&mapHttpMessageBody=false&mapHttpMessageFormUrlEncodedBody=false&authUsername={{clamp.config.policy.api.userName}}&authPassword={{clamp.config.policy.api.password}}&connectionTimeToLive=5000&httpClient.connectTimeout=10000&httpClient.socketTimeout=20000&authenticationPreemptive=true&connectionClose=true" /> + + <doFinally> + <to uri="direct:reset-raise-http-exception-flag" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> + <setProperty propertyName="logMessage"> + <simple>${exchangeProperty[microServicePolicy].getName()} removal + status + </simple> + </setProperty> + <to uri="direct:dump-loop-log-http-response" /> + </doFinally> + </doTry> + </route> + + <route id="create-operational-policy"> + <from uri="direct:create-operational-policy" /> + <doTry> + <log + loggingLevel="INFO" + message="Creating Operational Policy: ${exchangeProperty[operationalPolicy].getName()}" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Create Operational Policy')" /> + <setBody> + <simple>${exchangeProperty[operationalPolicy].createPolicyPayload()} + </simple> + </setBody> + <setHeader headerName="CamelHttpMethod"> + <constant>POST</constant> + </setHeader> + <setHeader headerName="Content-Type"> + <constant>application/json</constant> + </setHeader> + <setHeader headerName="X-ONAP-RequestID"> + <simple>${exchangeProperty[X-ONAP-RequestID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-InvocationID"> + <simple>${exchangeProperty[X-ONAP-InvocationID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-PartnerName"> + <simple>${exchangeProperty[X-ONAP-PartnerName]} + </simple> + </setHeader> + <log + loggingLevel="INFO" + message="Endpoint to create operational policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies"></log> + <toD + uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies?bridgeEndpoint=true&useSystemProperties=true&mapHttpMessageHeaders=false&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&authUsername={{clamp.config.policy.api.userName}}&authPassword={{clamp.config.policy.api.password}}&connectionTimeToLive=5000&httpClient.connectTimeout=10000&httpClient.socketTimeout=20000&authenticationPreemptive=true&connectionClose=true" /> + <doFinally> + <to uri="direct:reset-raise-http-exception-flag" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> + <setProperty propertyName="logMessage"> + <simple>${exchangeProperty[operationalPolicy].getName()} creation + status + </simple> + </setProperty> + <to uri="direct:dump-loop-log-http-response" /> + </doFinally> + </doTry> + </route> + + <route id="delete-operational-policy"> + <from uri="direct:delete-operational-policy" /> + <doTry> + <log + loggingLevel="INFO" + message="Deleting Operational Policy: ${exchangeProperty[operationalPolicy].getName()}" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Delete Operational Policy')" /> + <setBody> + <constant>null</constant> + </setBody> + <setHeader headerName="CamelHttpMethod"> + <constant>DELETE</constant> + </setHeader> + <setHeader headerName="X-ONAP-RequestID"> + <simple>${exchangeProperty[X-ONAP-RequestID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-InvocationID"> + <simple>${exchangeProperty[X-ONAP-InvocationID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-PartnerName"> + <simple>${exchangeProperty[X-ONAP-PartnerName]} + </simple> + </setHeader> + <log + loggingLevel="INFO" + message="Endpoint to delete operational policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies/${exchangeProperty[operationalPolicy].getName()}/versions/1"></log> + <toD + uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies/${exchangeProperty[operationalPolicy].getName()}/versions/1?bridgeEndpoint=true&useSystemProperties=true&mapHttpMessageHeaders=false&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&deleteWithBody=false&mapHttpMessageBody=false&mapHttpMessageFormUrlEncodedBody=false&authUsername={{clamp.config.policy.api.userName}}&authPassword={{clamp.config.policy.api.password}}&connectionTimeToLive=5000&httpClient.connectTimeout=10000&httpClient.socketTimeout=20000&authenticationPreemptive=true&connectionClose=true" /> + <doFinally> + <to uri="direct:reset-raise-http-exception-flag" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> + <setProperty propertyName="logMessage"> + <simple>${exchangeProperty[operationalPolicy].getName()} removal + status + </simple> + </setProperty> + <to uri="direct:dump-loop-log-http-response" /> + </doFinally> + </doTry> + </route> + + <route id="create-guard-policy"> + <from uri="direct:create-guard-policy" /> + <doTry> + <log + loggingLevel="INFO" + message="Creating Guard Policy: ${exchangeProperty[guardPolicy].getKey()}" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Create Guard Policy')" /> + <setBody> + <simple>${exchangeProperty[guardPolicy].getValue()} + </simple> + </setBody> + <setHeader headerName="CamelHttpMethod"> + <constant>POST</constant> + </setHeader> + <setHeader headerName="Content-Type"> + <constant>application/json</constant> + </setHeader> + <setHeader headerName="X-ONAP-RequestID"> + <simple>${exchangeProperty[X-ONAP-RequestID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-InvocationID"> + <simple>${exchangeProperty[X-ONAP-InvocationID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-PartnerName"> + <simple>${exchangeProperty[X-ONAP-PartnerName]} + </simple> + </setHeader> + <log + loggingLevel="INFO" + message="Endpoint to create guard policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies"></log> + <toD + uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies?bridgeEndpoint=true&useSystemProperties=true&mapHttpMessageHeaders=false&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&authUsername={{clamp.config.policy.api.userName}}&authPassword={{clamp.config.policy.api.password}}&connectionTimeToLive=5000&httpClient.connectTimeout=10000&httpClient.socketTimeout=20000&authenticationPreemptive=true&connectionClose=true" /> + <doFinally> + <to uri="direct:reset-raise-http-exception-flag" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> + <setProperty propertyName="logMessage"> + <simple>${exchangeProperty[guardPolicy].getKey()} creation status + </simple> + </setProperty> + <to uri="direct:dump-loop-log-http-response" /> + </doFinally> + </doTry> + </route> + + <route id="delete-guard-policy"> + <from uri="direct:delete-guard-policy" /> + <doTry> + <log + loggingLevel="INFO" + message="Deleting Guard Policy: ${exchangeProperty[guardPolicy].getKey()}" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Delete Guard Policy')" /> + <setBody> + <constant>null</constant> + </setBody> + <setHeader headerName="CamelHttpMethod"> + <constant>DELETE</constant> + </setHeader> + <setHeader headerName="X-ONAP-RequestID"> + <simple>${exchangeProperty[X-ONAP-RequestID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-InvocationID"> + <simple>${exchangeProperty[X-ONAP-InvocationID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-PartnerName"> + <simple>${exchangeProperty[X-ONAP-PartnerName]} + </simple> + </setHeader> + <log + loggingLevel="INFO" + message="Endpoint to delete guard policy: {{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/${exchangeProperty[guardPolicy].getKey()}/versions/1"></log> + <toD + uri="{{clamp.config.policy.api.url}}/policy/api/v1/policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/${exchangeProperty[guardPolicy].getKey()}/versions/1?bridgeEndpoint=true&useSystemProperties=true&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&deleteWithBody=false&mapHttpMessageBody=false&mapHttpMessageFormUrlEncodedBody=false&authUsername={{clamp.config.policy.api.userName}}&authPassword={{clamp.config.policy.api.password}}&connectionTimeToLive=5000&httpClient.connectTimeout=10000&httpClient.socketTimeout=20000&authenticationPreemptive=true&connectionClose=true" /> + + <doFinally> + <to uri="direct:reset-raise-http-exception-flag" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> + <setProperty propertyName="logMessage"> + <simple>${exchangeProperty[guardPolicy].getKey()} removal status + </simple> + </setProperty> + <to uri="direct:dump-loop-log-http-response" /> + </doFinally> + </doTry> + </route> + + <route id="add-all-to-active-pdp-group"> + <from uri="direct:add-all-to-active-pdp-group" /> + <doTry> + <log + loggingLevel="INFO" + message="Adding loop policies to PDP Group: ${exchangeProperty[loopObject].getName()}" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Add policies to PDP group')" /> + <setBody> + <simple>${exchangeProperty[loopObject].getComponent("POLICY").createPoliciesPayloadPdpGroup(exchangeProperty[loopObject])} + </simple> + </setBody> + <setHeader headerName="CamelHttpMethod"> + <constant>POST</constant> + </setHeader> + <setHeader headerName="Content-Type"> + <constant>application/json</constant> + </setHeader> + <setHeader headerName="X-ONAP-RequestID"> + <simple>${exchangeProperty[X-ONAP-RequestID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-InvocationID"> + <simple>${exchangeProperty[X-ONAP-InvocationID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-PartnerName"> + <simple>${exchangeProperty[X-ONAP-PartnerName]} + </simple> + </setHeader> + <log + loggingLevel="INFO" + message="Endpoint to add policies to PDP Group: {{clamp.config.policy.pap.url}}/policy/pap/v1/pdps/policies"></log> + <toD + uri="{{clamp.config.policy.pap.url}}/policy/pap/v1/pdps/policies?bridgeEndpoint=true&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&useSystemProperties=true&authUsername={{clamp.config.policy.pap.userName}}&authPassword={{clamp.config.policy.pap.password}}&connectionTimeToLive=5000&httpClient.connectTimeout=10000&httpClient.socketTimeout=20000&authenticationPreemptive=true&connectionClose=true" /> + + <doFinally> + <to uri="direct:reset-raise-http-exception-flag" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> + <setProperty propertyName="logMessage"> + <simple>PDP Group push ALL status</simple> + </setProperty> + <to uri="direct:dump-loop-log-http-response" /> + </doFinally> + </doTry> + </route> + + <route id="remove-all-policy-from-active-pdp-group"> + <from uri="direct:remove-all-policy-from-active-pdp-group" /> + <doTry> + <log + loggingLevel="INFO" + message="Removing policies from active PDP group for loop: ${exchangeProperty[loopObject].getName()}" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeLog('Policy', 'Removing policies PDP group')" /> + <split> + <simple>${exchangeProperty[loopObject].getComponent("POLICY").listPolicyNamesPdpGroup(exchangeProperty[loopObject])} + </simple> + <setProperty propertyName="policyName"> + <simple>${body}</simple> + </setProperty> + <setBody> + <constant>null</constant> + </setBody> + <setHeader headerName="CamelHttpMethod"> + <constant>DELETE</constant> + </setHeader> + <setHeader headerName="X-ONAP-RequestID"> + <simple>${exchangeProperty[X-ONAP-RequestID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-InvocationID"> + <simple>${exchangeProperty[X-ONAP-InvocationID]} + </simple> + </setHeader> + <setHeader headerName="X-ONAP-PartnerName"> + <simple>${exchangeProperty[X-ONAP-PartnerName]} + </simple> + </setHeader> + <log + loggingLevel="INFO" + message="Endpoint to delete policy from PDP Group: {{clamp.config.policy.pap.url}}/pdps/policies/${exchangeProperty[policyName]}/versions/1.0.0"></log> + <toD + uri="{{clamp.config.policy.pap.url}}/policy/pap/v1/pdps/policies/${exchangeProperty[policyName]}/versions/1.0.0?bridgeEndpoint=true&useSystemProperties=true&mapHttpMessageHeaders=false&throwExceptionOnFailure=${exchangeProperty[raiseHttpExceptionFlag]}&authUsername={{clamp.config.policy.pap.userName}}&authPassword={{clamp.config.policy.pap.password}}&connectionTimeToLive=5000&httpClient.connectTimeout=10000&httpClient.socketTimeout=20000&authenticationPreemptive=true&connectionClose=true" /> + <setProperty propertyName="logMessage"> + <simple>${exchangeProperty[policyName]} PDP Group removal status + </simple> + </setProperty> + <to uri="direct:dump-loop-log-http-response" /> + </split> + <doCatch> + <exception>java.lang.Exception</exception> + <handled> + <constant>false</constant> + </handled> + <setProperty propertyName="logMessage"> + <simple>PDP Group removal, Error reported: ${exception}</simple> + </setProperty> + <to uri="direct:dump-loop-log-http-response" /> + </doCatch> + <doFinally> + <to uri="direct:reset-raise-http-exception-flag" /> + <to + uri="bean:org.onap.clamp.flow.log.FlowLogOperation?method=invokeReturnLog()" /> + </doFinally> + </doTry> + </route> +</routes>
\ No newline at end of file diff --git a/src/main/resources/clds/camel/routes/utils-flows.xml b/src/main/resources/clds/camel/routes/utils-flows.xml new file mode 100644 index 00000000..adf843ff --- /dev/null +++ b/src/main/resources/clds/camel/routes/utils-flows.xml @@ -0,0 +1,17 @@ +<routes xmlns="http://camel.apache.org/schema/spring"> + <route id="reset-raise-http-exception-flag"> + <from uri="direct:reset-raise-http-exception-flag" /> + <setProperty propertyName="raiseHttpExceptionFlag"> + <simple resultType="java.lang.Boolean">true</simple> + </setProperty> + </route> + + <route id="dump-loop-log-http-response"> + <from uri="direct:dump-loop-log-http-response" /> + <log + loggingLevel="INFO" + message="${exchangeProperty[logMessage]} - ${header.CamelHttpResponseCode} : ${header.CamelHttpResponseText}" /> + <to + uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('${exchangeProperty[logMessage]} - ${header.CamelHttpResponseCode} : ${header.CamelHttpResponseText}','INFO',${exchangeProperty[loopObject]})" /> + </route> +</routes>
\ No newline at end of file diff --git a/src/main/resources/logback-default.xml b/src/main/resources/logback-default.xml index bc8ebb90..4c496716 100644 --- a/src/main/resources/logback-default.xml +++ b/src/main/resources/logback-default.xml @@ -40,7 +40,7 @@ <level>INFO</level> </filter> <encoder> - <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - %msg%n + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - %msg%n </pattern> </encoder> </appender> @@ -76,7 +76,7 @@ <file>${logDirectory}/debug.log</file> <append>true</append> <encoder> - <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - %msg%n + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - %msg%n </pattern> </encoder> <rollingPolicy diff --git a/src/test/java/org/onap/clamp/clds/it/config/CldsReferencePropertiesItCase.java b/src/test/java/org/onap/clamp/clds/it/config/CldsReferencePropertiesItCase.java index 8ebd627b..d3404203 100644 --- a/src/test/java/org/onap/clamp/clds/it/config/CldsReferencePropertiesItCase.java +++ b/src/test/java/org/onap/clamp/clds/it/config/CldsReferencePropertiesItCase.java @@ -55,10 +55,10 @@ public class CldsReferencePropertiesItCase { */ @Test public void testGetStringValue() { - assertEquals(refProp.getStringValue("policy.onap.name"), "DCAE"); - assertEquals(refProp.getStringValue("policy.ms.policyNamePrefix", ""), "Config_MS_"); - assertEquals(refProp.getStringValue("policy.ms.policyNamePrefix", "testos"), "Config_MS_"); - assertEquals(refProp.getStringValue("policy.ms", "policyNamePrefix"), "Config_MS_"); + assertEquals("DCAE", refProp.getStringValue("policy.onap.name")); + assertEquals("Config_MS_", refProp.getStringValue("policy.ms.policyNamePrefix", "")); + assertEquals("Config_MS_", refProp.getStringValue("policy.ms.policyNamePrefix", "testos")); + assertEquals("Config_MS_", refProp.getStringValue("policy.ms", "policyNamePrefix")); assertNull(refProp.getStringValue("does.not.exist")); } @@ -70,7 +70,7 @@ public class CldsReferencePropertiesItCase { //then assertNotNull(root); assertTrue(root.isJsonObject()); - assertEquals(root.getAsJsonObject().get("DC1").getAsString(), "Data Center 1"); + assertEquals("Data Center 1", root.getAsJsonObject().get("DC1").getAsString()); } @Test @@ -81,7 +81,7 @@ public class CldsReferencePropertiesItCase { //then assertNotNull(root); assertTrue(root.isJsonObject()); - assertEquals(root.getAsJsonObject().get("DC1").getAsString(), "Data Center 1"); + assertEquals("Data Center 1", root.getAsJsonObject().get("DC1").getAsString()); } @Test @@ -113,9 +113,9 @@ public class CldsReferencePropertiesItCase { @Test public void testGetStringList() { List<String> profileList = refProp.getStringList("policy.pdpUrl1", ","); - assertTrue(profileList.size() == 3); + assertEquals(3, profileList.size()); assertTrue(profileList.get(0).trim().startsWith("http://localhost:")); - assertTrue(profileList.get(1).trim().equals("testpdp")); - assertTrue(profileList.get(2).trim().equals("alpha123")); + assertEquals("testpdp", profileList.get(1).trim()); + assertEquals("alpha123", profileList.get(2).trim()); } } diff --git a/src/test/java/org/onap/clamp/clds/model/DcaeEventTest.java b/src/test/java/org/onap/clamp/clds/model/DcaeEventTest.java new file mode 100644 index 00000000..315e656d --- /dev/null +++ b/src/test/java/org/onap/clamp/clds/model/DcaeEventTest.java @@ -0,0 +1,74 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2019 Samsung. 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; + +import static org.junit.Assert.assertEquals; +import org.junit.Test; +import javax.ws.rs.BadRequestException; +import java.util.Arrays; + +public class DcaeEventTest { + + @Test + public void testGetCldsActionId() { + //given + DcaeEvent dcaeEvent = new DcaeEvent(); + dcaeEvent.setEvent(DcaeEvent.EVENT_CREATED); + dcaeEvent.setResourceUUID("1"); + dcaeEvent.setServiceUUID("2"); + + //when + String cldsAction = dcaeEvent.getCldsActionCd(); + dcaeEvent.setInstances(Arrays.asList(new CldsModelInstance())); + //then + assertEquals(CldsEvent.ACTION_CREATE, cldsAction); + + //when + dcaeEvent.setEvent(DcaeEvent.EVENT_DEPLOYMENT); + //then + assertEquals(CldsEvent.ACTION_DEPLOY, dcaeEvent.getCldsActionCd()); + + //when + dcaeEvent.setInstances(null); + //then + assertEquals(CldsEvent.ACTION_DEPLOY, dcaeEvent.getCldsActionCd()); + + //when + dcaeEvent.setEvent(DcaeEvent.EVENT_UNDEPLOYMENT); + //then + assertEquals(CldsEvent.ACTION_UNDEPLOY, dcaeEvent.getCldsActionCd()); + + } + + @Test(expected = BadRequestException.class) + public void shouldReturnBadRequestException() { + //given + DcaeEvent dcaeEvent = new DcaeEvent(); + dcaeEvent.setResourceUUID("1"); + dcaeEvent.setServiceUUID("2"); + //when + dcaeEvent.setEvent("BadEvent"); + //then + dcaeEvent.getCldsActionCd(); + } +} diff --git a/src/test/java/org/onap/clamp/clds/util/LoggingUtilsTest.java b/src/test/java/org/onap/clamp/clds/util/LoggingUtilsTest.java new file mode 100644 index 00000000..7e2da4d1 --- /dev/null +++ b/src/test/java/org/onap/clamp/clds/util/LoggingUtilsTest.java @@ -0,0 +1,148 @@ +/*- +* ============LICENSE_START======================================================= +* ONAP CLAMP +* Copyright (C) 2019 Samsung. 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.util; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; + +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.Map; + +import javax.net.ssl.HttpsURLConnection; +import javax.servlet.http.HttpServletRequest; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.mockito.runners.MockitoJUnitRunner; +import org.slf4j.MDC; +import org.slf4j.event.Level; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; + +/** + * Test Logging Utils. + */ +@RunWith(MockitoJUnitRunner.class) +public class LoggingUtilsTest { + + private static final EELFLogger logger = EELFManager.getInstance().getLogger(LoggingUtilsTest.class); + + private static final String SERVICE_NAME = "LogginUtilsTest: Test Entering method"; + + private LoggingUtils util; + + @Before + public void setup() { + this.util = new LoggingUtils(logger); + } + + @Test + public void testEnteringLoggingUtils() { + // given + final String userName = "test"; + + HttpServletRequest request = Mockito.mock(HttpServletRequest.class); + + UserDetails userDetails = Mockito.mock(UserDetails.class); + Mockito.when(userDetails.getUsername()).thenReturn(userName); + + Authentication localAuth = Mockito.mock(Authentication.class); + Mockito.when(localAuth.getPrincipal()).thenReturn(userDetails); + + SecurityContext securityContext = Mockito.mock(SecurityContext.class); + Mockito.when(securityContext.getAuthentication()).thenReturn(localAuth); + SecurityContextHolder.setContext(securityContext); + + // when + util.entering(request, SERVICE_NAME); + + // then + String[] keys = { ONAPLogConstants.MDCs.PARTNER_NAME, + ONAPLogConstants.MDCs.ENTRY_TIMESTAMP, + ONAPLogConstants.MDCs.REQUEST_ID, + ONAPLogConstants.MDCs.INVOCATION_ID, + ONAPLogConstants.MDCs.CLIENT_IP_ADDRESS, + ONAPLogConstants.MDCs.SERVER_FQDN, + ONAPLogConstants.MDCs.INSTANCE_UUID, + ONAPLogConstants.MDCs.SERVICE_NAME + }; + Map<String, String> mdc = MDC.getMDCAdapter().getCopyOfContextMap(); + + assertTrue(checkMapKeys(mdc, keys)); + assertEquals(userName, + mdc.get(ONAPLogConstants.MDCs.PARTNER_NAME)); + } + + @Test + public void testExistingLoggingUtils() { + // given + MDC.put(ONAPLogConstants.MDCs.ENTRY_TIMESTAMP, + ZonedDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT)); + + // when + util.exiting("200", SERVICE_NAME, Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); + + // then + Map<String, String> mdc = MDC.getMDCAdapter().getCopyOfContextMap(); + assertNull(mdc); + } + + @Test + public void testInvokeTestUtils() { + // given + final String targetEntity = "LoggingUtilsTest"; + final String targetServiceName = "testInvokeTestUtils"; + HttpsURLConnection secureConnection = Mockito.mock(HttpsURLConnection.class); + + // when + secureConnection = util.invokeHttps(secureConnection, targetEntity, targetServiceName); + + // then + assertNotNull(secureConnection); + String[] keys = {ONAPLogConstants.MDCs.TARGET_ENTITY, + ONAPLogConstants.MDCs.TARGET_SERVICE_NAME, + ONAPLogConstants.MDCs.INVOCATIONID_OUT, + ONAPLogConstants.MDCs.INVOKE_TIMESTAMP + }; + Map<String, String> mdc = MDC.getMDCAdapter().getCopyOfContextMap(); + + assertTrue(checkMapKeys(mdc, keys)); + assertEquals(targetEntity, mdc.get(ONAPLogConstants.MDCs.TARGET_ENTITY)); + assertEquals(targetServiceName, mdc.get(ONAPLogConstants.MDCs.TARGET_SERVICE_NAME)); + } + + private boolean checkMapKeys(Map map, String[] keys) { + return Arrays.stream(keys).allMatch(key -> map.get(key) != null); + } +} diff --git a/src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java b/src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java index d451b067..773332dd 100644 --- a/src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java +++ b/src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java @@ -223,7 +223,8 @@ public class CsarInstallerItCase { @Test(expected = SdcArtifactInstallerException.class) @Transactional - public void shouldThrowSdcArtifactInstallerException() throws SdcArtifactInstallerException, SdcToscaParserException, IOException, InterruptedException, PolicyModelException { + public void shouldThrowSdcArtifactInstallerException() throws SdcArtifactInstallerException, + SdcToscaParserException, IOException, InterruptedException, PolicyModelException { String generatedName = RandomStringUtils.randomAlphanumeric(5); CsarHandler csarHandler = buildFakeCsarHandler(generatedName); Mockito.when(csarHandler.getMapOfBlueprints()).thenThrow(IOException.class); diff --git a/src/test/java/org/onap/clamp/loop/DcaeComponentTest.java b/src/test/java/org/onap/clamp/loop/DcaeComponentTest.java new file mode 100644 index 00000000..0a3c1e16 --- /dev/null +++ b/src/test/java/org/onap/clamp/loop/DcaeComponentTest.java @@ -0,0 +1,93 @@ +/*- + * ============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 static org.assertj.core.api.Assertions.assertThat; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; + +import java.io.IOException; +import java.util.HashSet; + +import org.junit.Test; +import org.onap.clamp.clds.model.dcae.DcaeOperationStatusResponse; +import org.onap.clamp.loop.components.external.DcaeComponent; +import org.onap.clamp.policy.microservice.MicroServicePolicy; + +public class DcaeComponentTest { + + private Loop createTestLoop() { + String yaml = "imports:\n" + " - \"http://www.getcloudify.org/spec/cloudify/3.4/types.yaml\"\n" + + "node_templates:\n" + " docker_service_host:\n" + " type: dcae.nodes.SelectedDockerHost"; + + Loop loopTest = new Loop("ControlLoopTest", yaml, "<xml></xml>"); + loopTest.setGlobalPropertiesJson( + new Gson().fromJson("{\"dcaeDeployParameters\":" + "{\"policy_id\": \"name\"}}", JsonObject.class)); + loopTest.setLastComputedState(LoopState.DESIGN); + loopTest.setDcaeDeploymentId("123456789"); + loopTest.setDcaeDeploymentStatusUrl("http4://localhost:8085"); + loopTest.setDcaeBlueprintId("UUID-blueprint"); + + MicroServicePolicy microServicePolicy = new MicroServicePolicy("configPolicyTest", "", + "tosca_definitions_version: tosca_simple_yaml_1_0_0", true, + new Gson().fromJson("{\"configtype\":\"json\"}", JsonObject.class), new HashSet<>()); + microServicePolicy.setProperties(new Gson().fromJson("{\"param1\":\"value1\"}", JsonObject.class)); + + loopTest.addMicroServicePolicy(microServicePolicy); + return loopTest; + } + + @Test + public void convertDcaeResponseTest() throws IOException { + String dcaeFakeResponse = "{'requestId':'testId','operationType':'install','status':'state','error':'errorMessage', 'links':{'self':'selfUrl','uninstall':'uninstallUrl'}}"; + DcaeOperationStatusResponse responseObject = DcaeComponent.convertDcaeResponse(dcaeFakeResponse); + assertThat(responseObject.getRequestId()).isEqualTo("testId"); + assertThat(responseObject.getOperationType()).isEqualTo("install"); + assertThat(responseObject.getStatus()).isEqualTo("state"); + assertThat(responseObject.getError()).isEqualTo("errorMessage"); + assertThat(responseObject.getLinks()).isNotNull(); + assertThat(responseObject.getLinks().getSelf()).isEqualTo("selfUrl"); + assertThat(responseObject.getLinks().getUninstall()).isEqualTo("uninstallUrl"); + + assertThat(responseObject.getLinks().getStatus()).isNull(); + } + + @Test + public void testGetDeployPayload() throws IOException { + Loop loop = this.createTestLoop(); + String deploymentPayload = DcaeComponent.getDeployPayload(loop); + String expectedPayload = "{\"serviceTypeId\":\"UUID-blueprint\",\"inputs\":{\"policy_id\":\"name\"}}"; + assertThat(deploymentPayload).isEqualTo(expectedPayload); + } + + @Test + public void testGetUndeployPayload() throws IOException { + Loop loop = this.createTestLoop(); + String unDeploymentPayload = DcaeComponent.getUndeployPayload(loop); + String expectedPayload = "{\"serviceTypeId\":\"UUID-blueprint\"}"; + assertThat(unDeploymentPayload).isEqualTo(expectedPayload); + } + +} diff --git a/src/test/java/org/onap/clamp/loop/LoopOperationTestItCase.java b/src/test/java/org/onap/clamp/loop/LoopOperationTestItCase.java deleted file mode 100644 index a2c97e0c..00000000 --- a/src/test/java/org/onap/clamp/loop/LoopOperationTestItCase.java +++ /dev/null @@ -1,244 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP CLAMP - * ================================================================================ - * Copyright (C) 2019 Nokia 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 static org.assertj.core.api.Assertions.assertThat; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; - -import java.io.IOException; -import java.util.HashSet; - -import org.apache.camel.Exchange; -import org.apache.camel.Message; -import org.json.simple.parser.ParseException; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.onap.clamp.clds.Application; -import org.onap.clamp.loop.LoopOperation.TempLoopState; -import org.onap.clamp.policy.microservice.MicroServicePolicy; -import org.onap.clamp.policy.operational.OperationalPolicy; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = Application.class) -public class LoopOperationTestItCase { - - private Gson gson = new GsonBuilder().setPrettyPrinting().excludeFieldsWithoutExposeAnnotation().create(); - @Autowired - LoopService loopService; - - private Loop createTestLoop() { - String yaml = "imports:\n" + " - \"http://www.getcloudify.org/spec/cloudify/3.4/types.yaml\"\n" - + "node_templates:\n" + " docker_service_host:\n" + " type: dcae.nodes.SelectedDockerHost"; - - Loop loopTest = new Loop("ControlLoopTest", yaml, "<xml></xml>"); - loopTest.setGlobalPropertiesJson( - new Gson().fromJson("{\"dcaeDeployParameters\":" + "{\"policy_id\": \"name\"}}", JsonObject.class)); - loopTest.setLastComputedState(LoopState.DESIGN); - loopTest.setDcaeDeploymentId("123456789"); - loopTest.setDcaeDeploymentStatusUrl("http4://localhost:8085"); - loopTest.setDcaeBlueprintId("UUID-blueprint"); - - MicroServicePolicy microServicePolicy = new MicroServicePolicy("configPolicyTest", "", - "tosca_definitions_version: tosca_simple_yaml_1_0_0", true, - gson.fromJson("{\"configtype\":\"json\"}", JsonObject.class), new HashSet<>()); - microServicePolicy.setProperties(new Gson().fromJson("{\"param1\":\"value1\"}", JsonObject.class)); - - loopTest.addMicroServicePolicy(microServicePolicy); - return loopTest; - } - - @Test - public void testAnalysePolicyResponse() { - LoopOperation loopOp = new LoopOperation(loopService); - String status1 = loopOp.analysePolicyResponse(200); - String status2 = loopOp.analysePolicyResponse(404); - String status3 = loopOp.analysePolicyResponse(500); - String status4 = loopOp.analysePolicyResponse(503); - - // then - assertThat(status1).isEqualTo("SUBMITTED"); - assertThat(status2).isEqualTo("NOT_SUBMITTED"); - assertThat(status3).isEqualTo("IN_ERROR"); - assertThat(status4).isEqualTo("IN_ERROR"); - } - - @Test - public void testGetOperationalPolicyName() { - LoopOperation loopOp = new LoopOperation(loopService); - Loop loop = this.createTestLoop(); - String opName1 = loopOp.getOperationalPolicyName(loop); - assertThat(opName1).isNull(); - - OperationalPolicy opPolicy1 = new OperationalPolicy("OperationalPolicyTest1", null, - gson.fromJson("{\"type\":\"Operational\"}", JsonObject.class)); - loop.addOperationalPolicy(opPolicy1); - String opName2 = loopOp.getOperationalPolicyName(loop); - assertThat(opName2).isEqualTo("OperationalPolicyTest1"); - } - - @Test - public void testAnalyseDcaeResponse() throws ParseException { - LoopOperation loopOp = new LoopOperation(loopService); - String dcaeStatus1 = loopOp.analyseDcaeResponse(null, null); - assertThat(dcaeStatus1).isEqualTo("NOT_DEPLOYED"); - - String dcaeStatus2 = loopOp.analyseDcaeResponse(null, 500); - assertThat(dcaeStatus2).isEqualTo("IN_ERROR"); - - String dcaeStatus3 = loopOp.analyseDcaeResponse(null, 404); - assertThat(dcaeStatus3).isEqualTo("NOT_DEPLOYED"); - - Exchange camelExchange = Mockito.mock(Exchange.class); - Message mockMessage = Mockito.mock(Message.class); - Mockito.when(camelExchange.getIn()).thenReturn(mockMessage); - Mockito.when(mockMessage.getBody(String.class)) - .thenReturn("{\"operationType\":\"install\",\"status\":\"succeeded\"}"); - String dcaeStatus4 = loopOp.analyseDcaeResponse(camelExchange, 200); - assertThat(dcaeStatus4).isEqualTo("DEPLOYED"); - - Mockito.when(mockMessage.getBody(String.class)) - .thenReturn("{\"operationType\":\"install\",\"status\":\"processing\"}"); - String dcaeStatus5 = loopOp.analyseDcaeResponse(camelExchange, 200); - assertThat(dcaeStatus5).isEqualTo("PROCESSING"); - - Mockito.when(mockMessage.getBody(String.class)) - .thenReturn("{\"operationType\":\"install\",\"status\":\"failed\"}"); - String dcaeStatus6 = loopOp.analyseDcaeResponse(camelExchange, 200); - assertThat(dcaeStatus6).isEqualTo("IN_ERROR"); - - Mockito.when(mockMessage.getBody(String.class)) - .thenReturn("{\"operationType\":\"uninstall\",\"status\":\"succeeded\"}"); - String dcaeStatus7 = loopOp.analyseDcaeResponse(camelExchange, 200); - assertThat(dcaeStatus7).isEqualTo("NOT_DEPLOYED"); - - Mockito.when(mockMessage.getBody(String.class)) - .thenReturn("{\"operationType\":\"uninstall\",\"status\":\"processing\"}"); - String dcaeStatus8 = loopOp.analyseDcaeResponse(camelExchange, 200); - assertThat(dcaeStatus8).isEqualTo("PROCESSING"); - - Mockito.when(mockMessage.getBody(String.class)) - .thenReturn("{\"operationType\":\"uninstall\",\"status\":\"failed\"}"); - String dcaeStatus9 = loopOp.analyseDcaeResponse(camelExchange, 200); - assertThat(dcaeStatus9).isEqualTo("IN_ERROR"); - } - - @Test - public void testUpdateLoopStatus() { - LoopOperation loopOp = new LoopOperation(loopService); - Loop loop = this.createTestLoop(); - loopService.saveOrUpdateLoop(loop); - LoopState newState1 = loopOp.updateLoopStatus(loop, TempLoopState.SUBMITTED, TempLoopState.DEPLOYED); - LoopState dbState1 = loopService.getLoop(loop.getName()).getLastComputedState(); - assertThat(newState1).isEqualTo(LoopState.DEPLOYED); - assertThat(dbState1).isEqualTo(LoopState.DEPLOYED); - - LoopState newState2 = loopOp.updateLoopStatus(loop, TempLoopState.SUBMITTED, TempLoopState.NOT_DEPLOYED); - LoopState dbState2 = loopService.getLoop(loop.getName()).getLastComputedState(); - assertThat(newState2).isEqualTo(LoopState.SUBMITTED); - assertThat(dbState2).isEqualTo(LoopState.SUBMITTED); - - LoopState newState3 = loopOp.updateLoopStatus(loop, TempLoopState.SUBMITTED, TempLoopState.PROCESSING); - assertThat(newState3).isEqualTo(LoopState.WAITING); - - LoopState newState4 = loopOp.updateLoopStatus(loop, TempLoopState.SUBMITTED, TempLoopState.IN_ERROR); - assertThat(newState4).isEqualTo(LoopState.IN_ERROR); - - LoopState newState5 = loopOp.updateLoopStatus(loop, TempLoopState.NOT_SUBMITTED, TempLoopState.DEPLOYED); - assertThat(newState5).isEqualTo(LoopState.IN_ERROR); - - LoopState newState6 = loopOp.updateLoopStatus(loop, TempLoopState.NOT_SUBMITTED, TempLoopState.PROCESSING); - assertThat(newState6).isEqualTo(LoopState.IN_ERROR); - - LoopState newState7 = loopOp.updateLoopStatus(loop, TempLoopState.NOT_SUBMITTED, TempLoopState.NOT_DEPLOYED); - assertThat(newState7).isEqualTo(LoopState.DESIGN); - - LoopState newState8 = loopOp.updateLoopStatus(loop, TempLoopState.IN_ERROR, TempLoopState.DEPLOYED); - assertThat(newState8).isEqualTo(LoopState.IN_ERROR); - - LoopState newState9 = loopOp.updateLoopStatus(loop, TempLoopState.IN_ERROR, TempLoopState.NOT_DEPLOYED); - assertThat(newState9).isEqualTo(LoopState.IN_ERROR); - - LoopState newState10 = loopOp.updateLoopStatus(loop, TempLoopState.IN_ERROR, TempLoopState.PROCESSING); - assertThat(newState10).isEqualTo(LoopState.IN_ERROR); - - LoopState newState11 = loopOp.updateLoopStatus(loop, TempLoopState.IN_ERROR, TempLoopState.IN_ERROR); - assertThat(newState11).isEqualTo(LoopState.IN_ERROR); - } - - @Test - public void testUpdateLoopInfo() throws ParseException { - Loop loop = this.createTestLoop(); - loopService.saveOrUpdateLoop(loop); - - Exchange camelExchange = Mockito.mock(Exchange.class); - Message mockMessage = Mockito.mock(Message.class); - Mockito.when(camelExchange.getIn()).thenReturn(mockMessage); - Mockito.when(mockMessage.getBody(String.class)) - .thenReturn("{\"links\":{\"status\":\"http://testhost/dcae-operationstatus\",\"test2\":\"test2\"}}"); - - LoopOperation loopOp = new LoopOperation(loopService); - loopOp.updateLoopInfo(camelExchange, loop, "testNewId"); - - Loop newLoop = loopService.getLoop(loop.getName()); - String newDeployId = newLoop.getDcaeDeploymentId(); - String newDeploymentStatusUrl = newLoop.getDcaeDeploymentStatusUrl(); - - assertThat(newDeployId).isEqualTo("testNewId"); - assertThat(newDeploymentStatusUrl).isEqualTo("http4://testhost/dcae-operationstatus"); - } - - @Test - public void testGetDeploymentId() { - Loop loop = this.createTestLoop(); - LoopOperation loopOp = new LoopOperation(loopService); - String deploymentId1 = loopOp.getDeploymentId(loop); - assertThat(deploymentId1).isEqualTo("123456789"); - - loop.setDcaeDeploymentId(null); - String deploymentId2 = loopOp.getDeploymentId(loop); - assertThat(deploymentId2).startsWith("CLAMP_"); - - loop.setDcaeDeploymentId(""); - String deploymentId3 = loopOp.getDeploymentId(loop); - assertThat(deploymentId3).startsWith("CLAMP_"); - assertThat(deploymentId3).isNotEqualTo(deploymentId2); - } - - @Test - public void testGetDeployPayload() throws IOException { - Loop loop = this.createTestLoop(); - LoopOperation loopOp = new LoopOperation(loopService); - String deploymentPayload = loopOp.getDeployPayload(loop); - - String expectedPayload = "{\"serviceTypeId\":\"UUID-blueprint\",\"inputs\":{\"policy_id\":\"name\"}}"; - assertThat(deploymentPayload).isEqualTo(expectedPayload); - } -}
\ No newline at end of file diff --git a/src/test/java/org/onap/clamp/loop/LoopRepositoriesItCase.java b/src/test/java/org/onap/clamp/loop/LoopRepositoriesItCase.java index 1a3e3e3d..78e0d2e3 100644 --- a/src/test/java/org/onap/clamp/loop/LoopRepositoriesItCase.java +++ b/src/test/java/org/onap/clamp/loop/LoopRepositoriesItCase.java @@ -94,7 +94,7 @@ public class LoopRepositoriesItCase { } private LoopLog getLoopLog(LogType type, String message, Loop loop) { - return new LoopLog(message, type, loop); + return new LoopLog(message, type, "CLAMP", loop); } @Test @@ -118,7 +118,7 @@ public class LoopRepositoriesItCase { // Now set the ID in the previous model so that we can compare the objects loopLog.setId(((LoopLog) loopInDb.getLoopLogs().toArray()[0]).getId()); - assertThat(loopInDb).isEqualToComparingFieldByField(loopTest); + assertThat(loopInDb).isEqualToIgnoringGivenFields(loopTest, "components"); assertThat(loopRepository.existsById(loopTest.getName())).isEqualTo(true); assertThat(operationalPolicyService.isExisting(opPolicy.getName())).isEqualTo(true); assertThat(microServicePolicyService.isExisting(microServicePolicy.getName())).isEqualTo(true); @@ -126,7 +126,7 @@ public class LoopRepositoriesItCase { // Now attempt to read from database Loop loopInDbRetrieved = loopRepository.findById(loopTest.getName()).get(); - assertThat(loopInDbRetrieved).isEqualToComparingFieldByField(loopTest); + assertThat(loopInDbRetrieved).isEqualToIgnoringGivenFields(loopTest, "components"); assertThat((LoopLog) loopInDbRetrieved.getLoopLogs().toArray()[0]).isEqualToComparingFieldByField(loopLog); assertThat((OperationalPolicy) loopInDbRetrieved.getOperationalPolicies().toArray()[0]) .isEqualToComparingFieldByField(opPolicy); diff --git a/src/test/java/org/onap/clamp/loop/LoopServiceTestItCase.java b/src/test/java/org/onap/clamp/loop/LoopServiceTestItCase.java index c4254ec8..8add1a7b 100644 --- a/src/test/java/org/onap/clamp/loop/LoopServiceTestItCase.java +++ b/src/test/java/org/onap/clamp/loop/LoopServiceTestItCase.java @@ -296,7 +296,7 @@ public class LoopServiceTestItCase { saveTestLoopToDb(); // Add log Loop loop = loopsRepository.findById(EXAMPLE_LOOP_NAME).orElse(null); - loop.addLog(new LoopLog("test", LogType.INFO, loop)); + loop.addLog(new LoopLog("test", LogType.INFO, "CLAMP", loop)); loop = loopService.saveOrUpdateLoop(loop); // Add op policy OperationalPolicy operationalPolicy = new OperationalPolicy("opPolicy", null, diff --git a/src/test/java/org/onap/clamp/loop/LoopToJsonTest.java b/src/test/java/org/onap/clamp/loop/LoopToJsonTest.java index 144d34aa..c9350c61 100644 --- a/src/test/java/org/onap/clamp/loop/LoopToJsonTest.java +++ b/src/test/java/org/onap/clamp/loop/LoopToJsonTest.java @@ -38,6 +38,7 @@ import java.util.Random; import org.junit.Test; import org.onap.clamp.clds.util.JsonUtils; import org.onap.clamp.clds.util.ResourceFileUtil; +import org.onap.clamp.loop.components.external.PolicyComponent; import org.onap.clamp.loop.log.LogType; import org.onap.clamp.loop.log.LoopLog; import org.onap.clamp.policy.microservice.MicroServicePolicy; @@ -73,7 +74,7 @@ public class LoopToJsonTest { } private LoopLog getLoopLog(LogType type, String message, Loop loop) { - LoopLog log = new LoopLog(message, type, loop); + LoopLog log = new LoopLog(message, type, "CLAMP", loop); log.setId(Long.valueOf(new Random().nextInt())); return log; } @@ -97,8 +98,12 @@ public class LoopToJsonTest { System.out.println(jsonSerialized); Loop loopTestDeserialized = JsonUtils.GSON_JPA_MODEL.fromJson(jsonSerialized, Loop.class); assertNotNull(loopTestDeserialized); - assertThat(loopTestDeserialized).isEqualToIgnoringGivenFields(loopTest, "svgRepresentation", "blueprint"); - + assertThat(loopTestDeserialized).isEqualToIgnoringGivenFields(loopTest, "svgRepresentation", "blueprint", + "components"); + assertThat(loopTestDeserialized.getComponent("DCAE").getState()) + .isEqualToComparingFieldByField(loopTest.getComponent("DCAE").getState()); + assertThat(loopTestDeserialized.getComponent("POLICY").getState()) + .isEqualToComparingFieldByField(loopTest.getComponent("POLICY").getState()); // svg and blueprint not exposed so wont be deserialized assertThat(loopTestDeserialized.getBlueprint()).isEqualTo(null); assertThat(loopTestDeserialized.getSvgRepresentation()).isEqualTo(null); @@ -123,6 +128,6 @@ public class LoopToJsonTest { loopTest.addMicroServicePolicy(microServicePolicy); JSONAssert.assertEquals(ResourceFileUtil.getResourceAsString("tosca/pdp-group-policy-payload.json"), - loopTest.createPoliciesPayloadPdpGroup(), false); + PolicyComponent.createPoliciesPayloadPdpGroup(loopTest), false); } } diff --git a/src/test/javascript/propertyController.test.js b/src/test/javascript/propertyController.test.js index fbbc6bec..e7199966 100644 --- a/src/test/javascript/propertyController.test.js +++ b/src/test/javascript/propertyController.test.js @@ -30,16 +30,4 @@ describe('Property controller tests', function() { test('getMsUINotExist', () => { expect(propertyController.getMsUI("test")).toEqual(null); }); - - test('getLastUpdatedStatus', () => { - expect(propertyController.getLastUpdatedStatus()).toEqual('DESIGN'); - }); - - test('getDeploymentID', () => { - expect(propertyController.getDeploymentID()).toEqual('testId'); - }); - - test('getDeploymentStatusURL', () => { - expect(propertyController.getDeploymentStatusURL()).toEqual('testUrl'); - }); });
\ No newline at end of file diff --git a/src/test/resources/http-cache/third_party_proxy.py b/src/test/resources/http-cache/third_party_proxy.py index 0db977bb..0381ab18 100755 --- a/src/test/resources/http-cache/third_party_proxy.py +++ b/src/test/resources/http-cache/third_party_proxy.py @@ -127,10 +127,10 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler): with open(cached_file_content, 'w') as f: f.write(jsonGenerated) return True - elif self.path.startswith("/dcae-operationstatus") and http_type == "GET": + elif self.path.startswith("/dcae-operationstatus/install") and http_type == "GET": if not _file_available: - print "self.path start with /dcae-operationstatus, generating response json..." - jsonGenerated = "{\"operationType\": \"operationType1\", \"status\": \"succeeded\"}" + print "self.path start with /dcae-operationstatus/install, generating response json..." + jsonGenerated = "{\"operationType\": \"install\", \"status\": \"succeeded\"}" print "jsonGenerated: " + jsonGenerated try: @@ -145,24 +145,29 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler): with open(cached_file_content, 'w') as f: f.write(jsonGenerated) return True - elif self.path.startswith("/sdc/v1/catalog/services/") and http_type == "POST": + elif self.path.startswith("/dcae-operationstatus/uninstall") and http_type == "GET": if not _file_available: - print "self.path start with /sdc/v1/catalog/services/, generating response json..." - jsondata = json.loads(self.data_string) - jsonGenerated = "{\"artifactName\":\"" + jsondata['artifactName'] + "\",\"artifactType\":\"" + jsondata['artifactType'] + "\",\"artifactURL\":\"" + self.path + "\",\"artifactDescription\":\"" + jsondata['description'] + "\",\"artifactChecksum\":\"ZjJlMjVmMWE2M2M1OTM2MDZlODlmNTVmZmYzNjViYzM=\",\"artifactUUID\":\"" + str(uuid.uuid4()) + "\",\"artifactVersion\":\"1\"}" + print "self.path start with /dcae-operationstatus/uninstall, generating response json..." + jsonGenerated = "{\"operationType\": \"uninstall\", \"status\": \"succeeded\"}" print "jsonGenerated: " + jsonGenerated - os.makedirs(cached_file_folder, 0777) + try: + os.makedirs(cached_file_folder, 0777) + except OSError as e: + if e.errno != errno.EEXIST: + raise + print(cached_file_folder+" already exists") + with open(cached_file_header, 'w') as f: f.write("{\"Content-Length\": \"" + str(len(jsonGenerated)) + "\", \"Content-Type\": \"application/json\"}") with open(cached_file_content, 'w') as f: f.write(jsonGenerated) - return True; - elif self.path.startswith("/dcae-deployments/") and (http_type == "PUT" or http_type == "DELETE"): + return True + elif self.path.startswith("/sdc/v1/catalog/services/") and http_type == "POST": if not _file_available: - print "self.path start with /dcae-deployments/, generating response json..." - #jsondata = json.loads(self.data_string) - jsonGenerated = "{\"links\":{\"status\":\"http:\/\/" + PROXY_ADDRESS + "\/dcae-operationstatus\",\"test2\":\"test2\"}}" + print "self.path start with /sdc/v1/catalog/services/, generating response json..." + jsondata = json.loads(self.data_string) + jsonGenerated = "{\"artifactName\":\"" + jsondata['artifactName'] + "\",\"artifactType\":\"" + jsondata['artifactType'] + "\",\"artifactURL\":\"" + self.path + "\",\"artifactDescription\":\"" + jsondata['description'] + "\",\"artifactChecksum\":\"ZjJlMjVmMWE2M2M1OTM2MDZlODlmNTVmZmYzNjViYzM=\",\"artifactUUID\":\"" + str(uuid.uuid4()) + "\",\"artifactVersion\":\"1\"}" print "jsonGenerated: " + jsonGenerated os.makedirs(cached_file_folder, 0777) @@ -171,6 +176,30 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler): with open(cached_file_content, 'w') as f: f.write(jsonGenerated) return True + elif self.path.startswith("/dcae-deployments/") and http_type == "PUT": + print "self.path start with /dcae-deployments/ DEPLOY, generating response json..." + #jsondata = json.loads(self.data_string) + jsonGenerated = "{\"operationType\":\"install\",\"status\":\"processing\",\"links\":{\"status\":\"http:\/\/" + PROXY_ADDRESS + "\/dcae-operationstatus/install\"}}" + print "jsonGenerated: " + jsonGenerated + if not os.path.exists(cached_file_folder): + os.makedirs(cached_file_folder, 0777) + with open(cached_file_header, 'w+') as f: + f.write("{\"Content-Length\": \"" + str(len(jsonGenerated)) + "\", \"Content-Type\": \"application/json\"}") + with open(cached_file_content, 'w+') as f: + f.write(jsonGenerated) + return True + elif self.path.startswith("/dcae-deployments/") and http_type == "DELETE": + print "self.path start with /dcae-deployments/ UNDEPLOY, generating response json..." + #jsondata = json.loads(self.data_string) + jsonGenerated = "{\"operationType\":\"uninstall\",\"status\":\"processing\",\"links\":{\"status\":\"http:\/\/" + PROXY_ADDRESS + "\/dcae-operationstatus/uninstall\"}}" + print "jsonGenerated: " + jsonGenerated + if not os.path.exists(cached_file_folder): + os.makedirs(cached_file_folder, 0777) + with open(cached_file_header, 'w+') as f: + f.write("{\"Content-Length\": \"" + str(len(jsonGenerated)) + "\", \"Content-Type\": \"application/json\"}") + with open(cached_file_content, 'w+') as f: + f.write(jsonGenerated) + return True elif (self.path.startswith("/pdp/api/") and (http_type == "PUT" or http_type == "DELETE")) or (self.path.startswith("/pdp/api/policyEngineImport") and http_type == "POST"): print "self.path start with /pdp/api/, copying body to response ..." if not os.path.exists(cached_file_folder): @@ -180,7 +209,7 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler): with open(cached_file_content, 'w+') as f: f.write(self.data_string) return True - elif self.path.startswith("/policy/api/v1/policyTypes/") and http_type == "POST": + elif self.path.startswith("/policy/api/v1/policytypes/") and http_type == "POST": print "self.path start with POST new policy API /pdp/api/, copying body to response ..." if not os.path.exists(cached_file_folder): os.makedirs(cached_file_folder, 0777) @@ -189,8 +218,8 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler): with open(cached_file_content, 'w+') as f: f.write(self.data_string) return True - elif self.path.startswith("/policy/api/v1/policyTypes/") and http_type == "DELETE": - print "self.path start with DELETE new policy API /policy/api/v1/policyTypes/ ..." + elif self.path.startswith("/policy/api/v1/policytypes/") and http_type == "DELETE": + print "self.path start with DELETE new policy API /policy/api/v1/policytypes/ ..." if not os.path.exists(cached_file_folder): os.makedirs(cached_file_folder, 0777) @@ -199,6 +228,15 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler): with open(cached_file_content, 'w+') as f: f.write(self.data_string) return True + elif self.path.startswith("/policy/pap/v1/pdps/policies") and http_type == "POST": + print "self.path start with POST new policy API /policy/pap/v1/pdps/ ..." + if not os.path.exists(cached_file_folder): + os.makedirs(cached_file_folder, 0777) + with open(cached_file_header, 'w+') as f: + f.write("{\"Content-Length\": \"" + str(len("")) + "\", \"Content-Type\": \""+str("")+"\"}") + with open(cached_file_content, 'w+') as f: + f.write(self.data_string) + return True elif self.path.startswith("/policy/api/v1/policytypes/") and http_type == "GET": print "self.path start with /policy/api/v1/policytypes/, generating response json..." jsonGenerated = "{\"policyTypeId\": \"onap.policies.controlloop.operational\",\"policyTypeVersion\": \"1.0.0\",\"policyId\": \"OPERATIONAL_z711F_v1_0_ResourceInstanceName1_tca\"}" @@ -241,7 +279,9 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler): if not HOST: self.send_response(404) - return "404 Not found" + self.end_headers() + self.wfile.write('404 Not found, no remote HOST specified on the emulator !!!') + return "404 Not found, no remote HOST specified on the emulator !!!" url = '%s%s' % (HOST, self.path) response = requests.get(url, auth=AUTH, headers=HEADERS, stream=True) @@ -254,6 +294,8 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler): print('Status code : %s' % (response.status_code,)) print('Content : %s' % (response.content,)) self.send_response(response.status_code) + self.end_headers() + self.wfile.write('404 Not found, nothing found on the remote server !!!') return response.content else: print("Request for data currently present in cache: %s" % (cached_file_folder,)) @@ -292,7 +334,9 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler): if not HOST: self.send_response(404) - return "404 Not found" + self.end_headers() + self.wfile.write('404 Not found, no remote HOST specified on the emulator !!!') + return "404 Not found, no remote HOST specified on the emulator !!!" print("Request for data currently not present in cache: %s" % (cached_file_folder,)) @@ -308,6 +352,8 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler): print('Status code : %s' % (response.status_code,)) print('Content : %s' % (response.content,)) self.send_response(response.status_code) + self.end_headers() + self.wfile.write('404 Not found, nothing found on the remote server !!!') return response.content else: print("Request for data present in cache: %s" % (cached_file_folder,)) @@ -339,7 +385,9 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler): if not _file_available: if not HOST: self.send_response(404) - return "404 Not found" + self.end_headers() + self.wfile.write('404 Not found, no remote HOST specified on the emulator !!!') + return "404 Not found, no remote HOST specified on the emulator !!!" print("Request for data currently not present in cache: %s" % (cached_file_folder,)) @@ -355,6 +403,8 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler): print('Status code : %s' % (response.status_code,)) print('Content : %s' % (response.content,)) self.send_response(response.status_code) + self.end_headers() + self.wfile.write('404 Not found, nothing found on the remote server !!!') return response.content else: print("Request for data present in cache: %s" % (cached_file_folder,)) @@ -389,7 +439,9 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler): if not _file_available: if not HOST: self.send_response(404) - return "404 Not found" + self.end_headers() + self.wfile.write('404 Not found, no remote HOST specified on the emulator !!!') + return "404 Not found, no remote HOST specified on the emulator !!!" print("Request for data currently not present in cache: %s" % (cached_file_folder,)) @@ -405,6 +457,8 @@ class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler): print('Status code : %s' % (response.status_code,)) print('Content : %s' % (response.content,)) self.send_response(response.status_code) + self.end_headers() + self.wfile.write('404 Not found, nothing found on the remote server !!!') return response.content else: print("Request for data present in cache: %s" % (cached_file_folder,)) diff --git a/src/test/resources/https/https-test.properties b/src/test/resources/https/https-test.properties index 7614e177..0be9e298 100644 --- a/src/test/resources/https/https-test.properties +++ b/src/test/resources/https/https-test.properties @@ -30,6 +30,7 @@ server.port=${clamp.it.tests.https} server.ssl.key-store=classpath:https/keystore-test.jks server.ssl.key-store-password=testpass server.ssl.key-password=testpass +server.ssl.key-store-type=JKS ### In order to be user friendly when HTTPS is enabled, ### you can add another HTTP port that will be automatically redirected to HTTPS diff --git a/src/test/resources/logback.xml b/src/test/resources/logback.xml new file mode 100644 index 00000000..07e58785 --- /dev/null +++ b/src/test/resources/logback.xml @@ -0,0 +1,2 @@ +<!-- Empty Configuration to prevent creating log files by Units Tests (e.g LoggingUtilsTest) ! --> +<configuration /> diff --git a/version.properties b/version.properties index d222de82..b4b80529 100644 --- a/version.properties +++ b/version.properties @@ -26,8 +26,8 @@ # because they are used in Jenkins, whose plug-in doesn't support major=4 -minor=0 -patch=3 +minor=1 +patch=0 base_version=${major}.${minor}.${patch} |