From: sebdet Date: Thu, 23 May 2019 15:34:07 +0000 (+0200) Subject: Rework the loop state X-Git-Tag: 4.1.0~35^2 X-Git-Url: https://gerrit.onap.org/r/gitweb?a=commitdiff_plain;h=09bc8450b2b0c4f60eb4a241efc548d13c5c9912;p=clamp.git Rework the loop state Rework the state loop so there is no bug in the loop state anymore, now the components are scanned + upgrade to 4.0.4 Issue-ID: CLAMP-384 Change-Id: If7649238ee52864c84bfb9b6b8471d1738752e29 Signed-off-by: sebdet --- 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, diff --git a/pom.xml b/pom.xml index 4fdbea37..df8b0e27 100644 --- a/pom.xml +++ b/pom.xml @@ -61,12 +61,9 @@ UTF-8 UTF-8 - git-server - 1.8 - 1.0.0 - 2.23.2 - 2.1.4.RELEASE + 2.24.0 + 2.1.5.RELEASE jacoco ${project.build.directory}/surefire-reports @@ -89,7 +86,7 @@ true false - 9.0.16 + 9.0.20 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 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/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) @@ -110,6 +108,10 @@ public class Loop implements Serializable { @Enumerated(EnumType.STRING) private LoopState lastComputedState; + @Expose + @Transient + private final Map components = new HashMap<>(); + @Expose @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "loop") private Set 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 loopLogs = new HashSet<>(); + @SortNatural + private SortedSet 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 loopLogs) { + void setLoopLogs(SortedSet 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 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 listPolicyNamesPdpGroup() { - List 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 opSet = loop.getOperationalPolicies(); - Iterator 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 newOperationalPolicies) { Loop loop = findClosedLoopByName(loopName); Set 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 listPolicyNamesPdpGroup(Loop loop) { + List 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 { /** * The serial version ID. */ @@ -68,6 +68,10 @@ public class LoopLog implements Serializable { @Enumerated(EnumType.STRING) 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 @@ Date - Type + Type + Component Log - {{log.logInstant}} + {{log.logInstant}} {{log.logType}} - {{log.message}} + {{log.logComponent}} + {{log.message}} 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 = '   ' @@ -185,6 +151,22 @@ app .append( 'Status: ' + statusMsg + ''); + + var statusTable = ''; + + $.each(cl_props['components'], function(componentIndex, componentValue) { + statusTable+=''; + statusTable+=''; + statusTable+=''; + }); + statusTable+= '
ComponentStateDescription
'+componentIndex+''+componentValue['componentState']['stateName']+''+componentValue['componentState']['description']+'
'; + if ($("#status_components").length >= 1) + $("#status_components").remove(); + $("#activity_modeler") + .append( + '' + + statusTable + ''); + } 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/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..10144949 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 @@ @@ -212,27 +212,8 @@ - - - - - - ${exchangeProperty[policyStatus]} == 'SUBMITTED' and - ${exchangeProperty[dcaeStatus]} == 'NOT_DEPLOYED' - - - - - - - - - + + @@ -257,7 +238,7 @@ @@ -275,21 +256,8 @@ - - - - ${exchangeProperty[dcaeStatus]} == 'DEPLOYED' or ${exchangeProperty[dcaeStatus]} == 'IN_ERROR' or ${exchangeProperty[dcaeStatus]} == 'PROCESSING' - - - - - - - + @@ -524,6 +492,7 @@ + ${exchangeProperty[loopObject].getMicroServicePolicies()} @@ -609,20 +578,16 @@ - - false - - - - - + + + + + + java.lang.Exception @@ -637,8 +602,9 @@ uri="bean:org.onap.clamp.loop.log.LoopLogService?method=addLog('Get Status request failed, Error reported: ${exception}','ERROR',${exchangeProperty[loopObject]})" /> - + + ${exchangeProperty[loopObject]} + 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..b69c4fb8 --- /dev/null +++ b/src/main/resources/clds/camel/routes/dcae-flows.xml @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + PUT + + + application/json + + + ${exchangeProperty[X-ONAP-RequestID]} + + + + ${exchangeProperty[X-ONAP-InvocationID]} + + + + ${exchangeProperty[X-ONAP-PartnerName]} + + + + + + + + + + + + + + + + + DEPLOY loop status + (Dep-id:${exchangeProperty[dcaeDeploymentId]}, + StatusUrl:${exchangeProperty[dcaeStatusUrl]}) + + + + + + + + + + + + + + ${exchangeProperty[loopObject].getDcaeDeploymentId()} + != null + + + + + + + DELETE + + + application/json + + + + ${exchangeProperty[X-ONAP-RequestID]} + + + + ${exchangeProperty[X-ONAP-InvocationID]} + + + + ${exchangeProperty[X-ONAP-PartnerName]} + + + + + + + + + + + + + + + + + UNDEPLOY loop status + + + + + + + + + + + + + + + + + + + GET + + + ${exchangeProperty[X-ONAP-RequestID]} + + + + ${exchangeProperty[X-ONAP-InvocationID]} + + + + ${exchangeProperty[X-ONAP-PartnerName]} + + + + + + + + + DCAE deployment status + + + + + + + \ 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 @@ - - - - - ${header.loopName} - - - - - - - ${exchangeProperty[loopObject]} == null - - 404 - - - - - - - - - - - - - ${exchangeProperty[microServicePolicy].createPolicyPayload()} - - - - POST - - - application/json - - - ${exchangeProperty[X-ONAP-RequestID]} - - - - ${exchangeProperty[X-ONAP-InvocationID]} - - - - ${exchangeProperty[X-ONAP-PartnerName]} - - - - - - - - - ${exchangeProperty[microServicePolicy].getName()} creation - status - - - - - - - - - - - - - - null - - - DELETE - - - ${exchangeProperty[X-ONAP-RequestID]} - - - - ${exchangeProperty[X-ONAP-InvocationID]} - - - - ${exchangeProperty[X-ONAP-PartnerName]} - - - - - - - - - - ${exchangeProperty[microServicePolicy].getName()} removal - status - - - - - - - - - - - - - - ${exchangeProperty[operationalPolicy].createPolicyPayload()} - - - - POST - - - application/json - - - ${exchangeProperty[X-ONAP-RequestID]} - - - - ${exchangeProperty[X-ONAP-InvocationID]} - - - - ${exchangeProperty[X-ONAP-PartnerName]} - - - - - - - - - ${exchangeProperty[operationalPolicy].getName()} creation - status - - - - - - - - - - - - - - null - - - DELETE - - - ${exchangeProperty[X-ONAP-RequestID]} - - - - ${exchangeProperty[X-ONAP-InvocationID]} - - - - ${exchangeProperty[X-ONAP-PartnerName]} - - - - - - - - - ${exchangeProperty[operationalPolicy].getName()} removal - status - - - - - - - - - - - - - - ${exchangeProperty[guardPolicy].getValue()} - - - - POST - - - application/json - - - ${exchangeProperty[X-ONAP-RequestID]} - - - - ${exchangeProperty[X-ONAP-InvocationID]} - - - - ${exchangeProperty[X-ONAP-PartnerName]} - - - - - - - - - ${exchangeProperty[guardPolicy].getKey()} creation status - - - - - - - - - - - - - - null - - - DELETE - - - ${exchangeProperty[X-ONAP-RequestID]} - - - - ${exchangeProperty[X-ONAP-InvocationID]} - - - - ${exchangeProperty[X-ONAP-PartnerName]} - - - - - - - - - - ${exchangeProperty[guardPolicy].getKey()} removal status - - - - - - - - - - - - - - ${exchangeProperty[loopObject].createPoliciesPayloadPdpGroup()} - - - - POST - - - application/json - - - ${exchangeProperty[X-ONAP-RequestID]} - - - - ${exchangeProperty[X-ONAP-InvocationID]} - - - - ${exchangeProperty[X-ONAP-PartnerName]} - - - - - - - - - - PDP Group push ALL status - - - - - - - - - - - - - ${exchangeProperty[loopObject].listPolicyNamesPdpGroup()} - - - ${body} - - - null - - - DELETE - - - ${exchangeProperty[X-ONAP-RequestID]} - - - - ${exchangeProperty[X-ONAP-InvocationID]} - - - - ${exchangeProperty[X-ONAP-PartnerName]} - - - - - - ${exchangeProperty[policyName]} PDP Group removal status - - - - - - java.lang.Exception - - false - - - PDP Group removal, Error reported: ${exception} - - - - - - - - - - - - - - - - - - - - - - PUT - - - application/json - - - ${exchangeProperty[X-ONAP-RequestID]} - - - - ${exchangeProperty[X-ONAP-InvocationID]} - - - - ${exchangeProperty[X-ONAP-PartnerName]} - - - - - - - - - - DEPLOY loop status (id:${exchangeProperty[deploymentId]}) - - - - - - - - - - - - - - {\"serviceTypeId\": \"${exchangeProperty[loopObject].getDcaeBlueprintId()}\"} - - - - DELETE - - - application/json - - - ${exchangeProperty[X-ONAP-RequestID]} - - - - ${exchangeProperty[X-ONAP-InvocationID]} - - - - ${exchangeProperty[X-ONAP-PartnerName]} - - - - - - - - - - UNDEPLOY loop status - - - - - - - - - - - - - - - GET - - - ${exchangeProperty[X-ONAP-RequestID]} - - - - ${exchangeProperty[X-ONAP-InvocationID]} - - - - ${exchangeProperty[X-ONAP-PartnerName]} - - - - - - - - - Policy deployment status - - - - - - - - - - - - - - ${exchangeProperty[loopObject].getDcaeDeploymentStatusUrl()} == null - - - - - - - - - - - GET - - - ${exchangeProperty[X-ONAP-RequestID]} - - - - ${exchangeProperty[X-ONAP-InvocationID]} - - - - ${exchangeProperty[X-ONAP-PartnerName]} - - - - - - - - - DCAE deployment status - - - - - - - - - - - - - - - true - - - - - - - - \ 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 @@ + + + + + ${header.loopName} + + + + + + + ${exchangeProperty[loopObject]} == null + + 404 + + + + + + + + + false + + + false + + + ${exchangeProperty[loopObject].getComponent('POLICY')} + + + + + ${exchangeProperty[loopObject].getMicroServicePolicies()} + + + ${body.getName()} + + + ${body.getModelType()} + + + null + + + + false + + + + ${header.CamelHttpResponseCode} != 200 + + true + + + + + ${header.CamelHttpResponseCode} != 200 + + true + + + + + + ${exchangeProperty[loopObject].getOperationalPolicies()} + + + ${body.getName()} + + + onap.policies.controlloop.Operational + + + ${body} + + + null + + + + false + + + + ${header.CamelHttpResponseCode} != 200 + + true + + + + + ${header.CamelHttpResponseCode} != 200 + + true + + + + + + ${exchangeProperty[operationalPolicy].createGuardPolicyPayloads().entrySet()} + + + ${body.getKey()} + + + onap.policies.controlloop.Guard + + + null + + + + false + + + + ${header.CamelHttpResponseCode} != 200 + + true + + + + + ${header.CamelHttpResponseCode} != 200 + + true + + + + + + ${exchangeProperty[policyComponent].computeState(*)} + + + + + + + + + + ${exchangeProperty[loopObject].getComponent('DCAE')} + + + ${exchangeProperty[loopObject].getDcaeDeploymentStatusUrl()} + != null + + + false + + + + ${header.CamelHttpResponseCode} == 200 + + + + + + + + + ${exchangeProperty[dcaeComponent].computeState(*)} + + + + + + + + + + + + ${exchangeProperty['dcaeState'].getStateName()} == 'BLUEPRINT_DEPLOYED' and ${exchangeProperty['policyState'].getStateName()} == 'NOT_SENT' + + + + ${exchangeProperty['dcaeState'].getStateName()} == 'IN_ERROR' or ${exchangeProperty['dcaeState'].getStateName()} == 'MICROSERVICE_INSTALLATION_FAILED' + + + + ${exchangeProperty['dcaeState'].getStateName()} == 'MICROSERVICE_UNINSTALLATION_FAILED' or ${exchangeProperty['policyState'].getStateName()} == 'IN_ERROR' + + + + ${exchangeProperty['dcaeState'].getStateName()} == 'MICROSERVICE_INSTALLED_SUCCESSFULLY' and ${exchangeProperty['policyState'].getStateName()} == 'SENT_AND_DEPLOYED' + + + + ${exchangeProperty['dcaeState'].getStateName()} == 'MICROSERVICE_INSTALLED_SUCCESSFULLY' and ${exchangeProperty['policyState'].getStateName()} == 'SENT' + + + + ${exchangeProperty['dcaeState'].getStateName()} == 'BLUEPRINT_DEPLOYED' or ${exchangeProperty['dcaeState'].getStateName()} == 'MICROSERVICE_UNINSTALLED_SUCCESSFULLY' and ${exchangeProperty['policyState'].getStateName()} == 'SENT_AND_DEPLOYED' + + + + ${exchangeProperty['dcaeState'].getStateName()} == 'PROCESSING_MICROSERVICE_INSTALLATION' or ${exchangeProperty['dcaeState'].getStateName()} == 'PROCESSING_MICROSERVICE_UNINSTALLATION' and ${exchangeProperty['policyState'].getStateName()} == 'SENT_AND_DEPLOYED' + + + + ${exchangeProperty['dcaeState'].getStateName()} == 'MICROSERVICE_INSTALLED_SUCCESSFULLY' and ${exchangeProperty['policyState'].getStateName()} != 'NOT_SENT' + + + + + + + + \ 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..8cc594d2 --- /dev/null +++ b/src/main/resources/clds/camel/routes/policy-flows.xml @@ -0,0 +1,476 @@ + + + + + + + + + GET + + + ${exchangeProperty[X-ONAP-RequestID]} + + + + ${exchangeProperty[X-ONAP-InvocationID]} + + + + ${exchangeProperty[X-ONAP-PartnerName]} + + + + + + + + + ${exchangeProperty[policyName]} GET + Policy status + + + + + + + + + + + + + + GET + + + ${exchangeProperty[X-ONAP-RequestID]} + + + + ${exchangeProperty[X-ONAP-InvocationID]} + + + + ${exchangeProperty[X-ONAP-PartnerName]} + + + + + + + + + ${exchangeProperty[policyName]} GET Policy deployment + status + + + + + + + + + + + + + ${exchangeProperty[microServicePolicy].createPolicyPayload()} + + + + POST + + + application/json + + + ${exchangeProperty[X-ONAP-RequestID]} + + + + ${exchangeProperty[X-ONAP-InvocationID]} + + + + ${exchangeProperty[X-ONAP-PartnerName]} + + + + + + + + + ${exchangeProperty[microServicePolicy].getName()} creation + status + + + + + + + + + + + + + + null + + + DELETE + + + ${exchangeProperty[X-ONAP-RequestID]} + + + + ${exchangeProperty[X-ONAP-InvocationID]} + + + + ${exchangeProperty[X-ONAP-PartnerName]} + + + + + + + + + + ${exchangeProperty[microServicePolicy].getName()} removal + status + + + + + + + + + + + + + + ${exchangeProperty[operationalPolicy].createPolicyPayload()} + + + + POST + + + application/json + + + ${exchangeProperty[X-ONAP-RequestID]} + + + + ${exchangeProperty[X-ONAP-InvocationID]} + + + + ${exchangeProperty[X-ONAP-PartnerName]} + + + + + + + + + ${exchangeProperty[operationalPolicy].getName()} creation + status + + + + + + + + + + + + + + null + + + DELETE + + + ${exchangeProperty[X-ONAP-RequestID]} + + + + ${exchangeProperty[X-ONAP-InvocationID]} + + + + ${exchangeProperty[X-ONAP-PartnerName]} + + + + + + + + + ${exchangeProperty[operationalPolicy].getName()} removal + status + + + + + + + + + + + + + + ${exchangeProperty[guardPolicy].getValue()} + + + + POST + + + application/json + + + ${exchangeProperty[X-ONAP-RequestID]} + + + + ${exchangeProperty[X-ONAP-InvocationID]} + + + + ${exchangeProperty[X-ONAP-PartnerName]} + + + + + + + + + ${exchangeProperty[guardPolicy].getKey()} creation status + + + + + + + + + + + + + + null + + + DELETE + + + ${exchangeProperty[X-ONAP-RequestID]} + + + + ${exchangeProperty[X-ONAP-InvocationID]} + + + + ${exchangeProperty[X-ONAP-PartnerName]} + + + + + + + + + + ${exchangeProperty[guardPolicy].getKey()} removal status + + + + + + + + + + + + + + ${exchangeProperty[loopObject].getComponent("POLICY").createPoliciesPayloadPdpGroup(exchangeProperty[loopObject])} + + + + POST + + + application/json + + + ${exchangeProperty[X-ONAP-RequestID]} + + + + ${exchangeProperty[X-ONAP-InvocationID]} + + + + ${exchangeProperty[X-ONAP-PartnerName]} + + + + + + + + + + PDP Group push ALL status + + + + + + + + + + + + + ${exchangeProperty[loopObject].getComponent("POLICY").listPolicyNamesPdpGroup(exchangeProperty[loopObject])} + + + ${body} + + + null + + + DELETE + + + ${exchangeProperty[X-ONAP-RequestID]} + + + + ${exchangeProperty[X-ONAP-InvocationID]} + + + + ${exchangeProperty[X-ONAP-PartnerName]} + + + + + + ${exchangeProperty[policyName]} PDP Group removal status + + + + + + java.lang.Exception + + false + + + PDP Group removal, Error reported: ${exception} + + + + + + + + + + \ 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 @@ + + + + + true + + + + + + + + + \ No newline at end of file diff --git a/src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java b/src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java index ed912831..773332dd 100644 --- a/src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java +++ b/src/test/java/org/onap/clamp/loop/CsarInstallerItCase.java @@ -27,7 +27,6 @@ package org.onap.clamp.loop; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.any; import java.io.IOException; import java.util.ArrayList; @@ -65,6 +64,7 @@ import org.skyscreamer.jsonassert.JSONAssert; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.Rollback; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; @@ -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, ""); + 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, ""); - 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 a935808a..9a82ec09 100644 --- a/src/test/java/org/onap/clamp/loop/LoopRepositoriesItCase.java +++ b/src/test/java/org/onap/clamp/loop/LoopRepositoriesItCase.java @@ -92,7 +92,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 @@ -116,7 +116,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); @@ -124,7 +124,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 dcad1a51..8899a36c 100644 --- a/src/test/java/org/onap/clamp/loop/LoopToJsonTest.java +++ b/src/test/java/org/onap/clamp/loop/LoopToJsonTest.java @@ -36,6 +36,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; @@ -71,7 +72,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; } @@ -95,8 +96,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); @@ -121,6 +126,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..ce61ea06 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,11 +218,21 @@ 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": + 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) + 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/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: 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