diff options
Diffstat (limited to 'src/main/java/org/onap/clamp/clds')
74 files changed, 10240 insertions, 0 deletions
diff --git a/src/main/java/org/onap/clamp/clds/Application.java b/src/main/java/org/onap/clamp/clds/Application.java new file mode 100644 index 00000000..8459027f --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/Application.java @@ -0,0 +1,83 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds; + +import com.att.ajsc.common.utility.SystemPropertiesLoader; +import org.apache.camel.component.servlet.CamelHttpTransportServlet; +import org.camunda.bpm.spring.boot.starter.webapp.CamundaBpmWebappAutoConfiguration; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.actuate.autoconfigure.ManagementWebSecurityAutoConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration; +import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; +import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.scheduling.annotation.EnableAsync; + +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import java.util.ArrayList; +import java.util.Collection; + +@SpringBootApplication +@ComponentScan(basePackages = {"org.onap.clamp.clds","com.att.ajsc"}) +@EnableAutoConfiguration(exclude = {CamundaBpmWebappAutoConfiguration.class, HibernateJpaAutoConfiguration.class, JpaRepositoriesAutoConfiguration.class, SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class}) +@EnableAsync +public class Application extends SpringBootServletInitializer { + + private static final String CAMEL_SERVLET_NAME = "CamelServlet"; + private static final String CAMEL_URL_MAPPING = "/restservices/clds/v1/*"; + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(Application.class); + } + + public static void main(String[] args) throws Exception { + SystemPropertiesLoader.addSystemProperties(); + SpringApplication.run(Application.class, args); + } + + @Bean + public ServletRegistrationBean servletRegistrationBean() { + ServletRegistrationBean registration = new ServletRegistrationBean(); + registration.setName(CAMEL_SERVLET_NAME); + registration.setServlet(new CamelHttpTransportServlet()); + Collection<String> urlMappings = new ArrayList<>(); + urlMappings.add(CAMEL_URL_MAPPING); + registration.setUrlMappings(urlMappings); + return registration; + } + + @Bean + public Client restClient() { + return ClientBuilder.newClient(); + } + +} diff --git a/src/main/java/org/onap/clamp/clds/Routes.java b/src/main/java/org/onap/clamp/clds/Routes.java new file mode 100644 index 00000000..6fcb9307 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/Routes.java @@ -0,0 +1,42 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds; + +import com.att.ajsc.common.camel.AjscRouteBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class Routes extends RouteBuilder { + @Autowired + private AjscRouteBuilder ajscRoute; + + @Override + public void configure() throws Exception { + ajscRoute.initialize(this); + ajscRoute.setRoute(from("servlet:/?matchOnUriPrefix=true").to("cxfbean:jaxrsServices?providers=jaxrsProviders")); + } + +} diff --git a/src/main/java/org/onap/clamp/clds/WebConfig.java b/src/main/java/org/onap/clamp/clds/WebConfig.java new file mode 100644 index 00000000..38bd62e9 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/WebConfig.java @@ -0,0 +1,45 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +@Configuration +public class WebConfig { + + @Bean + public WebMvcConfigurerAdapter forwardToIndex() { + return new WebMvcConfigurerAdapter() { + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/swagger").setViewName("redirect:/icd/index.html"); + registry.addViewController("/icd/").setViewName("redirect:/icd/index.html"); + registry.addViewController("/login").setViewName("login.html"); + } + }; + } +} diff --git a/src/main/java/org/onap/clamp/clds/client/CldsEventDelegate.java b/src/main/java/org/onap/clamp/clds/client/CldsEventDelegate.java new file mode 100644 index 00000000..0f4d30d0 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/client/CldsEventDelegate.java @@ -0,0 +1,62 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.client; + +import org.onap.clamp.clds.dao.CldsDao; +import org.onap.clamp.clds.model.CldsEvent; +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.JavaDelegate; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.logging.Logger; + +/** + * Create CLDS Event. + */ +public class CldsEventDelegate implements JavaDelegate { + private static final Logger logger = Logger.getLogger(CldsEventDelegate.class.getName()); + @Autowired + private CldsDao cldsDao; + + /** + * Insert event using process variables. + * + * @param execution + */ + public void execute(DelegateExecution execution) throws Exception { + String controlName = (String) execution.getVariable("controlName"); + String actionCd = (String) execution.getVariable("actionCd"); + String actionStateCd = (String) execution.getVariable("actionStateCd"); + boolean isTest = (boolean) execution.getVariable("isTest"); + boolean isInsertTestEvent = (boolean) execution.getVariable("isInsertTestEvent"); + String userid = (String) execution.getVariable("userid"); + + // do not insert events for test actions unless flag set to insert them + if (!isTest || isInsertTestEvent) { + // won't really have userid here... + CldsEvent.insEvent(cldsDao, controlName, userid, actionCd, actionStateCd, execution.getProcessInstanceId()); + } + } + +} diff --git a/src/main/java/org/onap/clamp/clds/client/DcaeReqDelegate.java b/src/main/java/org/onap/clamp/clds/client/DcaeReqDelegate.java new file mode 100644 index 00000000..5583cf93 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/client/DcaeReqDelegate.java @@ -0,0 +1,59 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.client; + +import org.onap.clamp.clds.client.req.DcaeReq; +import org.onap.clamp.clds.model.prop.ModelProperties; +import org.onap.clamp.clds.model.refprop.RefProp; +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.JavaDelegate; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.logging.Logger; + + +/** + * Send control loop model to dcae proxy. + */ +public class DcaeReqDelegate implements JavaDelegate { + // currently uses the java.util.logging.Logger like the Camunda engine + private static final Logger logger = Logger.getLogger(DcaeReqDelegate.class.getName()); + + @Autowired + private RefProp refProp; + + /** + * Perform activity. Send to dcae proxy. + * + * @param execution + */ + public void execute(DelegateExecution execution) throws Exception { + ModelProperties prop = ModelProperties.create(execution); + String dcaeReq = DcaeReq.format(refProp, prop); + if (dcaeReq != null) { + execution.setVariable("dcaeReq", dcaeReq.getBytes()); + } + execution.setVariable("dcaeUrl", System.getProperty("CLDS_DCAE_URL") + "/" + prop.getControlName()); + } +} diff --git a/src/main/java/org/onap/clamp/clds/client/DcaeReqDeleteDelegate.java b/src/main/java/org/onap/clamp/clds/client/DcaeReqDeleteDelegate.java new file mode 100644 index 00000000..28dd6f1d --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/client/DcaeReqDeleteDelegate.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.client; + +import org.onap.clamp.clds.model.prop.ModelProperties; +import org.onap.clamp.clds.model.refprop.RefProp; +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.JavaDelegate; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.logging.Logger; + + +/** + * Send control loop model to dcae proxy. + */ +public class DcaeReqDeleteDelegate implements JavaDelegate { + // currently uses the java.util.logging.Logger like the Camunda engine + private static final Logger logger = Logger.getLogger(DcaeReqDeleteDelegate.class.getName()); + + @Autowired + private RefProp refProp; + + /** + * Perform activity. Send to dcae proxy. + * + * @param execution + */ + public void execute(DelegateExecution execution) throws Exception { + ModelProperties prop = ModelProperties.create(execution); + execution.setVariable("dcaeUrl", System.getProperty("CLDS_DCAE_URL") + "/" + prop.getControlName()); + } +} diff --git a/src/main/java/org/onap/clamp/clds/client/OperationalPolicyDelegate.java b/src/main/java/org/onap/clamp/clds/client/OperationalPolicyDelegate.java new file mode 100644 index 00000000..fc3ea2ab --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/client/OperationalPolicyDelegate.java @@ -0,0 +1,69 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.client; + +import org.onap.clamp.clds.client.req.OperationalPolicyReq; +import org.onap.clamp.clds.model.prop.ModelProperties; +import org.onap.clamp.clds.model.refprop.RefProp; +import org.openecomp.policy.api.AttributeType; +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.JavaDelegate; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Map; +import java.util.UUID; +import java.util.logging.Logger; + + +/** + * Send Operational Policy info to policy api. + */ +public class OperationalPolicyDelegate implements JavaDelegate { + // currently uses the java.util.logging.Logger like the Camunda engine + private static final Logger logger = Logger.getLogger(OperationalPolicyDelegate.class.getName()); + + @Autowired + private PolicyClient policyClient; + + @Autowired + private RefProp refProp; + + /** + * Perform activity. Send Operational Policy info to policy api. + * + * @param execution + */ + public void execute(DelegateExecution execution) throws Exception { + String operationalPolicyRequestUuid = UUID.randomUUID().toString(); + execution.setVariable("operationalPolicyRequestUuid", operationalPolicyRequestUuid); + + ModelProperties prop = ModelProperties.create(execution); + Map<AttributeType, Map<String, String>> attributes = OperationalPolicyReq.formatAttributes(refProp, prop); + String responseMessage = policyClient.sendBrms(attributes, prop, operationalPolicyRequestUuid); + if (responseMessage != null) { + execution.setVariable("operationalPolicyResponseMessage", responseMessage.getBytes()); + } + } + +} diff --git a/src/main/java/org/onap/clamp/clds/client/OperationalPolicyDeleteDelegate.java b/src/main/java/org/onap/clamp/clds/client/OperationalPolicyDeleteDelegate.java new file mode 100644 index 00000000..816b2142 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/client/OperationalPolicyDeleteDelegate.java @@ -0,0 +1,61 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.client; + +import org.onap.clamp.clds.model.prop.ModelProperties; +import org.onap.clamp.clds.model.prop.Policy; +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.JavaDelegate; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.logging.Logger; + + +/** + * Delete Operational Policy via policy api. + */ +public class OperationalPolicyDeleteDelegate implements JavaDelegate { + // currently uses the java.util.logging.Logger like the Camunda engine + private static final Logger logger = Logger.getLogger(OperationalPolicyDeleteDelegate.class.getName()); + + @Autowired + private PolicyClient policyClient; + + /** + * Perform activity. Delete Operational Policy via policy api. + * + * @param execution + */ + public void execute(DelegateExecution execution) throws Exception { + ModelProperties prop = ModelProperties.create(execution); + Policy policy = prop.getPolicy(); + prop.setCurrentModelElementId(policy.getId()); + + String responseMessage = policyClient.deleteBrms(prop); + if (responseMessage != null) { + execution.setVariable("operationalPolicyDeleteResponseMessage", responseMessage.getBytes()); + } + } + +} diff --git a/src/main/java/org/onap/clamp/clds/client/PolicyClient.java b/src/main/java/org/onap/clamp/clds/client/PolicyClient.java new file mode 100644 index 00000000..95e60ea2 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/client/PolicyClient.java @@ -0,0 +1,342 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.client; + +import org.onap.clamp.clds.model.prop.ModelProperties; +import org.onap.clamp.clds.model.refprop.RefProp; +import org.openecomp.policy.api.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationContext; + +import java.util.*; +import java.util.logging.Logger; + + +/** + * Policy utility methods - specifically, send the policy. + */ +public class PolicyClient { + // currently uses the java.util.logging.Logger like the Camunda engine + private static final Logger logger = Logger.getLogger(PolicyClient.class.getName()); + + @Value("${org.onap.clamp.config.files.cldsPolicyConfig:'classpath:etc/clds/clds-policy-config.properties'}") + private String cldsPolicyConfigFile; + + @Autowired + private ApplicationContext appContext; + + @Autowired + private RefProp refProp; + + public PolicyClient() { + + } + + /** + * Perform send of microservice policy + * + * @param attributes + * @param prop + * @param policyRequestUUID + * @return + * @throws Exception + */ + public String sendBrms(Map<AttributeType, Map<String, String>> attributes, ModelProperties prop, String policyRequestUUID) throws Exception { + + PolicyParameters policyParameters = new PolicyParameters(); + + // Set Policy Type(Mandatory) + policyParameters.setPolicyConfigType(PolicyConfigType.BRMS_PARAM); + + // Set Policy Name(Mandatory) + policyParameters.setPolicyName(prop.getCurrentPolicyScopeAndPolicyName()); + //Set Scope folder where the policy needs to be created(Mandatory) + //policyParameters.setPolicyScope(policyScope); + + // documentation says this is options, but when tested, got the following failure: java.lang.Exception: Policy send failed: PE300 - Data Issue: No policyDescription given. + policyParameters.setPolicyDescription(refProp.getStringValue("op.policyDescription")); + + policyParameters.setAttributes(attributes); + + //Set a random UUID(Mandatory) + policyParameters.setRequestID(UUID.fromString(policyRequestUUID)); + + String rtnMsg = send(policyParameters, prop); + + String policyType = refProp.getStringValue("policy.op.type"); + push(policyType, prop); + + return rtnMsg; + } + + /** + * Perform send of microservice policy + * + * @param policyJson + * @param prop + * @param policyRequestUUID + * @return + * @throws Exception + */ + public String sendMicroService(String policyJson, ModelProperties prop, String policyRequestUUID) throws Exception { + + PolicyParameters policyParameters = new PolicyParameters(); + + // Set Policy Type + policyParameters.setPolicyConfigType(PolicyConfigType.MicroService); + policyParameters.setEcompName(refProp.getStringValue("policy.ecomp.name")); + policyParameters.setPolicyName(prop.getCurrentPolicyScopeAndPolicyName()); + + policyParameters.setConfigBody(policyJson); + policyParameters.setConfigBodyType(PolicyType.JSON); + + policyParameters.setRequestID(UUID.fromString(policyRequestUUID)); + + String rtnMsg = send(policyParameters, prop); + + String policyType = refProp.getStringValue("policy.ms.type"); + push(policyType, prop); + + return rtnMsg; + } + + /** + * Perform send of policy. + * + * @param policyParameters + * @param prop + * @return + * @throws Exception + */ + private String send(PolicyParameters policyParameters, ModelProperties prop) throws Exception { + PolicyEngine policyEngine = new PolicyEngine(appContext.getResource(cldsPolicyConfigFile).getFile().getAbsolutePath()); + + // API method to create or update Policy. + PolicyChangeResponse response = null; + String responseMessage; + try { + if (prop.isCreateRequest()) { + logger.info("Attempting to create policy for action=" + prop.getActionCd()); + response = policyEngine.createPolicy(policyParameters); + responseMessage = response.getResponseMessage(); + } else { + logger.info("Attempting to update policy for action=" + prop.getActionCd()); + response = policyEngine.updatePolicy(policyParameters); + responseMessage = response.getResponseMessage(); + } + } catch (Exception e) { + responseMessage = e.toString(); + } + logger.info("response is " + responseMessage); + + if (response != null && response.getResponseCode() == 200) { + logger.info("Policy send successful"); + } else { + logger.warning("Policy send failed: " + responseMessage); + throw new Exception("Policy send failed: " + responseMessage); + } + + return responseMessage; + } + + /** + * Format and send push of policy. + * + * @param policyType + * @param prop + * @return + * @throws Exception + */ + private String push(String policyType, ModelProperties prop) throws Exception { + PushPolicyParameters pushPolicyParameters = new PushPolicyParameters(); + + //Parameter arguments + pushPolicyParameters.setPolicyName(prop.getCurrentPolicyScopeAndPolicyName()); + pushPolicyParameters.setPolicyType(policyType); + //pushPolicyParameters.setPolicyScope(policyScope); + pushPolicyParameters.setPdpGroup(refProp.getStringValue("policy.pdp.group")); + pushPolicyParameters.setRequestID(null); + + PolicyEngine policyEngine = new PolicyEngine(appContext.getResource(cldsPolicyConfigFile).getFile().getAbsolutePath()); + + // API method to create or update Policy. + PolicyChangeResponse response = null; + String responseMessage; + try { + logger.info("Attempting to push policy..."); + response = policyEngine.pushPolicy(pushPolicyParameters); + responseMessage = response.getResponseMessage(); + } catch (Exception e) { + responseMessage = e.toString(); + } + logger.info("response is " + responseMessage); + + if (response != null && (response.getResponseCode() == 200 || response.getResponseCode() == 204)) { + logger.info("Policy push successful"); + } else { + logger.warning("Policy push failed: " + responseMessage); + throw new Exception("Policy push failed: " + responseMessage); + } + + return responseMessage; + } + + /** + * Use Get Config Policy API to retrieve the versions for a policy. + * Return versions in sorted order. + * Return empty list if none found. + * + * @param policyNamePrefix + * @param prop + * @return + * @throws Exception + */ + private List<Integer> getVersions(String policyNamePrefix, ModelProperties prop) throws Exception { + + ArrayList<Integer> versions = new ArrayList<>(); + ConfigRequestParameters configRequestParameters = new ConfigRequestParameters(); + String policyName = prop.getCurrentPolicyScopeAndFullPolicyName(policyNamePrefix); + logger.info("policyName=" + policyName); + configRequestParameters.setPolicyName(policyName); + + PolicyEngine policyEngine = new PolicyEngine(appContext.getResource(cldsPolicyConfigFile).getFile().getAbsolutePath()); + + Collection<PolicyConfig> response = policyEngine.getConfig(configRequestParameters); + + Iterator<PolicyConfig> itrResp = response.iterator(); + + while (itrResp.hasNext()) { + PolicyConfig policyConfig = itrResp.next(); + try { + Integer version = new Integer(policyConfig.getPolicyVersion()); + versions.add(version); + } catch (Exception e) { + // just print warning - if n;o policies, version may be null + logger.warning("warning: failed to parse policyConfig.getPolicyVersion()=" + policyConfig.getPolicyVersion()); + } + } + Collections.sort(versions); + logger.info("versions.size()=" + versions.size()); + + return versions; + } + + /** + * Format and send delete Micro Service requests to Policy + * + * @param prop + * @return + * @throws Exception + */ + public String deleteMicrosService(ModelProperties prop) throws Exception { + String policyNamePrefix = refProp.getStringValue("policy.ms.policyNamePrefix"); + return deletePolicy(policyNamePrefix, prop); + } + + /** + * Format and send delete BRMS requests to Policy + * + * @param prop + * @return + * @throws Exception + */ + public String deleteBrms(ModelProperties prop) throws Exception { + String policyNamePrefix = refProp.getStringValue("policy.op.policyNamePrefix"); + return deletePolicy(policyNamePrefix, prop); + } + + /** + * Format and send delete PAP and PDP requests to Policy + * + * @param policyNamePrefix + * @param prop + * @return + * @throws Exception + */ + private String deletePolicy(String policyNamePrefix, ModelProperties prop) throws Exception { + String responseMessage = null; + + DeletePolicyParameters deletePolicyParameters = new DeletePolicyParameters(); + + List<Integer> versions = getVersions(policyNamePrefix, prop); + if (versions.size() > 0) { + int maxVersion = Collections.max(versions); + + // format delete all PAP request + deletePolicyParameters.setPolicyName(prop.getCurrentPolicyScopeAndFullPolicyNameWithVersion(policyNamePrefix, maxVersion)); + deletePolicyParameters.setPolicyComponent("PAP"); + deletePolicyParameters.setDeleteCondition(DeletePolicyCondition.ALL); + String policyType = refProp.getStringValue("policy.ms.type"); + deletePolicyParameters.setPolicyType(policyType); + + //send delete request + responseMessage = sendDeletePolicy(deletePolicyParameters, prop); + } + + for (Integer version : versions) { + // format delete all PDP request + deletePolicyParameters.setPolicyName(prop.getCurrentPolicyScopeAndFullPolicyNameWithVersion(policyNamePrefix, version)); + deletePolicyParameters.setPolicyComponent("PDP"); + deletePolicyParameters.setPdpGroup(refProp.getStringValue("policy.pdp.group")); + //send delete request + responseMessage = responseMessage + "; " + sendDeletePolicy(deletePolicyParameters, prop); + } + + return responseMessage; + } + + /** + * Send delete request to Policy + * + * @param deletePolicyParameters + * @param prop + * @return + * @throws Exception + */ + private String sendDeletePolicy(DeletePolicyParameters deletePolicyParameters, ModelProperties prop) throws Exception { + PolicyEngine policyEngine = new PolicyEngine(appContext.getResource(cldsPolicyConfigFile).getFile().getAbsolutePath()); + + // API method to create or update Policy. + PolicyChangeResponse response = null; + String responseMessage; + try { + logger.info("Attempting to delete policy..."); + response = policyEngine.deletePolicy(deletePolicyParameters); + responseMessage = response.getResponseMessage(); + } catch (Exception e) { + responseMessage = e.toString(); + } + logger.info("response is " + responseMessage); + + if (response != null && response.getResponseCode() == 200) { + logger.info("Policy delete successful"); + } else { + logger.warning("Policy delete failed: " + responseMessage); + throw new Exception("Policy delete failed: " + responseMessage); + } + + return responseMessage; + } +}
\ No newline at end of file diff --git a/src/main/java/org/onap/clamp/clds/client/SdcCatalogServices.java b/src/main/java/org/onap/clamp/clds/client/SdcCatalogServices.java new file mode 100644 index 00000000..58bba3c9 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/client/SdcCatalogServices.java @@ -0,0 +1,864 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.client; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.databind.node.TextNode; +import org.onap.clamp.clds.client.req.SdcReq; +import org.onap.clamp.clds.model.*; +import org.onap.clamp.clds.model.prop.ModelProperties; +import org.onap.clamp.clds.model.refprop.RefProp; +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVRecord; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +public class SdcCatalogServices { + private static final Logger logger = LoggerFactory.getLogger(SdcSendReqDelegate.class); + + @Autowired + private RefProp refProp; + + public String getAsdcServicesInformation(String uuid) throws Exception { + String baseUrl = refProp.getStringValue("asdc.serviceUrl"); + String basicAuth = SdcReq.getAsdcBasicAuth(refProp); + try { + String url = baseUrl; + if (uuid != null) { + url = baseUrl + "/" + uuid + "/metadata"; + } + URL urlObj = new URL(url); + + HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection(); + + conn.setRequestProperty("X-ONAP-InstanceID", "CLAMP-Tool"); + conn.setRequestProperty("Authorization", basicAuth); + conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8"); + conn.setRequestMethod("GET"); + + String resp = getResponse(conn); + if (resp != null) { + logger.info(resp.toString()); + return resp; + } + } catch (Exception e) { + logger.error("not able to ger any service information from asdc for uuid:" + uuid); + } + return ""; + } + + /** + * To remove duplicate serviceUUIDs from asdc services List + * + * @param rawCldsAsdcServiceList + * @return + */ + public List<CldsAsdcServiceInfo> removeDuplicateServices(List<CldsAsdcServiceInfo> rawCldsAsdcServiceList) { + List<CldsAsdcServiceInfo> cldsAsdcServiceInfoList = null; + if (rawCldsAsdcServiceList != null && rawCldsAsdcServiceList.size() > 0) { + // sort list + Collections.sort(rawCldsAsdcServiceList); + // and then take only the services with the max version (last in the list with the same name) + cldsAsdcServiceInfoList = new ArrayList<>(); + for (int i = 1; i < rawCldsAsdcServiceList.size(); i++) { + // compare name with previous - if not equal, then keep the previous (it's the last with that name) + CldsAsdcServiceInfo prev = rawCldsAsdcServiceList.get(i - 1); + if (!rawCldsAsdcServiceList.get(i).getName().equals(prev.getName())) { + cldsAsdcServiceInfoList.add(prev); + } + } + // add the last in the list + cldsAsdcServiceInfoList.add(rawCldsAsdcServiceList.get(rawCldsAsdcServiceList.size() - 1)); + } + return cldsAsdcServiceInfoList; + } + + /** + * To remove duplicate serviceUUIDs from asdc resources List + * + * @param rawCldsAsdcResourceList + * @return + */ + public List<CldsAsdcResource> removeDuplicateAsdcResourceInstances(List<CldsAsdcResource> rawCldsAsdcResourceList) { + List<CldsAsdcResource> cldsAsdcResourceList = null; + if (rawCldsAsdcResourceList != null && rawCldsAsdcResourceList.size() > 0) { + // sort list + Collections.sort(rawCldsAsdcResourceList); + // and then take only the resources with the max version (last in the list with the same name) + cldsAsdcResourceList = new ArrayList<>(); + for (int i = 1; i < rawCldsAsdcResourceList.size(); i++) { + // compare name with previous - if not equal, then keep the previous (it's the last with that name) + CldsAsdcResource prev = rawCldsAsdcResourceList.get(i - 1); + if (!rawCldsAsdcResourceList.get(i).getResourceInstanceName().equals(prev.getResourceInstanceName())) { + cldsAsdcResourceList.add(prev); + } + } + // add the last in the list + cldsAsdcResourceList.add(rawCldsAsdcResourceList.get(rawCldsAsdcResourceList.size() - 1)); + } + return cldsAsdcResourceList; + } + + + /** + * To remove duplicate basic resources with same resourceUUIDs + * + * @param rawCldsAsdcResourceListBasicList + * @return + */ + public List<CldsAsdcResourceBasicInfo> removeDuplicateAsdcResourceBasicInfo(List<CldsAsdcResourceBasicInfo> rawCldsAsdcResourceListBasicList) { + List<CldsAsdcResourceBasicInfo> cldsAsdcResourceBasicInfoList = null; + if (rawCldsAsdcResourceListBasicList != null && rawCldsAsdcResourceListBasicList.size() > 0) { + // sort list + Collections.sort(rawCldsAsdcResourceListBasicList); + // and then take only the resources with the max version (last in the list with the same name) + cldsAsdcResourceBasicInfoList = new ArrayList<>(); + for (int i = 1; i < rawCldsAsdcResourceListBasicList.size(); i++) { + // compare name with previous - if not equal, then keep the previous (it's the last with that name) + CldsAsdcResourceBasicInfo prev = rawCldsAsdcResourceListBasicList.get(i - 1); + if (!rawCldsAsdcResourceListBasicList.get(i).getName().equals(prev.getName())) { + cldsAsdcResourceBasicInfoList.add(prev); + } + } + // add the last in the list + cldsAsdcResourceBasicInfoList.add(rawCldsAsdcResourceListBasicList.get(rawCldsAsdcResourceListBasicList.size() - 1)); + } + return cldsAsdcResourceBasicInfoList; + } + + /** + * To get ServiceUUID by using serviceInvariantUUID + * + * @param invariantID + * @return + * @throws Exception + */ + public String getServiceUUIDFromServiceInvariantID(String invariantID) throws Exception { + String serviceUUID = ""; + String responseStr = getAsdcServicesInformation(null); + List<CldsAsdcServiceInfo> rawCldsAsdcServicesList = getCldsAsdcServicesListFromJson(responseStr); + List<CldsAsdcServiceInfo> cldsAsdcServicesList = removeDuplicateServices(rawCldsAsdcServicesList); + if (cldsAsdcServicesList != null && cldsAsdcServicesList.size() > 0) { + for (CldsAsdcServiceInfo currCldsAsdcServiceInfo : cldsAsdcServicesList) { + if (currCldsAsdcServiceInfo != null && currCldsAsdcServiceInfo.getInvariantUUID() != null + && currCldsAsdcServiceInfo.getInvariantUUID().equalsIgnoreCase(invariantID)) { + serviceUUID = currCldsAsdcServiceInfo.getUuid(); + break; + } + } + } + return serviceUUID; + } + + /** + * To get CldsAsdsServiceInfo class by parsing json string + * + * @param jsonStr + * @return + * @throws JsonParseException + * @throws JsonMappingException + * @throws IOException + */ + public List<CldsAsdcServiceInfo> getCldsAsdcServicesListFromJson(String jsonStr) throws IOException { + ObjectMapper objectMapper = new ObjectMapper(); + if (StringUtils.isBlank(jsonStr)) { + return null; + } + return objectMapper.readValue(jsonStr, objectMapper.getTypeFactory().constructCollectionType(List.class, CldsAsdcServiceInfo.class)); + } + + /** + * To get List<CldsAsdcResourceBasicInfo> class by parsing json string + * + * @param jsonStr + * @return + * @throws JsonParseException + * @throws JsonMappingException + * @throws IOException + */ + public List<CldsAsdcResourceBasicInfo> getAllAsdcResourcesListFromJson(String jsonStr) throws IOException { + ObjectMapper objectMapper = new ObjectMapper(); + if (StringUtils.isBlank(jsonStr)) { + return null; + } + return objectMapper.readValue(jsonStr, objectMapper.getTypeFactory().constructCollectionType(List.class, CldsAsdcResourceBasicInfo.class)); + } + + /** + * To get CldsAsdsResource class by parsing json string + * + * @param jsonStr + * @return + * @throws JsonParseException + * @throws JsonMappingException + * @throws IOException + */ + public CldsAsdcResource getCldsAsdcResourceFromJson(String jsonStr) throws IOException { + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.readValue(jsonStr, CldsAsdcResource.class); + } + + /** + * To get CldsAsdcServiceDetail by parsing json string + * + * @param jsonStr + * @return + * @throws JsonParseException + * @throws JsonMappingException + * @throws IOException + */ + public CldsAsdcServiceDetail getCldsAsdcServiceDetailFromJson(String jsonStr) throws IOException { + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.readValue(jsonStr, CldsAsdcServiceDetail.class); + } + + /** + * To upload artifact to asdc based on serviceUUID and resourcename on url + * @param prop + * @param userid + * @param url + * @param formatttedAsdcReq + * @return + * @throws Exception + */ + public String uploadArtifactToAsdc(ModelProperties prop, String userid, String url, String formatttedAsdcReq) throws Exception { + logger.info("userid=" + userid); + String md5Text = SdcReq.calculateMD5ByString(formatttedAsdcReq); + byte[] postData = SdcReq.stringToByteArray(formatttedAsdcReq); + int postDataLength = postData.length; + HttpURLConnection conn = getAsdcHttpUrlConnection(userid, postDataLength, url, md5Text); + try (DataOutputStream wr = new DataOutputStream(conn.getOutputStream())) { + wr.write(postData); + } + boolean requestFailed = true; + int responseCode = conn.getResponseCode(); + logger.info("responseCode=" + responseCode); + if (responseCode == 200) { + requestFailed = false; + } + + String responseStr = getResponse(conn); + if (responseStr != null) { + if (requestFailed) { + logger.error("requestFailed - responseStr=" + responseStr); + throw new Exception(responseStr); + } + } + return responseStr; + } + + private HttpURLConnection getAsdcHttpUrlConnection(String userid, int postDataLength, String url, String md5Text) throws IOException { + logger.info("userid=" + userid); + String basicAuth = SdcReq.getAsdcBasicAuth(refProp); + String asdcXONAPInstanceID = refProp.getStringValue("asdc.asdcX-ONAP-InstanceID"); + URL urlObj = new URL(url); + HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection(); + conn.setDoOutput(true); + conn.setRequestProperty("X-ONAP-InstanceID", asdcXONAPInstanceID); + conn.setRequestProperty("Authorization", basicAuth); + conn.setRequestProperty("Content-Type", "application/json"); + conn.setRequestProperty("Content-MD5", md5Text); + conn.setRequestProperty("HTTP_CSP_USERID", userid); + conn.setRequestMethod("POST"); + conn.setRequestProperty("charset", "utf-8"); + conn.setRequestProperty("Content-Length", Integer.toString(postDataLength)); + conn.setUseCaches(false); + return conn; + } + + private String getResponse(HttpURLConnection conn) throws IOException { + try (InputStream is = getInputStream(conn)) { + if (is != null) { + try (BufferedReader in = new BufferedReader(new InputStreamReader(is))) { + StringBuffer response = new StringBuffer(); + String inputLine; + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + } + return response.toString(); + } + } + } + return null; + } + + private InputStream getInputStream(HttpURLConnection conn) throws IOException { + InputStream inStream = conn.getErrorStream(); + if (inStream == null) { + inStream = conn.getInputStream(); + } + return inStream; + } + + + public CldsDBServiceCache getCldsDBServiceCacheUsingCldsServiceData(CldsServiceData cldsServiceData) throws IOException { + CldsDBServiceCache cldsDbServiceCache = new CldsDBServiceCache(); + cldsDbServiceCache.setCldsDataInstream(cldsServiceData); + cldsDbServiceCache.setInvariantId(cldsServiceData.getServiceInvariantUUID()); + cldsDbServiceCache.setServiceId(cldsServiceData.getServiceUUID()); + return cldsDbServiceCache; + } + + public boolean isCldsAsdcCacheDataExpired(CldsServiceData cldsServiceData) throws Exception { + boolean expired = false; + if (cldsServiceData != null && cldsServiceData.getServiceUUID() != null) { + String cachedServiceUUID = cldsServiceData.getServiceUUID(); + String latestServiceUUID = getServiceUUIDFromServiceInvariantID(cldsServiceData.getServiceInvariantUUID()); + String defaultRecordAge = refProp.getStringValue("CLDS_SERVICE_CACHE_MAX_SECONDS"); + if ((!cachedServiceUUID.equalsIgnoreCase(latestServiceUUID)) || + (cldsServiceData.getAgeOfRecord() != null && cldsServiceData.getAgeOfRecord() > Long.parseLong(defaultRecordAge))) { + expired = true; + } + } else { + expired = true; + } + return expired; + } + + public CldsServiceData getCldsServiceDataWithAlarmConditions(String invariantServiceUUID) throws Exception { + String url = refProp.getStringValue("asdc.serviceUrl"); + String catalogUrl = refProp.getStringValue("asdc.catalog.url"); + String serviceUUID = getServiceUUIDFromServiceInvariantID(invariantServiceUUID); + String serviceDetailUrl = url + "/" + serviceUUID + "/metadata"; + String responseStr = getCldsServicesOrResourcesBasedOnURL(serviceDetailUrl, false); + ObjectMapper objectMapper = new ObjectMapper(); + CldsServiceData cldsServiceData = new CldsServiceData(); + if (responseStr != null) { + CldsAsdcServiceDetail cldsAsdcServiceDetail = objectMapper.readValue(responseStr, CldsAsdcServiceDetail.class); + cldsServiceData.setServiceUUID(cldsAsdcServiceDetail.getUuid()); + cldsServiceData.setServiceInvariantUUID(cldsAsdcServiceDetail.getInvariantUUID()); + + // To remove duplicate resources from serviceDetail and add valid vfs to service + if (cldsAsdcServiceDetail != null && cldsAsdcServiceDetail.getResources() != null) { + List<CldsAsdcResource> cldsAsdcResourceList = removeDuplicateAsdcResourceInstances(cldsAsdcServiceDetail.getResources()); + if (cldsAsdcResourceList != null && cldsAsdcResourceList.size() > 0) { + List<CldsVfData> cldsVfDataList = new ArrayList<>(); + for (CldsAsdcResource currCldsAsdcResource : cldsAsdcResourceList) { + if (currCldsAsdcResource != null && currCldsAsdcResource.getResoucreType() != null && currCldsAsdcResource.getResoucreType().equalsIgnoreCase("VF")) { + CldsVfData currCldsVfData = new CldsVfData(); + currCldsVfData.setVfName(currCldsAsdcResource.getResourceInstanceName()); + currCldsVfData.setVfInvariantResourceUUID(currCldsAsdcResource.getResourceInvariantUUID()); + cldsVfDataList.add(currCldsVfData); + } + } + cldsServiceData.setCldsVfs(cldsVfDataList); + // For each vf in the list , add all vfc's + getAllVfcForVfList(cldsVfDataList, catalogUrl); + logger.info("value of cldsServiceData:" + cldsServiceData); + logger.info("value of cldsServiceData:" + cldsServiceData.getServiceInvariantUUID()); + } + } + } + return cldsServiceData; + } + + /** + * @param cldsVfDataList + * @throws IOException + */ + private void getAllVfcForVfList(List<CldsVfData> cldsVfDataList, String catalogUrl) throws IOException { + // todo : refact this.. + if (cldsVfDataList != null && cldsVfDataList.size() > 0) { + List<CldsAsdcResourceBasicInfo> allAsdcResources = getAllAsdcResources(); + String resourceVFType = "VF"; + List<CldsAsdcResourceBasicInfo> allVfResources = getAllAsdcVForVFCResourcesBasedOnResourceType(resourceVFType, allAsdcResources); + String resourceVFCType = "VFC"; + List<CldsAsdcResourceBasicInfo> allVfcResources = getAllAsdcVForVFCResourcesBasedOnResourceType(resourceVFCType, allAsdcResources); + for (CldsVfData currCldsVfData : cldsVfDataList) { + if (currCldsVfData != null && currCldsVfData.getVfInvariantResourceUUID() != null) { + String resourceUUID = getResourceUUIDFromResourceInvariantUUID(currCldsVfData.getVfInvariantResourceUUID(), allVfResources); + if (resourceUUID != null) { + String vfResourceUUIDUrl = catalogUrl + "resources" + "/" + resourceUUID + "/metadata"; + String vfResponse = getCldsServicesOrResourcesBasedOnURL(vfResourceUUIDUrl, false); + if (vfResponse != null) { + List<CldsVfcData> vfcDataListFromVfResponse = getVFCDataListFromVfResponse(vfResponse); + if (vfcDataListFromVfResponse != null) { + currCldsVfData.setCldsVfcs(vfcDataListFromVfResponse); + if (vfcDataListFromVfResponse.size() > 0) { + // To get artifacts for every VFC and get alarm conditions from artifact + for (CldsVfcData currCldsVfcData : vfcDataListFromVfResponse) { + if (currCldsVfcData != null && currCldsVfcData.getVfcInvariantResourceUUID() != null) { + String resourceVFCUUID = getResourceUUIDFromResourceInvariantUUID(currCldsVfcData.getVfcInvariantResourceUUID(), allVfcResources); + if (resourceVFCUUID != null) { + String vfcResourceUUIDUrl = catalogUrl + "resources" + "/" + resourceVFCUUID + "/metadata"; + String vfcResponse = getCldsServicesOrResourcesBasedOnURL(vfcResourceUUIDUrl, false); + if (vfcResponse != null) { + List<CldsAlarmCondition> alarmCondtionsFromVfc = getAlarmCondtionsFromVfc(vfcResponse); + currCldsVfcData.setCldsAlarmConditions(alarmCondtionsFromVfc); + } + } else { + logger.info("No resourceVFC UUID found for given invariantID:" + currCldsVfcData.getVfcInvariantResourceUUID()); + } + } + } + } + } + } + } else { + logger.info("No resourceUUID found for given invariantREsourceUUID:" + currCldsVfData.getVfInvariantResourceUUID()); + } + } + } + } + } + + private List<CldsVfcData> getVFCDataListFromVfResponse(String vfResponse) throws IOException { + ObjectMapper mapper = new ObjectMapper(); + ObjectNode vfResponseNode = (ObjectNode) mapper.readTree(vfResponse); + ArrayNode vfcArrayNode = (ArrayNode) vfResponseNode.get("resources"); + List<CldsVfcData> cldsVfcDataList = new ArrayList<>(); + if (vfcArrayNode != null && vfcArrayNode.size() > 0) { + for (int index = 0; index < vfcArrayNode.size(); index++) { + CldsVfcData currCldsVfcData = new CldsVfcData(); + ObjectNode currVfcNode = (ObjectNode) vfcArrayNode.get(index); + TextNode resourceTypeNode = (TextNode) currVfcNode.get("resoucreType"); + if (resourceTypeNode != null && resourceTypeNode.textValue().equalsIgnoreCase("VFC")) { + TextNode vfcResourceName = (TextNode) currVfcNode.get("resourceInstanceName"); + TextNode vfcInvariantResourceUUID = (TextNode) currVfcNode.get("resourceInvariantUUID"); + currCldsVfcData.setVfcName(vfcResourceName.textValue()); + currCldsVfcData.setVfcInvariantResourceUUID(vfcInvariantResourceUUID.textValue()); + cldsVfcDataList.add(currCldsVfcData); + } + } + } + return cldsVfcDataList; + } + + private String removeUnwantedBracesFromString(String id) { + if (id != null && id.contains("\"")) { + id = id.replaceAll("\"", ""); + } + return id; + } + + private List<CldsAlarmCondition> getAlarmCondtionsFromVfc(String vfcResponse) throws IOException { + List<CldsAlarmCondition> cldsAlarmConditionList = new ArrayList<>(); + ObjectMapper mapper = new ObjectMapper(); + ObjectNode vfcResponseNode = (ObjectNode) mapper.readTree(vfcResponse); + ArrayNode artifactsArrayNode = (ArrayNode) vfcResponseNode.get("artifacts"); + + if (artifactsArrayNode != null && artifactsArrayNode.size() > 0) { + for (int index = 0; index < artifactsArrayNode.size(); index++) { + ObjectNode currArtifactNode = (ObjectNode) artifactsArrayNode.get(index); + TextNode artifactUrlNode = (TextNode) currArtifactNode.get("artifactURL"); + if (artifactUrlNode != null) { + String responsesFromArtifactUrl = getResponsesFromArtifactUrl(artifactUrlNode.textValue()); + cldsAlarmConditionList.addAll(parseCsvToGetAlarmConditions(responsesFromArtifactUrl)); + logger.info(responsesFromArtifactUrl); + } + } + } + return cldsAlarmConditionList; + } + + private List<CldsAlarmCondition> parseCsvToGetAlarmConditions(String allAlarmCondsValues) throws IOException { + List<CldsAlarmCondition> cldsAlarmConditionList = new ArrayList<>(); + Reader alarmReader = new StringReader(allAlarmCondsValues); + Iterable<CSVRecord> records = CSVFormat.RFC4180.parse(alarmReader); + if (records != null) { + Iterator<CSVRecord> it = records.iterator(); + if (it.hasNext()) { + it.next(); + } + it.forEachRemaining(record -> processRecord(cldsAlarmConditionList, record)); + } + return cldsAlarmConditionList; + } + + private void processRecord(List<CldsAlarmCondition> cldsAlarmConditionList, CSVRecord record) { + if (record == null) { + return; + } + if (record.size() < 5) { + logger.debug("invalid csv alarm Record,total columns less than 5: " + record); + return; + } + if (StringUtils.isBlank(record.get(1)) || StringUtils.isBlank(record.get(3)) || StringUtils.isBlank(record.get(4))) { + logger.debug("invalid csv alarm Record,one of column is having blank value : " + record); + return; + } + CldsAlarmCondition cldsAlarmCondition = new CldsAlarmCondition(); + cldsAlarmCondition.setEventSourceType(record.get(1)); + cldsAlarmCondition.setAlarmConditionKey(record.get(3)); + cldsAlarmCondition.setSeverity(record.get(4)); + cldsAlarmConditionList.add(cldsAlarmCondition); + } + + private String getResponsesFromArtifactUrl(String artifactsUrl) throws IOException { + String hostUrl = refProp.getStringValue("asdc.hostUrl"); + artifactsUrl = artifactsUrl.replaceAll("\"", ""); + String artifactUrl = hostUrl + artifactsUrl; + logger.info("value of artifactURl:" + artifactUrl); + String currArtifactResponse = getCldsServicesOrResourcesBasedOnURL(artifactUrl, true); + logger.info("value of artifactResponse:" + currArtifactResponse); + return currArtifactResponse; + } + + /** + * Service to services/resources/artifacts from asdc.Pass alarmConditions as true to get alarmconditons from artifact url and else it is false + * + * @param url + * @param alarmConditions + * @return + * @throws IOException + */ + private String getCldsServicesOrResourcesBasedOnURL(String url, boolean alarmConditions) throws IOException { + String responseStr; + try { + url = removeUnwantedBracesFromString(url); + URL urlObj = new URL(url); + + HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection(); + String basicAuth = SdcReq.getAsdcBasicAuth(refProp); + conn.setRequestProperty("X-ONAP-InstanceID", "CLAMP-Tool"); + conn.setRequestProperty("Authorization", basicAuth); + conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8"); + conn.setRequestMethod("GET"); + + int responseCode = conn.getResponseCode(); + logger.info("responseCode=" + responseCode); + + BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); + StringBuffer response = new StringBuffer(); + String inputLine; + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + if (alarmConditions) { + response.append("\n"); + } + } + responseStr = response.toString(); + in.close(); + } catch (Exception e) { + logger.error("Exception occured :" + e.getMessage()); + throw e; + } + return responseStr; + } + + /** + * To create properties object by using cldsServicedata + * + * @param globalProps + * @param cldsServiceData + * @return + * @throws IOException + */ + public String createPropertiesObjectByUUID(String globalProps, CldsServiceData cldsServiceData) throws IOException { + String totalPropsStr; + ObjectMapper mapper = new ObjectMapper(); + ObjectNode globalPropsJson; + if (cldsServiceData != null && cldsServiceData.getServiceUUID() != null) { + + /** + * Objectnode to save all byservice, byvf , byvfc and byalarm nodes + */ + ObjectNode byIdObjectNode = mapper.createObjectNode(); + /** + * To create vf ResourceUUID node with serviceInvariantUUID + * + */ + ObjectNode invariantUUIDObjectNodeWithVF = createVFObjectNodeByServiceInvariantUUID(mapper, cldsServiceData); + byIdObjectNode.putPOJO("byService", invariantUUIDObjectNodeWithVF); + + /** + * To create byVf and vfcResourceNode with vfResourceUUID + */ + ObjectNode vfcObjectNodeByVfUUID = createVFCObjectNodeByVfUUID(mapper, cldsServiceData.getCldsVfs()); + byIdObjectNode.putPOJO("byVf", vfcObjectNodeByVfUUID); + + + /** + * To create byVfc and alarmCondition with vfcResourceUUID + */ + ObjectNode vfcResourceUUIDObjectNode = mapper.createObjectNode(); + if (cldsServiceData.getCldsVfs() != null && cldsServiceData.getCldsVfs().size() > 0) { + for (CldsVfData currCldsVfData : cldsServiceData.getCldsVfs()) { + if (currCldsVfData != null) { + createAlarmCondObjectNodeByVfcUUID(mapper, vfcResourceUUIDObjectNode, currCldsVfData.getCldsVfcs()); + } + } + } + byIdObjectNode.putPOJO("byVfc", vfcResourceUUIDObjectNode); + + /** + * To create byAlarmCondition with alarmConditionKey + */ + List<CldsAlarmCondition> allAlarmConditions = getAllAlarmConditionsFromCldsServiceData(cldsServiceData); + ObjectNode alarmCondObjectNodeByAlarmKey = createAlarmCondObjectNodeByAlarmKey(mapper, allAlarmConditions); + + byIdObjectNode.putPOJO("byAlarmCondition", alarmCondObjectNodeByAlarmKey); + + globalPropsJson = (ObjectNode) mapper.readValue(globalProps, JsonNode.class); + + globalPropsJson.putPOJO("shared", byIdObjectNode); + logger.info("valuie of objNode:" + globalPropsJson); + } else { + /** + * to create json with total properties when no serviceUUID passed + */ + globalPropsJson = (ObjectNode) mapper.readValue(globalProps, JsonNode.class); + } + totalPropsStr = globalPropsJson.toString(); + return totalPropsStr; + } + + private List<CldsAlarmCondition> getAllAlarmConditionsFromCldsServiceData(CldsServiceData cldsServiceData) { + List<CldsAlarmCondition> alarmCondList = new ArrayList<>(); + if (cldsServiceData != null && cldsServiceData.getCldsVfs() != null && cldsServiceData.getCldsVfs().size() > 0) { + for (CldsVfData currCldsVfData : cldsServiceData.getCldsVfs()) { + if (currCldsVfData != null && currCldsVfData.getCldsVfcs() != null && currCldsVfData.getCldsVfcs().size() > 0) { + for (CldsVfcData currCldsVfcData : currCldsVfData.getCldsVfcs()) { + if (currCldsVfcData != null && currCldsVfcData.getCldsAlarmConditions() != null && currCldsVfcData.getCldsAlarmConditions().size() > 0) { + for (CldsAlarmCondition currCldsAlarmCondition : currCldsVfcData.getCldsAlarmConditions()) { + if (currCldsAlarmCondition != null) { + alarmCondList.add(currCldsAlarmCondition); + } + } + } + } + } + } + } + return alarmCondList; + } + + private ObjectNode createAlarmCondObjectNodeByAlarmKey(ObjectMapper mapper, List<CldsAlarmCondition> cldsAlarmCondList) { + ObjectNode alarmCondKeyNode = mapper.createObjectNode(); + + if (cldsAlarmCondList != null && cldsAlarmCondList.size() > 0) { + for (CldsAlarmCondition currCldsAlarmCondition : cldsAlarmCondList) { + if (currCldsAlarmCondition != null) { + ObjectNode alarmCondNode = mapper.createObjectNode(); + alarmCondNode.put("eventSourceType", currCldsAlarmCondition.getEventSourceType()); + alarmCondNode.put("eventSeverity", currCldsAlarmCondition.getSeverity()); + alarmCondKeyNode.putPOJO(currCldsAlarmCondition.getAlarmConditionKey(), alarmCondNode); + } + } + } else { + ObjectNode alarmCondNode = mapper.createObjectNode(); + alarmCondNode.put("eventSourceType", ""); + alarmCondNode.put("eventSeverity", ""); + alarmCondKeyNode.putPOJO("", alarmCondNode); + } + return alarmCondKeyNode; + } + + private ObjectNode createVFObjectNodeByServiceInvariantUUID(ObjectMapper mapper, CldsServiceData cldsServiceData) { + ObjectNode invariantUUIDObjectNode = mapper.createObjectNode(); + ObjectNode vfObjectNode = mapper.createObjectNode(); + ObjectNode vfUUIDNode = mapper.createObjectNode(); + List<CldsVfData> cldsVfsList = cldsServiceData.getCldsVfs(); + if (cldsVfsList != null && cldsVfsList.size() > 0) { + for (CldsVfData currCldsVfData : cldsVfsList) { + if (currCldsVfData != null) { + vfUUIDNode.put(currCldsVfData.getVfInvariantResourceUUID(), currCldsVfData.getVfName()); + } + } + } else { + vfUUIDNode.put("", ""); + } + vfObjectNode.putPOJO("vf", vfUUIDNode); + invariantUUIDObjectNode.putPOJO(cldsServiceData.getServiceInvariantUUID(), vfObjectNode); + return invariantUUIDObjectNode; + } + + private void createAlarmCondObjectNodeByVfcUUID(ObjectMapper mapper, ObjectNode vfcResourceUUIDObjectNode, List<CldsVfcData> cldsVfcDataList) { + ObjectNode alarmCondContsObjectNode = mapper.createObjectNode(); + ObjectNode alarmCondNode = mapper.createObjectNode(); + // alarmCondNode.put("", ""); + if (cldsVfcDataList != null && cldsVfcDataList.size() > 0) { + for (CldsVfcData currCldsVfcData : cldsVfcDataList) { + if (currCldsVfcData != null) { + if (currCldsVfcData.getCldsAlarmConditions() != null && currCldsVfcData.getCldsAlarmConditions().size() > 0) { + for (CldsAlarmCondition currCldsAlarmCondition : currCldsVfcData.getCldsAlarmConditions()) { + alarmCondNode.put(currCldsAlarmCondition.getAlarmConditionKey(), currCldsAlarmCondition.getAlarmConditionKey()); + } + alarmCondContsObjectNode.putPOJO("alarmCondition", alarmCondNode); + } + alarmCondContsObjectNode.putPOJO("alarmCondition", alarmCondNode); + vfcResourceUUIDObjectNode.putPOJO(currCldsVfcData.getVfcInvariantResourceUUID(), alarmCondContsObjectNode); + } + } + } else { + alarmCondNode.put("", ""); + alarmCondContsObjectNode.putPOJO("alarmCondition", alarmCondNode); + vfcResourceUUIDObjectNode.putPOJO("", alarmCondContsObjectNode); + } + } + + private ObjectNode createVFCObjectNodeByVfUUID(ObjectMapper mapper, List<CldsVfData> cldsVfDataList) { + ObjectNode vfUUIDObjectNode = mapper.createObjectNode(); + + if (cldsVfDataList != null && cldsVfDataList.size() > 0) { + for (CldsVfData currCldsVfData : cldsVfDataList) { + if (currCldsVfData != null) { + ObjectNode vfcObjectNode = mapper.createObjectNode(); + ObjectNode vfcUUIDNode = mapper.createObjectNode(); + if (currCldsVfData.getCldsVfcs() != null && currCldsVfData.getCldsVfcs().size() > 0) { + for (CldsVfcData currCldsVfcData : currCldsVfData.getCldsVfcs()) { + vfcUUIDNode.put(currCldsVfcData.getVfcInvariantResourceUUID(), currCldsVfcData.getVfcName()); + } + } else { + vfcUUIDNode.put("", ""); + } + vfcObjectNode.putPOJO("vfc", vfcUUIDNode); + vfUUIDObjectNode.putPOJO(currCldsVfData.getVfInvariantResourceUUID(), vfcObjectNode); + } + } + } else { + ObjectNode vfcUUIDNode = mapper.createObjectNode(); + vfcUUIDNode.put("", ""); + ObjectNode vfcObjectNode = mapper.createObjectNode(); + vfcObjectNode.putPOJO("vfc", vfcUUIDNode); + vfUUIDObjectNode.putPOJO("", vfcObjectNode); + } + return vfUUIDObjectNode; + } + + public String getArtifactIdIfArtifactAlreadyExists(CldsAsdcServiceDetail cldsAsdcServiceDetail, String artifactName) { + String artifactUUId = null; + boolean artifactxists = false; + if (cldsAsdcServiceDetail != null && cldsAsdcServiceDetail.getResources() != null && cldsAsdcServiceDetail.getResources().size() > 0) { + for (CldsAsdcResource currCldsAsdcResource : cldsAsdcServiceDetail.getResources()) { + if (artifactxists) { + break; + } + if (currCldsAsdcResource != null && currCldsAsdcResource.getArtifacts() != null && currCldsAsdcResource.getArtifacts().size() > 0) { + for (CldsAsdcArtifact currCldsAsdcArtifact : currCldsAsdcResource.getArtifacts()) { + if (currCldsAsdcArtifact != null && currCldsAsdcArtifact.getArtifactName() != null) { + if (currCldsAsdcArtifact.getArtifactName().equalsIgnoreCase(artifactName)) { + artifactUUId = currCldsAsdcArtifact.getArtifactUUID(); + artifactxists = true; + break; + } + } + } + } + } + } + return artifactUUId; + } + + public String updateControlLoopStatusToDCAE(String dcaeUrl, String invariantResourceUUID, String invariantServiceUUID, String artifactName) { + String baseUrl = refProp.getStringValue("asdc.serviceUrl"); + String basicAuth = SdcReq.getAsdcBasicAuth(refProp); + String postStatusData = "{ \n" + + "\"event\" : \"" + "Created" + "\",\n" + + "\"serviceUUID\" : \"" + invariantServiceUUID + "\",\n" + + "\"resourceUUID\" :\"" + invariantResourceUUID + "\",\n" + + "\"artifactName\" : \"" + artifactName + "\",\n" + + "} \n"; + try { + String url = baseUrl; + if (invariantServiceUUID != null) { + url = dcaeUrl + "/closed-loops"; + } + URL urlObj = new URL(url); + + HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection(); + conn.setRequestProperty("X-ONAP-InstanceID", "CLAMP-Tool"); + conn.setRequestProperty("Authorization", basicAuth); + conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8"); + conn.setRequestMethod("POST"); + + byte[] postData = SdcReq.stringToByteArray(postStatusData); + try (DataOutputStream wr = new DataOutputStream(conn.getOutputStream())) { + wr.write(postData); + } + + int responseCode = conn.getResponseCode(); + logger.info("responseCode=" + responseCode); + + String resp = getResponse(conn); + if (resp != null) { + return resp; + } + } catch (Exception e) { + logger.error("not able to ger any service information from asdc for uuid:" + invariantServiceUUID); + } + return ""; + } + + /** + * To get all asdc VF/VFC Resources basic info + * + * @return + * @throws IOException + */ + private List<CldsAsdcResourceBasicInfo> getAllAsdcVForVFCResourcesBasedOnResourceType(String resourceType, List<CldsAsdcResourceBasicInfo> allAsdcResources) throws IOException { + List<CldsAsdcResourceBasicInfo> allAsdcVFResources = new ArrayList<>(); + if (allAsdcResources != null && allAsdcResources.size() > 0) { + for (CldsAsdcResourceBasicInfo currResource : allAsdcResources) { + if (currResource != null && currResource.getResourceType() != null && currResource.getResourceType().equalsIgnoreCase(resourceType)) { + allAsdcVFResources.add(currResource); + } + } + } + return allAsdcVFResources; + } + + private String getResourceUUIDFromResourceInvariantUUID(String resourceInvariantUUID, List<CldsAsdcResourceBasicInfo> resourceInfoList) throws IOException { + String resourceUUID = null; + if (resourceInfoList != null && resourceInfoList.size() > 0) { + for (CldsAsdcResourceBasicInfo currResource : resourceInfoList) { + if (currResource != null && currResource.getInvariantUUID() != null && currResource.getUuid() != null + && currResource.getInvariantUUID().equalsIgnoreCase(resourceInvariantUUID)) { + resourceUUID = currResource.getUuid(); + break; + } + } + } + return resourceUUID; + } + + /** + * To get all asdc Resources basic info + * + * @return + * @throws IOException + */ + private List<CldsAsdcResourceBasicInfo> getAllAsdcResources() throws IOException { + String catalogUrl = refProp.getStringValue("asdc.catalog.url"); + String resourceUrl = catalogUrl + "resources"; + String allAsdcResources = getCldsServicesOrResourcesBasedOnURL(resourceUrl, false); + List<CldsAsdcResourceBasicInfo> allAsdcResourceBasicInfo = getAllAsdcResourcesListFromJson(allAsdcResources); + return removeDuplicateAsdcResourceBasicInfo(allAsdcResourceBasicInfo); + } +} diff --git a/src/main/java/org/onap/clamp/clds/client/SdcSendReqDelegate.java b/src/main/java/org/onap/clamp/clds/client/SdcSendReqDelegate.java new file mode 100644 index 00000000..93b6e954 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/client/SdcSendReqDelegate.java @@ -0,0 +1,138 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.client; + +import org.onap.clamp.clds.client.req.SdcReq; +import org.onap.clamp.clds.model.CldsAsdcServiceDetail; +import org.onap.clamp.clds.model.DcaeEvent; +import org.onap.clamp.clds.model.prop.Global; +import org.onap.clamp.clds.model.prop.ModelProperties; +import org.onap.clamp.clds.model.refprop.RefProp; +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.JavaDelegate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * Send control loop model to dcae proxy. + */ +public class SdcSendReqDelegate implements JavaDelegate { + // currently uses the java.util.logging.Logger like the Camunda engine + private static final Logger logger = LoggerFactory.getLogger(SdcSendReqDelegate.class); + + @Autowired + private RefProp refProp; + + @Autowired + private SdcCatalogServices asdcCatalogServices; + + private String baseUrl; + private String artifactType; + private String locationArtifactType; + private String artifactLabel; + private String locationArtifactLabel; + + /** + * Perform activity. Send to asdc proxy. + * + * @param execution + */ + public void execute(DelegateExecution execution) throws Exception { + String userid = (String) execution.getVariable("userid"); + logger.info("userid=" + userid); + String docText = (String) execution.getVariable("docText"); + String artifactName = execution.getVariable("controlName") + DcaeEvent.ARTIFACT_NAME_SUFFIX; + execution.setVariable("artifactName", artifactName); + getAsdcAttributes(); + ModelProperties prop = ModelProperties.create(execution); + String bluprintPayload = SdcReq.formatBlueprint(refProp, prop, docText); + String formatttedAsdcReq = SdcReq.formatAsdcReq(bluprintPayload, artifactName, artifactLabel, artifactType); + if (formatttedAsdcReq != null) { + execution.setVariable("formattedArtifactReq", formatttedAsdcReq.getBytes()); + } + List<String> asdcReqUrlsList = SdcReq.getAsdcReqUrlsList(prop, baseUrl, asdcCatalogServices, execution); + + String asdcLocationsPayload = SdcReq.formatAsdcLocationsReq(prop, artifactName); + String locationArtifactName = execution.getVariable("controlName") + "-location.json"; + String formattedAsdcLocationReq = SdcReq.formatAsdcReq(asdcLocationsPayload, locationArtifactName, locationArtifactLabel, locationArtifactType); + if (formattedAsdcLocationReq != null) { + execution.setVariable("formattedLocationReq", formattedAsdcLocationReq.getBytes()); + } + String serviceInvariantUUID = getServiceInvariantUUIDFromProps(prop); + uploadToAsdc(prop, serviceInvariantUUID, userid, asdcReqUrlsList, formatttedAsdcReq, formattedAsdcLocationReq, artifactName, locationArtifactName); + } + + private String getServiceInvariantUUIDFromProps(ModelProperties props) { + String invariantUUID = ""; + Global globalProps = props.getGlobal(); + if (globalProps != null) { + if (globalProps.getService() != null) { + invariantUUID = globalProps.getService(); + } + } + return invariantUUID; + } + + private void uploadToAsdc(ModelProperties prop, String serviceInvariantUUID, String userid, List<String> asdcReqUrlsList, String formatttedAsdcReq, String formattedAsdcLocationReq, String artifactName, String locationArtifactName) throws Exception { + logger.info("userid=" + userid); + if (asdcReqUrlsList != null && asdcReqUrlsList.size() > 0) { + for (String url : asdcReqUrlsList) { + if (url != null) { + String originalServiceUUID = asdcCatalogServices.getServiceUUIDFromServiceInvariantID(serviceInvariantUUID); + logger.info("ServiceUUID used before upload in url:" + originalServiceUUID); + String asdcServicesInformation = asdcCatalogServices.getAsdcServicesInformation(originalServiceUUID); + CldsAsdcServiceDetail cldsAsdcServiceDetail = asdcCatalogServices.getCldsAsdcServiceDetailFromJson(asdcServicesInformation); + String uploadedArtifactUUID = asdcCatalogServices.getArtifactIdIfArtifactAlreadyExists(cldsAsdcServiceDetail, artifactName); + // Upload artifacts to asdc + String updateUrl = uploadedArtifactUUID != null ? url + "/" + uploadedArtifactUUID : url; + String responseStr = asdcCatalogServices.uploadArtifactToAsdc(prop, userid, updateUrl, formatttedAsdcReq); + logger.info("value of asdc Response of uploading to asdc :" + responseStr); + String updatedServiceUUID = asdcCatalogServices.getServiceUUIDFromServiceInvariantID(serviceInvariantUUID); + if (!originalServiceUUID.equalsIgnoreCase(updatedServiceUUID)) { + url = url.replace(originalServiceUUID, updatedServiceUUID); + } + logger.info("ServiceUUID used after upload in ulr:" + updatedServiceUUID); + asdcServicesInformation = asdcCatalogServices.getAsdcServicesInformation(updatedServiceUUID); + cldsAsdcServiceDetail = asdcCatalogServices.getCldsAsdcServiceDetailFromJson(asdcServicesInformation); + uploadedArtifactUUID = asdcCatalogServices.getArtifactIdIfArtifactAlreadyExists(cldsAsdcServiceDetail, locationArtifactName); + // To send location information also to asdc + updateUrl = uploadedArtifactUUID != null ? url + "/" + uploadedArtifactUUID : url; + responseStr = asdcCatalogServices.uploadArtifactToAsdc(prop, userid, updateUrl, formattedAsdcLocationReq); + logger.info("value of asdc Response of uploading location to asdc :" + responseStr); + } + } + } + } + + private void getAsdcAttributes() { + baseUrl = refProp.getStringValue("asdc.serviceUrl"); + artifactLabel = refProp.getStringValue("asdc.artifactLabel"); + locationArtifactLabel = refProp.getStringValue("asdc.locationArtifactLabel"); + artifactType = refProp.getStringValue("asdc.artifactType"); + locationArtifactType = refProp.getStringValue("asdc.locationArtifactType"); + } +} diff --git a/src/main/java/org/onap/clamp/clds/client/StringMatchPolicyDelegate.java b/src/main/java/org/onap/clamp/clds/client/StringMatchPolicyDelegate.java new file mode 100644 index 00000000..90e259f8 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/client/StringMatchPolicyDelegate.java @@ -0,0 +1,67 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.client; + +import org.onap.clamp.clds.client.req.StringMatchPolicyReq; +import org.onap.clamp.clds.model.prop.ModelProperties; +import org.onap.clamp.clds.model.refprop.RefProp; +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.JavaDelegate; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.UUID; +import java.util.logging.Logger; + + +/** + * Send String Match info to policy api. + */ +public class StringMatchPolicyDelegate implements JavaDelegate { + // currently uses the java.util.logging.Logger like the Camunda engine + private static final Logger logger = Logger.getLogger(StringMatchPolicyDelegate.class.getName()); + + @Autowired + private PolicyClient policyClient; + + @Autowired + private RefProp refProp; + + /** + * Perform activity. Send String Match info to policy api. + * + * @param execution + */ + public void execute(DelegateExecution execution) throws Exception { + String stringMatchPolicyRequestUuid = UUID.randomUUID().toString(); + execution.setVariable("stringMatchPolicyRequestUuid", stringMatchPolicyRequestUuid); + + ModelProperties prop = ModelProperties.create(execution); + String policyJson = StringMatchPolicyReq.format(refProp, prop); + String responseMessage = policyClient.sendMicroService(policyJson, prop, stringMatchPolicyRequestUuid); + if (responseMessage != null) { + execution.setVariable("stringMatchPolicyResponseMessage", responseMessage.getBytes()); + } + } + +} diff --git a/src/main/java/org/onap/clamp/clds/client/StringMatchPolicyDeleteDelegate.java b/src/main/java/org/onap/clamp/clds/client/StringMatchPolicyDeleteDelegate.java new file mode 100644 index 00000000..9efd358d --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/client/StringMatchPolicyDeleteDelegate.java @@ -0,0 +1,58 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.client; + +import org.onap.clamp.clds.model.prop.ModelProperties; +import org.onap.clamp.clds.model.prop.StringMatch; +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.JavaDelegate; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.logging.Logger; + + +/** + * Delete String Match Policy via policy api. + */ +public class StringMatchPolicyDeleteDelegate implements JavaDelegate { + // currently uses the java.util.logging.Logger like the Camunda engine + private static final Logger logger = Logger.getLogger(StringMatchPolicyDeleteDelegate.class.getName()); + + @Autowired + private PolicyClient policyClient; + + /** + * Perform activity. Delete String Match Policy via policy api. + * + * @param execution + */ + public void execute(DelegateExecution execution) throws Exception { + ModelProperties prop = ModelProperties.create(execution); + StringMatch stringMatch = prop.getStringMatch(); + prop.setCurrentModelElementId(stringMatch.getId()); + + policyClient.deleteMicrosService(prop); + } + +} diff --git a/src/main/java/org/onap/clamp/clds/client/TcaPolicyDelegate.java b/src/main/java/org/onap/clamp/clds/client/TcaPolicyDelegate.java new file mode 100644 index 00000000..58843d9b --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/client/TcaPolicyDelegate.java @@ -0,0 +1,53 @@ +package org.onap.clamp.clds.client; + +import java.util.UUID; +import java.util.logging.Logger; + +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.JavaDelegate; +import org.springframework.beans.factory.annotation.Autowired; + +import org.onap.clamp.clds.client.req.TcaMPolicyReq; +import org.onap.clamp.clds.model.prop.ModelProperties; +import org.onap.clamp.clds.model.prop.Tca; +import org.onap.clamp.clds.model.refprop.RefProp; + + +/** + * Send Tca info to policy api. + * + * + */ +public class TcaPolicyDelegate implements JavaDelegate { + // currently uses the java.util.logging.Logger like the Camunda engine + private static final Logger logger = Logger.getLogger(TcaPolicyDelegate.class.getName()); + + @Autowired + private RefProp refProp; + + @Autowired PolicyClient policyClient; + + /** + * Perform activity. Send Tca info to policy api. + * + * @param execution + */ + public void execute(DelegateExecution execution) throws Exception { + String tcaPolicyRequestUuid = UUID.randomUUID().toString(); + execution.setVariable("tcaPolicyRequestUuid", tcaPolicyRequestUuid); + + ModelProperties prop = ModelProperties.create(execution); + Tca tca = prop.getTca(); + if(tca.isFound()){ + String policyJson = TcaMPolicyReq.formatTca(refProp, prop); + String responseMessage = policyClient.sendMicroService(policyJson, prop, tcaPolicyRequestUuid); + if(responseMessage != null) + { + execution.setVariable("tcaPolicyResponseMessage", responseMessage.getBytes()); + } + } + } + + + +} diff --git a/src/main/java/org/onap/clamp/clds/client/TcaPolicyDeleteDelegate.java b/src/main/java/org/onap/clamp/clds/client/TcaPolicyDeleteDelegate.java new file mode 100644 index 00000000..31e05d7d --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/client/TcaPolicyDeleteDelegate.java @@ -0,0 +1,48 @@ +package org.onap.clamp.clds.client; + +import java.util.logging.Logger; + +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.JavaDelegate; +import org.springframework.beans.factory.annotation.Autowired; + +import org.onap.clamp.clds.model.prop.ModelProperties; +import org.onap.clamp.clds.model.prop.Tca; +import org.onap.clamp.clds.model.refprop.RefProp; + + +/** + * Delete Tca Policy via policy api. + * + * + */ +public class TcaPolicyDeleteDelegate implements JavaDelegate { + // currently uses the java.util.logging.Logger like the Camunda engine + private static final Logger logger = Logger.getLogger(TcaPolicyDeleteDelegate.class.getName()); + + @Autowired + private PolicyClient policyClient; + + /** + * Perform activity. Delete Tca Policy via policy api. + * + * @param execution + */ + public void execute(DelegateExecution execution) throws Exception { + + ModelProperties prop = ModelProperties.create(execution); + Tca tca = prop.getTca(); + if(tca.isFound()){ + prop.setCurrentModelElementId(tca.getId()); + + String responseMessage = policyClient.deleteMicrosService(prop); + if(responseMessage != null) + { + execution.setVariable("tcaPolicyDeleteResponseMessage", responseMessage.getBytes()); + } + } + } + + + +} diff --git a/src/main/java/org/onap/clamp/clds/client/req/DcaeReq.java b/src/main/java/org/onap/clamp/clds/client/req/DcaeReq.java new file mode 100644 index 00000000..35d6c9f5 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/client/req/DcaeReq.java @@ -0,0 +1,97 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.client.req; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.onap.clamp.clds.model.prop.Global; +import org.onap.clamp.clds.model.prop.ModelProperties; +import org.onap.clamp.clds.model.prop.StringMatch; +import org.onap.clamp.clds.model.refprop.RefProp; + +import java.io.IOException; +import java.util.List; +import java.util.logging.Logger; + + +/** + * Construct a DCAE request given CLDS objects. + */ +public class DcaeReq { + // currently uses the java.util.logging.Logger like the Camunda engine + private static final Logger logger = Logger.getLogger(DcaeReq.class.getName()); + + /** + * Format DCAE request. + * + * @param refProp + * @param prop + * @return + * @throws IOException + * @throws JsonMappingException + * @throws JsonParseException + */ + public static String format(RefProp refProp, ModelProperties prop) throws IOException { + Global globalProp = prop.getGlobal(); + String service = globalProp.getService(); + + StringMatch smProp = prop.getStringMatch(); + prop.setCurrentModelElementId(smProp.getId()); + + ObjectNode rootNode = (ObjectNode) refProp.getJsonTemplate("dcae.template"); + + // "properties":{ + ObjectNode properties = rootNode.with("properties"); + // "service_name": + properties.put("service_name", globalProp.getService()); + // "service_ids":[ + List<String> service_ids = refProp.decodeToList("dcae.decode.service_ids", globalProp.getService()); + JsonUtil.addArrayField(properties, "service_ids", service_ids); + // "vnf_ids":[ + JsonUtil.addArrayField(properties, "vnf_ids", globalProp.getResourceVf()); + // "location_ids":[ + JsonUtil.addArrayField(properties, "location_ids", globalProp.getLocation()); + + // "template":{ + ObjectNode template = rootNode.with("template"); + // "string_matching":{ + ObjectNode string_matching = template.with("string_matching"); + // "dcae":{ + ObjectNode dcae = string_matching.with("dcae"); + + dcae.put("inputTopic", smProp.getTopicSubscribes()); + dcae.put("outputTopic", smProp.getTopicPublishes()); + dcae.put("closedLoopControlName", prop.getControlName()); + dcae.put("policyName", prop.getCurrentPolicyScopeAndPolicyName()); + + // "serviceConfigurations":[ + StringMatchPolicyReq.appendServiceConfigurations(refProp, service, dcae, smProp); + + String dcaeReq = rootNode.toString(); + logger.info("dcaeReq=" + dcaeReq); + return dcaeReq; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/client/req/JsonUtil.java b/src/main/java/org/onap/clamp/clds/client/req/JsonUtil.java new file mode 100644 index 00000000..6aba683b --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/client/req/JsonUtil.java @@ -0,0 +1,66 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.client.req; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ArrayNode; + +import java.util.Iterator; +import java.util.List; + +/** + * Utility methods for formatting json + */ +public class JsonUtil { + + /** + * Add list of values to json array node + * + * @param list + * @param node + */ + public static void addListToArrayNode(List<String> list, ArrayNode node) { + for (String aList : list) { + node.add(aList); + } + } + + /** + * Add list of values to json array node + * + * @param json + * @param name + * @param list + */ + public static void addArrayField(JsonNode json, String name, List<String> list) { + if (list != null) { + ArrayNode node = (ArrayNode) json.withArray(name); + for (String aList : list) { + node.add(aList); + } + } + + } + +} diff --git a/src/main/java/org/onap/clamp/clds/client/req/OperationalPolicyReq.java b/src/main/java/org/onap/clamp/clds/client/req/OperationalPolicyReq.java new file mode 100644 index 00000000..90b9ff8a --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/client/req/OperationalPolicyReq.java @@ -0,0 +1,299 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.client.req; + +import org.onap.clamp.clds.model.prop.Global; +import org.onap.clamp.clds.model.prop.ModelProperties; +import org.onap.clamp.clds.model.prop.Policy; +import org.onap.clamp.clds.model.prop.PolicyItem; +import org.openecomp.policy.controlloop.policy.TargetType; +import org.openecomp.policy.controlloop.policy.PolicyResult; +import org.openecomp.policy.controlloop.policy.Target; +import org.openecomp.policy.controlloop.policy.builder.BuilderException; +import org.openecomp.policy.controlloop.policy.builder.ControlLoopPolicyBuilder; +import org.openecomp.policy.controlloop.policy.builder.Message; +import org.openecomp.policy.controlloop.policy.builder.Results; +import org.openecomp.policy.api.AttributeType; +import org.openecomp.policy.asdc.Resource; +import org.openecomp.policy.asdc.ResourceType; +import org.openecomp.policy.asdc.Service; +import org.onap.clamp.clds.model.refprop.RefProp; +import org.jboss.resteasy.spi.BadRequestException; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.*; +import java.util.logging.Logger; + + +/** + * Construct an Operational Policy request given CLDS objects. + */ +public class OperationalPolicyReq { + // currently uses the java.util.logging.Logger like the Camunda engine + private static final Logger logger = Logger.getLogger(OperationalPolicyReq.class.getName()); + + + /** + * Format Operational Policy attributes. + * + * @param refProp + * @param prop + * @return + * @throws BuilderException + * @throws UnsupportedEncodingException + */ + public static Map<AttributeType, Map<String, String>> formatAttributes(RefProp refProp, ModelProperties prop) throws BuilderException, UnsupportedEncodingException { + Global global = prop.getGlobal(); + Policy policy = prop.getPolicy(); + prop.setCurrentModelElementId(policy.getId()); + + String templateName = refProp.getStringValue("op.templateName", global.getService()); + String recipeTopic = refProp.getStringValue("op.recipeTopic", global.getService()); + String operationTopic = refProp.getStringValue("op.operationTopic", global.getService()); + String notificationTopic = refProp.getStringValue("op.notificationTopic", global.getService()); + + // ruleAttributes + Map<String, String> ruleAttributes = new HashMap<>(); + + if (operationTopic == null || operationTopic.length() == 0) { + logger.info("templateName=" + templateName); + logger.info("recipeTopic=" + recipeTopic); + logger.info("notificationTopic=" + notificationTopic); + + // if no operationTopic, then don't format yaml - use first policy from list + PolicyItem policyItem = policy.getPolicyItems().get(0); + + ruleAttributes.put("templateName", templateName); + ruleAttributes.put("ClosedLoopControlName", prop.getControlName()); + ruleAttributes.put("RecipeTopic", recipeTopic); + ruleAttributes.put("NotificationTopic", notificationTopic); + + String recipe = policyItem.getRecipe(); + String maxRetries = String.valueOf(policyItem.getMaxRetries()); + String retryTimeLimit = String.valueOf(policyItem.getRetryTimeLimit()); + logger.info("recipe=" + recipe); + logger.info("maxRetries=" + maxRetries); + logger.info("retryTimeLimit=" + retryTimeLimit); + ruleAttributes.put("Recipe", recipe); + ruleAttributes.put("MaxRetries", maxRetries); + ruleAttributes.put("RetryTimeLimit", retryTimeLimit); + } else { + logger.info("templateName=" + templateName); + logger.info("operationTopic=" + operationTopic); + logger.info("notificationTopic=" + notificationTopic); + + // format yaml + String yaml = formatYaml(refProp, prop); + + ruleAttributes.put("templateName", templateName); + ruleAttributes.put("ClosedLoopControlName", prop.getControlName()); + ruleAttributes.put("OperationTopic", operationTopic); + ruleAttributes.put("NotificationTopic", notificationTopic); + + ruleAttributes.put("ControlLoopYaml", yaml); + } + + // matchingAttributes + String controller = refProp.getStringValue("op.controller", global.getService()); + + Map<String, String> matchingAttributes = new HashMap<>(); + matchingAttributes.put("controller", controller); + + Map<AttributeType, Map<String, String>> attributes = new HashMap<>(); + attributes.put(AttributeType.RULE, ruleAttributes); + attributes.put(AttributeType.MATCHING, matchingAttributes); + + + return attributes; + } + + + /** + * Format Operational Policy yaml. + * + * @param refProp + * @param prop + * @return + * @throws BuilderException + * @throws UnsupportedEncodingException + */ + private static String formatYaml(RefProp refProp, ModelProperties prop) throws BuilderException, UnsupportedEncodingException { + // get property objects + Global global = prop.getGlobal(); + Policy policy = prop.getPolicy(); + prop.setCurrentModelElementId(policy.getId()); + + // convert values to ASDC objects + Service service = new Service(global.getService()); + Resource[] vfResources = convertToResource(global.getResourceVf(), ResourceType.VF); + Resource[] vfcResources = convertToResource(global.getResourceVfc(), ResourceType.VFC); + + // create builder + ControlLoopPolicyBuilder builder = ControlLoopPolicyBuilder.Factory.buildControlLoop(prop.getControlName(), policy.getTimeout(), service, vfResources); + builder.addResource(vfcResources); + + // process each policy + HashMap<String, org.openecomp.policy.controlloop.policy.Policy> policyObjMap = new HashMap<>(); + List<PolicyItem> policyItemList = orderParentFirst(policy.getPolicyItems()); + for (int i = 0; i < policyItemList.size(); i++) { + org.openecomp.policy.controlloop.policy.Policy policyObj; + PolicyItem policyItem = policyItemList.get(i); + String policyName = policyItem.getRecipe() + " Policy"; + if (i == 0) { + String policyDescription = policyItem.getRecipe() + " Policy - the trigger (no parent) policy - created by CLDS"; + policyObj = builder.setTriggerPolicy( + policyName, + policyDescription, + "APPC", + new Target(TargetType.VM), + policyItem.getRecipe(), + new HashMap<>(), //TODO To verify ! + policyItem.getMaxRetries(), + policyItem.getRetryTimeLimit()); + } else { + org.openecomp.policy.controlloop.policy.Policy parentPolicyObj = policyObjMap.get(policyItem.getParentPolicy()); + String policyDescription = policyItem.getRecipe() + " Policy - triggered conditionally by " + parentPolicyObj.getName() + " - created by CLDS"; + policyObj = builder.setPolicyForPolicyResult( + policyName, + policyDescription, + "APPC", + new Target(TargetType.VM), + policyItem.getRecipe(), + new HashMap<>(), //TODO To verify ! + policyItem.getMaxRetries(), + policyItem.getRetryTimeLimit(), + parentPolicyObj.getId(), + convertToPolicyResult(policyItem.getParentPolicyConditions())); + logger.info("policyObj.id=" + policyObj.getId() + "; parentPolicyObj.id=" + parentPolicyObj.getId()); + } + policyObjMap.put(policyItem.getId(), policyObj); + } + + // + // Build the specification + // + Results results = builder.buildSpecification(); + if (results.isValid()) { + logger.info("results.getSpecification()=" + results.getSpecification()); + } else { + // throw exception with error info + StringBuilder sb = new StringBuilder(); + sb.append("Operation Policy validation problem: ControlLoopPolicyBuilder failed with following messages: "); + for (Message message : results.getMessages()) { + sb.append(message.getMessage()); + sb.append("; "); + } + throw new BadRequestException(sb.toString()); + } + return URLEncoder.encode(results.getSpecification(), "UTF-8"); + } + + /** + * Order list of PolicyItems so that parents come before any of their children + * + * @param inOrigList + * @return + */ + private static List<PolicyItem> orderParentFirst(List<PolicyItem> inOrigList) { + List<PolicyItem> inList = new ArrayList<>(); + inList.addAll(inOrigList); + List<PolicyItem> outList = new ArrayList<>(); + int prevSize = 0; + while (!inList.isEmpty()) { + // check if there's a loop in the policy chain (the inList should have been reduced by at least one) + if (inList.size() == prevSize) { + throw new BadRequestException("Operation Policy validation problem: loop in Operation Policy chain"); + } + prevSize = inList.size(); + // the following loop should remove at least one PolicyItem from the inList + Iterator<PolicyItem> inListItr = inList.iterator(); + while (inListItr.hasNext()) { + PolicyItem inItem = inListItr.next(); + // check for trigger policy (no parent) + String parent = inItem.getParentPolicy(); + if (parent == null || parent.length() == 0) { + if (outList.size() > 0) { + throw new BadRequestException("Operation Policy validation problem: more than one trigger policy"); + } else { + outList.add(inItem); + inListItr.remove(); + } + } else { + // check if this PolicyItem's parent has been processed + for (PolicyItem outItem : outList) { + if (outItem.getId().equals(parent)) { + // if the inItem parent is already in the outList, then add inItem to outList and remove from inList + outList.add(inItem); + inListItr.remove(); + break; + } + } + } + } + } + return outList; + } + + + /** + * Convert a List of resource strings to an array of Resource objects. + * + * @param rList + * @param resourceType + * @return + */ + private static Resource[] convertToResource(List<String> rList, ResourceType resourceType) { + int size = 0; + if (rList != null) { + size = rList.size(); + } + Resource[] rArray = new Resource[size]; + for (int i = 0; i < size; i++) { + String rString = rList.get(i); + rArray[i] = new Resource(rString, resourceType); + } + return rArray; + } + + /** + * Convert a List of policy result strings to an array of PolicyResult objects. + * + * @param prList + * @return + */ + private static PolicyResult[] convertToPolicyResult(List<String> prList) { + int size = 0; + if (prList != null) { + size = prList.size(); + } + PolicyResult[] prArray = new PolicyResult[size]; + for (int i = 0; i < size; i++) { + String prString = prList.get(i); + prArray[i] = PolicyResult.toResult(prString); + } + return prArray; + } + +}
\ No newline at end of file diff --git a/src/main/java/org/onap/clamp/clds/client/req/SdcReq.java b/src/main/java/org/onap/clamp/clds/client/req/SdcReq.java new file mode 100644 index 00000000..45f17164 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/client/req/SdcReq.java @@ -0,0 +1,360 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.client.req; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.dataformat.yaml.snakeyaml.Yaml; +import org.onap.clamp.clds.client.SdcCatalogServices; +import org.onap.clamp.clds.model.CldsAsdcResource; +import org.onap.clamp.clds.model.CldsAsdcServiceDetail; +import org.onap.clamp.clds.model.prop.Global; +import org.onap.clamp.clds.model.prop.ModelProperties; +import org.onap.clamp.clds.model.prop.StringMatch; +import org.onap.clamp.clds.model.prop.Tca; +import org.onap.clamp.clds.model.refprop.RefProp; +import org.apache.commons.codec.digest.DigestUtils; +import org.camunda.bpm.engine.delegate.DelegateExecution; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.Map.Entry; +import java.util.logging.Logger; + +/** + * Construct a Asdc request given CLDS objects. + */ +public class SdcReq { + // currently uses the java.util.logging.Logger like the Camunda engine + private static final Logger logger = Logger.getLogger(SdcReq.class.getName()); + + /** + * @param refProp + * @param prop + * @return + * @throws JsonParseException + * @throws JsonMappingException + * @throws IOException + */ + public static String formatBlueprint(RefProp refProp, ModelProperties prop, String docText) + throws JsonParseException, JsonMappingException, IOException { + + Global globalProp = prop.getGlobal(); + String service = globalProp.getService(); + + String yamlvalue = getYamlvalue(docText); + + String updatedBlueprint = ""; + StringMatch stringMatch = prop.getStringMatch(); + Tca tca = prop.getTca(); + if (stringMatch.isFound()) { + prop.setCurrentModelElementId(stringMatch.getId()); + ObjectMapper objectMapper = new ObjectMapper(); + ObjectNode serviceConfigurations = objectMapper.createObjectNode(); + + StringMatchPolicyReq.appendServiceConfigurations(refProp, service, serviceConfigurations, stringMatch); + logger.info("Value of serviceConfigurations:" + serviceConfigurations); + ObjectNode servConfNode = (ObjectNode) serviceConfigurations.get("serviceConfigurations"); + + // get updated blueprint by attaching service Conf from + // globalProperties + updatedBlueprint = getUpdatedBlueprintWithServiceConf(refProp, prop, yamlvalue, servConfNode); + } else if (tca.isFound()) { + prop.setCurrentModelElementId(tca.getId()); + ObjectNode rootNode = (ObjectNode) refProp.getJsonTemplate("tca.template", service); + ObjectNode content = rootNode.with("content"); + TcaMPolicyReq.appendSignatures(refProp, service, content, tca, prop); + logger.info("Value of content:" + content); + // ObjectNode servConfNode = + // (ObjectNode)signatures.get("signatures"); + + // get updated blueprint by attaching service Conf from + // globalProperties + updatedBlueprint = getUpdatedBlueprintWithConfiguration(refProp, prop, yamlvalue, content); + } + + logger.info("value of blueprint:" + updatedBlueprint); + return updatedBlueprint; + } + + private static String getUpdatedBlueprintWithServiceConf(RefProp refProp, ModelProperties prop, String yamlValue, + ObjectNode serviceConf) throws IOException { + Yaml yaml = new Yaml(); + + // Serialiaze Yaml file + Map<String, Map> loadedYaml = (Map<String, Map>) yaml.load(yamlValue); + // Get node templates information from Yaml + Map<String, Map> nodeTemplates = (Map<String, Map>) loadedYaml.get("node_templates"); + logger.info("value of NodeTemplates:" + nodeTemplates); + + // Get StringMatch Object information from node templates of Yaml + Map<String, Map> smObject = (Map<String, Map>) nodeTemplates.get("SM"); + logger.info("value of StringMatch:" + smObject); + + // Get Properties Object information from stringmatch of Yaml + Map<String, String> propsObject = (Map<String, String>) smObject.get("properties"); + logger.info("value of PropsObject:" + propsObject); + + String deploymentJsonObject = propsObject.get("deployment_JSON"); + logger.info("value of deploymentJson:" + deploymentJsonObject); + + ObjectMapper mapper = new ObjectMapper(); + ObjectNode deployJsonNode = (ObjectNode) mapper.readTree(deploymentJsonObject); + ObjectNode configurationObjectNode = (ObjectNode) deployJsonNode.get("configuration"); + + // "policyName":"example_model06.ClosedLoop_FRWL_SIG_0538e6f2_8c1b_4656_9999_3501b3c59ad7_StringMatch_", + String policyNamePrefix = refProp.getStringValue("policy.ms.policyNamePrefix"); + String policyName = prop.getCurrentPolicyScopeAndFullPolicyName(policyNamePrefix); + configurationObjectNode.put("policyName", policyName); + + // "closedLoopControlName":"ClosedLoop-FRWL-SIG-0538e6f2-8c1b-4656-9999-3501b3c59ad7", + configurationObjectNode.put("closedLoopControlName", prop.getControlName()); + configurationObjectNode.set("serviceConfigurations", serviceConf); + propsObject.put("deployment_JSON", deployJsonNode.toString()); + String blueprint = yaml.dump(loadedYaml); + logger.info("value of updated Yaml File:" + blueprint); + + blueprint = yaml.dump(loadedYaml); + logger.info("value of updated Yaml File:" + blueprint); + + return blueprint; + } + + private static String getUpdatedBlueprintWithConfiguration(RefProp refProp, ModelProperties prop, String yamlValue, + ObjectNode serviceConf) throws JsonProcessingException, IOException { + String blueprint = ""; + Yaml yaml = new Yaml(); + // Serialiaze Yaml file + Map<String, Map> loadedYaml = (Map<String, Map>) yaml.load(yamlValue); + // Get node templates information from Yaml + Map<String, Map> nodeTemplates = (Map<String, Map>) loadedYaml.get("node_templates"); + logger.info("value of NodeTemplates:" + nodeTemplates); + // Get Tca Object information from node templates of Yaml + Map<String, Map> tcaObject = (Map<String, Map>) nodeTemplates.get("MTCA"); + logger.info("value of Tca:" + tcaObject); + // Get Properties Object information from tca of Yaml + Map<String, String> propsObject = (Map<String, String>) tcaObject.get("properties"); + logger.info("value of PropsObject:" + propsObject); + String deploymentJsonObject = (String) propsObject.get("deployment_JSON"); + logger.info("value of deploymentJson:" + deploymentJsonObject); + + ObjectMapper mapper = new ObjectMapper(); + + ObjectNode deployJsonNode = (ObjectNode) mapper.readTree(deploymentJsonObject); + + // "policyName":"example_model06.ClosedLoop_FRWL_SIG_0538e6f2_8c1b_4656_9999_3501b3c59ad7_Tca_", + String policyNamePrefix = refProp.getStringValue("policy.ms.policyNamePrefix"); + String policyName = prop.getCurrentPolicyScopeAndFullPolicyName(policyNamePrefix); + serviceConf.put("policyName", policyName); + + deployJsonNode.set("configuration", serviceConf); + propsObject.put("deployment_JSON", deployJsonNode.toString()); + blueprint = yaml.dump(loadedYaml); + logger.info("value of updated Yaml File:" + blueprint); + + return blueprint; + } + + public static String formatAsdcLocationsReq(ModelProperties prop, String artifactName) { + ObjectMapper objectMapper = new ObjectMapper(); + Global global = prop.getGlobal(); + List<String> locationsList = global.getLocation(); + ArrayNode locationsArrayNode = objectMapper.createArrayNode(); + ObjectNode locationObject = objectMapper.createObjectNode(); + for (String currLocation : locationsList) { + locationsArrayNode.add(currLocation); + } + locationObject.put("artifactName", artifactName); + locationObject.putPOJO("locations", locationsArrayNode); + String locationJsonFormat = locationObject.toString(); + logger.info("Value of locaation Json Artifact:" + locationsArrayNode); + return locationJsonFormat; + } + + public static String formatAsdcReq(String payloadData, String artifactName, String artifactLabel, + String artifactType) throws IOException { + logger.info("artifact=" + payloadData); + String base64Artifact = base64Encode(payloadData); + return "{ \n" + "\"payloadData\" : \"" + base64Artifact + "\",\n" + "\"artifactLabel\" : \"" + artifactLabel + + "\",\n" + "\"artifactName\" :\"" + artifactName + "\",\n" + "\"artifactType\" : \"" + artifactType + + "\",\n" + "\"artifactGroupType\" : \"DEPLOYMENT\",\n" + "\"description\" : \"from CLAMP Cockpit\"\n" + + "} \n"; + } + + public static String getAsdcReqUrl(ModelProperties prop, String url) { + Global globalProps = prop.getGlobal(); + String serviceUUID = ""; + String resourceInstanceName = ""; + if (globalProps != null) { + List<String> resourceVf = globalProps.getResourceVf(); + if (resourceVf != null && resourceVf.size() > 0) { + resourceInstanceName = resourceVf.get(0); + } + if (globalProps.getService() != null) { + serviceUUID = globalProps.getService(); + } + } + String normalizedResourceInstanceName = normalizeResourceInstanceName(resourceInstanceName); + return url + "/" + serviceUUID + "/resourceInstances/" + normalizedResourceInstanceName + "/artifacts"; + } + + /** + * To get List of urls for all vfresources + * + * @param prop + * @param baseUrl + * @param sdcCatalogServices + * @return + * @throws Exception + */ + public static List<String> getAsdcReqUrlsList(ModelProperties prop, String baseUrl, + SdcCatalogServices sdcCatalogServices, DelegateExecution execution) throws Exception { + // TODO : refact and regroup with very similar code + List<String> urlList = new ArrayList<>(); + Global globalProps = prop.getGlobal(); + if (globalProps != null) { + if (globalProps.getService() != null) { + String serviceInvariantUUID = globalProps.getService(); + execution.setVariable("serviceInvariantUUID", serviceInvariantUUID); + List<String> resourceVfList = globalProps.getResourceVf(); + String serviceUUID = sdcCatalogServices.getServiceUUIDFromServiceInvariantID(serviceInvariantUUID); + String asdcServicesInformation = sdcCatalogServices.getAsdcServicesInformation(serviceUUID); + CldsAsdcServiceDetail cldsAsdcServiceDetail = sdcCatalogServices.getCldsAsdcServiceDetailFromJson(asdcServicesInformation); + if (cldsAsdcServiceDetail != null && resourceVfList != null) { + List<CldsAsdcResource> cldsAsdcResourcesList = cldsAsdcServiceDetail.getResources(); + if (cldsAsdcResourcesList != null && cldsAsdcResourcesList.size() > 0) { + for (CldsAsdcResource cldsAsdcResource : cldsAsdcResourcesList) { + if (cldsAsdcResource != null && cldsAsdcResource.getResoucreType() != null + && cldsAsdcResource.getResoucreType().equalsIgnoreCase("VF")) { + if (resourceVfList.contains(cldsAsdcResource.getResourceInvariantUUID())) { + String normalizedResourceInstanceName = normalizeResourceInstanceName(cldsAsdcResource.getResourceInstanceName()); + String svcUrl = baseUrl + "/" + serviceUUID + "/resourceInstances/" + normalizedResourceInstanceName + "/artifacts"; + urlList.add(svcUrl); + } + } + } + } + } + } + } + return urlList; + } + + /** + * "Normalize" the resource instance name: - Remove spaces, underscores, + * dashes, and periods. - make lower case This is required by ASDC when + * using the resource instance name to upload an artifact. + * + * @param inText + * @return + */ + public static String normalizeResourceInstanceName(String inText) { + return inText.replace(" ", "").replace("-", "").replace(".", "").toLowerCase(); + } + + /** + * from michael + * + * @param data + * @return + */ + public static String calculateMD5ByString(String data) { + String calculatedMd5 = DigestUtils.md5Hex(data); + // encode base-64 result + return base64Encode(calculatedMd5.getBytes()); + } + + /** + * Base 64 encode a String. + * + * @param inText + * @return + */ + public static String base64Encode(String inText) { + return base64Encode(stringToByteArray(inText)); + } + + /** + * Convert String to byte array. + * + * @param inText + * @return + */ + public static byte[] stringToByteArray(String inText) { + return inText.getBytes(StandardCharsets.UTF_8); + } + + /** + * Base 64 encode a byte array. + * + * @param bytes + * @return + */ + public static String base64Encode(byte[] bytes) { + Base64.Encoder encoder = Base64.getEncoder(); + return encoder.encodeToString(bytes); + } + + /** + * Return ASDC id and pw as a HTTP Basic Auth string (for example: Basic + * dGVzdDoxMjM0NTY=). + * + * @return + */ + public static String getAsdcBasicAuth(RefProp refProp) { + String asdcId = refProp.getStringValue("asdc.serviceUsername"); + String asdcPw = refProp.getStringValue("asdc.servicePassword"); + String idPw = base64Encode(asdcId + ":" + asdcPw); + return "Basic " + idPw; + } + + private static String getYamlvalue(String docText) throws IOException { + ObjectMapper objectMapper = new ObjectMapper(); + String yamlFileValue = ""; + ObjectNode root = objectMapper.readValue(docText, ObjectNode.class); + Iterator<Entry<String, JsonNode>> entryItr = root.fields(); + while (entryItr.hasNext()) { + Entry<String, JsonNode> entry = entryItr.next(); + String key = entry.getKey(); + if (key != null && key.equalsIgnoreCase("global")) { + ArrayNode arrayNode = (ArrayNode) entry.getValue(); + for (JsonNode anArrayNode : arrayNode) { + ObjectNode node = (ObjectNode) anArrayNode; + ArrayNode arrayValueNode = (ArrayNode) node.get("value"); + JsonNode jsonNode = arrayValueNode.get(0); + yamlFileValue = jsonNode.asText(); + logger.info("value:" + yamlFileValue); + } + break; + } + } + return yamlFileValue; + } +} diff --git a/src/main/java/org/onap/clamp/clds/client/req/StringMatchPolicyReq.java b/src/main/java/org/onap/clamp/clds/client/req/StringMatchPolicyReq.java new file mode 100644 index 00000000..0f66cd9b --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/client/req/StringMatchPolicyReq.java @@ -0,0 +1,138 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.client.req; + +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.onap.clamp.clds.model.prop.Global; +import org.onap.clamp.clds.model.prop.ModelProperties; +import org.onap.clamp.clds.model.prop.ServiceConfiguration; +import org.onap.clamp.clds.model.prop.StringMatch; +import org.onap.clamp.clds.model.refprop.RefProp; + +import java.io.IOException; +import java.util.Iterator; +import java.util.Map.Entry; +import java.util.logging.Logger; + + +/** + * Construct a Policy for String Match Micro Service request given CLDS objects. + */ +public class StringMatchPolicyReq { + // currently uses the java.util.logging.Logger like the Camunda engine + private static final Logger logger = Logger.getLogger(StringMatchPolicyReq.class.getName()); + + /** + * Format Policy String Match request. + * + * @param refProp + * @param prop + * @return + * @throws IOException + */ + public static String format(RefProp refProp, ModelProperties prop) throws IOException { + Global global = prop.getGlobal(); + String service = global.getService(); + + StringMatch sm = prop.getStringMatch(); + prop.setCurrentModelElementId(sm.getId()); + ObjectNode rootNode = (ObjectNode) refProp.getJsonTemplate("sm.template", service); + + // "policyName": + rootNode.put("policyName", prop.getCurrentPolicyScopeAndPolicyName()); + + // "content":{ + ObjectNode content = rootNode.with("content"); + + // "closedLoopControlName": + content.put("closedLoopControlName", prop.getControlName()); + + // "serviceConfigurations":[ + appendServiceConfigurations(refProp, service, content, sm); + + String stringMatchPolicyReq = rootNode.toString(); + logger.info("stringMatchPolicyReq=" + stringMatchPolicyReq); + return stringMatchPolicyReq; + } + + /** + * Add serviceConfigurations to json + * + * @param appendToNode + * @param sm + * @throws IOException + */ + public static void appendServiceConfigurations(RefProp refProp, String service, ObjectNode appendToNode, StringMatch sm) throws IOException { + // "serviceConfigurations":{ + ObjectNode scNodes = appendToNode.with("serviceConfigurations"); + + Iterator<ServiceConfiguration> scItr = sm.getServiceConfigurations().iterator(); + int index = 0; + while (scItr.hasNext()) { + ServiceConfiguration sc = scItr.next(); + + //"ItemX":{ + index++; + String keyValue = "Item" + index; + ObjectNode scNode = (ObjectNode) refProp.getJsonTemplate("sm.sc.template", service); + scNodes.set(keyValue, scNode); + + // "rulegroup":"abc", + String rulegroupInd = refProp.getStringValue("sm.rulegroup", service); + String groupNumber = sc.getGroupNumber(); + if (rulegroupInd != null && rulegroupInd.equalsIgnoreCase("true") && groupNumber != null && groupNumber.length() > 0) { + + //String rulegroup = (sc.getResourceVf() == null ? "" : String.join(" ", sc.getResourceVf())) + " - " + (sc.getResourceVfc() == null ? "" : String.join(" ", sc.getResourceVfc())); + scNode.put("rulegroup", groupNumber); + } + + // "aaiMatchingFields" : ["VM_NAME"], + JsonUtil.addArrayField(scNode, "aaiMatchingFields", sc.getaaiMatchingFields()); + // "aaiSendFields" : ["VMID", "TenantID"], + JsonUtil.addArrayField(scNode, "aaiSendFields", sc.getaaiSendFields()); + + // "stringSet": [ + ArrayNode ssNode = scNode.putArray("stringSet"); + // ObjectNode ssNode = scNode.with("stringSet"); + for (Entry<String, String> entry : sc.getStringSet().entrySet()) { + // exclude eventSourceType + if (!entry.getKey().equals("eventSourceType")) { + ssNode.add(entry.getKey()); + ssNode.add(entry.getValue()); + } + } + + // timeWindow": "0", + scNode.put("timeWindow", sc.getTimeWindow()); + // "ageLimit": "3600", + scNode.put("ageLimit", sc.getAgeLimit()); + // "createClosedLoopEventId" : "Initial", + scNode.put("createClosedLoopEventId", sc.getCreateClosedLoopEventId()); + // "outputEventName": "OnSet" + scNode.put("outputEventName", sc.getOutputEventName()); + } + } + +} diff --git a/src/main/java/org/onap/clamp/clds/client/req/TcaMPolicyReq.java b/src/main/java/org/onap/clamp/clds/client/req/TcaMPolicyReq.java new file mode 100644 index 00000000..f8acb64f --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/client/req/TcaMPolicyReq.java @@ -0,0 +1,93 @@ +package org.onap.clamp.clds.client.req; + +import java.io.IOException; +import java.util.Iterator; +import java.util.logging.Logger; + +import org.onap.clamp.clds.model.prop.Global; +import org.onap.clamp.clds.model.prop.ModelProperties; +import org.onap.clamp.clds.model.prop.Tca; +import org.onap.clamp.clds.model.prop.TcaItem; +import org.onap.clamp.clds.model.prop.TcaThreshhold; +import org.onap.clamp.clds.model.refprop.RefProp; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + +/** + * Construct a Policy for Tca/MTca Service request given CLDS objects. + * + * + */ +public class TcaMPolicyReq { + private static final Logger logger = Logger.getLogger(StringMatchPolicyReq.class.getName()); + + /** + * Format Tca Policy request + * + * @param refProp + * @param prop + * @return + * @throws JsonParseException + * @throws JsonMappingException + * @throws IOException + */ + public static String formatTca(RefProp refProp, ModelProperties prop) throws JsonParseException, JsonMappingException, IOException { + Global global = prop.getGlobal(); + String service = global.getService(); + + Tca tca = prop.getTca(); + prop.setCurrentModelElementId(tca.getId()); + ObjectNode rootNode = (ObjectNode)refProp.getJsonTemplate("tca.template", service); + rootNode.put("policyName", prop.getCurrentPolicyScopeAndPolicyName()); + ObjectNode content = rootNode.with("content"); + appendSignatures(refProp, service, content, tca, prop); + + String tcaPolicyReq = rootNode.toString(); + logger.info("tcaPolicyReq=" + tcaPolicyReq); + return tcaPolicyReq; + } + + /** + * Add appendSignatures to json + * + * @param refProp + * @param service + * @param appendToNode + * @param tca + * @param prop + * @throws JsonParseException + * @throws JsonMappingException + * @throws IOException + */ + public static void appendSignatures(RefProp refProp, String service, ObjectNode appendToNode, Tca tca, ModelProperties prop) throws JsonParseException, JsonMappingException, IOException { + // "signatures":{ + ArrayNode tcaNodes = appendToNode.withArray("signatures"); + for(TcaItem tcaItem : tca.getTcaItems()){ + ObjectNode tcaNode = (ObjectNode)refProp.getJsonTemplate("tca.signature.template", service); + tcaNode.put("useCaseName", tcaItem.getTcaName()); + tcaNode.put("signatureName", tcaItem.getTcaName()+ "_" + tcaItem.getTcaUuId()); + tcaNode.put("signatureUuid", tcaItem.getTcaUuId()); + prop.setPolicyUniqueId(tcaItem.getPolicyId()); + tcaNode.put("closedLoopControlName", prop.getControlNameAndPolicyUniqueId()); + tcaNode.put("severity", tcaItem.getSeverity()); + tcaNode.put("maxInterval", tcaItem.getInterval()); + tcaNode.put("minMessageViolations", tcaItem.getViolations()); + + tcaNodes.add(tcaNode); + Iterator<TcaThreshhold> scItr = tcaItem.getTcaThreshholds().iterator(); + while(scItr.hasNext()) { + TcaThreshhold tcaThreshhold = scItr.next(); + // "thresholds": [ + ArrayNode thNodes = tcaNode.withArray("thresholds"); + ObjectNode thNode = thNodes.addObject(); + thNode.put("fieldPath", tcaThreshhold.getFieldPath()); + thNode.put("thresholdName", tcaThreshhold.getMetric()); + thNode.put("thresholdValue", tcaThreshhold.getThreshhold()); + thNode.put("direction", tcaThreshhold.getOperator()); + } + } + } + +}
\ No newline at end of file diff --git a/src/main/java/org/onap/clamp/clds/common/LogMessages.java b/src/main/java/org/onap/clamp/clds/common/LogMessages.java new file mode 100644 index 00000000..cdd47937 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/common/LogMessages.java @@ -0,0 +1,37 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.common; + +import com.att.eelf.i18n.EELFResolvableErrorEnum; +import com.att.eelf.i18n.EELFResourceManager; + +public enum LogMessages implements EELFResolvableErrorEnum { + + LOGSERVICE_HELLO_MESSAGE, LOGSERVICE_EMAIL_ERROR, LOGSERVICE_EMAIL_CLASS, LOGSERVICE_EMAIL_CLASS_NULL, PROCESS_INSTANCE_ID; + + static { + EELFResourceManager.loadMessageBundle("logmessages"); + } + +} diff --git a/src/main/java/org/onap/clamp/clds/config/CamundaAuthFilterInitializer.java b/src/main/java/org/onap/clamp/clds/config/CamundaAuthFilterInitializer.java new file mode 100644 index 00000000..244b40aa --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/config/CamundaAuthFilterInitializer.java @@ -0,0 +1,87 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.config; + +import java.util.EnumSet; +import java.util.Map; +import java.util.logging.Logger; + +import javax.servlet.DispatcherType; +import javax.servlet.Filter; +import javax.servlet.FilterRegistration; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; + +import org.camunda.bpm.spring.boot.starter.CamundaBpmAutoConfiguration; +import org.camunda.bpm.webapp.impl.security.auth.AuthenticationFilter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.boot.web.servlet.ServletContextInitializer; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConditionalOnWebApplication +@AutoConfigureAfter(CamundaBpmAutoConfiguration.class) +public class CamundaAuthFilterInitializer implements ServletContextInitializer { + + private static final EnumSet<DispatcherType> DISPATCHER_TYPES = EnumSet.of(DispatcherType.REQUEST); + + private static final String AJSC_CADI_PROPS_FILE = "cadi.properties"; + + private ServletContext servletContext; + + @Value("${com.att.ajsc.camunda.contextPath:/camunda}") + private String CAMUNDA_SUFFIX; + + private static final Logger log = Logger.getLogger(CamundaAuthFilterInitializer.class.getName()); + + @Override + public void onStartup(ServletContext servletContext) throws ServletException { + this.servletContext = servletContext; + + registerFilter("Authentication Filter", AuthenticationFilter.class, CAMUNDA_SUFFIX + "/*"); + } + + private FilterRegistration registerFilter(final String filterName, final Class<? extends Filter> filterClass, + final String... urlPatterns) { + return registerFilter(filterName, filterClass, null, urlPatterns); + } + + private FilterRegistration registerFilter(final String filterName, final Class<? extends Filter> filterClass, + final Map<String, String> initParameters, final String... urlPatterns) { + FilterRegistration filterRegistration = servletContext.getFilterRegistration(filterName); + + if (filterRegistration == null) { + filterRegistration = servletContext.addFilter(filterName, filterClass); + filterRegistration.addMappingForUrlPatterns(DISPATCHER_TYPES, true, urlPatterns); + + if (initParameters != null) { + filterRegistration.setInitParameters(initParameters); + } + } + + return filterRegistration; + } +} diff --git a/src/main/java/org/onap/clamp/clds/config/CamundaEngineConfiguration.java b/src/main/java/org/onap/clamp/clds/config/CamundaEngineConfiguration.java new file mode 100644 index 00000000..949f4ea6 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/config/CamundaEngineConfiguration.java @@ -0,0 +1,49 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.config; + +import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +import javax.sql.DataSource; + +@Configuration +public class CamundaEngineConfiguration { + + /** + * Camunda Identity databse DataSource configuration + */ + @Primary + @Bean(name = "camundaBpmDataSource") + @ConfigurationProperties(prefix = "spring.datasource") + public DataSource dataSource() { + return DataSourceBuilder + .create() + .build(); + } + +} diff --git a/src/main/java/org/onap/clamp/clds/config/CldsConfiguration.java b/src/main/java/org/onap/clamp/clds/config/CldsConfiguration.java new file mode 100644 index 00000000..814d2c6a --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/config/CldsConfiguration.java @@ -0,0 +1,142 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.config; + +import com.att.ajsc.common.AjscProvider; +import com.att.ajsc.common.AjscService; +import org.onap.clamp.clds.client.*; +import org.onap.clamp.clds.dao.CldsDao; +import org.onap.clamp.clds.model.refprop.RefProp; +import org.onap.clamp.clds.transform.XslTransformer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +import javax.sql.DataSource; +import javax.xml.transform.TransformerConfigurationException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +@Configuration +@Profile("clamp-default") +public class CldsConfiguration { + + @Autowired + private ApplicationContext context; + + /** + * Clds Identity databse DataSource configuration + */ + @Bean(name = "cldsDataSource") + @ConfigurationProperties(prefix = "spring.cldsdatasource") + public DataSource cldsDataSource() { + return DataSourceBuilder + .create() + .build(); + } + + @Bean(name = "jaxrsProviders") + public List jaxrsProviders() { + return new ArrayList(context.getBeansWithAnnotation(AjscProvider.class).values()); + } + + @Bean(name = "jaxrsServices") + public List jaxrsServices() { + return new ArrayList(context.getBeansWithAnnotation(AjscService.class).values()); + } + + @Bean(name = "cldsDao") + public CldsDao getCldsDao() { + CldsDao cldsDao = new CldsDao(); + cldsDao.setDataSource(cldsDataSource()); + return cldsDao; + } + + @Bean(name = "cldsBpmnTransformer") + public XslTransformer getCldsBpmnXslTransformer() throws TransformerConfigurationException { + XslTransformer xslTransformer = new XslTransformer(); + xslTransformer.setXslResourceName("xsl/clds-bpmn-transformer.xsl"); + return xslTransformer; + } + + @Bean + public RefProp getRefProp() throws IOException { + return new RefProp(); + } + + @Bean + public PolicyClient getPolicyClient() { + return new PolicyClient(); + } + + @Bean(name = "cldsEventDelegate") + public CldsEventDelegate getCldsEventDelegate() { + return new CldsEventDelegate(); + } + + @Bean(name = "dcaeReqDelegate") + public DcaeReqDelegate getDcaeReqDelegate() { + return new DcaeReqDelegate(); + } + + @Bean(name = "sdcSendReqDelegate") + public SdcSendReqDelegate getSdcSendReqDelegate() { + return new SdcSendReqDelegate(); + } + + @Bean(name = "dcaeReqDeleteDelegate") + public DcaeReqDeleteDelegate getDcaeReqDeleteDelegate() { + return new DcaeReqDeleteDelegate(); + } + + @Bean(name = "operationalPolicyDelegate") + public OperationalPolicyDelegate getOperationalPolicyDelegate() { + return new OperationalPolicyDelegate(); + } + + @Bean(name = "operationalPolicyDeleteDelegate") + public OperationalPolicyDeleteDelegate getOperationalPolicyDeleteDelegate() { + return new OperationalPolicyDeleteDelegate(); + } + + @Bean(name = "stringMatchPolicyDelegate") + public StringMatchPolicyDelegate getStringMatchPolicyDelegate() { + return new StringMatchPolicyDelegate(); + } + + @Bean(name = "stringMatchPolicyDeleteDelegate") + public StringMatchPolicyDeleteDelegate getStringMatchPolicyDeleteDelegate() { + return new StringMatchPolicyDeleteDelegate(); + } + + @Bean(name = "sdcCatalogServices") + public SdcCatalogServices getAsdcCatalogServices() { + return new SdcCatalogServices(); + } +}
\ No newline at end of file diff --git a/src/main/java/org/onap/clamp/clds/config/CldsSecurityConfig.java b/src/main/java/org/onap/clamp/clds/config/CldsSecurityConfig.java new file mode 100644 index 00000000..571ad4b4 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/config/CldsSecurityConfig.java @@ -0,0 +1,117 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.Resource; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.LinkedList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +@Configuration +@EnableWebSecurity +public class CldsSecurityConfig extends WebSecurityConfigurerAdapter { + + private static final Logger logger = Logger.getLogger(CldsSecurityConfig.class.getName()); + + @Autowired + private ApplicationContext appContext; + + @Value("${org.onap.clamp.config.files.cldsUsers:'classpath:etc/config/clds/clds-users.properties'}") + private String cldsUsers; + + private final static String ROLEPREFIX = "null|null|"; + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .csrf().disable() + .authorizeRequests() + .anyRequest().authenticated() + .and() + .formLogin() + .loginPage("/login.html") + .permitAll() + .and() + .logout() + .permitAll(); + } + + @Autowired + public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { + List<String> userList = loadUsers(); + + // no users defined + if (null == userList || userList.isEmpty()) { + logger.log(Level.SEVERE, "No users defined. Users should be defined under clds/clds-users.properties."); + return; + } + + for (String user : userList) { + String[] userInfo = user.split("[|]"); + if (userInfo.length != 3) { + logger.log(Level.SEVERE, "Defined User(" + user + ") is not in good format. User format should be:<username>|<password>|<role>. Role should be eiother 'read' or 'all'."); + continue; + } + + auth + .inMemoryAuthentication() + .withUser(userInfo[0]).password(userInfo[1]).roles(ROLEPREFIX + ("all".equalsIgnoreCase(userInfo[2]) ? "*" : userInfo[2])); + + } + } + + private boolean validUser(String[] userInfo) { + return ((userInfo != null) && (userInfo.length == 3) && (("all".equals(userInfo[2])) || ("read".equals(userInfo[2])))); + } + + private List<String> loadUsers() throws Exception { + logger.info("Load from clds-users.properties"); + + Resource resource = appContext.getResource(cldsUsers); + BufferedReader input = new BufferedReader(new InputStreamReader(resource.getInputStream())); + + List<String> userList = new LinkedList<>(); + + String line; + while ((line = input.readLine()) != null) { + if (!line.contains("#")) { + userList.add(line); + } + logger.info("line read:" + line); + } + return userList; + } +}
\ No newline at end of file diff --git a/src/main/java/org/onap/clamp/clds/config/CsiLoggingConfiguration.java b/src/main/java/org/onap/clamp/clds/config/CsiLoggingConfiguration.java new file mode 100644 index 00000000..5c5ba574 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/config/CsiLoggingConfiguration.java @@ -0,0 +1,48 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.config; + +import com.att.ajsc.csilogging.common.AsyncSupport; +import com.att.ajsc.csilogging.interceptors.CsiLoggingCamelPostInterceptor; +import com.att.ajsc.csilogging.interceptors.CsiLoggingCamelPreInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class CsiLoggingConfiguration { + @Bean + public CsiLoggingCamelPreInterceptor csiLoggingCamelPreInterceptor() { + return new CsiLoggingCamelPreInterceptor(); + } + + @Bean + public CsiLoggingCamelPostInterceptor csiLoggingCamelPostInterceptor() { + return new CsiLoggingCamelPostInterceptor(); + } + + @Bean + public AsyncSupport asyncsupport() { + return new AsyncSupport(); + } +} diff --git a/src/main/java/org/onap/clamp/clds/dao/CldsDao.java b/src/main/java/org/onap/clamp/clds/dao/CldsDao.java new file mode 100644 index 00000000..67e4d1b8 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/dao/CldsDao.java @@ -0,0 +1,485 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.dao; + +import org.onap.clamp.clds.model.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.SqlParameterSource; +import org.springframework.jdbc.core.simple.SimpleJdbcCall; +import org.springframework.stereotype.Repository; + +import javax.sql.DataSource; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.sql.Blob; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Data Access for CLDS Model tables. + */ +@Repository("cldsDao") +public class CldsDao { + + private static final Logger logger = LoggerFactory.getLogger(CldsDao.class); + + private JdbcTemplate jdbcTemplateObject; + private SimpleJdbcCall procGetModel; + private SimpleJdbcCall procGetModelTemplate; + private SimpleJdbcCall procSetModel; + private SimpleJdbcCall procInsEvent; + private SimpleJdbcCall procUpdEvent; + private SimpleJdbcCall procSetTemplate; + private SimpleJdbcCall procGetTemplate; + private SimpleJdbcCall procDelAllModelInstances; + private SimpleJdbcCall procInsModelInstance; + private SimpleJdbcCall procDelModelInstance; + + /** + * Log message when instantiating + */ + public CldsDao() { + logger.info("CldsDao instantiating..."); + } + + /** + * When dataSource is provided, instantiate spring jdbc objects. + * + * @param dataSource + */ + public void setDataSource(DataSource dataSource) { + this.jdbcTemplateObject = new JdbcTemplate(dataSource); + this.procGetModel = new SimpleJdbcCall(dataSource).withProcedureName("get_model"); + this.procGetModelTemplate = new SimpleJdbcCall(dataSource).withProcedureName("get_model_template"); + this.procSetModel = new SimpleJdbcCall(dataSource).withProcedureName("set_model"); + this.procInsEvent = new SimpleJdbcCall(dataSource).withProcedureName("ins_event"); + this.procUpdEvent = new SimpleJdbcCall(dataSource).withProcedureName("upd_event"); + this.procGetTemplate = new SimpleJdbcCall(dataSource).withProcedureName("get_template"); + this.procSetTemplate = new SimpleJdbcCall(dataSource).withProcedureName("set_template"); + this.procInsModelInstance = new SimpleJdbcCall(dataSource).withProcedureName("ins_model_instance"); + this.procDelModelInstance = new SimpleJdbcCall(dataSource).withProcedureName("del_model_instance"); + this.procDelAllModelInstances = new SimpleJdbcCall(dataSource).withProcedureName("del_all_model_instances"); + } + + /** + * Get a model from the database given the model name. + * + * @param modelName + * @return model + */ + public CldsModel getModel(String modelName) { + return getModel(modelName, null); + } + + /** + * Get a model from the database given the controlNameUuid. + * + * @param controlNameUuid + * @return model + */ + public CldsModel getModelByUuid(String controlNameUuid) { + return getModel(null, controlNameUuid); + } + + /** + * Get a model from the database given the model name or a controlNameUuid. + * + * @param modelName + * @return model + */ + private CldsModel getModel(String modelName, String controlNameUuid) { + CldsModel model = new CldsModel(); + model.setName(modelName); + SqlParameterSource in = new MapSqlParameterSource() + .addValue("v_model_name", modelName) + .addValue("v_control_name_uuid", controlNameUuid); + Map<String, Object> out = logSqlExecution(procGetModel, in); + model.setControlNamePrefix((String) out.get("v_control_name_prefix")); + model.setControlNameUuid((String) out.get("v_control_name_uuid")); + model.setId((String) (out.get("v_model_id"))); + model.setTemplateId((String) (out.get("v_template_id"))); + model.setTemplateName((String) (out.get("v_template_name"))); + model.setBpmnId((String) (out.get("v_template_bpmn_id"))); + model.setBpmnUserid((String) out.get("v_template_bpmn_userid")); + model.setBpmnText((String) out.get("v_template_bpmn_text")); + model.setPropId((String) (out.get("v_model_prop_id"))); + model.setPropUserid((String) out.get("v_model_prop_userid")); + model.setPropText((String) out.get("v_model_prop_text")); + model.setImageId((String) (out.get("v_template_image_id"))); + model.setImageUserid((String) out.get("v_template_image_userid")); + model.setImageText((String) out.get("v_template_image_text")); + model.setDocId((String) (out.get("v_template_doc_id"))); + model.setDocUserid((String) out.get("v_template_doc_userid")); + model.setDocText((String) out.get("v_template_doc_text")); + model.setBlueprintText((String) out.get("v_model_blueprint_text")); + model.getEvent().setId((String) (out.get("v_event_id"))); + model.getEvent().setActionCd((String) out.get("v_action_cd")); + model.getEvent().setActionStateCd((String) out.get("v_action_state_cd")); + model.getEvent().setProcessInstanceId((String) out.get("v_event_process_instance_id")); + model.getEvent().setUserid((String) out.get("v_event_userid")); + return model; + } + + /** + * Get a model and template information from the database given the model name. + * + * @param modelName + * @return model + */ + public CldsModel getModelTemplate(String modelName) { + CldsModel model = new CldsModel(); + model.setName(modelName); + SqlParameterSource in = new MapSqlParameterSource().addValue("v_model_name", modelName); + Map<String, Object> out = logSqlExecution(procGetModelTemplate, in); + // todo : rationalize + model.setControlNamePrefix((String) out.get("v_control_name_prefix")); + model.setControlNameUuid((String) out.get("v_control_name_uuid")); + model.setId((String) (out.get("v_model_id"))); + model.setTemplateId((String) (out.get("v_template_id"))); + model.setTemplateName((String) (out.get("v_template_name"))); + model.setBpmnId((String) (out.get("v_template_bpmn_id"))); + model.setBpmnUserid((String) out.get("v_template_bpmn_userid")); + model.setBpmnText((String) out.get("v_template_bpmn_text")); + model.setPropId((String) (out.get("v_model_prop_id"))); + model.setPropUserid((String) out.get("v_model_prop_userid")); + model.setPropText((String) out.get("v_model_prop_text")); + model.setImageId((String) (out.get("v_template_image_id"))); + model.setImageUserid((String) out.get("v_template_image_userid")); + model.setImageText((String) out.get("v_template_image_text")); + model.setDocId((String) (out.get("v_template_doc_id"))); + model.setDocUserid((String) out.get("v_template_doc_userid")); + model.setDocText((String) out.get("v_template_doc_text")); + model.setBlueprintText((String) out.get("v_model_blueprint_text")); + model.getEvent().setId((String) (out.get("v_event_id"))); + model.getEvent().setActionCd((String) out.get("v_action_cd")); + model.getEvent().setActionStateCd((String) out.get("v_action_state_cd")); + model.getEvent().setProcessInstanceId((String) out.get("v_event_process_instance_id")); + model.getEvent().setUserid((String) out.get("v_event_userid")); + + Map<String, Object> modelResults = logSqlExecution(procGetModel, in); + Object modelResultObject = modelResults.get("#result-set-1"); + if (modelResultObject != null && modelResultObject instanceof ArrayList) { + List<Object> modelInstanceRs = (List<Object>) modelResultObject; + for (Object currModelInstance : modelInstanceRs) { + if (currModelInstance != null && currModelInstance instanceof HashMap) { + HashMap<String, String> modelInstanceMap = (HashMap<String, String>) currModelInstance; + CldsModelInstance modelInstance = new CldsModelInstance(); + modelInstance.setModelInstanceId(modelInstanceMap.get("model_instance_id")); + modelInstance.setVmName(modelInstanceMap.get("vm_name")); + modelInstance.setLocation(modelInstanceMap.get("location")); + model.getCldsModelInstanceList().add(modelInstance); + logger.info("value of currModel: {}", currModelInstance); + } + } + } + return model; + } + + /** + * Update model in the database using parameter values and return updated model object. + * + * @param model + * @param userid + * @return + */ + public CldsModel setModel(CldsModel model, String userid) { + SqlParameterSource in = new MapSqlParameterSource() + .addValue("v_model_name", model.getName()) + .addValue("v_template_id", model.getTemplateId()) + .addValue("v_userid", userid) + .addValue("v_model_prop_text", model.getPropText()) + .addValue("v_model_blueprint_text", model.getBlueprintText()) + .addValue("v_control_name_prefix", model.getControlNamePrefix()) + .addValue("v_control_name_uuid", model.getControlNameUuid()); + Map<String, Object> out = logSqlExecution(procSetModel, in); + model.setControlNamePrefix((String) out.get("v_control_name_prefix")); + model.setControlNameUuid((String) out.get("v_control_name_uuid")); + model.setId((String) (out.get("v_model_id"))); + model.setPropId((String) (out.get("v_model_prop_id"))); + model.setPropUserid((String) (out.get("v_model_prop_userid"))); + model.setBlueprintId((String) (out.get("v_model_blueprint_id"))); + model.setBlueprintUserid((String) out.get("v_model_blueprint_userid")); + model.getEvent().setId((String) (out.get("v_event_id"))); + model.getEvent().setActionCd((String) out.get("v_action_cd")); + model.getEvent().setActionStateCd((String) out.get("v_action_state_cd")); + model.getEvent().setProcessInstanceId((String) out.get("v_event_process_instance_id")); + model.getEvent().setUserid((String) out.get("v_event_userid")); + return model; + } + + /** + * Inserts new modelInstance in the database using parameter values and return updated model object. + * + * @param model + * @param modelInstancesList + * @return + */ + public void insModelInstance(CldsModel model, List<CldsModelInstance> modelInstancesList) { + // Delete all existing model instances for given controlNameUUID + logger.debug("deleting instances for: {}", model.getControlNameUuid()); + delAllModelInstances(model.getControlNameUuid()); + + if (modelInstancesList == null) { + logger.debug("modelInstancesList == null"); + } else { + for (CldsModelInstance currModelInstance : modelInstancesList) { + logger.debug("v_control_name_uuid={}", model.getControlNameUuid()); + logger.debug("v_vm_name={}", currModelInstance.getVmName()); + logger.debug("v_location={}", currModelInstance.getLocation()); + SqlParameterSource in = new MapSqlParameterSource() + .addValue("v_control_name_uuid", model.getControlNameUuid()) + .addValue("v_vm_name", currModelInstance.getVmName()) + .addValue("v_location", currModelInstance.getLocation()); + Map<String, Object> out = logSqlExecution(procInsModelInstance, in); + model.setId((String) (out.get("v_model_id"))); + CldsModelInstance modelInstance = new CldsModelInstance(); + modelInstance.setLocation(currModelInstance.getLocation()); + modelInstance.setVmName(currModelInstance.getVmName()); + modelInstance.setModelInstanceId((String) (out.get("v_model_instance_id"))); + model.getCldsModelInstanceList().add(modelInstance); + } + } + } + + /** + * Delete a list of modelInstance from the database using parameter values and returns updated model object. + * This method is defunct - DCAE Proxy will not undeploy individual instances. It will send an empty list of + * deployed instances to indicate all have been removed. Or it will send an updated list to indicate those that + * are still deployed with any not on the list considered undeployed. + * + * @param controlNameUUid + * @param modelInstancesList + * @return + */ + private CldsModel delModelInstance(String controlNameUUid, List<CldsModelInstance> modelInstancesList) { + CldsModel model = new CldsModel(); + for (CldsModelInstance currModelInstance : modelInstancesList) { + SqlParameterSource in = new MapSqlParameterSource() + .addValue("v_control_name_uuid", controlNameUUid) + .addValue("v_vm_name", currModelInstance.getVmName()); + Map<String, Object> out = logSqlExecution(procDelModelInstance, in); + model.setId((String) (out.get("v_model_id"))); + } + return model; + } + + /** + * Insert an event in the database - require either modelName or controlNamePrefix/controlNameUuid. + * @param modelName + * @param controlNamePrefix + * @param controlNameUuid + * @param cldsEvent + * @return + */ + public CldsEvent insEvent(String modelName, String controlNamePrefix, String controlNameUuid, CldsEvent cldsEvent) { + CldsEvent event = new CldsEvent(); + SqlParameterSource in = new MapSqlParameterSource() + .addValue("v_model_name", modelName) + .addValue("v_control_name_prefix", controlNamePrefix) + .addValue("v_control_name_uuid", controlNameUuid) + .addValue("v_userid", cldsEvent.getUserid()) + .addValue("v_action_cd", cldsEvent.getActionCd()) + .addValue("v_action_state_cd", cldsEvent.getActionStateCd()) + .addValue("v_process_instance_id", cldsEvent.getProcessInstanceId()); + Map<String, Object> out = logSqlExecution(procInsEvent, in); + event.setId((String) (out.get("v_event_id"))); + return event; + } + + /** + * Method to delete all model instances based on controlNameUUID + * + * @param controlNameUUid + * @return + */ + private String delAllModelInstances(String controlNameUUid) { + SqlParameterSource in = new MapSqlParameterSource() + .addValue("v_control_name_uuid", controlNameUUid); + Map<String, Object> out = logSqlExecution(procDelAllModelInstances, in); + return (String) (out.get("v_model_id")); + } + + /** + * Update event with process instance id. + * + * @param eventId + * @param processInstanceId + */ + public void updEvent(String eventId, String processInstanceId) { + SqlParameterSource in = new MapSqlParameterSource() + .addValue("v_event_id", eventId) + .addValue("v_process_instance_id", processInstanceId); + logSqlExecution(procUpdEvent, in); + } + + /** + * Generic mapper for list of values + */ + private static final class ValueItemMapper implements RowMapper<ValueItem> { + public ValueItem mapRow(ResultSet rs, int rowNum) throws SQLException { + ValueItem item = new ValueItem(); + item.setValue(rs.getString(1)); + return item; + } + } + + /** + * Generic mapper for CldsDBServiceCache + */ + private static final class CldsServiceDataMapper implements RowMapper<CldsServiceData> { + public CldsServiceData mapRow(ResultSet rs, int rowNum) throws SQLException { + CldsServiceData cldsServiceData = new CldsServiceData(); + long age; + age = rs.getLong(5); + Blob blob = rs.getBlob(4); + InputStream is = blob.getBinaryStream(); + ObjectInputStream oip; + try { + oip = new ObjectInputStream(is); + cldsServiceData = (CldsServiceData) oip.readObject(); + cldsServiceData.setAgeOfRecord(age); + } catch (IOException | ClassNotFoundException e) { + logger.error("Error caught while retrieving cldsServiceData from database"); + } + return cldsServiceData; + } + } + + /** + * Return list of model names + * + * @return model names + */ + public List<ValueItem> getBpmnNames() { + String SQL = "SELECT model_name FROM model ORDER BY 1;"; + return jdbcTemplateObject.query(SQL, new ValueItemMapper()); + } + + /** + * Update template in the database using parameter values and return updated template object. + * + * @param template + * @param userid + * @return + */ + public CldsTemplate setTemplate(CldsTemplate template, String userid) { + SqlParameterSource in = new MapSqlParameterSource() + .addValue("v_template_name", template.getName()) + .addValue("v_userid", userid) + .addValue("v_template_bpmn_text", template.getBpmnText()) + .addValue("v_template_image_text", template.getImageText()) + .addValue("v_template_doc_text", template.getPropText()); + Map<String, Object> out = logSqlExecution(procSetTemplate, in); + template.setId((String) (out.get("v_template_id"))); + template.setBpmnUserid((String) (out.get("v_template_bpmn_userid"))); + template.setBpmnId((String) (out.get("v_template_bpmn_id"))); + template.setBpmnText((String) (out.get("v_template_bpmn_text"))); + template.setImageId((String) (out.get("v_template_image_id"))); + template.setImageUserid((String) out.get("v_template_image_userid")); + template.setImageText((String) out.get("v_template_image_text")); + template.setPropId((String) (out.get("v_template_doc_id"))); + template.setPropUserid((String) out.get("v_template_doc_userid")); + template.setPropText((String) out.get("v_template_doc_text")); + return template; + } + + /** + * Return list of template names + * + * @return template names + */ + public List<ValueItem> getTemplateNames() { + String SQL = "SELECT template_name FROM template ORDER BY 1;"; + return jdbcTemplateObject.query(SQL, new ValueItemMapper()); + } + + /** + * Get a template from the database given the model name. + * + * @param templateName + * @return model + */ + public CldsTemplate getTemplate(String templateName) { + CldsTemplate template = new CldsTemplate(); + template.setName(templateName); + SqlParameterSource in = new MapSqlParameterSource().addValue("v_template_name", templateName); + Map<String, Object> out = logSqlExecution(procGetTemplate, in); + template.setId((String) (out.get("v_template_id"))); + template.setBpmnUserid((String) (out.get("v_template_bpmn_userid"))); + template.setBpmnId((String) (out.get("v_template_bpmn_id"))); + template.setBpmnText((String) (out.get("v_template_bpmn_text"))); + template.setImageId((String) (out.get("v_template_image_id"))); + template.setImageUserid((String) out.get("v_template_image_userid")); + template.setImageText((String) out.get("v_template_image_text")); + template.setPropId((String) (out.get("v_template_doc_id"))); + template.setPropUserid((String) out.get("v_template_doc_userid")); + template.setPropText((String) out.get("v_template_doc_text")); + return template; + } + + public CldsServiceData getCldsServiceCache(String invariantUUID) throws SQLException, IOException, ClassNotFoundException { + CldsServiceData cldsServiceData = null; + List<CldsServiceData> cldsServiceDataList = new ArrayList<>(); + try { + String getCldsServiceSQL = "SELECT * , TIMESTAMPDIFF(SECOND, timestamp, CURRENT_TIMESTAMP()) FROM clds_service_cache where invariant_service_id = ? "; + cldsServiceData = jdbcTemplateObject.queryForObject(getCldsServiceSQL, new Object[]{invariantUUID}, new CldsServiceDataMapper()); + logger.info("value of cldsServiceDataList: {}", cldsServiceDataList); + } catch (EmptyResultDataAccessException e) { + logger.info("cache row not found for invariantUUID: {}", invariantUUID); + } + return cldsServiceData; + } + + public void setCldsServiceCache(CldsDBServiceCache cldsDBServiceCache) throws SQLException, IOException { + if (cldsDBServiceCache != null && cldsDBServiceCache.getInvariantId() != null && cldsDBServiceCache.getServiceId() != null) { + String invariantUUID = cldsDBServiceCache.getInvariantId(); + String serviceUUID = cldsDBServiceCache.getServiceId(); + InputStream is = cldsDBServiceCache.getCldsDataInstream(); + String insertCldsServiceCacheSQL = "INSERT INTO clds_service_cache" + + "(invariant_service_id,service_id,timestamp,object_data) VALUES" + + "(?,?,CURRENT_TIMESTAMP,?) ON DUPLICATE KEY UPDATE invariant_service_id = VALUES(invariant_service_id) , timestamp = CURRENT_TIMESTAMP , object_data = VALUES(object_data) "; + jdbcTemplateObject.update(insertCldsServiceCacheSQL, invariantUUID, serviceUUID, is); + } + } + + private static Map<String, Object> logSqlExecution(SimpleJdbcCall call, SqlParameterSource source) { + try { + return call.execute(source); + } catch (Exception e) { + logger.error("Exception occured in " + source.getClass().getCanonicalName() + ": " + e); + throw e; + } + } + +} diff --git a/src/main/java/org/onap/clamp/clds/exception/AjscExceptionMapper.java b/src/main/java/org/onap/clamp/clds/exception/AjscExceptionMapper.java new file mode 100644 index 00000000..41023ace --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/exception/AjscExceptionMapper.java @@ -0,0 +1,40 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.exception; + +import com.att.ajsc.common.AjscProvider; +import com.att.ajsc.common.exception.ServerErrorException; +import com.att.ajsc.common.exception.ServiceException; + +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; + +@AjscProvider +public class AjscExceptionMapper implements ExceptionMapper<Exception> { + + @Override + public Response toResponse(final Exception exception) { + return exception instanceof ServiceException ? ((ServiceException) exception).toResponse() : new ServerErrorException(exception.getMessage()).toResponse(); + } +} diff --git a/src/main/java/org/onap/clamp/clds/jsf/JsfExampleBean.java b/src/main/java/org/onap/clamp/clds/jsf/JsfExampleBean.java new file mode 100644 index 00000000..5fdcedd9 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/jsf/JsfExampleBean.java @@ -0,0 +1,61 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.jsf; + +import javax.faces.bean.ManagedBean; +import javax.faces.bean.SessionScoped; +import java.io.Serializable; +import java.util.Date; + +@ManagedBean +@SessionScoped +public class JsfExampleBean implements Serializable { + + private static final long serialVersionUID = 1L; + + private String value; + private Date dateValue; + + private static final java.text.SimpleDateFormat timestampFormat = new java.text.SimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public Date getDateValue() { + return dateValue; + } + + public void setDateValue(Date dateValue) { + this.dateValue = dateValue; + } + + public String getDateValueText() { + return timestampFormat.format(dateValue); + } +} diff --git a/src/main/java/org/onap/clamp/clds/model/CldsAlarmCondition.java b/src/main/java/org/onap/clamp/clds/model/CldsAlarmCondition.java new file mode 100644 index 00000000..03254783 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/CldsAlarmCondition.java @@ -0,0 +1,59 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model; + +import java.io.Serializable; + +public class CldsAlarmCondition implements Serializable { + + private static final long serialVersionUID = 1L; + private String eventSourceType; + private String alarmConditionKey; + private String severity; + + public String getEventSourceType() { + return eventSourceType; + } + + public void setEventSourceType(String eventSourceType) { + this.eventSourceType = eventSourceType; + } + + public String getSeverity() { + return severity; + } + + public void setSeverity(String severity) { + this.severity = severity; + } + + public String getAlarmConditionKey() { + return alarmConditionKey; + } + + public void setAlarmConditionKey(String alarmConditionKey) { + this.alarmConditionKey = alarmConditionKey; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/CldsAsdcArtifact.java b/src/main/java/org/onap/clamp/clds/model/CldsAsdcArtifact.java new file mode 100644 index 00000000..43d5ab6a --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/CldsAsdcArtifact.java @@ -0,0 +1,112 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class CldsAsdcArtifact { + + private String artifactName; + private String artifactType; + private String artifactURL; + private String artifactDescription; + private String artifactTimeout; + private String artifactChecksum; + private String artifactUUID; + private String artifactVersion; + private String generatedFromUUID; + + public String getArtifactName() { + return artifactName; + } + + public void setArtifactName(String artifactName) { + this.artifactName = artifactName; + } + + public String getArtifactType() { + return artifactType; + } + + public void setArtifactType(String artifactType) { + this.artifactType = artifactType; + } + + public String getArtifactURL() { + return artifactURL; + } + + public void setArtifactURL(String artifactURL) { + this.artifactURL = artifactURL; + } + + public String getArtifactDescription() { + return artifactDescription; + } + + public void setArtifactDescription(String artifactDescription) { + this.artifactDescription = artifactDescription; + } + + public String getArtifactTimeout() { + return artifactTimeout; + } + + public void setArtifactTimeout(String artifactTimeout) { + this.artifactTimeout = artifactTimeout; + } + + public String getArtifactChecksum() { + return artifactChecksum; + } + + public void setArtifactChecksum(String artifactChecksum) { + this.artifactChecksum = artifactChecksum; + } + + public String getArtifactUUID() { + return artifactUUID; + } + + public void setArtifactUUID(String artifactUUID) { + this.artifactUUID = artifactUUID; + } + + public String getArtifactVersion() { + return artifactVersion; + } + + public void setArtifactVersion(String artifactVersion) { + this.artifactVersion = artifactVersion; + } + + public String getGeneratedFromUUID() { + return generatedFromUUID; + } + + public void setGeneratedFromUUID(String generatedFromUUID) { + this.generatedFromUUID = generatedFromUUID; + } +} diff --git a/src/main/java/org/onap/clamp/clds/model/CldsAsdcResource.java b/src/main/java/org/onap/clamp/clds/model/CldsAsdcResource.java new file mode 100644 index 00000000..3210b696 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/CldsAsdcResource.java @@ -0,0 +1,131 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import java.math.BigDecimal; +import java.util.List; +import java.util.logging.Logger; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class CldsAsdcResource implements Comparable<CldsAsdcResource> { + private static final Logger logger = Logger.getLogger(CldsAsdcServiceInfo.class.getName()); + + private String resourceInstanceName; + private String resourceName; + private String resourceInvariantUUID; + private String resourceVersion; + private String resoucreType; + private String resourceUUID; + private List<CldsAsdcArtifact> artifacts; + + public String getResourceInstanceName() { + return resourceInstanceName; + } + + public void setResourceInstanceName(String resourceInstanceName) { + this.resourceInstanceName = resourceInstanceName; + } + + public String getResourceName() { + return resourceName; + } + + public void setResourceName(String resourceName) { + this.resourceName = resourceName; + } + + public String getResourceInvariantUUID() { + return resourceInvariantUUID; + } + + public void setResourceInvariantUUID(String resourceInvariantUUID) { + this.resourceInvariantUUID = resourceInvariantUUID; + } + + public String getResourceVersion() { + return resourceVersion; + } + + public void setResourceVersion(String resourceVersion) { + this.resourceVersion = resourceVersion; + } + + public String getResoucreType() { + return resoucreType; + } + + public void setResoucreType(String resoucreType) { + this.resoucreType = resoucreType; + } + + public String getResourceUUID() { + return resourceUUID; + } + + public void setResourceUUID(String resourceUUID) { + this.resourceUUID = resourceUUID; + } + + public List<CldsAsdcArtifact> getArtifacts() { + return artifacts; + } + + public void setArtifacts(List<CldsAsdcArtifact> artifacts) { + this.artifacts = artifacts; + } + + @Override + public int compareTo(CldsAsdcResource in) { + // Compares this object with the specified object for order. + // Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object. + + // first compare based on name + int rtn = resourceInstanceName.compareToIgnoreCase(in.resourceInstanceName); + + if (rtn == 0) { + BigDecimal myVersion = convertVersion(resourceVersion); + BigDecimal inVersion = convertVersion(in.resourceVersion); + rtn = myVersion.compareTo(inVersion); + } + return rtn; + } + + /** + * Convert version String into a BigDecimal + * + * @param versionText + * @return + */ + private BigDecimal convertVersion(String versionText) { + BigDecimal rtn = new BigDecimal(0.0); + try { + rtn = new BigDecimal(versionText); + } catch (NumberFormatException nfe) { + logger.warning("ASDC version=" + versionText + " is not decimal for name=" + resourceInstanceName); + } + return rtn; + } +} diff --git a/src/main/java/org/onap/clamp/clds/model/CldsAsdcResourceBasicInfo.java b/src/main/java/org/onap/clamp/clds/model/CldsAsdcResourceBasicInfo.java new file mode 100644 index 00000000..c66428a6 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/CldsAsdcResourceBasicInfo.java @@ -0,0 +1,160 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import java.math.BigDecimal; +import java.util.logging.Logger; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class CldsAsdcResourceBasicInfo implements Comparable<CldsAsdcResourceBasicInfo> { + private static final Logger logger = Logger.getLogger(CldsAsdcServiceInfo.class.getName()); + + private String uuid; + private String invariantUUID; + private String name; + private String version; + private String toscaModelURL; + private String category; + private String subCategory; + private String resourceType; + private String lifecycleState; + private String lastUpdaterUserId; + + @Override + public int compareTo(CldsAsdcResourceBasicInfo in) { + // Compares this object with the specified object for order. + // Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object. + // first compare based on name + int rtn = name.compareToIgnoreCase(in.name); + + if (rtn == 0) { + BigDecimal myVersion = convertVersion(version); + BigDecimal inVersion = convertVersion(in.version); + rtn = myVersion.compareTo(inVersion); + } + return rtn; + } + + /** + * Convert version String into a BigDecimal + * + * @param version + * @return + */ + private BigDecimal convertVersion(String version) { + BigDecimal rtn = new BigDecimal(0.0); + try { + rtn = new BigDecimal(version); + } catch (NumberFormatException nfe) { + logger.warning("ASDC version=" + version + " is not decimal for name=" + name); + } + return rtn; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getInvariantUUID() { + return invariantUUID; + } + + public void setInvariantUUID(String invariantUUID) { + this.invariantUUID = invariantUUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getToscaModelURL() { + return toscaModelURL; + } + + public void setToscaModelURL(String toscaModelURL) { + this.toscaModelURL = toscaModelURL; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public String getSubCategory() { + return subCategory; + } + + public void setSubCategory(String subCategory) { + this.subCategory = subCategory; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getLifecycleState() { + return lifecycleState; + } + + public void setLifecycleState(String lifecycleState) { + this.lifecycleState = lifecycleState; + } + + public String getLastUpdaterUserId() { + return lastUpdaterUserId; + } + + public void setLastUpdaterUserId(String lastUpdaterUserId) { + this.lastUpdaterUserId = lastUpdaterUserId; + } + + public Logger getLOGGER() { + return logger; + } +} diff --git a/src/main/java/org/onap/clamp/clds/model/CldsAsdcServiceDetail.java b/src/main/java/org/onap/clamp/clds/model/CldsAsdcServiceDetail.java new file mode 100644 index 00000000..f50e09d5 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/CldsAsdcServiceDetail.java @@ -0,0 +1,142 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class CldsAsdcServiceDetail { + + private String uuid; + private String invariantUUID; + private String name; + private String version; + private String toscaModelURL; + private String category; + private String lifecycleState; + private String lastUpdaterUserId; + private String distributionStatus; + private String lastUpdaterFullName; + private List<CldsAsdcResource> resources; + private List<CldsAsdcArtifact> artifacts; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getInvariantUUID() { + return invariantUUID; + } + + public void setInvariantUUID(String invariantUUID) { + this.invariantUUID = invariantUUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getToscaModelURL() { + return toscaModelURL; + } + + public void setToscaModelURL(String toscaModelURL) { + this.toscaModelURL = toscaModelURL; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public String getLifecycleState() { + return lifecycleState; + } + + public void setLifecycleState(String lifecycleState) { + this.lifecycleState = lifecycleState; + } + + public String getLastUpdaterUserId() { + return lastUpdaterUserId; + } + + public void setLastUpdaterUserId(String lastUpdaterUserId) { + this.lastUpdaterUserId = lastUpdaterUserId; + } + + public String getDistributionStatus() { + return distributionStatus; + } + + public void setDistributionStatus(String distributionStatus) { + this.distributionStatus = distributionStatus; + } + + public String getLastUpdaterFullName() { + return lastUpdaterFullName; + } + + public void setLastUpdaterFullName(String lastUpdaterFullName) { + this.lastUpdaterFullName = lastUpdaterFullName; + } + + public List<CldsAsdcResource> getResources() { + return resources; + } + + public void setResources(List<CldsAsdcResource> resources) { + this.resources = resources; + } + + public List<CldsAsdcArtifact> getArtifacts() { + return artifacts; + } + + public void setArtifacts(List<CldsAsdcArtifact> artifacts) { + this.artifacts = artifacts; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/CldsAsdcServiceInfo.java b/src/main/java/org/onap/clamp/clds/model/CldsAsdcServiceInfo.java new file mode 100644 index 00000000..3ed57534 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/CldsAsdcServiceInfo.java @@ -0,0 +1,148 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model; + +import java.math.BigDecimal; +import java.util.logging.Logger; + +public class CldsAsdcServiceInfo implements Comparable<CldsAsdcServiceInfo> { + private static final Logger logger = Logger.getLogger(CldsAsdcServiceInfo.class.getName()); + + private String uuid; + private String invariantUUID; + private String name; + private String version; + private String toscaModelURL; + private String category; + private String lifecycleState; + private String lastUpdaterUserId; + private String distributionStatus; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getInvariantUUID() { + return invariantUUID; + } + + public void setInvariantUUID(String invariantUUID) { + this.invariantUUID = invariantUUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getToscaModelURL() { + return toscaModelURL; + } + + public void setToscaModelURL(String toscaModelURL) { + this.toscaModelURL = toscaModelURL; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public String getLifecycleState() { + return lifecycleState; + } + + public void setLifecycleState(String lifecycleState) { + this.lifecycleState = lifecycleState; + } + + public String getLastUpdaterUserId() { + return lastUpdaterUserId; + } + + public void setLastUpdaterUserId(String lastUpdaterUserId) { + this.lastUpdaterUserId = lastUpdaterUserId; + } + + public String getDistributionStatus() { + return distributionStatus; + } + + public void setDistributionStatus(String distributionStatus) { + this.distributionStatus = distributionStatus; + } + + /** + * Compare using name and then version. Version is converted to a decimal. + */ + @Override + public int compareTo(CldsAsdcServiceInfo in) { + // Compares this object with the specified object for order. + // Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object. + // first compare based on name + int rtn = name.compareToIgnoreCase(in.name); + + if (rtn == 0) { + BigDecimal myVersion = convertVersion(version); + BigDecimal inVersion = convertVersion(in.version); + rtn = myVersion.compareTo(inVersion); + } + + return rtn; + } + + /** + * Convert version String into a BigDecimal + * + * @param versionText + * @return + */ + private BigDecimal convertVersion(String versionText) { + try { + return new BigDecimal(versionText); + } catch (NumberFormatException nfe) { + logger.warning("ASDC version=" + versionText + " is not decimal for name=" + name); + } + return new BigDecimal(0.0); + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/CldsDBServiceCache.java b/src/main/java/org/onap/clamp/clds/model/CldsDBServiceCache.java new file mode 100644 index 00000000..658e21f9 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/CldsDBServiceCache.java @@ -0,0 +1,66 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model; + +import java.io.*; + +public class CldsDBServiceCache { + + private String invariantId; + private String serviceId; + private InputStream cldsDataInstream; + + public String getInvariantId() { + return invariantId; + } + + public void setInvariantId(String invariantId) { + this.invariantId = invariantId; + } + + public String getServiceId() { + return serviceId; + } + + public void setServiceId(String serviceId) { + this.serviceId = serviceId; + } + + public InputStream getCldsDataInstream() throws IOException { + return cldsDataInstream; + } + + public void setCldsDataInstream(CldsServiceData cldsServiceData) throws IOException { + this.cldsDataInstream = getInstreamFromObject(cldsServiceData); + } + + private InputStream getInstreamFromObject(CldsServiceData cldsServiceData) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(baos); + oos.writeObject(cldsServiceData); + oos.flush(); + oos.close(); + return new ByteArrayInputStream(baos.toByteArray()); + } +} diff --git a/src/main/java/org/onap/clamp/clds/model/CldsEvent.java b/src/main/java/org/onap/clamp/clds/model/CldsEvent.java new file mode 100644 index 00000000..8379e502 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/CldsEvent.java @@ -0,0 +1,183 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model; + +import org.onap.clamp.clds.dao.CldsDao; + +/** + * Represent a CLDS Event. + */ +public class CldsEvent { + public static final String ACTION_CREATE = "CREATE"; + public static final String ACTION_SUBMIT = "SUBMIT"; + public static final String ACTION_RESUBMIT = "RESUBMIT"; // an update before model is active + public static final String ACTION_DISTRIBUTE = "DISTRIBUTE"; // only from dcae + public static final String ACTION_DEPLOY = "DEPLOY"; // only from dcae + public static final String ACTION_UNDEPLOY = "UNDEPLOY"; // only from dcae + public static final String ACTION_UPDATE = "UPDATE"; + public static final String ACTION_DELETE = "DELETE"; + public static final String ACTION_STOP = "STOP"; + public static final String ACTION_RESTART = "RESTART"; + + public static final String ACTION_STATE_INITIATED = "INITIATED"; + public static final String ACTION_STATE_SENT = "SENT"; + public static final String ACTION_STATE_COMPLETED = "COMPLETED"; + public static final String ACTION_STATE_RECEIVED = "RECEIVED"; + public static final String ACTION_STATE_ERROR = "ERROR"; + public static final String ACTION_STATE_ANY = null; + + private String id; + private String actionCd; + private String actionStateCd; + private String processInstanceId; + private String userid; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + /** + * @param cldsDao + * @param controlName + * @param userid + * @param actionCd + * @param actionStateCd + * @param processInstanceId + * @return + */ + public static CldsEvent insEvent(CldsDao cldsDao, String controlName, String userid, String actionCd, String actionStateCd, String processInstanceId) { + CldsModel model = CldsModel.createUsingControlName(controlName); + return insEvent(cldsDao, model, actionCd, actionStateCd, processInstanceId); + } + + /** + * Insert event using controlNameUuid to find the model. + * This method meant for processing events from dcae. + * @param cldsDao + * @param model + * @param actionCd + * @param actionStateCd + * @param processInstanceId + * @return + */ + public static CldsEvent insEvent(CldsDao cldsDao, CldsModel model, String actionCd, String actionStateCd, String processInstanceId) { + CldsEvent event = new CldsEvent(); + event.setActionCd(actionCd); + event.setActionStateCd(actionStateCd); + event.setProcessInstanceId(processInstanceId); + cldsDao.insEvent(null, model.getControlNamePrefix(), model.getControlNameUuid(), event); + return event; + } + + /** + * Check if actionCd and actionStateCd are equal to the supplied checkActionCd and checkActionStateCd. + * Treat checkActionStateCd == null as a wildcard + * checkActionCd should not be null. + * + * @param checkActionCd + * @param checkActionStateCd + * @return + */ + public boolean isActionAndStateCd(String checkActionCd, String checkActionStateCd) { + if (actionCd == null) { + return false; + } + // treat checkActionStateCd == null as a wildcard (same for actionStateCd, although it shouln't be null...) + if (checkActionStateCd == null || actionStateCd == null) { + return actionCd.equals(checkActionCd); + } + return actionCd.equals(checkActionCd) && actionStateCd.equals(checkActionStateCd); + } + + /** + * Check if actionStateCd is equal to the supplied checkActionStateCd. + * checkActionCd should not be null. + * + * @param checkActionStateCd + * @return + */ + public boolean isActionStateCd(String checkActionStateCd) { + return !(checkActionStateCd == null || actionStateCd == null) && actionStateCd.equals(checkActionStateCd); + } + + /** + * @return the actionCd + */ + public String getActionCd() { + return actionCd; + } + + /** + * @param actionCd the actionCd to set + */ + public void setActionCd(String actionCd) { + this.actionCd = actionCd; + } + + /** + * @return the actionStateCd + */ + public String getActionStateCd() { + return actionStateCd; + } + + /** + * @param actionStateCd the actionStateCd to set + */ + public void setActionStateCd(String actionStateCd) { + this.actionStateCd = actionStateCd; + } + + /** + * @return the processInstanceId + */ + public String getProcessInstanceId() { + return processInstanceId; + } + + /** + * @param processInstanceId the processInstanceId to set + */ + public void setProcessInstanceId(String processInstanceId) { + this.processInstanceId = processInstanceId; + } + + /** + * @return the userid + */ + public String getUserid() { + return userid; + } + + /** + * @param userid the userid to set + */ + public void setUserid(String userid) { + this.userid = userid; + } +} diff --git a/src/main/java/org/onap/clamp/clds/model/CldsModel.java b/src/main/java/org/onap/clamp/clds/model/CldsModel.java new file mode 100644 index 00000000..4d4f3aab --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/CldsModel.java @@ -0,0 +1,570 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model; + +import org.onap.clamp.clds.dao.CldsDao; +import org.jboss.resteasy.spi.BadRequestException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.NotFoundException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Represent a CLDS Model. + */ +public class CldsModel { + private static final Logger logger = LoggerFactory.getLogger(CldsModel.class); + + private static final int UUID_LENGTH = 36; + + public static final String STATUS_DESIGN = "DESIGN"; + public static final String STATUS_DISTRIBUTED = "DISTRIBUTED"; + public static final String STATUS_ACTIVE = "ACTIVE"; + public static final String STATUS_STOPPED = "STOPPED"; + public static final String STATUS_DELETING = "DELETING"; + public static final String STATUS_ERROR = "ERROR"; // manual intervention required + public static final String STATUS_UNKNOWN = "UNKNOWN"; + + private String id; + private String templateId; + private String templateName; + private String name; + private String controlNamePrefix; + private String controlNameUuid; + private String bpmnId; + private String bpmnUserid; + private String bpmnText; + private String propId; + private String propUserid; + private String propText; + private String imageId; + private String imageUserid; + private String imageText; + private String docId; + private String docUserid; + private String docText; + private String blueprintId; + private String blueprintUserid; + private String blueprintText; + private CldsEvent event; + private String status; + private List<String> permittedActionCd; + private List<CldsModelInstance> cldsModelInstanceList; + + /** + * Construct empty model. + */ + public CldsModel() { + event = new CldsEvent(); + } + + /** + * Retrieve from DB. + * + * @param cldsDao + * @param name + * @return + */ + public static CldsModel retrieve(CldsDao cldsDao, String name, boolean okIfNotFound) { + // get from db + CldsModel model = cldsDao.getModelTemplate(name); + if (model.getId() == null && !okIfNotFound) { + throw new NotFoundException(); + } + model.determineStatus(); + model.determinePermittedActionCd(); + return model; + } + + /** + * Save model to DB. + * + * @param cldsDao + * @param userid + */ + public void save(CldsDao cldsDao, String userid) { + cldsDao.setModel(this, userid); + determineStatus(); + determinePermittedActionCd(); + } + + /** + * Insert a new event for the new action. + * Throw IllegalArgumentException if requested actionCd is not permitted. + * + * @param cldsDao + * @param userid + * @param actionCd + * @param actionStateCd + */ + public void insEvent(CldsDao cldsDao, String userid, String actionCd, String actionStateCd) { + validateAction(actionCd); + event = CldsEvent.insEvent(cldsDao, this, actionCd, actionStateCd, null); + determineStatus(); + determinePermittedActionCd(); + } + + /** + * Update event with processInstanceId + * + * @param cldsDao + * @param processInstanceId + */ + public void updEvent(CldsDao cldsDao, String processInstanceId) { + cldsDao.updEvent(event.getId(), processInstanceId); + } + + /** + * set the status in the model + */ + private void determineStatus() { + + status = STATUS_UNKNOWN; + if (event == null || event.getActionCd() == null) { + status = STATUS_DESIGN; + } else if (event.isActionStateCd(CldsEvent.ACTION_STATE_ERROR)) { + status = STATUS_ERROR; + } else if (event.isActionAndStateCd(CldsEvent.ACTION_CREATE, CldsEvent.ACTION_STATE_ANY) || + event.isActionAndStateCd(CldsEvent.ACTION_SUBMIT, CldsEvent.ACTION_STATE_ANY) || + event.isActionAndStateCd(CldsEvent.ACTION_RESUBMIT, CldsEvent.ACTION_STATE_ANY) || + event.isActionAndStateCd(CldsEvent.ACTION_DELETE, CldsEvent.ACTION_STATE_RECEIVED)) { + status = STATUS_DESIGN; + } else if (event.isActionAndStateCd(CldsEvent.ACTION_DISTRIBUTE, CldsEvent.ACTION_STATE_RECEIVED) || + event.isActionAndStateCd(CldsEvent.ACTION_UNDEPLOY, CldsEvent.ACTION_STATE_RECEIVED)) { + status = STATUS_DISTRIBUTED; + } else if (event.isActionAndStateCd(CldsEvent.ACTION_DELETE, CldsEvent.ACTION_STATE_SENT)) { + status = STATUS_DELETING; + } else if (event.isActionAndStateCd(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_STATE_RECEIVED) || + event.isActionAndStateCd(CldsEvent.ACTION_RESTART, CldsEvent.ACTION_STATE_ANY) || + event.isActionAndStateCd(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STATE_ANY)) { + status = STATUS_ACTIVE; + } else if (event.isActionAndStateCd(CldsEvent.ACTION_STOP, CldsEvent.ACTION_STATE_ANY)) { + status = STATUS_STOPPED; + } + + } + + /** + * Get the actionCd from current event. If none, default value is CldsEvent.ACTION_CREATE + * + * @return + */ + private String getCurrentActionCd() { + // current default actionCd is CREATE + String actionCd = CldsEvent.ACTION_CREATE; + if (event != null && event.getActionCd() != null) { + actionCd = event.getActionCd(); + } + return actionCd; + } + + /** + * Get the actionStateCd from current event. If none, default value is CldsEvent.ACTION_STATE_COMPLETED + * + * @return + */ + private String getCurrentActionStateCd() { + // current default actionStateCd is CREATE + String actionStateCd = CldsEvent.ACTION_STATE_COMPLETED; + if (event != null && event.getActionStateCd() != null) { + actionStateCd = event.getActionStateCd(); + } + return actionStateCd; + } + + /** + * Determine permittedActionCd list using the actionCd from the current event. + */ + private void determinePermittedActionCd() { + String actionCd = getCurrentActionCd(); + switch (actionCd) { + case CldsEvent.ACTION_CREATE: + permittedActionCd = Arrays.asList(CldsEvent.ACTION_SUBMIT); + break; + case CldsEvent.ACTION_SUBMIT: + case CldsEvent.ACTION_RESUBMIT: + // for 1702 delete is not currently implemented (and resubmit requires manually deleting artifact from asdc + permittedActionCd = Arrays.asList(CldsEvent.ACTION_RESUBMIT); + break; + case CldsEvent.ACTION_DISTRIBUTE: + case CldsEvent.ACTION_UNDEPLOY: + permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE); + break; + case CldsEvent.ACTION_DEPLOY: + case CldsEvent.ACTION_RESTART: + case CldsEvent.ACTION_UPDATE: + // for 1702 delete is not currently implemented + permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STOP); + break; + case CldsEvent.ACTION_DELETE: + if (getCurrentActionStateCd().equals(CldsEvent.ACTION_STATE_SENT)) { + permittedActionCd = Arrays.asList(); + } else { + permittedActionCd = Arrays.asList(CldsEvent.ACTION_SUBMIT); + } + break; + case CldsEvent.ACTION_STOP: + // for 1702 delete is not currently implemented + permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_RESTART); + break; + default: + logger.warn("Invalid current actionCd: " + actionCd); + } + } + + /** + * Validate requestedActionCd - determine permittedActionCd and then check if contained in permittedActionCd + * Throw IllegalArgumentException if requested actionCd is not permitted. + * + * @param requestedActionCd + */ + public void validateAction(String requestedActionCd) { + determinePermittedActionCd(); + if (!permittedActionCd.contains(requestedActionCd)) { + throw new IllegalArgumentException("Invalid requestedActionCd: " + requestedActionCd + ". Given current actionCd: " + getCurrentActionCd() + ", the permittedActionCd: " + permittedActionCd); + } + } + + /** + * Extract the UUID portion of a given full control name (controlNamePrefix + controlNameUuid). + * No fields are populated other than controlNamePrefix and controlNameUuid. + * Throws BadRequestException if length of given control name is less than UUID_LENGTH. + * + * @param fullControlName + * @return + */ + public static CldsModel createUsingControlName(String fullControlName) { + + int len = 0; + + if (fullControlName != null) { + len = fullControlName.length(); + } + if (len < UUID_LENGTH) { + throw new BadRequestException("closed loop id / control name length, " + len + ", less than the minimum of: " + UUID_LENGTH); + } + CldsModel model = new CldsModel(); + model.setControlNamePrefix(fullControlName.substring(0, len - UUID_LENGTH)); + model.setControlNameUuid(fullControlName.substring(len - UUID_LENGTH)); + return model; + } + + /** + * @return the controlName (controlNamePrefix + controlNameUuid) + */ + public String getControlName() { + return controlNamePrefix + controlNameUuid; + } + + /** + * To insert modelInstance to the database + * + * @param cldsDao + * @param dcaeEvent + */ + public static CldsModel insertModelInstance(CldsDao cldsDao, DcaeEvent dcaeEvent, String userid) { + String controlName = dcaeEvent.getControlName(); + CldsModel cldsModel = createUsingControlName(controlName); + cldsModel = cldsDao.getModelByUuid(cldsModel.getControlNameUuid()); + cldsModel.determineStatus(); + if (dcaeEvent.getCldsActionCd().equals(CldsEvent.ACTION_UNDEPLOY) || + (dcaeEvent.getCldsActionCd().equals(CldsEvent.ACTION_DEPLOY) && (cldsModel.getStatus().equals(STATUS_DISTRIBUTED) || cldsModel.getStatus().equals(STATUS_DESIGN)))) { + CldsEvent.insEvent(cldsDao, dcaeEvent.getControlName(), userid, dcaeEvent.getCldsActionCd(), CldsEvent.ACTION_STATE_RECEIVED, null); + } + cldsDao.insModelInstance(cldsModel, dcaeEvent.getInstances()); + return cldsModel; + } + + /** + * To remove modelInstance from the database + * This method is defunct - DCAE Proxy will not undeploy individual instances. It will send an empty list of + * deployed instances to indicate all have been removed. Or it will send an updated list to indicate those that + * are still deployed with any not on the list considered undeployed. + * + * @param cldsDao + * @param dcaeEvent + */ + @SuppressWarnings("unused") + private static CldsModel removeModelInstance(CldsDao cldsDao, DcaeEvent dcaeEvent) { + String controlName = dcaeEvent.getControlName(); + //cldsModel = cldsDao.delModelInstance(cldsModel.getControlNameUuid(), dcaeEvent.getInstances() ); + return createUsingControlName(controlName); + } + + /** + * @return the name + */ + public String getName() { + return name; + } + + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + + public String getTemplateId() { + return templateId; + } + + public void setTemplateId(String templateId) { + this.templateId = templateId; + } + + /** + * @return the controlNamePrefix + */ + public String getControlNamePrefix() { + return controlNamePrefix; + } + + /** + * @param controlNamePrefix the controlNamePrefix to set + */ + public void setControlNamePrefix(String controlNamePrefix) { + this.controlNamePrefix = controlNamePrefix; + } + + /** + * @return the controlNameUuid + */ + public String getControlNameUuid() { + return controlNameUuid; + } + + /** + * @param controlNameUuid the controlNameUuid to set + */ + public void setControlNameUuid(String controlNameUuid) { + this.controlNameUuid = controlNameUuid; + } + + + /** + * @return the propUserid + */ + public String getPropUserid() { + return propUserid; + } + + /** + * @param propUserid the propUserid to set + */ + public void setPropUserid(String propUserid) { + this.propUserid = propUserid; + } + + /** + * @return the propText + */ + public String getPropText() { + return propText; + } + + /** + * @param propText the propText to set + */ + public void setPropText(String propText) { + this.propText = propText; + } + + /** + * @return the event + */ + public CldsEvent getEvent() { + return event; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTemplateName() { + return templateName; + } + + public void setTemplateName(String templateName) { + this.templateName = templateName; + } + + public String getPropId() { + return propId; + } + + public void setPropId(String propId) { + this.propId = propId; + } + + /** + * @param event the event to set + */ + public void setEvent(CldsEvent event) { + this.event = event; + } + + /** + * @return the status + */ + public String getStatus() { + return status; + } + + /** + * @param status the status to set + */ + public void setStatus(String status) { + this.status = status; + } + + /** + * @return the permittedActionCd + */ + public List<String> getPermittedActionCd() { + return permittedActionCd; + } + + /** + * @param permittedActionCd the permittedActionCd to set + */ + public void setPermittedActionCd(List<String> permittedActionCd) { + this.permittedActionCd = permittedActionCd; + } + + public String getBlueprintId() { + return blueprintId; + } + + public void setBlueprintId(String blueprintId) { + this.blueprintId = blueprintId; + } + + public String getBlueprintUserid() { + return blueprintUserid; + } + + public void setBlueprintUserid(String blueprintUserid) { + this.blueprintUserid = blueprintUserid; + } + + public String getBlueprintText() { + return blueprintText; + } + + public void setBlueprintText(String blueprintText) { + this.blueprintText = blueprintText; + } + + public String getBpmnId() { + return bpmnId; + } + + public void setBpmnId(String bpmnId) { + this.bpmnId = bpmnId; + } + + public String getBpmnUserid() { + return bpmnUserid; + } + + public void setBpmnUserid(String bpmnUserid) { + this.bpmnUserid = bpmnUserid; + } + + public String getBpmnText() { + return bpmnText; + } + + public void setBpmnText(String bpmnText) { + this.bpmnText = bpmnText; + } + + public String getImageId() { + return imageId; + } + + public void setImageId(String imageId) { + this.imageId = imageId; + } + + public String getImageUserid() { + return imageUserid; + } + + public void setImageUserid(String imageUserid) { + this.imageUserid = imageUserid; + } + + public String getImageText() { + return imageText; + } + + public void setImageText(String imageText) { + this.imageText = imageText; + } + + public String getDocId() { + return docId; + } + + public void setDocId(String docId) { + this.docId = docId; + } + + public String getDocUserid() { + return docUserid; + } + + public void setDocUserid(String docUserid) { + this.docUserid = docUserid; + } + + public String getDocText() { + return docText; + } + + public void setDocText(String docText) { + this.docText = docText; + } + + public List<CldsModelInstance> getCldsModelInstanceList() { + if (cldsModelInstanceList == null) { + cldsModelInstanceList = new ArrayList<>(); + } + return cldsModelInstanceList; + } + + public void setCldsModelInstanceList(List<CldsModelInstance> cldsModelInstanceList) { + this.cldsModelInstanceList = cldsModelInstanceList; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/CldsModelInstance.java b/src/main/java/org/onap/clamp/clds/model/CldsModelInstance.java new file mode 100644 index 00000000..4c16aade --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/CldsModelInstance.java @@ -0,0 +1,59 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class CldsModelInstance { + + private String modelInstanceId; + private String location; + private String vmName; + + public String getVmName() { + return vmName; + } + + public void setVmName(String vmName) { + this.vmName = vmName; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getModelInstanceId() { + return modelInstanceId; + } + + public void setModelInstanceId(String modelInstanceId) { + this.modelInstanceId = modelInstanceId; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/CldsServiceData.java b/src/main/java/org/onap/clamp/clds/model/CldsServiceData.java new file mode 100644 index 00000000..89108393 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/CldsServiceData.java @@ -0,0 +1,112 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model; + +import org.onap.clamp.clds.dao.CldsDao; +import org.onap.clamp.clds.service.CldsService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.NotAuthorizedException; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +public class CldsServiceData implements Serializable { + private static final Logger logger = LoggerFactory.getLogger(CldsServiceData.class); + + private static final long serialVersionUID = 1L; + + private String serviceInvariantUUID; + private String serviceUUID; + private Long ageOfRecord; + private List<CldsVfData> cldsVfs; + + public String getServiceInvariantUUID() { + return serviceInvariantUUID; + } + + public void setServiceInvariantUUID(String serviceInvariantUUID) { + this.serviceInvariantUUID = serviceInvariantUUID; + } + + public List<CldsVfData> getCldsVfs() { + return cldsVfs; + } + + public void setCldsVfs(List<CldsVfData> cldsVfs) { + this.cldsVfs = cldsVfs; + } + + public String getServiceUUID() { + return serviceUUID; + } + + public void setServiceUUID(String serviceUUID) { + this.serviceUUID = serviceUUID; + } + + public CldsServiceData getCldsServiceCache(CldsDao cldsDao, String invariantServiceUUID) throws Exception { + return cldsDao.getCldsServiceCache(invariantServiceUUID); + } + + public void setCldsServiceCache(CldsDao cldsDao, CldsDBServiceCache cldsDBServiceCache) throws Exception { + cldsDao.setCldsServiceCache(cldsDBServiceCache); + } + + public Long getAgeOfRecord() { + return ageOfRecord; + } + + public void setAgeOfRecord(Long ageOfRecord) { + this.ageOfRecord = ageOfRecord; + } + + /** + * Filter out any VFs that the user is not authorized for. + * Use the CldsService to determine if the user is authorized for a VF. + * + * @param svc + */ + public void filterVfs(CldsService svc) { + List<CldsVfData> filteredCldsVfs = new ArrayList<>(); + if (cldsVfs == null) { + logger.debug("cldsVfs == null"); + } else { + for (CldsVfData vf : cldsVfs) { + // if user is authorized for the VF then add it to the filtered list + try { + if (svc.isAuthorizedForVf(vf.getVfInvariantResourceUUID())) { + filteredCldsVfs.add(vf); + } + } catch (NotAuthorizedException e) { + logger.debug("user not authorized for {}", vf.getVfInvariantResourceUUID()); + // when not NotAuthorizedException - don't add to filteredCldsVfs list + } + } + } + // new filtered list replaces the list of VFs for the user + cldsVfs = filteredCldsVfs; + } +} diff --git a/src/main/java/org/onap/clamp/clds/model/CldsTemplate.java b/src/main/java/org/onap/clamp/clds/model/CldsTemplate.java new file mode 100644 index 00000000..6e2c8d70 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/CldsTemplate.java @@ -0,0 +1,186 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model; + +import org.onap.clamp.clds.dao.CldsDao; + +import javax.ws.rs.NotFoundException; + +/** + * Represent a CLDS Model. + */ +public class CldsTemplate { + + public static final String STATUS_DESIGN = "DESIGN"; + public static final String STATUS_ACTIVE = "ACTIVE"; + public static final String STATUS_STOPPED = "STOPPED"; + public static final String STATUS_DELETING = "DELETING"; + public static final String STATUS_ERROR = "ERROR"; // manual intervention required + public static final String STATUS_UNKNOWN = "UNKNOWN"; + + private String id; + private String name; + private String controlNamePrefix; + private String controlNameUuid; + private String bpmnId; + private String bpmnUserid; + private String bpmnText; + private String imageId; + private String imageUserid; + private String imageText; + private String propId; + private String propUserid; + private String propText; + + /** + * Save template to DB. + * + * @param cldsDao + * @param userid + */ + public void save(CldsDao cldsDao, String userid) { + cldsDao.setTemplate(this, userid); + } + + /** + * Retrieve from DB. + * + * @param cldsDao + * @param name + * @return + */ + public static CldsTemplate retrieve(CldsDao cldsDao, String name, boolean okIfNotFound) { + // get from db + CldsTemplate template = cldsDao.getTemplate(name); + if (template.getId() == null && !okIfNotFound) { + throw new NotFoundException(); + } + return template; + } + + public String getBpmnUserid() { + return bpmnUserid; + } + + public void setBpmnUserid(String bpmnUserid) { + this.bpmnUserid = bpmnUserid; + } + + public String getBpmnText() { + return bpmnText; + } + + public void setBpmnText(String bpmnText) { + this.bpmnText = bpmnText; + } + + public String getImageUserid() { + return imageUserid; + } + + public void setImageUserid(String imageUserid) { + this.imageUserid = imageUserid; + } + + public String getImageText() { + return imageText; + } + + public void setImageText(String imageText) { + this.imageText = imageText; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getControlNamePrefix() { + return controlNamePrefix; + } + + public void setControlNamePrefix(String controlNamePrefix) { + this.controlNamePrefix = controlNamePrefix; + } + + public String getControlNameUuid() { + return controlNameUuid; + } + + public void setControlNameUuid(String controlNameUuid) { + this.controlNameUuid = controlNameUuid; + } + + public String getPropId() { + return propId; + } + + public void setPropId(String propId) { + this.propId = propId; + } + + public String getPropUserid() { + return propUserid; + } + + public void setPropUserid(String propUserid) { + this.propUserid = propUserid; + } + + public String getPropText() { + return propText; + } + + public void setPropText(String propText) { + this.propText = propText; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getBpmnId() { + return bpmnId; + } + + public void setBpmnId(String bpmnId) { + this.bpmnId = bpmnId; + } + + public String getImageId() { + return imageId; + } + + public void setImageId(String imageId) { + this.imageId = imageId; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/CldsVfData.java b/src/main/java/org/onap/clamp/clds/model/CldsVfData.java new file mode 100644 index 00000000..dbcfb346 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/CldsVfData.java @@ -0,0 +1,61 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model; + +import java.io.Serializable; +import java.util.List; + +public class CldsVfData implements Serializable { + + private static final long serialVersionUID = 1L; + + private String vfName; + private String vfInvariantResourceUUID; + private List<CldsVfcData> cldsVfcs; + + public String getVfName() { + return vfName; + } + + public void setVfName(String vfName) { + this.vfName = vfName; + } + + public List<CldsVfcData> getCldsVfcs() { + return cldsVfcs; + } + + public void setCldsVfcs(List<CldsVfcData> cldsVfcs) { + this.cldsVfcs = cldsVfcs; + } + + public String getVfInvariantResourceUUID() { + return vfInvariantResourceUUID; + } + + public void setVfInvariantResourceUUID(String vfInvariantResourceUUID) { + this.vfInvariantResourceUUID = vfInvariantResourceUUID; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/CldsVfcData.java b/src/main/java/org/onap/clamp/clds/model/CldsVfcData.java new file mode 100644 index 00000000..2d56d01f --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/CldsVfcData.java @@ -0,0 +1,61 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model; + +import java.io.Serializable; +import java.util.List; + +public class CldsVfcData implements Serializable { + + private static final long serialVersionUID = 1L; + + private String vfcName; + private String vfcInvariantResourceUUID; + private List<CldsAlarmCondition> cldsAlarmConditions; + + public String getVfcName() { + return vfcName; + } + + public void setVfcName(String vfcName) { + this.vfcName = vfcName; + } + + public List<CldsAlarmCondition> getCldsAlarmConditions() { + return cldsAlarmConditions; + } + + public void setCldsAlarmConditions(List<CldsAlarmCondition> cldsAlarmConditions) { + this.cldsAlarmConditions = cldsAlarmConditions; + } + + public String getVfcInvariantResourceUUID() { + return vfcInvariantResourceUUID; + } + + public void setVfcInvariantResourceUUID(String vfcInvariantResourceUUID) { + this.vfcInvariantResourceUUID = vfcInvariantResourceUUID; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/DcaeEvent.java b/src/main/java/org/onap/clamp/clds/model/DcaeEvent.java new file mode 100644 index 00000000..e10971e7 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/DcaeEvent.java @@ -0,0 +1,149 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model; + +import org.jboss.resteasy.spi.BadRequestException; + +import java.util.List; + +/** + * Represent a DCAE Event. + */ +public class DcaeEvent { + public static final String EVENT_CREATED = "created"; // this is an event we (clds) sends to dcae + public static final String EVENT_DISTRIBUTION = "distribution"; + public static final String EVENT_DEPLOYMENT = "deployment"; + public static final String EVENT_UNDEPLOYMENT = "undeployment"; + public static final String ARTIFACT_NAME_SUFFIX = ".yml"; + + private String event; + private String serviceUUID; + private String resourceUUID; + private String artifactName; // controlName.yml + private List<CldsModelInstance> instances; + + /** + * Transform a DCAE Event Action to a CldsEvent.actionCd + * + * @return + */ + public String getCldsActionCd() { + if (event == null || event.length() == 0) { + throw new BadRequestException("action null or empty"); + } else if (event.equals(EVENT_CREATED)) { + return CldsEvent.ACTION_CREATE; + } else if (event.equals(EVENT_DISTRIBUTION)) { + return CldsEvent.ACTION_DISTRIBUTE; + } else if (event.equals(EVENT_DEPLOYMENT) && + (instances == null || instances.size() == 0)) { + return CldsEvent.ACTION_UNDEPLOY; + } else if (event.equals(EVENT_DEPLOYMENT)) { + return CldsEvent.ACTION_DEPLOY; + // EVENT_UNDEPLOYMENT is defunct - DCAE Proxy will not undeploy individual instances. It will send an empty list of + // deployed instances to indicate all have been removed. Or it will send an updated list to indicate those that + // are still deployed with any not on the list considered undeployed. + //} else if ( event.equals(EVENT_UNDEPLOYMENT) ) { + // return CldsEvent.ACTION_UNDEPLOY; + } + throw new BadRequestException("event value not valid: " + event); + } + + /** + * Derive the controlName from the artifactName. + * + * @return the controlName + */ + public String getControlName() { + if (artifactName != null && artifactName.endsWith(ARTIFACT_NAME_SUFFIX)) { + return artifactName.substring(0, artifactName.length() - ARTIFACT_NAME_SUFFIX.length()); + } else { + throw new BadRequestException("artifactName value not valid (expecting it to end with " + ARTIFACT_NAME_SUFFIX + "): " + artifactName); + } + } + + /** + * @return the event + */ + public String getEvent() { + return event; + } + + /** + * @param event the event to set + */ + public void setEvent(String event) { + this.event = event; + } + + /** + * @return the serviceUUID + */ + public String getServiceUUID() { + return serviceUUID; + } + + /** + * @param serviceUUID the serviceUUID to set + */ + public void setServiceUUID(String serviceUUID) { + this.serviceUUID = serviceUUID; + } + + /** + * @return the resourceUUID + */ + public String getResourceUUID() { + return resourceUUID; + } + + /** + * @param resourceUUID the resourceUUID to set + */ + public void setResourceUUID(String resourceUUID) { + this.resourceUUID = resourceUUID; + } + + /** + * @return the artifactName + */ + public String getArtifactName() { + return artifactName; + } + + /** + * @param artifactName the artifactName to set + */ + public void setArtifactName(String artifactName) { + this.artifactName = artifactName; + } + + public List<CldsModelInstance> getInstances() { + return instances; + } + + public void setInstances(List<CldsModelInstance> instances) { + this.instances = instances; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/HelloWorld.java b/src/main/java/org/onap/clamp/clds/model/HelloWorld.java new file mode 100644 index 00000000..1165f5da --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/HelloWorld.java @@ -0,0 +1,50 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model; + +public class HelloWorld { + + private String message; + + public HelloWorld() { + // needed for deserializer + } + + public HelloWorld(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return "message = " + getMessage(); + } +} diff --git a/src/main/java/org/onap/clamp/clds/model/ValueItem.java b/src/main/java/org/onap/clamp/clds/model/ValueItem.java new file mode 100644 index 00000000..804d1854 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/ValueItem.java @@ -0,0 +1,58 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model; + +/** + * ValueItem used for value lists. + */ +public class ValueItem { + private String value; + + /** + * Instantiate using value. + * + * @param value + */ + public ValueItem(String value) { + this.value = value; + } + + public ValueItem() { + } + + /** + * @return the value + */ + public String getValue() { + return value; + } + + /** + * @param value the value to set + */ + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/prop/Collector.java b/src/main/java/org/onap/clamp/clds/model/prop/Collector.java new file mode 100644 index 00000000..84bc38f0 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/prop/Collector.java @@ -0,0 +1,47 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model.prop; + +import com.fasterxml.jackson.databind.JsonNode; + +import java.util.logging.Logger; + +/** + * Parse Collector json properties. + */ +public class Collector extends ModelElement { + private static final Logger logger = Logger.getLogger(Collector.class.getName()); + + /** + * Parse Collector given json node. + * + * @param modelBpmn + * @param modelJson + */ + public Collector(ModelProperties modelProp, ModelBpmn modelBpmn, JsonNode modelJson) { + super(TYPE_COLLECTOR, modelProp, modelBpmn, modelJson); + topicPublishes = getValueByName("topicPublishes"); + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/prop/Global.java b/src/main/java/org/onap/clamp/clds/model/prop/Global.java new file mode 100644 index 00000000..f8986b36 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/prop/Global.java @@ -0,0 +1,113 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model.prop; + +import com.fasterxml.jackson.databind.JsonNode; + +import java.util.List; +import java.util.logging.Logger; + +/** + * Parse global json properties. + * <p> + * Example json: "global":[{"name":"service","value":["vUSP"]},{"name":"vnf","value":["vCTS","v3CDB"]},{"name":"location","value":["san_diego","san_antonio","kansas_city","kings_mountain","Secaucus","lisle","concord","houston","akron"]}] + */ +public class Global { + private static final Logger logger = Logger.getLogger(Global.class.getName()); + + private String service; + private List<String> resourceVf; + private List<String> resourceVfc; + private List<String> location; + + /** + * Parse global given json node. + * + * @param modelJson + */ + public Global(JsonNode modelJson) { + JsonNode globalNode = modelJson.get("global"); + service = ModelElement.getValueByName(globalNode, "service"); + resourceVf = ModelElement.getValuesByName(globalNode, "vf"); + resourceVfc = ModelElement.getValuesByName(globalNode, "vfc"); + location = ModelElement.getValuesByName(globalNode, "location"); + } + + /** + * @return the service + */ + public String getService() { + return service; + } + + /** + * @param service the service to set + */ + public void setService(String service) { + this.service = service; + } + + /** + * @return the resourceVf + */ + public List<String> getResourceVf() { + return resourceVf; + } + + /** + * @param resourceVf the resourceVf to set + */ + public void setResourceVf(List<String> resourceVf) { + this.resourceVf = resourceVf; + } + + /** + * @return the resourceVfc + */ + public List<String> getResourceVfc() { + return resourceVfc; + } + + /** + * @param resourceVfc the resourceVfc to set + */ + public void setResourceVfc(List<String> resourceVfc) { + this.resourceVfc = resourceVfc; + } + + /** + * @return the location + */ + public List<String> getLocation() { + return location; + } + + /** + * @param location the location to set + */ + public void setLocation(List<String> location) { + this.location = location; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/prop/ModelBpmn.java b/src/main/java/org/onap/clamp/clds/model/prop/ModelBpmn.java new file mode 100644 index 00000000..b4cc11dc --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/prop/ModelBpmn.java @@ -0,0 +1,153 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model.prop; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + +import java.io.IOException; +import java.util.*; +import java.util.Map.Entry; +import java.util.logging.Logger; + +/** + * Parse Model BPMN properties. + * <p> + * Example json: {"collector":[{"id":"Collector_11r50j1", "from":"StartEvent_1"}],"stringMatch":[{"id":"StringMatch_0h6cbdv"}],"policy":[{"id":"Policy_0oxeocn", "from":"StringMatch_0h6cbdv"}]} + */ +public class ModelBpmn { + private static final Logger logger = Logger.getLogger(ModelBpmn.class.getName()); + + // for each type, an array of entries + private final Map<String, List<ModelBpmnEntry>> entriesByType = new HashMap<>(); + + // for each id, an array of entries + private final Map<String, List<ModelBpmnEntry>> entriesById = new HashMap<>(); + + // List of all elementIds + private List<String> bpmnElementIds; + + /** + * Create ModelBpmn and populate maps from json + * + * @param modelBpmnPropText + * @return + * @throws IOException + * @throws JsonMappingException + * @throws JsonParseException + */ + public static ModelBpmn create(String modelBpmnPropText) throws IOException { + ModelBpmn modelBpmn = new ModelBpmn(); + ObjectMapper objectMapper = new ObjectMapper(); + ObjectNode root = objectMapper.readValue(modelBpmnPropText, ObjectNode.class); + // iterate over each entry like: "collector":[{"id":"Collector_11r50j1","from":"StartEvent_1"}] + Iterator<Entry<String, JsonNode>> entryItr = root.fields(); + List<String> bpmnElementIdList = new ArrayList<>(); + while (entryItr.hasNext()) { + // process the entry + Entry<String, JsonNode> entry = entryItr.next(); + String type = entry.getKey(); + ArrayNode arrayNode = (ArrayNode) entry.getValue(); + // process each id/from object, like: {"id":"Collector_11r50j1","from":"StartEvent_1"} + for (JsonNode anArrayNode : arrayNode) { + ObjectNode node = (ObjectNode) anArrayNode; + String id = node.get("id").asText(); + String fromId = node.get("from").asText(); + ModelBpmnEntry modelBpmnEntry = new ModelBpmnEntry(type, id, fromId); + modelBpmn.addEntry(modelBpmnEntry); + bpmnElementIdList.add(id); + } + modelBpmn.setBpmnElementIds(bpmnElementIdList); + } + return modelBpmn; + } + + /** + * Add entry to both maps. + * + * @param entry + */ + private void addEntry(ModelBpmnEntry entry) { + addEntry(entriesByType, entry, entry.getType()); + addEntry(entriesById, entry, entry.getId()); + } + + /** + * Add an entry to provided map with provided key. + * + * @param map + * @param entry + * @param key + */ + private static void addEntry(Map<String, List<ModelBpmnEntry>> map, ModelBpmnEntry entry, String key) { + List<ModelBpmnEntry> list = map.computeIfAbsent(key, k -> new ArrayList<>()); + list.add(entry); + } + + /** + * + * + * @param type + * @return true if the element is found or false otherwise + */ + public boolean getModelElementFound(String type) { + return entriesByType.get(type) != null; + } + + /** + * @return the id field given the ModelElement type + */ + public String getId(String type) { + return entriesByType.get(type).get(0).getId(); + } + + /** + * @return the fromId field given the ModelElement type + */ + public String getFromId(String type) { + return entriesByType.get(type).get(0).getFromId(); + } + + /** + * @return the ModelElement type given the ModelElement id + */ + public String getType(String id) { + return entriesById.get(id).get(0).getType(); + } + + /** + * @return list of elementIds from bpmn + */ + public List<String> getBpmnElementIds() { + return bpmnElementIds; + } + + public void setBpmnElementIds(List<String> bpmnElementIds) { + this.bpmnElementIds = bpmnElementIds; + } +} diff --git a/src/main/java/org/onap/clamp/clds/model/prop/ModelBpmnEntry.java b/src/main/java/org/onap/clamp/clds/model/prop/ModelBpmnEntry.java new file mode 100644 index 00000000..8002f447 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/prop/ModelBpmnEntry.java @@ -0,0 +1,95 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model.prop; + +import java.util.logging.Logger; + +/** + * Model BPMN property entry + * <p> + * Example json: {"collector":[{"id":"Collector_11r50j1", "from":"StartEvent_1"}],"stringMatch":[{"id":"StringMatch_0h6cbdv"],"policy":[{"id":"Policy_0oxeocn", "from":"StringMatch_0h6cbdv"}]} + */ +public class ModelBpmnEntry { + private static final Logger logger = Logger.getLogger(ModelBpmnEntry.class.getName()); + + private String type; + private String id; + private String fromId; + + /** + * Parse the json so that the "id" and "from" fields can be retrieved on demand. + * + * @param type + * @param id + * @param fromId + */ + public ModelBpmnEntry(String type, String id, String fromId) { + this.type = type; + this.id = id; + this.fromId = fromId; + } + + /** + * @return the type + */ + public String getType() { + return type; + } + + /** + * @param type the type to set + */ + public void setType(String type) { + this.type = type; + } + + /** + * @return the id + */ + public String getId() { + return id; + } + + /** + * @param id the id to set + */ + public void setId(String id) { + this.id = id; + } + + /** + * @return the fromId + */ + public String getFromId() { + return fromId; + } + + /** + * @param fromId the fromId to set + */ + public void setFromId(String fromId) { + this.fromId = fromId; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/prop/ModelElement.java b/src/main/java/org/onap/clamp/clds/model/prop/ModelElement.java new file mode 100644 index 00000000..d8e90306 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/prop/ModelElement.java @@ -0,0 +1,232 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model.prop; + +import com.fasterxml.jackson.databind.JsonNode; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.logging.Logger; + +/** + * Provide base ModelElement functionality. + */ +public abstract class ModelElement { + private final static Logger sLOGGER = Logger.getLogger(ModelElement.class.getName()); + private static final Logger logger = Logger.getLogger(ModelElement.class.getName()); + + public static final String TYPE_COLLECTOR = "collector"; + public static final String TYPE_STRING_MATCH = "stringMatch"; + public static final String TYPE_POLICY = "policy"; + public static final String TYPE_TCA = "tca"; + + private final String type; + private final ModelBpmn modelBpmn; + private final String id; + protected String topicPublishes; + protected final JsonNode meNode; + private boolean isFound; + + private final ModelProperties modelProp; + + /** + * Perform base parsing of properties for a ModelElement (such as, + * Collector, StringMatch, Policy and Tca) + * + * @param type + * @param modelProp + * @param modelBpmn + * @param modelJson + */ + protected ModelElement(String type, ModelProperties modelProp, ModelBpmn modelBpmn, JsonNode modelJson) { + this.type = type; + this.modelProp = modelProp; + this.modelBpmn = modelBpmn; + this.id = modelBpmn.getId(type); + this.meNode = modelJson.get(id); + this.isFound = modelBpmn.getModelElementFound(type); + } + + /** + * topicSubscribes is the topicPublishes of the from Model Element + * + * @return the topicSubscribes + */ + public String getTopicSubscribes() { + // get fromId for this type + String fromId = modelBpmn.getFromId(type); + // find the type of the from model element + String fromType = modelBpmn.getType(fromId); + // get the model element for the type + ModelElement me = modelProp.getModelElementByType(fromType); + // get the topic publishes for the model element + return me.topicPublishes; + } + + /** + * @return the topicPublishes + */ + public String getTopicPublishes() { + return topicPublishes; + } + + /** + * Return the value field of the json node element that has a name field + * equals to the given name. + * + * @param nodeIn + * @param name + * @return + */ + public static String getValueByName(JsonNode nodeIn, String name) { + String value = null; + if (nodeIn != null) { + for (JsonNode node : nodeIn) { + if (node.path("name").asText().equals(name)) { + JsonNode vnode = node.path("value"); + if (vnode.isArray()) { + // if array, assume value is in first element + value = vnode.path(0).asText(); + } else { + // otherwise, just return text + value = vnode.asText(); + } + } + } + } + if (value == null || value.length() == 0) { + sLOGGER.warning(name + "=" + value); + } else { + sLOGGER.fine(name + "=" + value); + } + return value; + } + + /** + * Return the int value field of the json node element that has a name field + * equals to the given name. + * + * @param nodeIn + * @param name + * @return + */ + public static Integer getIntValueByName(JsonNode nodeIn, String name) { + String value = getValueByName(nodeIn, name); + return Integer.valueOf(value); + } + + /** + * Return an array of values for the field of the json node element that has + * a name field equals to the given name. + * + * @param nodeIn + * @param name + * @return + */ + public static List<String> getValuesByName(JsonNode nodeIn, String name) { + List<String> values = null; + if (nodeIn != null) { + Iterator<JsonNode> i = nodeIn.iterator(); + while (i.hasNext()) { + JsonNode node = i.next(); + if (node.path("name").asText().equals(name)) { + values = getValuesList(node); + } + } + } + if (values == null || values.size() == 0) { + sLOGGER.warning(name + "=" + values); + } else { + sLOGGER.fine(name + "=" + values); + } + return values; + } + + /** + * Return an array of String values. + * + * @param nodeIn + * @return + */ + public static List<String> getValuesList(JsonNode nodeIn) { + ArrayList<String> al = new ArrayList<>(); + if (nodeIn != null) { + Iterator<JsonNode> itr = nodeIn.path("value").elements(); + while (itr.hasNext()) { + JsonNode node = itr.next(); + al.add(node.asText()); + } + } + return al; + } + + /** + * Return the value field of the json node element that has a name field + * equals to the given name. + * + * @param name + * @return + */ + public String getValueByName(String name) { + return getValueByName(meNode, name); + } + + /** + * Return the int value field of the json node element that has a name field + * equals to the given name. + * + * @param name + * @return + */ + public Integer getIntValueByName(String name) { + return getIntValueByName(meNode, name); + } + + /** + * Return an array of values for the field of the json node element that has + * a name field equals to the given name. + * + * @param name + * @return + */ + public List<String> getValuesByName(String name) { + return getValuesByName(meNode, name); + } + + /** + * @return the id + */ + public String getId() { + return id; + } + + /** + * @return the isFound + */ + public boolean isFound() { + return isFound; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/prop/ModelProperties.java b/src/main/java/org/onap/clamp/clds/model/prop/ModelProperties.java new file mode 100644 index 00000000..014b8c77 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/prop/ModelProperties.java @@ -0,0 +1,320 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model.prop; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.onap.clamp.clds.model.CldsEvent; +import org.onap.clamp.clds.model.CldsModel; +import org.camunda.bpm.engine.delegate.DelegateExecution; + +import java.io.IOException; +import java.util.List; +import java.util.logging.Logger; + +/** + * Parse model properties. + */ +public class ModelProperties { + private static final Logger logger = Logger.getLogger(ModelProperties.class.getName()); + + private ModelBpmn modelBpmn; + private JsonNode modelJson; + + private final String modelName; + private final String controlName; + private final String actionCd; + + private Global global; + private Collector collector; + private StringMatch stringMatch; + private Policy policy; + private Tca tca; + + private String currentModelElementId; + private String policyUniqueId; + + /** + * Retain data required to parse the ModelElement objects. (Rather than + * parse them all - parse them on demand if requested.) + * + * @param modelName + * @param controlName + * @param actionCd + * @param modelBpmnPropText + * @param modelPropText + * @throws JsonProcessingException + * @throws IOException + */ + public ModelProperties(String modelName, String controlName, String actionCd, String modelBpmnPropText, String modelPropText) throws IOException { + this.modelName = modelName; + this.controlName = controlName; + this.actionCd = actionCd; + modelBpmn = ModelBpmn.create(modelBpmnPropText); + ObjectMapper mapper = new ObjectMapper(); + modelJson = mapper.readTree(modelPropText); + } + + /** + * Get the VF for a model. If return null if there is no VF. + * + * @param model + * @return + */ + public static String getVf(CldsModel model) { + List<String> vfs = null; + try { + ObjectMapper mapper = new ObjectMapper(); + JsonNode modelJson = mapper.readTree(model.getPropText()); + Global global = new Global(modelJson); + vfs = global.getResourceVf(); + } catch (IOException e) { + // VF is null + } + String vf = null; + if (vfs != null && !vfs.isEmpty()) { + vf = vfs.get(0); + } + return vf; + } + + /** + * Create ModelProperties for Camunda Delegate. + * + * @param execution + * @return + * @throws JsonProcessingException + * @throws IOException + */ + public static ModelProperties create(DelegateExecution execution) throws IOException { + String modelProp = (String) execution.getVariable("modelProp"); + String modelBpmnProp = (String) execution.getVariable("modelBpmnProp"); + String modelName = (String) execution.getVariable("modelName"); + String controlName = (String) execution.getVariable("controlName"); + String actionCd = (String) execution.getVariable("actionCd"); + + return new ModelProperties(modelName, controlName, actionCd, modelBpmnProp, modelProp); + } + + /** + * return appropriate model element given the type + * + * @param type + * @return + */ + public ModelElement getModelElementByType(String type) { + ModelElement me; + switch (type) { + case ModelElement.TYPE_COLLECTOR: + me = getCollector(); + break; + case ModelElement.TYPE_STRING_MATCH: + me = getStringMatch(); + break; + case ModelElement.TYPE_POLICY: + me = getPolicy(); + break; + case ModelElement.TYPE_TCA: + me = getTca(); + break; + default: + throw new IllegalArgumentException("Invalid ModelElement type: " + type); + } + return me; + } + + /** + * @return the modelName + */ + public String getModelName() { + return modelName; + } + + /** + * @return the controlName + */ + public String getControlName() { + return controlName; + } + + /** + * @return the controlNameAndPolicyUniqueId + */ + public String getControlNameAndPolicyUniqueId() { + return controlName + "_" + policyUniqueId; + } + + /** + * @return the currentPolicyName + */ + private String getCurrentPolicyName() { + return normalizePolicyScopeName(controlName + "_" + currentModelElementId); + } + + /** + * @return the currentPolicyScopeAndPolicyName + */ + public String getCurrentPolicyScopeAndPolicyName() { + return normalizePolicyScopeName(modelName + "." + getCurrentPolicyName()); + } + + /** + * @return the currentPolicyScopeAndFullPolicyName + */ + public String getCurrentPolicyScopeAndFullPolicyName(String policyNamePrefix) { + return normalizePolicyScopeName(modelName + "." + policyNamePrefix + getCurrentPolicyName()); + } + + /** + * @return the currentPolicyScopeAndFullPolicyNameWithVersion + */ + public String getCurrentPolicyScopeAndFullPolicyNameWithVersion(String policyNamePrefix, int version) { + return normalizePolicyScopeName( + modelName + "." + policyNamePrefix + getCurrentPolicyName() + "." + version + ".xml"); + } + + /** + * Replace all '-' with '_' within policy scope and name. + * + * @param inName + * @return + */ + private String normalizePolicyScopeName(String inName) { + return inName.replaceAll("-", "_"); + } + + /** + * @return the currentModelElementId + */ + public String getCurrentModelElementId() { + return currentModelElementId; + } + + /** + * When generating a policy request for a model element, must set the id of + * that model element using this method. Used to generate the policy name. + * + * @param currentModelElementId + * the currentModelElementId to set + */ + public void setCurrentModelElementId(String currentModelElementId) { + this.currentModelElementId = currentModelElementId; + } + + /** + * @return the policyUniqueId + */ + public String getPolicyUniqueId() { + return policyUniqueId; + } + + /** + * When generating a policy request for a model element, must set the unique + * id of that policy using this method. Used to generate the policy name. + * + * @param policyUniqueId + * the policyUniqueId to set + */ + public void setPolicyUniqueId(String policyUniqueId) { + this.policyUniqueId = policyUniqueId; + } + + /** + * @return the collector + */ + public Collector getCollector() { + if (collector == null) { + collector = new Collector(this, modelBpmn, modelJson); + } + return collector; + } + + /** + * @return the actionCd + */ + public String getActionCd() { + return actionCd; + } + + /** + * @return the isCreateRequest + */ + public boolean isCreateRequest() { + switch (actionCd) { + case CldsEvent.ACTION_SUBMIT: + case CldsEvent.ACTION_RESTART: + return true; + } + return false; + } + + public boolean isStopRequest() { + switch (actionCd) { + case CldsEvent.ACTION_STOP: + return true; + } + return false; + } + + /** + * @return the global + */ + public Global getGlobal() { + if (global == null) { + global = new Global(modelJson); + } + return global; + } + + /** + * @return the stringMatch + */ + public StringMatch getStringMatch() { + if (stringMatch == null) { + stringMatch = new StringMatch(this, modelBpmn, modelJson); + } + return stringMatch; + } + + /** + * @return the policy + */ + public Policy getPolicy() { + if (policy == null) { + policy = new Policy(this, modelBpmn, modelJson); + } + return policy; + } + + /** + * @return the tca + */ + public Tca getTca() { + if (tca == null) { + tca = new Tca(this, modelBpmn, modelJson); + } + return tca; + } +} diff --git a/src/main/java/org/onap/clamp/clds/model/prop/Policy.java b/src/main/java/org/onap/clamp/clds/model/prop/Policy.java new file mode 100644 index 00000000..729eb438 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/prop/Policy.java @@ -0,0 +1,78 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model.prop; + +import com.fasterxml.jackson.databind.JsonNode; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.logging.Logger; + +/** + * Parse Policy json properties. + * <p> + * Example json: "Policy_005sny1":[[{"name":"timeout","value":"5"}],{"policyConfigurations":[[{"name":"recipe","value":["restart"]},{"name":"maxRetries","value":["3"]},{"name":"retryTimeLimit","value":["180"]},{"name":"_id","value":["vf3RtPi"]},{"name":"location","value":["san_diego"]},{"name":"resource","value":["vCTS"]},{"name":"onMaxRetriesLimit","value":[""]},{"name":"onTimeLimit","value":[""]},{"name":"onOtherFailure","value":[""]},{"name":"policy_parent","value":[""]}],[{"name":"recipe","value":["rebuild"]},{"name":"maxRetries","value":["3"]},{"name":"retryTimeLimit","value":["180"]},{"name":"_id","value":["89z8Ncl"]},{"name":"location","value":["san_diego"]},{"name":"resource","value":["vCTS"]},{"name":"onMaxRetriesLimit","value":[""]},{"name":"onTimeLimit","value":[""]},{"name":"onOtherFailure","value":[""]},{"name":"policy_parent","value":["vf3RtPi"]}]]}] + */ +public class Policy extends ModelElement { + private static final Logger logger = Logger.getLogger(Policy.class.getName()); + + private final Integer timeout; + private final List<PolicyItem> policyItems; + + /** + * Parse Policy given json node. + * + * @param modelProp + * @param modelBpmn + * @param modelJson + */ + public Policy(ModelProperties modelProp, ModelBpmn modelBpmn, JsonNode modelJson) { + super(TYPE_POLICY, modelProp, modelBpmn, modelJson); + timeout = getIntValueByName(meNode.get(0), "timeout"); + + // process policies + JsonNode policyNode = meNode.get(1).get("policyConfigurations"); + Iterator<JsonNode> itr = policyNode.elements(); + policyItems = new ArrayList<>(); + while (itr.hasNext()) { + policyItems.add(new PolicyItem(itr.next())); + } + } + + /** + * @return the timeout + */ + public Integer getTimeout() { + return timeout; + } + + /** + * @return the policyItems + */ + public List<PolicyItem> getPolicyItems() { + return policyItems; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/prop/PolicyItem.java b/src/main/java/org/onap/clamp/clds/model/prop/PolicyItem.java new file mode 100644 index 00000000..a943f184 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/prop/PolicyItem.java @@ -0,0 +1,103 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model.prop; + +import com.fasterxml.jackson.databind.JsonNode; + +import java.util.List; +import java.util.logging.Logger; + +/** + * Parse policyConfigurations from Policy json properties. + * <p> + * Example json: "Policy_005sny1":[[{"name":"timeout","value":"5"}],{"policyConfigurations":[[{"name":"recipe","value":["restart"]},{"name":"maxRetries","value":["3"]},{"name":"retryTimeLimit","value":["180"]},{"name":"_id","value":["vf3RtPi"]},{"name":"location","value":["san_diego"]},{"name":"resource","value":["vCTS"]},{"name":"onMaxRetriesLimit","value":[""]},{"name":"onTimeLimit","value":[""]},{"name":"onOtherFailure","value":[""]},{"name":"policy_parent","value":[""]}],[{"name":"recipe","value":["rebuild"]},{"name":"maxRetries","value":["3"]},{"name":"retryTimeLimit","value":["180"]},{"name":"_id","value":["89z8Ncl"]},{"name":"location","value":["san_diego"]},{"name":"resource","value":["vCTS"]},{"name":"onMaxRetriesLimit","value":[""]},{"name":"onTimeLimit","value":[""]},{"name":"onOtherFailure","value":[""]},{"name":"policy_parent","value":["vf3RtPi"]}]]}] + */ +public class PolicyItem { + private static final Logger logger = Logger.getLogger(Policy.class.getName()); + + private final String id; + private final String recipe; + private final int maxRetries; + private final int retryTimeLimit; + private final String parentPolicy; + private final List<String> parentPolicyConditions; + + /** + * Parse Policy given json node. + * + * @param node + */ + public PolicyItem(JsonNode node) { + id = ModelElement.getValueByName(node, "_id"); + recipe = ModelElement.getValueByName(node, "recipe"); + maxRetries = ModelElement.getIntValueByName(node, "maxRetries"); + retryTimeLimit = ModelElement.getIntValueByName(node, "retryTimeLimit"); + parentPolicy = ModelElement.getValueByName(node, "parentPolicy"); + parentPolicyConditions = ModelElement.getValuesByName(node, "parentPolicyConditions"); + + } + + /** + * @return the id + */ + public String getId() { + return id; + } + + /** + * @return the recipe + */ + public String getRecipe() { + return recipe; + } + + /** + * @return the maxRetries + */ + public int getMaxRetries() { + return maxRetries; + } + + /** + * @return the retryTimeLimit + */ + public int getRetryTimeLimit() { + return retryTimeLimit; + } + + /** + * @return the parentPolicy + */ + public String getParentPolicy() { + return parentPolicy; + } + + /** + * @return the parentPolicyConditions + */ + public List<String> getParentPolicyConditions() { + return parentPolicyConditions; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/prop/ServiceConfiguration.java b/src/main/java/org/onap/clamp/clds/model/prop/ServiceConfiguration.java new file mode 100644 index 00000000..498f852e --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/prop/ServiceConfiguration.java @@ -0,0 +1,156 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model.prop; + +import com.fasterxml.jackson.databind.JsonNode; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; + +/** + * Parse serviceConfigurations from StringMatch json properties. + * <p> + * Example json: "StringMatch_0c2cy0c":[[{"name":"topicPublishes","value":"DCAE-CL-EVENT"}],{"serviceConfigurations":[[{"name":"aaiMatchingFields","value":["VMID"]},{"name":"aaiSendFields","value":["VNFNAME","LOCID"]},{"name":"vnf","value":["aSBG"]},{"name":"timeWindow","value":["0"]},{"name":"ageLimit","value":["1600"]},{"name":"createClosedLoopEventId","value":["Initial"]},{"name":"outputEventName","value":["OnSet"]},{"stringSet":[{"name":"alarmCondition","value":["authenticationFailure"]},{"name":"eventSeverity","value":["NORMAL"]},{"name":"eventSourceType","value":["f5BigIP"]}]}],[{"name":"aaiMatchingFields","value":["VMID"]},{"name":"aaiSendFields","value":["VMID","Identiy","VNFNAME"]},{"name":"vnf","value":["aSBG"]},{"name":"timeWindow","value":["0"]},{"name":"ageLimit","value":["1600"]},{"name":"createClosedLoopEventId","value":["Close"]},{"name":"outputEventName","value":["Abatement"]},{"stringSet":[{"name":"alarmCondition","value":["authenticationFailure"]},{"name":"eventSeverity","value":["NORMAL"]},{"name":"eventSourceType","value":["f5BigIP"]}]}]]}] + */ +public class ServiceConfiguration { + + private static final Logger logger = Logger.getLogger(ServiceConfiguration.class.getName()); + + private final List<String> aaiMatchingFields; + private final List<String> aaiSendFields; + private final String groupNumber; + private final List<String> resourceVf; + private final List<String> resourceVfc; + private final String timeWindow; + private final String ageLimit; + private final String createClosedLoopEventId; + private final String outputEventName; + private final Map<String, String> stringSet; + + /** + * Parse serviceConfigurations given json node. + * + * @param node + */ + public ServiceConfiguration(JsonNode node) { + aaiMatchingFields = ModelElement.getValuesByName(node, "aaiMatchingFields"); + aaiSendFields = ModelElement.getValuesByName(node, "aaiSendFields"); + groupNumber = ModelElement.getValueByName(node, "groupNumber"); + resourceVf = ModelElement.getValuesByName(node, "vf"); + resourceVfc = ModelElement.getValuesByName(node, "vfc"); + timeWindow = ModelElement.getValueByName(node, "timeWindow"); + ageLimit = ModelElement.getValueByName(node, "ageLimit"); + createClosedLoopEventId = ModelElement.getValueByName(node, "createClosedLoopEventId"); + outputEventName = ModelElement.getValueByName(node, "outputEventName"); + + // process the stringSet fields + JsonNode ssNodes = node.findPath("stringSet"); + Iterator<JsonNode> itr = ssNodes.elements(); + stringSet = new HashMap<>(); + while (itr.hasNext()) { + JsonNode ssNode = itr.next(); + String key = ssNode.path("name").asText(); + String value = ssNode.path("value").path(0).asText(); + if (key.length() != 0 && value.length() != 0) { + // only add string set field if not null + logger.fine("stringSet: " + key + "=" + value); + stringSet.put(key, value); + } + } + } + + /** + * @return the aaiMatchingFields + */ + public List<String> getaaiMatchingFields() { + return aaiMatchingFields; + } + + /** + * @return the aaiSendFields + */ + public List<String> getaaiSendFields() { + return aaiSendFields; + } + + /** + * @return the groupNumber + */ + public String getGroupNumber() { + return groupNumber; + } + + /** + * @return the resourceVf + */ + public List<String> getResourceVf() { + return resourceVf; + } + + /** + * @return the resourceVfc + */ + public List<String> getResourceVfc() { + return resourceVfc; + } + + /** + * @return the timeWindow + */ + public String getTimeWindow() { + return timeWindow; + } + + /** + * @return the ageLimit + */ + public String getAgeLimit() { + return ageLimit; + } + + /** + * @return the createClosedLoopEventId + */ + public String getCreateClosedLoopEventId() { + return createClosedLoopEventId; + } + + /** + * @return the outputEventName + */ + public String getOutputEventName() { + return outputEventName; + } + + /** + * @return the stringSet + */ + public Map<String, String> getStringSet() { + return stringSet; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/prop/StringMatch.java b/src/main/java/org/onap/clamp/clds/model/prop/StringMatch.java new file mode 100644 index 00000000..d7092c4e --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/prop/StringMatch.java @@ -0,0 +1,70 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model.prop; + +import com.fasterxml.jackson.databind.JsonNode; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.logging.Logger; + +/** + * Parse StringMatch json properties. + * <p> + * Example json: "StringMatch_0c2cy0c":[[{"name":"topicPublishes","value":"DCAE-CL-EVENT"}],{"serviceConfigurations":[[{"name":"aaiMatchingFields","value":["VMID"]},{"name":"aaiSendFields","value":["VNFNAME","LOCID"]},{"name":"vnf","value":["aSBG"]},{"name":"timeWindow","value":["0"]},{"name":"ageLimit","value":["1600"]},{"name":"createClosedLoopEventId","value":["Initial"]},{"name":"outputEventName","value":["OnSet"]},{"stringSet":[{"name":"alarmCondition","value":["authenticationFailure"]},{"name":"eventSeverity","value":["NORMAL"]},{"name":"eventSourceType","value":["f5BigIP"]}]}],[{"name":"aaiMatchingFields","value":["VMID"]},{"name":"aaiSendFields","value":["VMID","Identiy","VNFNAME"]},{"name":"vnf","value":["aSBG"]},{"name":"timeWindow","value":["0"]},{"name":"ageLimit","value":["1600"]},{"name":"createClosedLoopEventId","value":["Close"]},{"name":"outputEventName","value":["Abatement"]},{"stringSet":[{"name":"alarmCondition","value":["authenticationFailure"]},{"name":"eventSeverity","value":["NORMAL"]},{"name":"eventSourceType","value":["f5BigIP"]}]}]]}] + */ +public class StringMatch extends ModelElement { + private static final Logger logger = Logger.getLogger(StringMatch.class.getName()); + + private final List<ServiceConfiguration> serviceConfigurations; + + /** + * Parse StringMatch given json node. + * + * @param modelBpmn + * @param modelJson + */ + public StringMatch(ModelProperties modelProp, ModelBpmn modelBpmn, JsonNode modelJson) { + super(ModelElement.TYPE_STRING_MATCH, modelProp, modelBpmn, modelJson); + + topicPublishes = getValueByName(meNode.get(0), "topicPublishes"); + + // process Server_Configurations + JsonNode serviceConfigurationsNode = meNode.get(1).get("serviceConfigurations"); + Iterator<JsonNode> itr = serviceConfigurationsNode.elements(); + serviceConfigurations = new ArrayList<>(); + while (itr.hasNext()) { + serviceConfigurations.add(new ServiceConfiguration(itr.next())); + } + } + + /** + * @return the serviceConfigurations + */ + public List<ServiceConfiguration> getServiceConfigurations() { + return serviceConfigurations; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/prop/Tca.java b/src/main/java/org/onap/clamp/clds/model/prop/Tca.java new file mode 100644 index 00000000..c7b23608 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/prop/Tca.java @@ -0,0 +1,47 @@ +package org.onap.clamp.clds.model.prop; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.logging.Logger; + +import com.fasterxml.jackson.databind.JsonNode; + +/** + * Parse Tca json properties. + * + * Example json: {"TCA_0lm6cix":{"Narra":[{"name":"tname","value":"Narra"},{"name":"tcaEnab","value":"on"},{"name":"tcaPol","value":"Polcicy1"},{"name":"tcaPolId","value":"1"},{"name":"tcaInt","value":"1"},{"name":"tcaSev","value":"Critical"},{"name":"tcaVio","value":"1"},{"serviceConfigurations":[["FIELDPATH_test_1",">","4"],["FIELDPATH_test_1","=","5"]]}],"Srini":[{"name":"tname","value":"Srini"},{"name":"tcaEnab","value":"on"},{"name":"tcaPol","value":"Policy1"},{"name":"tcaPolId","value":"1"},{"name":"tcaInt","value":"1"},{"name":"tcaSev","value":"Major"},{"name":"tcaVio","value":"1"},{"serviceConfigurations":[["FIELDPATH_test_2","=","3"],["FIELDPATH_test_1",">","2"]]}]}} + * + * + */ +public class Tca extends ModelElement { + + private static final Logger logger = Logger.getLogger(StringMatch.class.getName()); + + private List<TcaItem> tcaItems; + + /** + * Parse Tca given json node + * + * @param modelProp + * @param modelBpmn + * @param modelJson + */ + public Tca(ModelProperties modelProp, ModelBpmn modelBpmn, JsonNode modelJson) { + super(ModelElement.TYPE_TCA, modelProp, modelBpmn, modelJson); + + // process Server_Configurations + if(meNode != null){ + Iterator<JsonNode> itr = meNode.elements(); + tcaItems = new ArrayList<TcaItem>(); + while(itr.hasNext()) { + tcaItems.add(new TcaItem(itr.next())); + } + } + } + + public List<TcaItem> getTcaItems() { + return tcaItems; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/prop/TcaItem.java b/src/main/java/org/onap/clamp/clds/model/prop/TcaItem.java new file mode 100644 index 00000000..5792c057 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/prop/TcaItem.java @@ -0,0 +1,128 @@ +package org.onap.clamp.clds.model.prop; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.logging.Logger; + +import com.fasterxml.jackson.databind.JsonNode; + +/** + * Parse Tca Item json properties. + * + * Example json: {"TCA_0lm6cix":{"Narra":[{"name":"tname","value":"Narra"},{"name":"tcaEnab","value":"on"},{"name":"tcaPol","value":"Polcicy1"},{"name":"tcaPolId","value":"1"},{"name":"tcaInt","value":"1"},{"name":"tcaSev","value":"Critical"},{"name":"tcaVio","value":"1"},{"serviceConfigurations":[["FIELDPATH_test_1",">","4"],["FIELDPATH_test_1","=","5"]]}],"Srini":[{"name":"tname","value":"Srini"},{"name":"tcaEnab","value":"on"},{"name":"tcaPol","value":"Policy1"},{"name":"tcaPolId","value":"1"},{"name":"tcaInt","value":"1"},{"name":"tcaSev","value":"Major"},{"name":"tcaVio","value":"1"},{"serviceConfigurations":[["FIELDPATH_test_2","=","3"],["FIELDPATH_test_1",">","2"]]}]}} + * + * + */ +public class TcaItem { + + private static final Logger logger = Logger.getLogger(TcaItem.class.getName()); + + private String tcaName; + private String tcaUuId; + private String nfNamingCode; + private String tcaEnable; + private String policyId; + private Integer interval; + private String severity; + private Integer violations; + private List<TcaThreshhold> tcaThreshholds; + + /** + * Parse Tca Item given json node + * + * @param node + */ + public TcaItem(JsonNode node) { + + tcaName = ModelElement.getValueByName(node, "tname"); + tcaUuId = ModelElement.getValueByName(node, "tuuid"); + nfNamingCode = ModelElement.getValueByName(node, "tnfc"); + tcaEnable = ModelElement.getValueByName(node, "tcaEnab"); + policyId = ModelElement.getValueByName(node, "tcaPolId"); + if(ModelElement.getValueByName(node, "tcaInt") != null){ + interval = Integer.valueOf(ModelElement.getValueByName(node, "tcaInt")); + } + severity = ModelElement.getValueByName(node, "tcaSev"); + if(ModelElement.getValueByName(node, "tcaVio") != null){ + violations = Integer.valueOf(ModelElement.getValueByName(node, "tcaVio")); + } + + // process service Configurations + JsonNode serviceConfigurationsNode = node.get(node.size() - 1).get("serviceConfigurations"); + Iterator<JsonNode> itr = serviceConfigurationsNode.elements(); + tcaThreshholds = new ArrayList<TcaThreshhold>(); + while(itr.hasNext()) { + tcaThreshholds.add(new TcaThreshhold(itr.next())); + } + } + + public String getTcaName() { + return tcaName; + } + + public void setTcaName(String tcaName) { + this.tcaName = tcaName; + } + + public String getTcaUuId() { + return tcaUuId; + } + + public void setTcaUuId(String tcaUuId) { + this.tcaUuId = tcaUuId; + } + + public String getNfNamingCode() { + return nfNamingCode; + } + + public void setNfNamingCode(String nfNamingCode) { + this.nfNamingCode = nfNamingCode; + } + + public String getTcaEnable() { + return tcaEnable; + } + + public void setTcaEnable(String tcaEnable) { + this.tcaEnable = tcaEnable; + } + + public String getPolicyId() { + return policyId; + } + + public void setPolicyId(String policyId) { + this.policyId = policyId; + } + + public Integer getInterval() { + return interval; + } + + public void setInterval(Integer interval) { + this.interval = interval; + } + + public String getSeverity() { + return severity; + } + + public void setSeverity(String severity) { + this.severity = severity; + } + + public Integer getViolations() { + return violations; + } + + public void setViolations(Integer violations) { + this.violations = violations; + } + + public List<TcaThreshhold> getTcaThreshholds() { + return tcaThreshholds; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/prop/TcaThreshhold.java b/src/main/java/org/onap/clamp/clds/model/prop/TcaThreshhold.java new file mode 100644 index 00000000..47f2c6fd --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/prop/TcaThreshhold.java @@ -0,0 +1,76 @@ +package org.onap.clamp.clds.model.prop; + +import java.util.logging.Logger; + +import com.fasterxml.jackson.databind.JsonNode; + +/** + * Parse Tca Threshhold json properties. + * + * Example json: {"TCA_0lm6cix":{"Narra":[{"name":"tname","value":"Narra"},{"name":"tcaEnab","value":"on"},{"name":"tcaPol","value":"Polcicy1"},{"name":"tcaPolId","value":"1"},{"name":"tcaInt","value":"1"},{"name":"tcaSev","value":"Critical"},{"name":"tcaVio","value":"1"},{"serviceConfigurations":[["FIELDPATH_test_1",">","4"],["FIELDPATH_test_1","=","5"]]}],"Srini":[{"name":"tname","value":"Srini"},{"name":"tcaEnab","value":"on"},{"name":"tcaPol","value":"Policy1"},{"name":"tcaPolId","value":"1"},{"name":"tcaInt","value":"1"},{"name":"tcaSev","value":"Major"},{"name":"tcaVio","value":"1"},{"serviceConfigurations":[["FIELDPATH_test_2","=","3"],["FIELDPATH_test_1",">","2"]]}]}} + * + * + */ +public class TcaThreshhold { + + private static final Logger logger = Logger.getLogger(TcaThreshhold.class.getName()); + + private String metric; + private String fieldPath; + private String operator; + private Integer threshhold; + + /** + * Parse Tca Threshhold given json node + * + * @param node + */ + public TcaThreshhold(JsonNode node) { + + if(node.get(0) != null){ + metric = node.get(0).asText(); + } + if(node.get(1) != null){ + operator = node.get(1).asText(); + } + if(node.get(2) != null){ + threshhold = Integer.valueOf(node.get(2).asText()); + } + if(node.get(3) != null){ + fieldPath = node.get(3).asText(); + } + } + + public String getMetric() { + return metric; + } + + public void setMetric(String metric) { + this.metric = metric; + } + + public String getFieldPath() { + return fieldPath; + } + + public void setFieldPath(String fieldPath) { + this.fieldPath = fieldPath; + } + + public String getOperator() { + return operator; + } + + public void setOperator(String operator) { + this.operator = operator; + } + + public Integer getThreshhold() { + return threshhold; + } + + public void setThreshhold(Integer threshhold) { + this.threshhold = threshhold; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/model/refprop/RefProp.java b/src/main/java/org/onap/clamp/clds/model/refprop/RefProp.java new file mode 100644 index 00000000..c81b6a77 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/model/refprop/RefProp.java @@ -0,0 +1,139 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.model.refprop; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationContext; +import org.springframework.core.io.Resource; + +import javax.annotation.PostConstruct; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Properties; +import java.util.logging.Logger; + +/** + * Holds reference properties. + */ +public class RefProp { + private static final Logger logger = Logger.getLogger(RefProp.class.getName()); + + @Autowired + private ApplicationContext appContext; + + private Properties prop; + + @Value("${org.onap.clamp.config.files.cldsReference:'classpath:/clds/clds-reference.properties'}") + private String cldsReferenceValuesFile; + + /** + * Load reference properties via null constructor + * + * @throws IOException + */ + public RefProp() throws IOException { + } + + @PostConstruct + public void loadConfig () throws IOException { + prop = new Properties(); + Resource resource = appContext.getResource(cldsReferenceValuesFile); + prop.load(resource.getInputStream()); + } + + /** + * get property value + * + * @param key + * @return + */ + public String getStringValue(String key) { + return prop.getProperty(key); + } + + /** + * get property value for a combo key (key1 + "." + key2). If not found just use key1. + * + * @param key1 + * @param key2 + * @return + */ + public String getStringValue(String key1, String key2) { + String value = getStringValue(key1 + "." + key2); + if (value == null || value.length() == 0) { + value = getStringValue(key1); + } + return value; + } + + /** + * Return json as objects that can be updated + * + * @param key + * @return + * @throws IOException + */ + public JsonNode getJsonTemplate(String key) throws IOException { + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.readValue(getStringValue(key), JsonNode.class); + } + + /** + * Return json as objects that can be updated. First try with combo key (key1 + "." + key2), otherwise default to just key1. + * + * @param key1 + * @param key2 + * @return + * @throws IOException + */ + public JsonNode getJsonTemplate(String key1, String key2) throws IOException { + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.readValue(getStringValue(key1, key2), JsonNode.class); + } + + /** + * Get list of values for a property field containing json and a field/keyword within that json. + * + * @param fieldName + * @param value + * @return + * @throws IOException + */ + public List<String> decodeToList(String fieldName, String value) throws IOException { + JsonNode decode = getJsonTemplate(fieldName); + Iterator<JsonNode> itr = decode.path(value).elements(); + ArrayList<String> al = new ArrayList<>(); + while (itr.hasNext()) { + JsonNode node = itr.next(); + al.add(node.asText()); + } + return al; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/service/CldsService.java b/src/main/java/org/onap/clamp/clds/service/CldsService.java new file mode 100644 index 00000000..a0aadccb --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/service/CldsService.java @@ -0,0 +1,646 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.service; + +import com.att.ajsc.common.AjscService; +import com.att.ajsc.filemonitor.AJSCPropertiesMap; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.onap.clamp.clds.client.SdcCatalogServices; +import org.onap.clamp.clds.dao.CldsDao; +import org.onap.clamp.clds.model.prop.ModelProperties; +import org.onap.clamp.clds.model.refprop.RefProp; +import org.onap.clamp.clds.transform.XslTransformer; +import org.apache.commons.lang3.StringUtils; +import org.camunda.bpm.engine.RuntimeService; +import org.camunda.bpm.engine.runtime.ProcessInstance; +import org.jboss.resteasy.spi.BadRequestException; +import org.onap.clamp.clds.model.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationContext; +import org.springframework.core.io.Resource; + +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +/** + * Service to save and retrieve the CLDS model attributes. + */ +@AjscService +@Path("/clds") +public class CldsService extends SecureServiceBase { + + @Autowired + private ApplicationContext appContext; + + private static final Logger logger = LoggerFactory.getLogger(CldsService.class); + + @Value("${CLDS_PERMISSION_TYPE_CL:org.onap.clamp.clds.cl}") + private static String CLDS_PERMISSION_TYPE_CL; + + @Value("${CLDS_PERMISSION_TYPE_CL_MANAGE:org.onap.clamp.clds.cl.manage}") + private static String CLDS_PERMISSION_TYPE_CL_MANAGE; + + @Value("${CLDS_PERMISSION_TYPE_CL_EVENT:/META-INF/securityFilterRules.json}") + private static String CLDS_PERMISSION_TYPE_CL_EVENT; + + @Value("${CLDS_PERMISSION_TYPE_FILTER_VF:/META-INF/securityFilterRules.json}") + private static String CLDS_PERMISSION_TYPE_FILTER_VF; + + @Value("${CLDS_PERMISSION_INSTANCE:/META-INF/securityFilterRules.json}") + private static String CLDS_PERMISSION_INSTANCE; + + private static final SecureServicePermission PERMISSION_READ_CL = SecureServicePermission.create(CLDS_PERMISSION_TYPE_CL, CLDS_PERMISSION_INSTANCE, "read"); + + private static final SecureServicePermission PERMISSION_UPDATE_CL = SecureServicePermission.create(CLDS_PERMISSION_TYPE_CL, CLDS_PERMISSION_INSTANCE, "update"); + + @Value("${org.onap.clamp.config.files.globalClds:classpath:/clds/globalClds.properties}") + private String globalClds; + private Properties globalCldsProperties; + + @Autowired + private CldsDao cldsDao; + @Autowired + private RuntimeService runtimeService; + @Autowired + private XslTransformer cldsBpmnTransformer; + + @Autowired + private RefProp refProp; + + @Autowired + private SdcCatalogServices asdcCatalogServices; + // + + public CldsService() { + } + + public CldsService(RefProp refProp) { + this.refProp = refProp; + } + + /** + * REST service that retrieves BPMN for a CLDS model name from the database. + * This is subset of the json getModel. + * This is only expected to be used for testing purposes, not by the UI. + * + * @param modelName + * @return bpmn xml text - content of bpmn given name + */ + @GET + @Path("/model/bpmn/{modelName}") + @Produces(MediaType.TEXT_XML) + public String getBpmnXml(@PathParam("modelName") String modelName) { + isAuthorized(PERMISSION_READ_CL); + logger.info("GET bpmnText for modelName={}", modelName); + CldsModel model = CldsModel.retrieve(cldsDao, modelName, false); + return model.getBpmnText(); + } + + /** + * REST service that saves BPMN for a CLDS model by name in the database. + * This is subset of the json putModel. + * This is only expected to be used for testing purposes, not by the UI. + * + * @param modelName + */ + @PUT + @Path("/model/bpmn/{modelName}") + @Consumes(MediaType.TEXT_XML) + public String putBpmnXml(@PathParam("modelName") String modelName, String bpmnText) { + isAuthorized(PERMISSION_UPDATE_CL); + logger.info("PUT bpmnText for modelName={}", modelName); + logger.info("PUT bpmnText={}", bpmnText); + CldsModel cldsModel = CldsModel.retrieve(cldsDao, modelName, true); + cldsModel.setBpmnText(bpmnText); + cldsModel.save(cldsDao, getUserid()); + return "wrote bpmnText for modelName=" + modelName; + } + + /** + * REST service that retrieves image for a CLDS model name from the database. + * This is subset of the json getModel. + * This is only expected to be used for testing purposes, not by the UI. + * + * @param modelName + * @return image xml text - content of image given name + */ + @GET + @Path("/model/image/{modelName}") + @Produces(MediaType.TEXT_XML) + public String getImageXml(@PathParam("modelName") String modelName) { + isAuthorized(PERMISSION_READ_CL); + logger.info("GET imageText for modelName={}", modelName); + CldsModel model = CldsModel.retrieve(cldsDao, modelName, false); + return model.getImageText(); + } + + /** + * REST service that saves image for a CLDS model by name in the database. + * This is subset of the json putModel. + * This is only expected to be used for testing purposes, not by the UI. + * + * @param modelName + */ + @PUT + @Path("/model/image/{modelName}") + @Consumes(MediaType.TEXT_XML) + public String putImageXml(@PathParam("modelName") String modelName, String imageText) { + isAuthorized(PERMISSION_UPDATE_CL); + logger.info("PUT iamgeText for modelName={}", modelName); + logger.info("PUT imageText={}", imageText); + CldsModel cldsModel = CldsModel.retrieve(cldsDao, modelName, true); + cldsModel.setImageText(imageText); + cldsModel.save(cldsDao, getUserid()); + return "wrote imageText for modelName=" + modelName; + } + + /** + * REST service that retrieves a CLDS model by name from the database. + * + * @param modelName + * @return clds model - clds model for the given model name + * @throws NotAuthorizedException + */ + @GET + @Path("/model/{modelName}") + @Produces(MediaType.APPLICATION_JSON) + public CldsModel getModel(@PathParam("modelName") String modelName) throws NotAuthorizedException { + isAuthorized(PERMISSION_READ_CL); + logger.debug("GET model for modelName={}", modelName); + CldsModel cldsModel = CldsModel.retrieve(cldsDao, modelName, false); + isAuthorizedForVf(cldsModel); + return cldsModel; + } + + /** + * REST service that saves a CLDS model by name in the database. + * + * @param modelName + * @throws TransformerException + * @throws TransformerConfigurationException + */ + @PUT + @Path("/model/{modelName}") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public CldsModel putModel(@PathParam("modelName") String modelName, CldsModel cldsModel) throws TransformerException { + isAuthorized(PERMISSION_UPDATE_CL); + isAuthorizedForVf(cldsModel); + logger.info("PUT model for modelName={}", modelName); + logger.info("PUT bpmnText={}", cldsModel.getBpmnText()); + logger.info("PUT propText={}", cldsModel.getPropText()); + logger.info("PUT imageText={}", cldsModel.getImageText()); + cldsModel.setName(modelName); + + if (cldsModel.getTemplateName() != null) { + CldsTemplate template = cldsDao.getTemplate(cldsModel.getTemplateName()); + if (template != null) { + cldsModel.setTemplateId(template.getId()); + cldsModel.setDocText(template.getPropText()); + cldsModel.setDocId(template.getPropId()); + } + } + cldsModel.save(cldsDao, getUserid()); + return cldsModel; + } + + /** + * REST service that retrieves a list of CLDS model names. + * + * @return model names in JSON + */ + @GET + @Path("/model-names") + @Produces(MediaType.APPLICATION_JSON) + public List<ValueItem> getModelNames() { +// isAuthorized(PERMISSION_READ_CL); + logger.info("GET list of model names"); + return cldsDao.getBpmnNames(); + } + + /** + * REST service that saves and processes an action for a CLDS model by name. + * + * @param action + * @param modelName + * @param test + * @param model + * @return + * @throws TransformerConfigurationException + * @throws TransformerException + * @throws IOException + * @throws JsonProcessingException + * @throws NotAuthorizedException + */ + @PUT + @Path("/action/{action}/{modelName}") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public CldsModel putModelAndProcessAction(@PathParam("action") String action, @PathParam("modelName") String modelName, @QueryParam("test") String test, CldsModel model) throws TransformerException, NotAuthorizedException, IOException { + String actionCd = action.toUpperCase(); + SecureServicePermission permisionManage = SecureServicePermission.create(CLDS_PERMISSION_TYPE_CL_MANAGE, CLDS_PERMISSION_INSTANCE, actionCd); + isAuthorized(permisionManage); + isAuthorizedForVf(model); + String userid = getUserid(); + String actionStateCd = CldsEvent.ACTION_STATE_INITIATED; + String processDefinitionKey = "clds-process-action-wf"; + + logger.info("PUT actionCd={}", actionCd); + logger.info("PUT actionStateCd={}", actionStateCd); + logger.info("PUT processDefinitionKey={}", processDefinitionKey); + logger.info("PUT modelName={}", modelName); + logger.info("PUT test={}", test); + logger.info("PUT bpmnText={}", model.getBpmnText()); + logger.info("PUT propText={}", model.getPropText()); + logger.info("PUT userid={}", userid); + + if (model.getTemplateName() != null) { + CldsTemplate template = cldsDao.getTemplate(model.getTemplateName()); + if (template != null) { + model.setTemplateId(template.getId()); + model.setDocText(template.getPropText()); + model.setDocId(template.getPropId()); + } + } + // save model to db + model.setName(modelName); + model.save(cldsDao, getUserid()); + + // get vars and format if necessary + String prop = model.getPropText(); + String bpmn = model.getBpmnText(); + String docText = model.getDocText(); + String controlName = model.getControlName(); + + String bpmnJson = cldsBpmnTransformer.doXslTransformToString(bpmn); + logger.info("PUT bpmnJson={}", bpmnJson); + + boolean isTest = false; + if (test != null && test.equalsIgnoreCase("true")) { + isTest = true; + } else { + // if action.test.override is true, then any action will be marked as test=true (even if incoming action request had test=false); otherwise, test flag will be unchanged on the action request + String actionTestOverride = refProp.getStringValue("action.test.override"); + if (actionTestOverride != null && actionTestOverride.equalsIgnoreCase("true")) { + logger.info("PUT actionTestOverride={}", actionTestOverride); + logger.info("PUT override test indicator and setting it to true"); + isTest = true; + } + } + logger.info("PUT isTest={}", isTest); + + + boolean isInsertTestEvent = false; + String insertTestEvent = refProp.getStringValue("action.insert.test.event"); + if (insertTestEvent != null && insertTestEvent.equalsIgnoreCase("true")) { + isInsertTestEvent = true; + } + logger.info("PUT isInsertTestEvent={}", isInsertTestEvent); + + + // determine if requested action is permitted + model.validateAction(actionCd); + + // input variables to camunda process + Map<String, Object> variables = new HashMap<>(); + variables.put("actionCd", actionCd); + variables.put("modelProp", prop); + variables.put("modelBpmnProp", bpmnJson); + variables.put("modelName", modelName); + variables.put("controlName", controlName); + variables.put("docText", docText); + variables.put("isTest", isTest); + variables.put("userid", userid); + variables.put("isInsertTestEvent", isInsertTestEvent); + + // start camunda process + ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefinitionKey, variables); + + // log process info + logger.info("Started processDefinitionId={}, processInstanceId={}", pi.getProcessDefinitionId(), pi.getProcessInstanceId()); + + // refresh model info from db (get fresh event info) + return CldsModel.retrieve(cldsDao, modelName, false); + } + + /** + * REST service that accepts events for a model. + * + * @param test + * @param dcaeEvent + * @throws BadRequestException + */ + @POST + @Path("/dcae/event") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public String postDcaeEvent(@QueryParam("test") String test, DcaeEvent dcaeEvent) throws BadRequestException { + String userid = null; + // TODO: allow auth checking to be turned off by removing the permission type property + if (CLDS_PERMISSION_TYPE_CL_EVENT != null && CLDS_PERMISSION_TYPE_CL_EVENT.length() > 0) { + SecureServicePermission permissionEvent = SecureServicePermission.create(CLDS_PERMISSION_TYPE_CL_EVENT, CLDS_PERMISSION_INSTANCE, dcaeEvent.getEvent()); + isAuthorized(permissionEvent); + userid = getUserid(); + } + + boolean isTest = false; + if (test != null && test.equalsIgnoreCase("true")) { + isTest = true; + } + + int instanceCount = 0; + if (dcaeEvent.getInstances() != null) { + instanceCount = dcaeEvent.getInstances().size(); + } + String msgInfo = "event=" + dcaeEvent.getEvent() + " serviceUUID=" + dcaeEvent.getServiceUUID() + " resourceUUID=" + dcaeEvent.getResourceUUID() + " artifactName=" + dcaeEvent.getArtifactName() + " instance count=" + instanceCount + " isTest=" + isTest; + logger.info("POST dcae event {}", msgInfo); + + if (isTest) { + logger.warn("Ignorning test event from DCAE"); + } else { + if (DcaeEvent.EVENT_DEPLOYMENT.equalsIgnoreCase(dcaeEvent.getEvent())) { + CldsModel.insertModelInstance(cldsDao, dcaeEvent, userid); + } else { + CldsEvent.insEvent(cldsDao, dcaeEvent.getControlName(), userid, dcaeEvent.getCldsActionCd(), CldsEvent.ACTION_STATE_RECEIVED, null); + } + // EVENT_UNDEPLOYMENT is defunct - DCAE Proxy will not undeploy individual instances. It will send an empty list of + // deployed instances to indicate all have been removed. Or it will send an updated list to indicate those that + // are still deployed with any not on the list considered undeployed. + //else if(DcaeEvent.EVENT_UNDEPLOYMENT.equalsIgnoreCase(dcaeEvent.getEvent())) + //{ + // CldsModel.removeModelInstance(cldsDao, dcaeEvent); + //} + } + + return msgInfo; + } + + /** + * REST service that retrieves asdc services + * + * @throws Exception + */ + @GET + @Path("/asdc/services") + @Produces(MediaType.APPLICATION_JSON) + public String getAsdcServices() throws Exception { + String retStr; + try { + String responseStr = asdcCatalogServices.getAsdcServicesInformation(null); + retStr = createUiServiceFormatJson(responseStr); + } catch (Exception e) { + logger.info("{} {}", e.getClass().getName(), e.getMessage()); + throw e; + } + logger.info("value of asdcServices : {}", retStr); + return retStr; + } + + /** + * REST service that retrieves total properties required by UI + * + * @throws Exception + */ + @GET + @Path("/properties") + @Produces(MediaType.APPLICATION_JSON) + public String getAsdcProperties() throws Exception { + return createPropertiesObjectByUUID(getGlobalCldsString(), "{}"); + } + + /** + * REST service that retrieves total properties by using invariantUUID based on refresh and non refresh + * + * @throws Exception + */ + @GET + @Path("/properties/{serviceInvariantUUID}") + @Produces(MediaType.APPLICATION_JSON) + public String getAsdcPropertiesByServiceUUIDForRefresh(@PathParam("serviceInvariantUUID") String serviceInvariantUUID, @DefaultValue("false") @QueryParam("refresh") String refresh) throws Exception { + CldsServiceData cldsServiceData = new CldsServiceData(); + cldsServiceData.setServiceInvariantUUID(serviceInvariantUUID); + + boolean isCldsAsdcDataExpired = true; + // To getcldsService information from database cache using invariantUUID only when refresh = false + if (refresh != null && refresh.equalsIgnoreCase("false")) { + cldsServiceData = cldsServiceData.getCldsServiceCache(cldsDao, serviceInvariantUUID); + // If cldsService is available in database Cache , verify is data expired or not + if (cldsServiceData != null) { + isCldsAsdcDataExpired = asdcCatalogServices.isCldsAsdcCacheDataExpired(cldsServiceData); + } + } + // If user Requested for refresh or database cache expired , get all data from asdc api. + if ((refresh != null && refresh.equalsIgnoreCase("true")) || isCldsAsdcDataExpired) { + cldsServiceData = asdcCatalogServices.getCldsServiceDataWithAlarmConditions(serviceInvariantUUID); + CldsDBServiceCache cldsDBServiceCache = asdcCatalogServices.getCldsDBServiceCacheUsingCldsServiceData(cldsServiceData); + if (cldsDBServiceCache != null && cldsDBServiceCache.getInvariantId() != null && cldsDBServiceCache.getServiceId() != null) { + cldsServiceData.setCldsServiceCache(cldsDao, cldsDBServiceCache); + } + } + + // filter out VFs the user is not authorized for + cldsServiceData.filterVfs(this); + + // format retrieved data into properties json + return asdcCatalogServices.createPropertiesObjectByUUID(getGlobalCldsString(), cldsServiceData); + } + + /** + * Determine if the user is authorized for a particular VF by its invariant UUID. + * + * @param vfInvariantUuid + * @throws NotAuthorizedException + * @return + */ + public boolean isAuthorizedForVf(String vfInvariantUuid) throws NotAuthorizedException { + if (CLDS_PERMISSION_TYPE_FILTER_VF != null && CLDS_PERMISSION_TYPE_FILTER_VF.length() > 0) { + SecureServicePermission permission = SecureServicePermission.create(CLDS_PERMISSION_TYPE_FILTER_VF, CLDS_PERMISSION_INSTANCE, vfInvariantUuid); + return isAuthorized(permission); + } else { + // if CLDS_PERMISSION_TYPE_FILTER_VF property is not provided, then VF filtering is turned off + logger.warn("VF filtering turned off"); + return true; + } + } + + /** + * Determine if the user is authorized for a particular VF by its invariant UUID. + * If not authorized, then NotAuthorizedException is thrown. + * + * @param model + * @return + */ + private boolean isAuthorizedForVf(CldsModel model) throws NotAuthorizedException { + String vf = ModelProperties.getVf(model); + if (vf == null || vf.length() == 0) { + logger.info("VF not found in model"); + return true; + } else { + return isAuthorizedForVf(vf); + } + } + + private String createUiServiceFormatJson(String responseStr) throws IOException { + if (StringUtils.isBlank(responseStr)) { + return ""; + } + ObjectMapper objectMapper = new ObjectMapper(); + List<CldsAsdcServiceInfo> rawList = objectMapper.readValue(responseStr, objectMapper.getTypeFactory().constructCollectionType(List.class, CldsAsdcServiceInfo.class)); + ObjectNode invariantIdServiceNode = objectMapper.createObjectNode(); + ObjectNode serviceNode = objectMapper.createObjectNode(); + logger.info("value of cldsserviceiNfolist: {}", rawList); + if (rawList != null && rawList.size() > 0) { + List<CldsAsdcServiceInfo> cldsAsdcServiceInfoList = asdcCatalogServices.removeDuplicateServices(rawList); + + for (CldsAsdcServiceInfo currCldsAsdcServiceInfo : cldsAsdcServiceInfoList) { + if (currCldsAsdcServiceInfo != null) { + invariantIdServiceNode.put(currCldsAsdcServiceInfo.getInvariantUUID(), currCldsAsdcServiceInfo.getName()); + } + } + serviceNode.putPOJO("service", invariantIdServiceNode); + } + return serviceNode.toString(); + } + + private String createPropertiesObjectByUUID(String globalProps, String cldsResponseStr) throws IOException { + ObjectMapper mapper = new ObjectMapper(); + CldsAsdcServiceDetail cldsAsdcServiceDetail = mapper.readValue(cldsResponseStr, CldsAsdcServiceDetail.class); + ObjectNode globalPropsJson = null; + if (cldsAsdcServiceDetail != null && cldsAsdcServiceDetail.getUuid() != null) { + /** + * to create json with vf, alarm and locations + */ + ObjectNode serviceObjectNode = createEmptyVfAlarmObject(mapper); + ObjectNode vfObjectNode = mapper.createObjectNode(); + + /** + * to create json with vf and vfresourceId + */ + createVfObjectNode(vfObjectNode, mapper, cldsAsdcServiceDetail.getResources()); + serviceObjectNode.putPOJO(cldsAsdcServiceDetail.getInvariantUUID(), vfObjectNode); + ObjectNode byServiceBasicObjetNode = mapper.createObjectNode(); + byServiceBasicObjetNode.putPOJO("byService", serviceObjectNode); + + /** + * to create json with VFC Node + */ + ObjectNode emptyvfcobjectNode = createByVFCObjectNode(mapper, cldsAsdcServiceDetail.getResources()); + byServiceBasicObjetNode.putPOJO("byVf", emptyvfcobjectNode); + globalPropsJson = (ObjectNode) mapper.readValue(globalProps, JsonNode.class); + globalPropsJson.putPOJO("shared", byServiceBasicObjetNode); + logger.info("valuie of objNode: {}", globalPropsJson); + } else { + /** + * to create json with total properties when no serviceUUID passed + */ + globalPropsJson = (ObjectNode) mapper.readValue(globalProps, JsonNode.class); + } + return globalPropsJson.toString(); + } + + private ObjectNode createEmptyVfAlarmObject(ObjectMapper mapper) { + ObjectNode emptyObjectNode = mapper.createObjectNode(); + emptyObjectNode.put("", ""); + ObjectNode vfObjectNode = mapper.createObjectNode(); + vfObjectNode.putPOJO("vf", emptyObjectNode); + vfObjectNode.putPOJO("location", emptyObjectNode); + vfObjectNode.putPOJO("alarmCondition", emptyObjectNode); + ObjectNode emptyServiceObjectNode = mapper.createObjectNode(); + emptyServiceObjectNode.putPOJO("", vfObjectNode); + return emptyServiceObjectNode; + } + + private void createVfObjectNode(ObjectNode vfObjectNode2, ObjectMapper mapper, List<CldsAsdcResource> rawCldsAsdcResourceList) throws IOException { + ObjectNode vfNode = mapper.createObjectNode(); + vfNode.put("", ""); + + // To remove repeated resource instance name from resourceInstanceList + List<CldsAsdcResource> cldsAsdcResourceList = asdcCatalogServices.removeDuplicateAsdcResourceInstances(rawCldsAsdcResourceList); + /** + * Creating vf resource node using cldsAsdcResource Object + */ + if (cldsAsdcResourceList != null && cldsAsdcResourceList.size() > 0) { + for (CldsAsdcResource cldsAsdcResource : cldsAsdcResourceList) { + if (cldsAsdcResource != null && cldsAsdcResource.getResoucreType() != null && cldsAsdcResource.getResoucreType().equalsIgnoreCase("VF")) { + vfNode.put(cldsAsdcResource.getResourceUUID(), cldsAsdcResource.getResourceName()); + } + } + } + vfObjectNode2.putPOJO("vf", vfNode); + String locationStringValue = refProp.getStringValue("ui.location.default"); + String alarmStringValue = refProp.getStringValue("ui.alarm.default"); + + /** + * creating location json object using properties file value + */ + ObjectNode locationJsonNode = (ObjectNode) mapper.readValue(locationStringValue, JsonNode.class); + vfObjectNode2.putPOJO("location", locationJsonNode); + + /** + * creating alarm json object using properties file value + */ + logger.info("value of alarm: {}", alarmStringValue); + ObjectNode alarmStringJsonNode = (ObjectNode) mapper.readValue(alarmStringValue, JsonNode.class); + vfObjectNode2.putPOJO("alarmCondition", alarmStringJsonNode); + } + + private ObjectNode createByVFCObjectNode(ObjectMapper mapper, List<CldsAsdcResource> cldsAsdcResourceList) { + ObjectNode emptyObjectNode = mapper.createObjectNode(); + ObjectNode emptyvfcobjectNode = mapper.createObjectNode(); + ObjectNode vfCObjectNode = mapper.createObjectNode(); + vfCObjectNode.putPOJO("vfC", emptyObjectNode); + ObjectNode subVfCObjectNode = mapper.createObjectNode(); + subVfCObjectNode.putPOJO("vfc", emptyObjectNode); + if (cldsAsdcResourceList != null && cldsAsdcResourceList.size() > 0) { + for (CldsAsdcResource cldsAsdcResource : cldsAsdcResourceList) { + if (cldsAsdcResource != null && cldsAsdcResource.getResoucreType() != null && cldsAsdcResource.getResoucreType().equalsIgnoreCase("VF")) { + vfCObjectNode.putPOJO(cldsAsdcResource.getResourceUUID(), subVfCObjectNode); + } + } + } + emptyvfcobjectNode.putPOJO("", vfCObjectNode); + return emptyvfcobjectNode; + } + + private String getGlobalCldsString() throws Exception { + if (null == globalCldsProperties) { + globalCldsProperties = new Properties(); + globalCldsProperties.load(appContext.getResource(globalClds).getInputStream()); + } + return (String) globalCldsProperties.get("globalCldsProps"); + } +} diff --git a/src/main/java/org/onap/clamp/clds/service/CldsTemplateService.java b/src/main/java/org/onap/clamp/clds/service/CldsTemplateService.java new file mode 100644 index 00000000..0ffa955c --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/service/CldsTemplateService.java @@ -0,0 +1,275 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.service; + +import com.att.ajsc.common.AjscService; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.onap.clamp.clds.dao.CldsDao; +import org.onap.clamp.clds.model.CldsTemplate; +import org.onap.clamp.clds.model.ValueItem; +import org.onap.clamp.clds.model.prop.ModelBpmn; +import org.onap.clamp.clds.transform.XslTransformer; +import org.camunda.bpm.engine.RuntimeService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; +import javax.xml.transform.TransformerException; +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +/** + * Service to save and retrieve the CLDS model attributes. + */ +@AjscService +@Path("/cldsTempate") +public class CldsTemplateService extends SecureServiceBase { + + private static final Logger logger = LoggerFactory.getLogger(CldsTemplateService.class); + + private static final String collectorKey = "Collector"; + private static final String stringMatchKey = "StringMatch"; + private static final String policyKey = "Policy"; + + private static final String CLDS_PERMISSION_TYPE_TEMPLATE = System.getProperty("CLDS_PERMISSION_TYPE_TEMPLATE"); + private static final String CLDS_PERMISSION_INSTANCE = System.getProperty("CLDS_PERMISSION_INSTANCE"); + + private static final SecureServicePermission PERMISSION_READ_TEMPLATE = SecureServicePermission.create(CLDS_PERMISSION_TYPE_TEMPLATE, CLDS_PERMISSION_INSTANCE, "read"); + private static final SecureServicePermission PERMISSION_UPDATE_TEMPLATE = SecureServicePermission.create(CLDS_PERMISSION_TYPE_TEMPLATE, CLDS_PERMISSION_INSTANCE, "update"); + + @Autowired + private CldsDao cldsDao; + @Autowired + private RuntimeService runtimeService; + @Autowired + private XslTransformer cldsBpmnTransformer; + + private static String userid; + + /** + * REST service that retrieves BPMN for a CLDS template name from the database. + * This is subset of the json getModel. + * This is only expected to be used for testing purposes, not by the UI. + * + * @param templateName + * @return bpmn xml text - content of bpmn given name + */ + @GET + @Path("/template/bpmn/{templateName}") + @Produces(MediaType.TEXT_XML) + public String getBpmnTemplate(@PathParam("templateName") String templateName) { + isAuthorized(PERMISSION_READ_TEMPLATE); + logger.info("GET bpmnText for templateName=" + templateName); + CldsTemplate template = CldsTemplate.retrieve(cldsDao, templateName, false); + return template.getBpmnText(); + } + + /** + * REST service that saves BPMN for a CLDS template by name in the database. + * This is subset of the json putModel. + * This is only expected to be used for testing purposes, not by the UI. + * + * @param templateName + * @param bpmnText + */ + @PUT + @Path("/template/bpmn/{templateName}") + @Consumes(MediaType.TEXT_XML) + public String putBpmnTemplateXml(@PathParam("templateName") String templateName, String bpmnText) { + isAuthorized(PERMISSION_UPDATE_TEMPLATE); + logger.info("PUT bpmnText for templateName=" + templateName); + logger.info("PUT bpmnText=" + bpmnText); + CldsTemplate cldsTemplate = CldsTemplate.retrieve(cldsDao, templateName, true); + cldsTemplate.setBpmnText(bpmnText); + cldsTemplate.save(cldsDao, userid); + return "wrote bpmnText for templateName=" + templateName; + } + + /** + * REST service that retrieves image for a CLDS template name from the database. + * This is subset of the json getModel. + * This is only expected to be used for testing purposes, not by the UI. + * + * @param templateName + * @return image xml text - content of image given name + */ + @GET + @Path("/template/image/{templateName}") + @Produces(MediaType.TEXT_XML) + public String getImageXml(@PathParam("templateName") String templateName) { + isAuthorized(PERMISSION_READ_TEMPLATE); + logger.info("GET imageText for templateName=" + templateName); + CldsTemplate template = CldsTemplate.retrieve(cldsDao, templateName, false); + return template.getImageText(); + } + + /** + * REST service that saves image for a CLDS template by name in the database. + * This is subset of the json putModel. + * This is only expected to be used for testing purposes, not by the UI. + * + * @param templateName + * @param imageText + */ + @PUT + @Path("/template/image/{templateName}") + @Consumes(MediaType.TEXT_XML) + public String putImageXml(@PathParam("templateName") String templateName, String imageText) { + isAuthorized(PERMISSION_UPDATE_TEMPLATE); + logger.info("PUT iamgeText for modelName=" + templateName); + logger.info("PUT imageText=" + imageText); + CldsTemplate cldsTemplate = CldsTemplate.retrieve(cldsDao, templateName, true); + cldsTemplate.setImageText(imageText); + cldsTemplate.save(cldsDao, userid); + return "wrote imageText for modelName=" + templateName; + } + + /** + * REST service that retrieves a CLDS template by name from the database. + * + * @param templateName + * @return clds template - clds template for the given template name + */ + @GET + @Path("/template/{templateName}") + @Produces(MediaType.APPLICATION_JSON) + public CldsTemplate getTemplate(@PathParam("templateName") String templateName) { + isAuthorized(PERMISSION_READ_TEMPLATE); + logger.info("GET model for templateName=" + templateName); + return CldsTemplate.retrieve(cldsDao, templateName, false); + } + + /** + * REST service that saves a CLDS template by name in the database. + * + * @param templateName + * @throws IOException + * @throws JsonMappingException + * @throws JsonParseException + */ + @PUT + @Path("/template/{templateName}") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public CldsTemplate putTemplate(@PathParam("templateName") String templateName, CldsTemplate cldsTemplate) throws TransformerException, IOException { + isAuthorized(PERMISSION_UPDATE_TEMPLATE); + logger.info("PUT Template for templateName=" + templateName); + logger.info("PUT bpmnText=" + cldsTemplate.getBpmnText()); + logger.info("PUT propText=" + cldsTemplate.getPropText()); + logger.info("PUT imageText=" + cldsTemplate.getImageText()); + cldsTemplate.setName(templateName); + String bpmnText = cldsTemplate.getBpmnText(); + String imageText = cldsTemplate.getImageText(); + String propText = cldsTemplate.getPropText(); + Map<String, String> newBpmnIdsMap = getNewBpmnIdsMap(bpmnText, cldsTemplate.getPropText()); + for (String currBpmnId : newBpmnIdsMap.keySet()) { + if (currBpmnId != null && newBpmnIdsMap.get(currBpmnId) != null) { + bpmnText = bpmnText.replace(currBpmnId, newBpmnIdsMap.get(currBpmnId)); + imageText = imageText.replace(currBpmnId, newBpmnIdsMap.get(currBpmnId)); + propText = propText.replace(currBpmnId, newBpmnIdsMap.get(currBpmnId)); + } + } + cldsTemplate.setBpmnText(bpmnText); + cldsTemplate.setImageText(imageText); + cldsTemplate.setPropText(propText); + logger.info(" bpmnText : " + cldsTemplate.getBpmnText()); + logger.info(" Image Text : " + cldsTemplate.getImageText()); + logger.info(" Prop Text : " + cldsTemplate.getPropText()); + cldsTemplate.save(cldsDao, userid); + return cldsTemplate; + } + + /** + * REST service that retrieves a list of CLDS template names. + * + * @return template names in JSON + */ + @GET + @Path("/template-names") + @Produces(MediaType.APPLICATION_JSON) + public List<ValueItem> getTemplateNames() { + isAuthorized(PERMISSION_READ_TEMPLATE); + logger.info("GET list of template names"); + return cldsDao.getTemplateNames(); + } + + + private Map<String, String> getNewBpmnIdsMap(String bpmnText, String propText) throws TransformerException, IOException { + /** + * Test sample code start + */ + String bpmnJson = cldsBpmnTransformer.doXslTransformToString(bpmnText); + ModelBpmn templateBpmn = ModelBpmn.create(bpmnJson); + List<String> bpmnElementIds = templateBpmn.getBpmnElementIds(); + logger.info("value of elementIds:" + bpmnElementIds); + logger.info("value of prop text:" + propText); + Map<String, String> bpmnIoIdsMap = new HashMap<>(); + if (bpmnElementIds != null && bpmnElementIds.size() > 0) { + ObjectMapper objectMapper = new ObjectMapper(); + ObjectNode root = objectMapper.readValue(propText, ObjectNode.class); + Iterator<Entry<String, JsonNode>> entryItr = root.fields(); + while (entryItr.hasNext()) { + // process the entry + Entry<String, JsonNode> entry = entryItr.next(); + String keyPropName = entry.getKey(); + for (String currElementId : bpmnElementIds) { + if (keyPropName != null && keyPropName.equalsIgnoreCase(currElementId)) { + ArrayNode arrayNode = (ArrayNode) entry.getValue(); + // process each id/from object, like: {"id":"Collector_11r50j1", "from":"StartEvent_1"} + for (JsonNode anArrayNode : arrayNode) { + ObjectNode node = (ObjectNode) anArrayNode; + String valueNode = node.get("value").asText(); + logger.info("value of node:" + valueNode); + if (keyPropName.startsWith(collectorKey)) { + valueNode = collectorKey + "_" + valueNode; + } else if (keyPropName.startsWith(stringMatchKey)) { + valueNode = stringMatchKey + "_" + valueNode; + } else if (keyPropName.startsWith(policyKey)) { + valueNode = policyKey + "_" + valueNode; + } + bpmnIoIdsMap.put(keyPropName, valueNode); + } + break; + } + } + } + } + logger.info("value of hashmap:" + bpmnIoIdsMap); + /** + * Test sample code end + */ + return bpmnIoIdsMap; + } +} diff --git a/src/main/java/org/onap/clamp/clds/service/LogService.java b/src/main/java/org/onap/clamp/clds/service/LogService.java new file mode 100644 index 00000000..1c3d9dc6 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/service/LogService.java @@ -0,0 +1,38 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.service; + +public interface LogService { + + String logMessage(String logMessageText, String javamail, String springmail, String commonsmail); + + String postLogMessage(String histEventList); + + String createLogMessage(String startTime, String endTime, String serviceName); + + String createLogMessageUsingHistory(String procInstId, String histEventList); + + String CreateHistLog(String procInstId); + +} diff --git a/src/main/java/org/onap/clamp/clds/service/LogServiceImpl.java b/src/main/java/org/onap/clamp/clds/service/LogServiceImpl.java new file mode 100644 index 00000000..e7ee93a4 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/service/LogServiceImpl.java @@ -0,0 +1,276 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.service; + +import com.att.ajsc.camunda.core.AttCamundaHistoryEvent; +import com.att.ajsc.camunda.core.AttCamundaService; +import com.att.ajsc.logging.AjscEelfManager; +import com.att.eelf.configuration.EELFLogger; +import com.google.gson.Gson; +import org.onap.clamp.clds.common.LogMessages; +import org.apache.commons.mail.Email; +import org.apache.commons.mail.SimpleEmail; +import org.apache.cxf.jaxrs.ext.MessageContext; +import org.camunda.bpm.engine.HistoryService; +import org.camunda.bpm.engine.RuntimeService; +import org.camunda.bpm.engine.history.HistoricActivityInstance; +import org.camunda.bpm.engine.impl.history.event.HistoricActivityInstanceEventEntity; +import org.camunda.bpm.engine.runtime.ProcessInstance; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mail.MailException; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSenderImpl; +import org.springframework.stereotype.Service; + +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; +import javax.ws.rs.core.Context; +import java.util.*; + +@Service +public class LogServiceImpl implements LogService { + private static final EELFLogger logger = AjscEelfManager.getInstance().getLogger(LogServiceImpl.class); + + @Autowired + private RuntimeService runtimeService; + + @Autowired + private HistoryService historyService; + + @Context + private MessageContext context; + + public void setRuntimeService(RuntimeService runtimeService) { + this.runtimeService = runtimeService; + } + + public LogServiceImpl() { + // needed for instantiation + } + + @Override + public String logMessage(String logMessageText, String javamail, String springmail, String commonsmail) { + logger.info("Value of contexxt : " + context); + String convId = null; + if (context != null) { + convId = context.getHttpServletRequest().getHeader("X-CSI-ConversationId"); + if (convId == null) { + convId = (String) context.getHttpServletRequest().getAttribute("X-CSI-ConversationId"); + } + context.getHttpServletRequest().setAttribute("CALL_TYPE", "Testing"); + AttCamundaService.setHttpRequest(context.getHttpServletRequest()); + } + // input variables to example camunda process + Map<String, Object> variables = new HashMap<>(); + variables.put("logMessageText", logMessageText); + if (convId != null) { + variables.put("conversationId", convId); + } + + // BEGIN - added for send mail testing + // also added the following to the method signature: , @QueryParam("javamail") String javamail, @QueryParam("springmail") String springmail, @QueryParam("commonsmail") String commonsmail + // if javamail parameter provided, assume it contains an email address. + // use Java Mail to send an email from that address, to that address + if (javamail != null && javamail.length() > 0) { + variables.put("javamail", javamail); + try { + Properties props = new Properties(); + props.put("mail.smtp.host", "smtp.sbc.com"); // eMail.setHostName + Session session = Session.getInstance(props); + MimeMessage msg = new MimeMessage(session); + + msg.setFrom(new InternetAddress(javamail)); //eMail.setFrom + + InternetAddress[] fromAddresses = {new InternetAddress(javamail)}; + msg.setReplyTo(fromAddresses); //eMail.addReplyTo + msg.setSubject("test message using javax.mail"); //eMail.setSubject + msg.setText(logMessageText); // eMail.setMsg + + msg.addRecipient(Message.RecipientType.TO, new InternetAddress(javamail)); // eMail.addTo + Transport.send(msg); + } catch (MessagingException e) { + logger.error(LogMessages.LOGSERVICE_EMAIL_ERROR, e); + } + } + + // if springmail parameter provided, assume it contains an email address. + // use Spring Mail to send an email from that address, to that address + if (springmail != null && springmail.length() > 0) { + variables.put("springmail", springmail); + JavaMailSenderImpl sender = new JavaMailSenderImpl(); + SimpleMailMessage smsg = new SimpleMailMessage(); + + try { + sender.setHost("smtp.sbc.com"); // eMail.setHostName + smsg.setFrom(springmail); //eMail.setFrom + smsg.setReplyTo(springmail); //eMail.addReplyTo + smsg.setSubject("test message using spring mail"); //eMail.setSubject + smsg.setText(logMessageText); // eMail.setMsg + smsg.setTo(springmail); // eMail.addTo + sender.send(smsg); + } catch (MailException e) { + logger.error(LogMessages.LOGSERVICE_EMAIL_ERROR, e); + } + } + + // if commonsmail parameter provided, assume it contains an email address. + // use Apache Commons Mail to send an email from that address, to that address + if (commonsmail != null && commonsmail.length() > 0) { + variables.put("commonsmail", commonsmail); + Email eMail = new SimpleEmail(); + try { + eMail.setHostName("smtp.sbc.com"); + eMail.setFrom(commonsmail); + eMail.addReplyTo(commonsmail); + eMail.setSubject("test message using commons mail"); + eMail.setMsg(logMessageText); + eMail.addTo(commonsmail); + java.net.URL classUrl = this.getClass().getResource("com.sun.mail.util.TraceInputStream"); + if (classUrl != null) { + logger.info(LogMessages.LOGSERVICE_EMAIL_CLASS, classUrl.getFile()); + } else { + logger.info(LogMessages.LOGSERVICE_EMAIL_CLASS, classUrl.getFile()); + logger.info(LogMessages.LOGSERVICE_EMAIL_CLASS_NULL); + } + eMail.send(); + } catch (Exception e) { + logger.error(LogMessages.LOGSERVICE_EMAIL_ERROR, e); + } + } + // END - added for send mail testing + + // execute example camunda process, log-message-wf + ProcessInstance pi = runtimeService.startProcessInstanceByKey("log-message-wf", variables); + AttCamundaService.setHttpRequest(null); + // return text message of what was done + return "Started processDefinitionId=" + pi.getProcessDefinitionId() + ", processInstanceId=" + pi.getProcessInstanceId() + ", to log message: " + logMessageText; + } + + @Override + public String postLogMessage(String histEventList) { + String message = "no logs Created"; + logger.info("value of history events:" + histEventList); + Gson gson = new Gson(); + AttCamundaHistoryEvent attCamundaHistoryEvent = gson.fromJson(histEventList, AttCamundaHistoryEvent.class); + if (attCamundaHistoryEvent != null && attCamundaHistoryEvent.getProcInstId() != null) { + logger.info(LogMessages.PROCESS_INSTANCE_ID, attCamundaHistoryEvent.getProcInstId()); + if (context != null && context.getHttpServletRequest() != null && context.getHttpServletRequest().getAttribute("PERFORMANCE_TRACKER_BEAN") != null) { + context.getHttpServletRequest().setAttribute("CALL_TYPE", "Testing"); + List<HistoricActivityInstance> histActInstList = historyService.createHistoricActivityInstanceQuery().processInstanceId(attCamundaHistoryEvent.getProcInstId()).list(); + + if (histActInstList != null && histActInstList.size() > 0) { + for (HistoricActivityInstance currHistoricActivityInstance : histActInstList) { + if (currHistoricActivityInstance != null && currHistoricActivityInstance.getActivityName() != null && currHistoricActivityInstance.getStartTime() != null + && currHistoricActivityInstance.getEndTime() != null) { + logger.info("value of serviceTrack:" + currHistoricActivityInstance); + message = "Log Entry Created"; + logger.info(message); + } + } + } + if (attCamundaHistoryEvent.getHistoryEventList() != null && attCamundaHistoryEvent.getHistoryEventList().size() > 0) { + List<HistoricActivityInstanceEventEntity> historyEventList = attCamundaHistoryEvent.getHistoryEventList(); + for (HistoricActivityInstanceEventEntity actiEvent : historyEventList) { + // resolve null pointer exception if actiEvent.getActivityName() + message = "Log Entry Created"; + } + } + } + } + return message; + } + + @Override + public String createLogMessage(String startTime, String endTime, String serviceName) { + String message = "no logs Created"; + + if (context != null && context.getHttpServletRequest() != null && context.getHttpServletRequest().getAttribute("PERFORMANCE_TRACKER_BEAN") != null) { + context.getHttpServletRequest().setAttribute("X-CSI-ClientApp", "AJSC-CSI~sdsds"); + /*PerformanceTrackingBean trackingBean =(PerformanceTrackingBean) context.getHttpServletRequest().getAttribute("PERFORMANCE_TRACKER_BEAN"); + PerformanceTracking.addInvokeServiceTrack(trackingBean, + serviceName, Long.valueOf(startTime), Long.valueOf(endTime), "Completed", + 500, 1000) ;*/ + message = "Log Entry Created"; + } + // return text message of what was done + return message; + } + + @Override + public String createLogMessageUsingHistory(String procInstId, String histEventList) { + String message = "no logs Created"; + logger.info("value of history events:" + histEventList); + logger.info("value of events:" + histEventList + ":" + histEventList); + if (context != null && context.getHttpServletRequest() != null && context.getHttpServletRequest().getAttribute("PERFORMANCE_TRACKER_BEAN") != null) { + context.getHttpServletRequest().setAttribute("CALL_TYPE", "Testing"); + List<HistoricActivityInstance> histActInstList = historyService.createHistoricActivityInstanceQuery().processInstanceId(procInstId).list(); + + if (histActInstList != null && histActInstList.size() > 0) { + for (HistoricActivityInstance currHistoricActivityInstance : histActInstList) { + if (currHistoricActivityInstance != null && currHistoricActivityInstance.getActivityName() != null && currHistoricActivityInstance.getStartTime() != null + && currHistoricActivityInstance.getEndTime() != null) { + logger.info("value of serviceTrack:" + currHistoricActivityInstance); + message = "Log Entry Created"; + logger.info(message); + } + } + } + } + return message; + } + + @Override + public String CreateHistLog(String procInstId) { + String message = "no logs Created"; + if (context != null && context.getHttpServletRequest() != null && context.getHttpServletRequest().getAttribute("PERFORMANCE_TRACKER_BEAN") != null) { + List<HistoricActivityInstance> histActInstList = historyService.createHistoricActivityInstanceQuery().processInstanceId(procInstId).list(); + + if (histActInstList != null && histActInstList.size() > 0) { + for (HistoricActivityInstance currHistoricActivityInstance : histActInstList) { + if (currHistoricActivityInstance != null && currHistoricActivityInstance.getActivityName() != null && currHistoricActivityInstance.getStartTime() != null + && currHistoricActivityInstance.getEndTime() != null) { + logger.info("value of serviceTrack:" + currHistoricActivityInstance); + context.getHttpServletRequest().setAttribute("X-CSI-ClientApp", "AJSC-CSI~sdsds"); + message = "Log Entry Created"; + } + } + } + } + return message; + } + + private String getActivityInstanceState(int activityInstanceState) { + String activityState = "Default"; + if (activityInstanceState == 1) { + activityState = "Complete"; + } else if (activityInstanceState == 2) { + activityState = "Cancelled"; + } + return activityState; + } +} diff --git a/src/main/java/org/onap/clamp/clds/service/SecureServiceBase.java b/src/main/java/org/onap/clamp/clds/service/SecureServiceBase.java new file mode 100644 index 00000000..c17af97f --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/service/SecureServiceBase.java @@ -0,0 +1,105 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.NotAuthorizedException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.SecurityContext; +import java.security.Principal; + +/** + * Base/abstract Service class. + * Implements shared security methods. + */ +public abstract class SecureServiceBase { + private static final Logger logger = LoggerFactory.getLogger(SecureServiceBase.class); + + @Context + private SecurityContext securityContext; + + /** + * Get the userid + * + * @return + */ + public String getUserid() { + return getPrincipalName(); + } + + /** + * Get the principal name. + * + * @return + */ + public String getPrincipalName() { + Principal p = securityContext.getUserPrincipal(); + String name = "Not found"; + if (p != null) { + name = p.getName(); + } + logger.debug("userPrincipal.getName()={}", name); + return name; + } + + /** + * Check if user is authorized for the given the permission. + * Allow matches if user has a permission with an "*" in permission instance + * or permission action even if the permission to check has a specific value + * in those fields. For example: + * if the user has this permission: app-perm-type|*|* + * it will be authorized if the inPermission to check is: app-perm-type|dev|read + * + * @param inPermission + * @return + * @throws NotAuthorizedException + */ + public boolean isAuthorized(SecureServicePermission inPermission) throws NotAuthorizedException { + boolean authorized = false; + logger.debug("checking if {} has permission: {}", getPrincipalName(), inPermission); + // check if the user has the permission key or the permission key with a combination of all instance and/or all action. + if (securityContext.isUserInRole(inPermission.getKey())) { + logger.info("{} authorized for permission: {}", getPrincipalName(), inPermission.getKey()); + authorized = true; + // the rest of these don't seem to be required - isUserInRole method appears to take * as a wildcard + } else if (securityContext.isUserInRole(inPermission.getKeyAllInstance())) { + logger.info("{} authorized because user has permission with * for instance: {}", getPrincipalName(), inPermission.getKey()); + authorized = true; + } else if (securityContext.isUserInRole(inPermission.getKeyAllInstanceAction())) { + logger.info("{} authorized because user has permission with * for instance and * for action: {}", getPrincipalName(), inPermission.getKey()); + authorized = true; + } else if (securityContext.isUserInRole(inPermission.getKeyAllAction())) { + logger.info("{} authorized because user has permission with * for action: {}", getPrincipalName(), inPermission.getKey()); + authorized = true; + } else { + String msg = getPrincipalName() + " does not have permission: " + inPermission; + logger.warn(msg); + throw new NotAuthorizedException(msg); + } + return authorized; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/service/SecureServicePermission.java b/src/main/java/org/onap/clamp/clds/service/SecureServicePermission.java new file mode 100644 index 00000000..a2213f91 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/service/SecureServicePermission.java @@ -0,0 +1,190 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.service; + +/** + * Permission class that can be instantiated easily using constructor or factory methods. + */ +public class SecureServicePermission { + public final static String ALL = "*"; + + private String type; + private String instance; + private String action; + + /** + * Factory method to create permission given type, instance, and action. + * + * @param type + * @param instance + * @param action + * @return + */ + public static SecureServicePermission create(String type, String instance, String action) { + return new SecureServicePermission(type, instance, action); + } + + /** + * Factory method to create permission given type and instance. Default action to ALL/*. + * + * @param type + * @param instance + * @return + */ + public static SecureServicePermission create(String type, String instance) { + return new SecureServicePermission(type, instance); + } + + /** + * Factory method to create permission given type. Default instance and action to ALL/*. + * + * @param type + * @return + */ + public static SecureServicePermission create(String type) { + return new SecureServicePermission(type); + } + + /** + * Instantiate permission given type, instance, and action. + * + * @param type + * @param instance + * @param action + */ + public SecureServicePermission(String type, String instance, String action) { + this.type = type; + this.instance = instance; + this.action = action; + } + + /** + * Instantiate permission given type and instance. Default action to ALL/*. + * + * @param type + * @param instance + */ + public SecureServicePermission(String type, String instance) { + this.type = type; + this.instance = instance; + this.action = ALL; + } + + /** + * Instantiate permission given type. Default instance and action to ALL/*. + * + * @param type + */ + public SecureServicePermission(String type) { + this.type = type; + this.instance = ALL; + this.action = ALL; + } + + /** + * Override toString - return permission in key format + */ + public String toString() { + return getKey(); + } + + /** + * Return Permission in Key format = type, instance, and action separate by pipe character. + * + * @return + */ + public String getKey() { + return type + "|" + instance + "|" + action; + } + + /** + * Return Permission in Key format = type, all instance, and action separate by pipe character. + * + * @return + */ + public String getKeyAllInstance() { + return type + "|" + ALL + "|" + action; + } + + /** + * Return Permission in Key format = type, all instance, and all action separate by pipe character. + * + * @return + */ + public String getKeyAllInstanceAction() { + return type + "|" + ALL + "|" + ALL; + } + + /** + * Return Permission in Key format = type, instance, and all action separate by pipe character. + * + * @return + */ + public String getKeyAllAction() { + return type + "|" + instance + "|" + ALL; + } + + /** + * @return the type + */ + public String getType() { + return type; + } + + /** + * @param type the type to set + */ + public void setType(String type) { + this.type = type; + } + + /** + * @return the instance + */ + public String getInstance() { + return instance; + } + + /** + * @param instance the instance to set + */ + public void setInstance(String instance) { + this.instance = instance; + } + + /** + * @return the action + */ + public String getAction() { + return action; + } + + /** + * @param action the action to set + */ + public void setAction(String action) { + this.action = action; + } + +} diff --git a/src/main/java/org/onap/clamp/clds/service/rs/JaxrsLogService.java b/src/main/java/org/onap/clamp/clds/service/rs/JaxrsLogService.java new file mode 100644 index 00000000..d0ef1359 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/service/rs/JaxrsLogService.java @@ -0,0 +1,101 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.service.rs; + +import io.swagger.annotations.Api; + +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; + + +/** + * Service to invoke example Camunda process. + * <p> + * Try testing by using: + * http://[hostname]:[serverPort]/jaxrsservices/log/log-message/your-message-here + */ +@Api(value = "/log") +@Path("/log") +@Produces({MediaType.TEXT_PLAIN}) +public interface JaxrsLogService { + + /** + * REST service that executes example camunda process to log input message. + * + * @param logMessageText + * @return output from service - comment on what was done + */ + @GET + @Path("/log-message/{logMessageText}") + @Produces(MediaType.TEXT_PLAIN) + String logMessage(@PathParam("logMessageText") String logMessageText, @QueryParam("javamail") String javamail, @QueryParam("springmail") String springmail, @QueryParam("commonsmail") String commonsmail); + + /** + * REST service that executes example camunda process to log input message. + * + * @return output from service - comment on what was done + */ + @POST + @Path("/postLogHist") + @Produces(MediaType.TEXT_PLAIN) + @Consumes(MediaType.APPLICATION_JSON) + String postLogMessage(String histEventList); + + /** + * REST service that executes example camunda process to log input message. + * + * @param startTime + * @param endTime + * @param serviceName + * @return output from service - comment on what was done + */ + @GET + @Path("/createLog/{startTime}/{endTime}/{serviceName}") + @Produces(MediaType.TEXT_PLAIN) + String createLogMessage(@PathParam("startTime") String startTime, @PathParam("endTime") String endTime, @PathParam("serviceName") String serviceName); + + /** + * REST service that executes example camunda process to log input message. + * + * @param procInstId + * @param histEventList + * @return output from service - comment on what was done + */ + @GET + @Path("/createLogHist/{procInstId}/{histEventList}") + @Produces(MediaType.TEXT_PLAIN) + String createLogMessageUsingHistory(@PathParam("procInstId") String procInstId, @PathParam("histEventList") String histEventList); + + /** + * REST service that executes example camunda process to log input message. + * + * @param procInstId + * @return output from service - comment on what was done + */ + @GET + @Path("/histLog/{procInstId}") + @Produces(MediaType.TEXT_PLAIN) + String CreateHistLog(@PathParam("procInstId") String procInstId); + +} diff --git a/src/main/java/org/onap/clamp/clds/service/rs/JaxrsLogServiceImpl.java b/src/main/java/org/onap/clamp/clds/service/rs/JaxrsLogServiceImpl.java new file mode 100644 index 00000000..4ef7d2e9 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/service/rs/JaxrsLogServiceImpl.java @@ -0,0 +1,94 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.service.rs; + +import com.att.ajsc.common.AjscService; +import org.onap.clamp.clds.service.LogService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Service to invoke example Camunda process. + * <p> + * Try testing by using: + * http://[hostname]:[serverPort]/services/log/log-message/your-message-here + */ +@AjscService +public class JaxrsLogServiceImpl implements JaxrsLogService { + + @Autowired + private LogService logService; + + /** + * REST service that executes example camunda process to log input message. + * + * @param logMessageText + * @return output from service - comment on what was done + */ + public String logMessage(String logMessageText, String javamail, String springmail, String commonsmail) { + return logService.logMessage(logMessageText, javamail, springmail, commonsmail); + } + + /** + * REST service that executes example camunda process to log input message. + * + * @return output from service - comment on what was done + */ + public String postLogMessage(String histEventList) { + return logService.postLogMessage(histEventList); + } + + /** + * REST service that executes example camunda process to log input message. + * + * @param startTime + * @param endTime + * @param serviceName + * @return output from service - comment on what was done + */ + public String createLogMessage(String startTime, String endTime, String serviceName) { + return logService.createLogMessage(startTime, endTime, serviceName); + } + + /** + * REST service that executes example camunda process to log input message. + * + * @param procInstId + * @param histEventList + * @return output from service - comment on what was done + */ + public String createLogMessageUsingHistory(String procInstId, String histEventList) { + return logService.createLogMessageUsingHistory(procInstId, histEventList); + } + + /** + * REST service that executes example camunda process to log input message. + * + * @param procInstId + * @return output from service - comment on what was done + */ + public String CreateHistLog(String procInstId) { + return logService.CreateHistLog(procInstId); + } + +} diff --git a/src/main/java/org/onap/clamp/clds/transform/TransformUtil.java b/src/main/java/org/onap/clamp/clds/transform/TransformUtil.java new file mode 100644 index 00000000..2c666db0 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/transform/TransformUtil.java @@ -0,0 +1,66 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.transform; + +import java.io.IOException; +import java.io.InputStream; + +/** + * Utility methods supporting transforms. + */ +public class TransformUtil { + + /** + * Return resource as a Stream. + * + * @param name + * @return resource - resource as stream + */ + public static InputStream getResourceAsStream(String name) { + InputStream is = Thread.currentThread().getContextClassLoader() + .getResourceAsStream(name); + if (is == null) { + throw new IllegalArgumentException("Unable to find resource: " + + name); + } + return is; + } + + /** + * Return resource as a Stream. + * + * @param name + * @throws IOException + */ + public static String getResourceAsString(String name) throws IOException { + InputStream is = getResourceAsStream(name); + java.util.Scanner scanner = new java.util.Scanner(is); + java.util.Scanner s = scanner.useDelimiter("\\A"); + String text = s.hasNext() ? s.next() : ""; + s.close(); + scanner.close(); + is.close(); + return text; + } +} diff --git a/src/main/java/org/onap/clamp/clds/transform/XslTransformer.java b/src/main/java/org/onap/clamp/clds/transform/XslTransformer.java new file mode 100644 index 00000000..7d003160 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/transform/XslTransformer.java @@ -0,0 +1,59 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.transform; + +import javax.xml.transform.*; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; +import java.io.StringReader; +import java.io.StringWriter; + +/** + * XSL Transformer. + */ +public class XslTransformer { + + private Templates templates; + + public void setXslResourceName(String xslResourceName) throws TransformerConfigurationException { + TransformerFactory tfactory = TransformerFactory.newInstance(); + templates = tfactory.newTemplates(new StreamSource(TransformUtil.getResourceAsStream(xslResourceName))); + } + + /** + * Given xml input, return the transformed result. + * + * @param xml + * @throws TransformerException + */ + public String doXslTransformToString(String xml) throws TransformerException { + StringWriter output = new StringWriter(4000); + + Transformer transformer = templates.newTransformer(); + transformer.transform(new StreamSource(new StringReader(xml)), + new StreamResult(output)); + return output.toString(); + } + +} diff --git a/src/main/java/org/onap/clamp/clds/workflow/LogMessageDelegate.java b/src/main/java/org/onap/clamp/clds/workflow/LogMessageDelegate.java new file mode 100644 index 00000000..693b334e --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/workflow/LogMessageDelegate.java @@ -0,0 +1,46 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.workflow; + +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.JavaDelegate; + +/** + * Log message. + * Invoked by the log-message-wf example Camunda workflow/bpmn. + */ +public class LogMessageDelegate implements JavaDelegate { + + /** + * Perform activity. Log message from running process and set a variable in the running process. + * + * @param execution + */ + public void execute(DelegateExecution execution) throws Exception { + String logMessageText = (String) execution.getVariable("logMessageText"); + + System.out.println("Invoked from processDefinitionId=" + execution.getProcessDefinitionId() + ", processInstanceId=" + execution.getProcessInstanceId() + ", activityInstanceId=" + execution.getActivityInstanceId() + ": logMessageText=" + logMessageText); + execution.setVariable("isMessageLogComplete", true); + } +} diff --git a/src/main/java/org/onap/clamp/clds/workflow/ProcessRequestDelegate.java b/src/main/java/org/onap/clamp/clds/workflow/ProcessRequestDelegate.java new file mode 100644 index 00000000..32449642 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/workflow/ProcessRequestDelegate.java @@ -0,0 +1,57 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +/* Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onap.clamp.clds.workflow; + + +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.JavaDelegate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + + +@Component +public class ProcessRequestDelegate implements JavaDelegate { + + private static final Logger logger = LoggerFactory.getLogger(ProcessRequestDelegate.class); + + //@Override + public void execute(DelegateExecution execution) throws Exception { + logger.info("Processing request by '" + execution.getVariable("customerId") + "'..."); + logger.info("Processing request by '" + execution.getVariable("amount") + "'..."); + } + +} diff --git a/src/main/java/org/onap/clamp/clds/workflow/RestMessageDelegate.java b/src/main/java/org/onap/clamp/clds/workflow/RestMessageDelegate.java new file mode 100644 index 00000000..0eda2dec --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/workflow/RestMessageDelegate.java @@ -0,0 +1,59 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ + +package org.onap.clamp.clds.workflow; + +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.JavaDelegate; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Logger; + +/** + * Log message. + * Invoked by the log-message-wf example Camunda workflow/bpmn. + */ +public class RestMessageDelegate implements JavaDelegate { + private static final Logger logger = Logger.getLogger(RestMessageDelegate.class.getName()); + + /** + * Perform activity. Log message from running process and set a variable in the running process. + * + * @param execution + */ + public void execute(DelegateExecution execution) throws Exception { + String logMessageText = (String) execution.getVariable("logMessageText"); + RestTemplate restTemplate = new RestTemplate(); + Map<String, String> restValues = new HashMap<>(); + restValues.put("procInstId", execution.getProcessInstanceId()); + logger.info("Invoked from processDefinitionId=" + execution.getProcessDefinitionId() + ", processInstanceId=" + execution.getProcessInstanceId() + ", activityInstanceId=" + execution.getActivityInstanceId() + ": logMessageText=" + logMessageText); + // TODO: this should be fixed - put in temporary solution with existing sysprop and vars - why are we calling our own service? + String port = System.getProperty("server.port"); + ResponseEntity<String> resp = restTemplate.getForEntity("http://localhost:" + port + "/services/CamundaExample/v1/jaxrsExample/log/histLog/{procInstId}", String.class, restValues); + logger.info("value of resp:" + resp); + execution.setVariable("isMessageLogComplete", true); + } +} |