X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fonap%2Fclamp%2Fclds%2Fservice%2FCldsService.java;h=71dd5c4f4db5466f97beb1b695feb4925c6cec27;hb=7b8d18c2d8893e735e2809609361071bb702b53f;hp=521f3ce2758ca1dfe434701c8f2f370f8e4aadb2;hpb=23c4c2752564b7ec967b3176600578be5a1cb08b;p=clamp.git diff --git a/src/main/java/org/onap/clamp/clds/service/CldsService.java b/src/main/java/org/onap/clamp/clds/service/CldsService.java index 521f3ce2..71dd5c4f 100644 --- a/src/main/java/org/onap/clamp/clds/service/CldsService.java +++ b/src/main/java/org/onap/clamp/clds/service/CldsService.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP CLAMP * ================================================================================ - * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights + * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights * reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -26,53 +26,42 @@ package org.onap.clamp.clds.service; import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; import java.io.IOException; -import java.security.GeneralSecurityException; +import java.lang.reflect.Type; import java.util.Date; import java.util.List; -import java.util.Optional; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.BadRequestException; -import javax.ws.rs.NotAuthorizedException; import javax.xml.transform.TransformerException; import org.apache.camel.Produce; -import org.apache.commons.codec.DecoderException; -import org.apache.commons.lang3.StringUtils; import org.json.simple.parser.ParseException; import org.onap.clamp.clds.camel.CamelProxy; import org.onap.clamp.clds.client.DcaeDispatcherServices; import org.onap.clamp.clds.client.DcaeInventoryServices; -import org.onap.clamp.clds.client.req.sdc.SdcCatalogServices; import org.onap.clamp.clds.config.ClampProperties; import org.onap.clamp.clds.dao.CldsDao; -import org.onap.clamp.clds.exception.CldsConfigException; import org.onap.clamp.clds.exception.policy.PolicyClientException; import org.onap.clamp.clds.exception.sdc.SdcCommunicationException; -import org.onap.clamp.clds.model.CldsDbServiceCache; import org.onap.clamp.clds.model.CldsEvent; import org.onap.clamp.clds.model.CldsInfo; import org.onap.clamp.clds.model.CldsModel; import org.onap.clamp.clds.model.CldsModelProp; import org.onap.clamp.clds.model.CldsMonitoringDetails; -import org.onap.clamp.clds.model.CldsServiceData; import org.onap.clamp.clds.model.CldsTemplate; import org.onap.clamp.clds.model.DcaeEvent; import org.onap.clamp.clds.model.ValueItem; -import org.onap.clamp.clds.model.properties.AbstractModelElement; import org.onap.clamp.clds.model.properties.ModelProperties; -import org.onap.clamp.clds.model.sdc.SdcResource; -import org.onap.clamp.clds.model.sdc.SdcServiceDetail; import org.onap.clamp.clds.model.sdc.SdcServiceInfo; import org.onap.clamp.clds.sdc.controller.installer.CsarInstallerImpl; import org.onap.clamp.clds.transform.XslTransformer; -import org.onap.clamp.clds.util.JacksonUtils; +import org.onap.clamp.clds.util.JsonUtils; import org.onap.clamp.clds.util.LoggingUtils; import org.onap.clamp.clds.util.ONAPLogConstants; import org.slf4j.event.Level; @@ -89,57 +78,107 @@ import org.springframework.web.client.HttpClientErrorException; @Component public class CldsService extends SecureServiceBase { + /** + * The constant LIST_OF_SDC_SERVICE_INFO_TYPE. + */ + public static final Type LIST_OF_SDC_SERVICE_INFO_TYPE = new TypeToken>() { + }.getType(); @Produce(uri = "direct:processSubmit") private CamelProxy camelProxy; + /** + * The constant securityLogger. + */ protected static final EELFLogger securityLogger = EELFManager.getInstance().getSecurityLogger(); + /** + * The constant logger. + */ protected static final EELFLogger logger = EELFManager.getInstance().getLogger(CldsService.class); + /** + * The constant GLOBAL_PROPERTIES_KEY. + */ public static final String GLOBAL_PROPERTIES_KEY = "files.globalProperties"; - private final String cldsPersmissionTypeCl; private final String cldsPermissionTypeClManage; private final String cldsPermissionTypeClEvent; private final String cldsPermissionTypeFilterVf; - private final String cldsPermissionTypeTemplate; private final String cldsPermissionInstance; + /** + * The Permission read cl. + */ final SecureServicePermission permissionReadCl; + /** + * The Permission update cl. + */ final SecureServicePermission permissionUpdateCl; + /** + * The Permission read template. + */ final SecureServicePermission permissionReadTemplate; + /** + * The Permission update template. + */ final SecureServicePermission permissionUpdateTemplate; + /** + * The Permission read tosca. + */ final SecureServicePermission permissionReadTosca; + /** + * The Permission update tosca. + */ final SecureServicePermission permissionUpdateTosca; private final CldsDao cldsDao; private final XslTransformer cldsBpmnTransformer; private final ClampProperties refProp; - private final SdcCatalogServices sdcCatalogServices; private final DcaeDispatcherServices dcaeDispatcherServices; private final DcaeInventoryServices dcaeInventoryServices; private LoggingUtils util = new LoggingUtils(logger); @Autowired private HttpServletRequest request; + + /** + * Instantiates a new Clds service. + * + * @param cldsDao the clds dao + * @param cldsBpmnTransformer the clds bpmn transformer + * @param refProp the ref prop + * @param dcaeDispatcherServices the dcae dispatcher services + * @param dcaeInventoryServices the dcae inventory services + * @param cldsPersmissionTypeCl the clds persmission type cl + * @param cldsPermissionTypeClManage the clds permission type cl manage + * @param cldsPermissionTypeClEvent the clds permission type cl event + * @param cldsPermissionTypeFilterVf the clds permission type filter vf + * @param cldsPermissionTypeTemplate the clds permission type template + * @param cldsPermissionTypeTosca the clds permission type tosca + * @param cldsPermissionInstance the clds permission instance + */ @Autowired public CldsService(CldsDao cldsDao, XslTransformer cldsBpmnTransformer, ClampProperties refProp, - SdcCatalogServices sdcCatalogServices, DcaeDispatcherServices dcaeDispatcherServices, + DcaeDispatcherServices dcaeDispatcherServices, DcaeInventoryServices dcaeInventoryServices, - @Value("${clamp.config.security.permission.type.cl:permission-type-cl}") String cldsPersmissionTypeCl, - @Value("${clamp.config.security.permission.type.cl.manage:permission-type-cl-manage}") String cldsPermissionTypeClManage, - @Value("${clamp.config.security.permission.type.cl.event:permission-type-cl-event}") String cldsPermissionTypeClEvent, - @Value("${clamp.config.security.permission.type.filter.vf:permission-type-filter-vf}") String cldsPermissionTypeFilterVf, - @Value("${clamp.config.security.permission.type.template:permission-type-template}") String cldsPermissionTypeTemplate, - @Value("${clamp.config.security.permission.type.tosca:permission-type-tosca}") String cldsPermissionTypeTosca, - @Value("${clamp.config.security.permission.instance:dev}") String cldsPermissionInstance) { + @Value("${clamp.config.security.permission.type.cl:permission-type-cl}") + String cldsPersmissionTypeCl, + @Value("${clamp.config.security.permission.type.cl.manage:permission-type-cl-manage}") + String cldsPermissionTypeClManage, + @Value("${clamp.config.security.permission.type.cl.event:permission-type-cl-event}") + String cldsPermissionTypeClEvent, + @Value("${clamp.config.security.permission.type.filter.vf:permission-type-filter-vf}") + String cldsPermissionTypeFilterVf, + @Value("${clamp.config.security.permission.type.template:permission-type-template}") + String cldsPermissionTypeTemplate, + @Value("${clamp.config.security.permission.type.tosca:permission-type-tosca}") + String cldsPermissionTypeTosca, + @Value("${clamp.config.security.permission.instance:dev}") + String cldsPermissionInstance) { this.cldsDao = cldsDao; this.cldsBpmnTransformer = cldsBpmnTransformer; this.refProp = refProp; - this.sdcCatalogServices = sdcCatalogServices; this.dcaeDispatcherServices = dcaeDispatcherServices; this.dcaeInventoryServices = dcaeInventoryServices; - this.cldsPersmissionTypeCl = cldsPersmissionTypeCl; this.cldsPermissionTypeClManage = cldsPermissionTypeClManage; this.cldsPermissionTypeClEvent = cldsPermissionTypeClEvent; this.cldsPermissionTypeFilterVf = cldsPermissionTypeFilterVf; - this.cldsPermissionTypeTemplate = cldsPermissionTypeTemplate; this.cldsPermissionInstance = cldsPermissionInstance; permissionReadCl = SecureServicePermission.create(cldsPersmissionTypeCl, cldsPermissionInstance, "read"); permissionUpdateCl = SecureServicePermission.create(cldsPersmissionTypeCl, cldsPermissionInstance, "update"); @@ -149,11 +188,12 @@ public class CldsService extends SecureServiceBase { "update"); permissionReadTosca = SecureServicePermission.create(cldsPermissionTypeTosca, cldsPermissionInstance, "read"); permissionUpdateTosca = SecureServicePermission.create(cldsPermissionTypeTosca, cldsPermissionInstance, - "update"); + "update"); } - /* - * @return list of CLDS-Monitoring-Details: CLOSELOOP_NAME | Close loop name + /** + * Gets clds details. + * list of CLDS-Monitoring-Details: CLOSELOOP_NAME | Close loop name * used in the CLDS application (prefix: ClosedLoop- + unique ClosedLoop ID) * MODEL_NAME | Model Name in CLDS application SERVICE_TYPE_ID | TypeId returned * from the DCAE application when the ClosedLoop is submitted @@ -161,11 +201,12 @@ public class CldsService extends SecureServiceBase { * generated when the ClosedLoop is deployed in DCAE. TEMPLATE_NAME | Template * used to generate the ClosedLoop model. ACTION_CD | Current state of the * ClosedLoop in CLDS application. + * @return the clds details */ - public List getCLDSDetails() { + public List getCldsDetails() { util.entering(request, "CldsService: GET model details"); Date startTime = new Date(); - List cldsMonitoringDetailsList = cldsDao.getCLDSMonitoringDetails(); + List cldsMonitoringDetailsList = cldsDao.getCldsMonitoringDetails(); // audit log LoggingUtils.setTimeContext(startTime, new Date()); auditLogger.info("GET cldsDetails completed"); @@ -173,9 +214,11 @@ public class CldsService extends SecureServiceBase { return cldsMonitoringDetailsList; } - /* + /** + * Gets clds info. * CLDS IFO service will return 3 things 1. User Name 2. CLDS code version that * is currently installed from pom.xml file 3. User permissions + * @return the clds info */ public CldsInfo getCldsInfo() { util.entering(request, "CldsService: GET cldsInfo"); @@ -197,7 +240,7 @@ public class CldsService extends SecureServiceBase { * This is subset of the json getModel. This is only expected to be used for * testing purposes, not by the UI. * - * @param modelName + * @param modelName the model name * @return bpmn xml text - content of bpmn given name */ public String getBpmnXml(String modelName) { @@ -218,11 +261,11 @@ public class CldsService extends SecureServiceBase { * This is subset of the json getModel. This is only expected to be used for * testing purposes, not by the UI. * - * @param modelName + * @param modelName the model name * @return image xml text - content of image given name */ public String getImageXml(String modelName) { - util.entering(request, "CldsService: GET model image"); + util.entering(request, "CldsService: GET model image"); Date startTime = new Date(); isAuthorized(permissionReadCl); logger.info("GET imageText for modelName={}", modelName); @@ -237,25 +280,35 @@ public class CldsService extends SecureServiceBase { /** * REST service that retrieves a CLDS model by name from the database. * - * @param modelName + * @param modelName the model name * @return clds model - clds model for the given model name */ public CldsModel getModel(String modelName) { - util.entering(request, "CldsService: GET model"); + util.entering(request, "CldsService: GET model"); Date startTime = new Date(); isAuthorized(permissionReadCl); logger.debug("GET model for modelName={}", modelName); CldsModel cldsModel = CldsModel.retrieve(cldsDao, modelName, false); isAuthorizedForVf(cldsModel); + // Try an update for DCAE status // Checking condition whether our CLDS model can call Inventory Method - if (cldsModel.canInventoryCall()) { - try { - // Method to call dcae inventory and invoke insert event method + try { + // Method to call dcae inventory and invoke insert event method + if (cldsModel.canDcaeInventoryCall() + && !cldsModel.getTemplateName().startsWith(CsarInstallerImpl.TEMPLATE_NAME_PREFIX)) { dcaeInventoryServices.setEventInventory(cldsModel, getUserId()); - } catch (Exception e) { - LoggingUtils.setErrorContext("900", "Set event inventory error"); - logger.error("getModel set event Inventory error:" + e); } + // This is a blocking call + if (cldsModel.getEvent().isActionCd(CldsEvent.ACTION_DEPLOY) + && !CldsModel.STATUS_ACTIVE.equals(cldsModel.getStatus()) && cldsModel.getDeploymentId() != null + && cldsModel.getDeploymentStatusUrl() != null) { + checkDcaeDeploymentStatus(cldsModel, CldsEvent.ACTION_DEPLOY, false); + // Refresh the model object in any cases for new event + cldsModel = CldsModel.retrieve(cldsDao, cldsModel.getName(), false); + } + } catch (Exception e) { + LoggingUtils.setErrorContext("900", "Set event inventory error"); + logger.error("getModel set event Inventory error:" + e); } // audit log LoggingUtils.setTimeContext(startTime, new Date()); @@ -267,10 +320,12 @@ public class CldsService extends SecureServiceBase { /** * REST service that saves a CLDS model by name in the database. * - * @param modelName + * @param modelName the model name + * @param cldsModel the clds model + * @return the clds model */ public CldsModel putModel(String modelName, CldsModel cldsModel) { - util.entering(request, "CldsService: PUT model"); + util.entering(request, "CldsService: PUT model"); Date startTime = new Date(); isAuthorized(permissionUpdateCl); isAuthorizedForVf(cldsModel); @@ -278,11 +333,9 @@ public class CldsService extends SecureServiceBase { logger.info("PUT bpmnText={}", cldsModel.getBpmnText()); logger.info("PUT propText={}", cldsModel.getPropText()); logger.info("PUT imageText={}", cldsModel.getImageText()); - cldsModel.setName(modelName); fillInCldsModel(cldsModel); - updateAndInsertNewEvent(cldsModel.getName(), cldsModel.getControlNamePrefix(), cldsModel.getEvent(), - CldsEvent.ACTION_MODIFY); cldsModel.save(cldsDao, getUserId()); + // audit log LoggingUtils.setTimeContext(startTime, new Date()); auditLogger.info("PUT model completed"); @@ -300,7 +353,7 @@ public class CldsService extends SecureServiceBase { Date startTime = new Date(); isAuthorized(permissionReadCl); logger.info("GET list of model names"); - List names = cldsDao.getBpmnNames(); + List names = cldsDao.getModelNames(); // audit log LoggingUtils.setTimeContext(startTime, new Date()); auditLogger.info("GET model names completed"); @@ -325,29 +378,22 @@ public class CldsService extends SecureServiceBase { /** * REST service that saves and processes an action for a CLDS model by name. * - * @param action - * @param modelName - * @param validateFlag - * @param model - * @return - * @throws TransformerException - * In case of issues when doing the XSLT of the BPMN flow - * @throws ParseException - * In case of issues when parsing the JSON - * @throws GeneralSecurityException - * In case of issues when decrypting the password - * @throws DecoderException - * In case of issues with the Hex String decoding + * @param action the action + * @param modelName the model name + * @param test the test + * @param model the model + * @return response entity + * @throws TransformerException In case of issues when doing the XSLT of the BPMN flow + * @throws ParseException In case of issues when parsing the JSON */ - public ResponseEntity putModelAndProcessAction(String action, - String modelName,String test, CldsModel model) - throws TransformerException, ParseException { + public ResponseEntity putModelAndProcessAction(String action, String modelName, String test, CldsModel model) + throws TransformerException, ParseException { util.entering(request, "CldsService: Process model action"); Date startTime = new Date(); - CldsModel retrievedModel = null; - Boolean errorCase = false; + String errorMessage = ""; + String actionCd = ""; try { - String actionCd = action.toUpperCase(); + actionCd = action.toUpperCase(); SecureServicePermission permisionManage = SecureServicePermission.create(cldsPermissionTypeClManage, cldsPermissionInstance, actionCd); isAuthorized(permisionManage); @@ -362,10 +408,9 @@ public class CldsService extends SecureServiceBase { logger.info("PUT getTypeId={}", model.getTypeId()); logger.info("PUT deploymentId={}", model.getDeploymentId()); this.fillInCldsModel(model); - // save model to db - model.setName(modelName); - updateAndInsertNewEvent(modelName, model.getControlNamePrefix(), model.getEvent(), CldsEvent.ACTION_MODIFY); + // save model to db just in case model.save(cldsDao, getUserId()); + // get vars and format if necessary String prop = model.getPropText(); String bpmn = model.getBpmnText(); @@ -373,85 +418,59 @@ public class CldsService extends SecureServiceBase { String controlName = model.getControlName(); String bpmnJson = cldsBpmnTransformer.doXslTransformToString(bpmn); logger.info("PUT bpmnJson={}", bpmnJson); - // Flag indicates whether it is triggered by Validation Test button - // from - // UI - boolean isTest = Boolean.valueOf(test); - if (!isTest) { - String actionTestOverride = refProp.getStringValue("action.test.override"); - if (Boolean.valueOf(actionTestOverride)) { - logger.info("PUT actionTestOverride={}", actionTestOverride); - logger.info("PUT override test indicator and setting it to true"); - isTest = true; - } - } + // Test flag coming from UI or from Clamp config + boolean isTest = Boolean.parseBoolean(test) + || Boolean.parseBoolean(refProp.getStringValue("action.test.override")); logger.info("PUT isTest={}", isTest); - String insertTestEvent = refProp.getStringValue("action.insert.test.event"); - boolean isInsertTestEvent = Boolean.valueOf(insertTestEvent); - + boolean isInsertTestEvent = Boolean.parseBoolean(refProp.getStringValue("action.insert.test.event")); logger.info("PUT isInsertTestEvent={}", isInsertTestEvent); // determine if requested action is permitted model.validateAction(actionCd); logger.info("modelProp - " + prop); logger.info("docText - " + docText); try { - String result = camelProxy.submit(actionCd, prop, bpmnJson, modelName, controlName, docText, isTest, - userId, isInsertTestEvent, model.getEvent().getActionCd()); + String result = camelProxy.executeAction(actionCd, prop, bpmnJson, modelName, controlName, docText, + isTest, userId, isInsertTestEvent, model.getEvent().getActionCd()); logger.info("Starting Camel flow on request, result is: ", result); } catch (SdcCommunicationException | PolicyClientException | BadRequestException e) { - errorCase = true; logger.error("Exception occured during invoking Camel process", e); + errorMessage = e.getMessage(); } - if (!actionCd.equalsIgnoreCase(CldsEvent.ACTION_DELETE)) { - // refresh model info from db (get fresh event info) - retrievedModel = CldsModel.retrieve(cldsDao, modelName, false); - } - if (retrievedModel != null) { - if (!isTest && !errorCase && (actionCd.equalsIgnoreCase(CldsEvent.ACTION_SUBMIT) - || actionCd.equalsIgnoreCase(CldsEvent.ACTION_RESUBMIT) - || actionCd.equalsIgnoreCase(CldsEvent.ACTION_SUBMITDCAE))) { - if (retrievedModel.getTemplateName().startsWith(CsarInstallerImpl.TEMPLATE_NAME_PREFIX)) { - // SDC artifact case - logger.info("Skipping DCAE inventory call as closed loop has been created from SDC notification"); - DcaeEvent dcaeEvent = new DcaeEvent(); - dcaeEvent.setArtifactName(retrievedModel.getControlName() + ".yml"); - dcaeEvent.setEvent(DcaeEvent.EVENT_DISTRIBUTION); - CldsEvent.insEvent(cldsDao, dcaeEvent.getControlName(), userId, dcaeEvent.getCldsActionCd(), - CldsEvent.ACTION_STATE_RECEIVED, null); - } else { - // This should be done only when the call to DCAE - // has not yet been done. When CL comes from SDC - // this is not required as the DCAE inventory call is done - // during the CL deployment. - dcaeInventoryServices.setEventInventory(retrievedModel, getUserId()); - } - retrievedModel.save(cldsDao, getUserId()); - } - // audit log - LoggingUtils.setTimeContext(startTime, new Date()); - auditLogger.info("Process model action completed"); - } else { - logger.error("CldsModel not found in database with modelName: " + modelName); - util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "CldsModel not found in database with modelName " + "modelName", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR); - return new ResponseEntity("CldsModel not found in database with modelName: \" + modelName", HttpStatus.INTERNAL_SERVER_ERROR); - } + // audit log + LoggingUtils.setTimeContext(startTime, new Date()); + auditLogger.info("Process model action completed"); } catch (Exception e) { - errorCase = true; logger.error("Exception occured during putModelAndProcessAction", e); + errorMessage = e.getMessage(); } - if (errorCase) { - util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "putModelAndProcessAction failed", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR); - return new ResponseEntity<>(retrievedModel, HttpStatus.INTERNAL_SERVER_ERROR); + + if (null == errorMessage || (null != errorMessage && !errorMessage.isEmpty())) { + CldsEvent.insEvent(cldsDao, model.getControlName(), getUserId(), actionCd, CldsEvent.ACTION_STATE_ERROR, + null); + // Need a refresh as new events have been inserted + model = CldsModel.retrieve(cldsDao, modelName, false); + if (null == errorMessage) { + errorMessage = "No response from Policy"; + } + model.setErrorMessageForUi(errorMessage); + util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "putModelAndProcessAction failed", Level.INFO, + ONAPLogConstants.ResponseStatus.ERROR); + return new ResponseEntity<>(model, HttpStatus.INTERNAL_SERVER_ERROR); + } else { + // Need a refresh as new events have been inserted, could have been deleted so + // not blocking call + model = CldsModel.retrieve(cldsDao, modelName, true); + util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); + return new ResponseEntity<>(model, HttpStatus.OK); } - util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); - return new ResponseEntity<>(retrievedModel, HttpStatus.OK); } /** * REST service that accepts events for a model. * - * @param test - * @param dcaeEvent + * @param test the test + * @param dcaeEvent the dcae event + * @return the string */ public String postDcaeEvent(String test, DcaeEvent dcaeEvent) { util.entering(request, "CldsService: Post dcae event"); @@ -467,14 +486,14 @@ public class CldsService extends SecureServiceBase { } // Flag indicates whether it is triggered by Validation Test button from // UI - boolean isTest = Boolean.valueOf(test); + boolean isTest = Boolean.parseBoolean(test); 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; + + " 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"); @@ -494,84 +513,22 @@ public class CldsService extends SecureServiceBase { } /** - * REST service that retrieves sdc services + * REST service that retrieves total properties required by UI. * - * @throws GeneralSecurityException - * In case of issue when decryting the SDC password - * @throws DecoderException - * In case of issues with the decoding of the Hex String - */ - public String getSdcServices() throws GeneralSecurityException, DecoderException { - util.entering(request, "CldsService: GET sdc services"); - Date startTime = new Date(); - String retStr; - try { - retStr = createUiServiceFormatJson(sdcCatalogServices.getSdcServicesInformation(null)); - } catch (IOException e) { - logger.error("IOException during SDC communication", e); - throw new SdcCommunicationException("IOException during SDC communication", e); - } - logger.info("value of sdcServices : {}", retStr); - // audit log - LoggingUtils.setTimeContext(startTime, new Date()); - auditLogger.info("GET sdc services completed"); - util.exiting("200", "Get sdc services success", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); - return retStr; - } - - /** - * REST service that retrieves total properties required by UI - * - * @throws IOException - * In case of issues + * @return the sdc properties + * @throws IOException In case of issues */ public String getSdcProperties() throws IOException { - return createPropertiesObjectByUUID("{}"); + return refProp.getJsonTemplate(GLOBAL_PROPERTIES_KEY).toString(); } - /** - * REST service that retrieves total properties by using invariantUUID based on - * refresh and non refresh - * - * @throws GeneralSecurityException - * In case of issues with the decryting the encrypted password - * @throws DecoderException - * In case of issues with the decoding of the Hex String - * @throws IOException - * In case of issue to convert CldsServiceCache to InputStream - */ - public String getSdcPropertiesByServiceUUIDForRefresh( - String serviceInvariantUUID, Boolean refresh) - throws GeneralSecurityException, DecoderException, IOException { - util.entering(request, "CldsService: GET sdc properties by uuid"); - Date startTime = new Date(); - CldsServiceData cldsServiceData = new CldsServiceData(); - cldsServiceData.setServiceInvariantUUID(serviceInvariantUUID); - if (!Optional.ofNullable(refresh).orElse(false)) { - cldsServiceData = cldsDao.getCldsServiceCache(serviceInvariantUUID); - } - if (sdcCatalogServices.isCldsSdcCacheDataExpired(cldsServiceData)) { - cldsServiceData = sdcCatalogServices.getCldsServiceDataWithAlarmConditions(serviceInvariantUUID); - cldsDao.setCldsServiceCache(new CldsDbServiceCache(cldsServiceData)); - } - // filter out VFs the user is not authorized for - cldsServiceData.filterVfs(this); - // format retrieved data into properties json - String sdcProperties = sdcCatalogServices.createPropertiesObjectByUUID(cldsServiceData); - // audit log - LoggingUtils.setTimeContext(startTime, new Date()); - auditLogger.info("GET sdc properties by uuid completed"); - util.exiting("200", "Get sdc properties by uuid success", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); - return sdcProperties; - } /** * Determine if the user is authorized for a particular VF by its invariant * UUID. * - * @param vfInvariantUuid - * @throws NotAuthorizedException - * @return + * @param vfInvariantUuid the vf invariant uuid + * @return boolean or throws NotAuthorizedException */ public boolean isAuthorizedForVf(String vfInvariantUuid) { if (cldsPermissionTypeFilterVf != null && !cldsPermissionTypeFilterVf.isEmpty()) { @@ -590,7 +547,7 @@ public class CldsService extends SecureServiceBase { * Determine if the user is authorized for a particular VF by its invariant * UUID. If not authorized, then NotAuthorizedException is thrown. * - * @param model + * @param model The clds model * @return */ private boolean isAuthorizedForVf(CldsModel model) { @@ -603,141 +560,17 @@ public class CldsService extends SecureServiceBase { } } - private String createUiServiceFormatJson(String responseStr) throws IOException { - if (StringUtils.isBlank(responseStr)) { - return ""; - } - ObjectMapper objectMapper = JacksonUtils.getObjectMapperInstance(); - List rawList = objectMapper.readValue(responseStr, - objectMapper.getTypeFactory().constructCollectionType(List.class, SdcServiceInfo.class)); - ObjectNode invariantIdServiceNode = objectMapper.createObjectNode(); - ObjectNode serviceNode = objectMapper.createObjectNode(); - logger.info("value of cldsserviceiNfolist: {}", rawList); - if (rawList != null && !rawList.isEmpty()) { - List cldsSdcServiceInfoList = sdcCatalogServices.removeDuplicateServices(rawList); - for (SdcServiceInfo currCldsSdcServiceInfo : cldsSdcServiceInfoList) { - if (currCldsSdcServiceInfo != null) { - invariantIdServiceNode.put(currCldsSdcServiceInfo.getInvariantUUID(), - currCldsSdcServiceInfo.getName()); - } - } - serviceNode.putPOJO("service", invariantIdServiceNode); - } - return serviceNode.toString(); - } - - private String createPropertiesObjectByUUID(String cldsResponseStr) throws IOException { - ObjectMapper mapper = JacksonUtils.getObjectMapperInstance(); - SdcServiceDetail cldsSdcServiceDetail = mapper.readValue(cldsResponseStr, SdcServiceDetail.class); - ObjectNode globalPropsJson = (ObjectNode) refProp.getJsonTemplate(GLOBAL_PROPERTIES_KEY); - if (cldsSdcServiceDetail != null && cldsSdcServiceDetail.getUuid() != null) { - /** - * to create json with vf, alarm and locations - */ - ObjectNode serviceObjectNode = createEmptyVfAlarmObject(); - ObjectNode vfObjectNode = mapper.createObjectNode(); - /** - * to create json with vf and vfresourceId - */ - createVfObjectNode(vfObjectNode, cldsSdcServiceDetail.getResources()); - serviceObjectNode.putPOJO(cldsSdcServiceDetail.getInvariantUUID(), vfObjectNode); - ObjectNode byServiceBasicObjetNode = mapper.createObjectNode(); - byServiceBasicObjetNode.putPOJO("byService", serviceObjectNode); - /** - * to create json with VFC Node - */ - ObjectNode emptyvfcobjectNode = createByVFCObjectNode(cldsSdcServiceDetail.getResources()); - byServiceBasicObjetNode.putPOJO("byVf", emptyvfcobjectNode); - globalPropsJson.putPOJO("shared", byServiceBasicObjetNode); - logger.info("valuie of objNode: {}", globalPropsJson); - } - return globalPropsJson.toString(); - } - - private ObjectNode createEmptyVfAlarmObject() { - ObjectMapper mapper = JacksonUtils.getObjectMapperInstance(); - 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, List rawCldsSdcResourceList) { - ObjectMapper mapper = JacksonUtils.getObjectMapperInstance(); - ObjectNode vfNode = mapper.createObjectNode(); - vfNode.put("", ""); - // To remove repeated resource instance name from - // resourceInstanceList - List cldsSdcResourceList = sdcCatalogServices - .removeDuplicateSdcResourceInstances(rawCldsSdcResourceList); - /** - * Creating vf resource node using cldsSdcResource Object - */ - if (cldsSdcResourceList != null && !cldsSdcResourceList.isEmpty()) { - for (SdcResource cldsSdcResource : cldsSdcResourceList) { - if (cldsSdcResource != null && "VF".equalsIgnoreCase(cldsSdcResource.getResoucreType())) { - vfNode.put(cldsSdcResource.getResourceUUID(), cldsSdcResource.getResourceName()); - } - } - } - vfObjectNode2.putPOJO("vf", vfNode); - /** - * creating location json object using properties file value - */ - ObjectNode locationJsonNode; - try { - locationJsonNode = (ObjectNode) mapper.readValue(refProp.getStringValue("ui.location.default"), - JsonNode.class); - } catch (IOException e) { - logger.error("Unable to load ui.location.default JSON in clds-references.properties properly", e); - throw new CldsConfigException( - "Unable to load ui.location.default JSON in clds-references.properties properly", e); - } - vfObjectNode2.putPOJO("location", locationJsonNode); - /** - * creating alarm json object using properties file value - */ - String alarmStringValue = refProp.getStringValue("ui.alarm.default"); - logger.info("value of alarm: {}", alarmStringValue); - ObjectNode alarmStringJsonNode; - try { - alarmStringJsonNode = (ObjectNode) mapper.readValue(alarmStringValue, JsonNode.class); - } catch (IOException e) { - logger.error("Unable to ui.alarm.default JSON in clds-references.properties properly", e); - throw new CldsConfigException("Unable to load ui.alarm.default JSON in clds-references.properties properly", - e); - } - vfObjectNode2.putPOJO("alarmCondition", alarmStringJsonNode); - } - - private ObjectNode createByVFCObjectNode(List cldsSdcResourceList) { - ObjectMapper mapper = JacksonUtils.getObjectMapperInstance(); - 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 (cldsSdcResourceList != null && !cldsSdcResourceList.isEmpty()) { - for (SdcResource cldsSdcResource : cldsSdcResourceList) { - if (cldsSdcResource != null && "VF".equalsIgnoreCase(cldsSdcResource.getResoucreType())) { - vfCObjectNode.putPOJO(cldsSdcResource.getResourceUUID(), subVfCObjectNode); - } - } - } - emptyvfcobjectNode.putPOJO("", vfCObjectNode); - return emptyvfcobjectNode; - } - + /** + * Deploy model response entity. + * + * @param modelName the model name + * @param model the model + * @return the response entity + */ public ResponseEntity deployModel(String modelName, CldsModel model) { util.entering(request, "CldsService: Deploy model"); Date startTime = new Date(); - Boolean errorCase = false; + String errorMessage = ""; try { fillInCldsModel(model); String bpmnJson = cldsBpmnTransformer.doXslTransformToString(model.getBpmnText()); @@ -754,132 +587,132 @@ public class CldsService extends SecureServiceBase { if (model.getDeploymentId() != null && !model.getDeploymentId().isEmpty()) { deploymentId = model.getDeploymentId(); } else { - deploymentId = "closedLoop_" + UUID.randomUUID() + "_deploymentId"; + model.setDeploymentId(deploymentId = "closedLoop_" + UUID.randomUUID() + "_deploymentId"); } - String createNewDeploymentStatusUrl = dcaeDispatcherServices.createNewDeployment(deploymentId, - model.getTypeId(), modelProp.getGlobal().getDeployParameters()); - String operationStatus = dcaeDispatcherServices.getOperationStatusWithRetry(createNewDeploymentStatusUrl); - if ("succeeded".equalsIgnoreCase(operationStatus)) { - String artifactName = model.getControlName(); - if (artifactName != null) { - artifactName = artifactName + ".yml"; - } - DcaeEvent dcaeEvent = new DcaeEvent(); - /* set dcae events */ - dcaeEvent.setArtifactName(artifactName); - dcaeEvent.setEvent(DcaeEvent.EVENT_DEPLOYMENT); - CldsEvent.insEvent(cldsDao, dcaeEvent.getControlName(), getUserId(), dcaeEvent.getCldsActionCd(), - CldsEvent.ACTION_STATE_RECEIVED, null); - model.setDeploymentId(deploymentId); - model.save(cldsDao, getUserId()); - } else { - logger.info("Deploy model (" + modelName + ") failed...Operation Status is - " + operationStatus); - util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "DeployModel failed", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR); - throw new HttpClientErrorException(HttpStatus.INTERNAL_SERVER_ERROR, - "Deploy model (" + modelName + ") failed...Operation Status is - " + operationStatus); - } - logger.info("Deploy model (" + modelName + ") succeeded...Deployment Id is - " + deploymentId); + model.setDeploymentStatusUrl(dcaeDispatcherServices.createNewDeployment(deploymentId, model.getTypeId(), + modelProp.getGlobal().getDeployParameters())); + CldsEvent.insEvent(cldsDao, model.getControlName(), getUserId(), CldsEvent.ACTION_DEPLOY, + CldsEvent.ACTION_STATE_INITIATED, null); + model.save(cldsDao, getUserId()); + // This is a blocking call + checkDcaeDeploymentStatus(model, CldsEvent.ACTION_DEPLOY, true); + // Refresh the model object in any cases for new event + model = CldsModel.retrieve(cldsDao, model.getName(), false); // audit log LoggingUtils.setTimeContext(startTime, new Date()); auditLogger.info("Deploy model completed"); } catch (Exception e) { - errorCase = true; + errorMessage = e.getMessage(); logger.error("Exception occured during deployModel", e); } - if (errorCase) { - util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "DeployModel failed", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR); + if (!errorMessage.isEmpty()) { + model.setErrorMessageForUi(errorMessage); + util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "DeployModel failed", Level.INFO, + ONAPLogConstants.ResponseStatus.ERROR); return new ResponseEntity<>(model, HttpStatus.INTERNAL_SERVER_ERROR); + } else { + util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); + return new ResponseEntity<>(model, HttpStatus.OK); } - util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); - return new ResponseEntity<>(model, HttpStatus.OK); } + /** + * Un deploy model response entity. + * + * @param modelName the model name + * @param model the model + * @return the response entity + */ public ResponseEntity unDeployModel(String modelName, CldsModel model) { util.entering(request, "CldsService: Undeploy model"); Date startTime = new Date(); - Boolean errorCase = false; + String errorMessage = ""; try { SecureServicePermission permisionManage = SecureServicePermission.create(cldsPermissionTypeClManage, cldsPermissionInstance, CldsEvent.ACTION_UNDEPLOY); isAuthorized(permisionManage); isAuthorizedForVf(model); - String operationStatusUndeployUrl = dcaeDispatcherServices.deleteExistingDeployment(model.getDeploymentId(), - model.getTypeId()); - String operationStatus = dcaeDispatcherServices.getOperationStatusWithRetry(operationStatusUndeployUrl); - if ("succeeded".equalsIgnoreCase(operationStatus)) { - String artifactName = model.getControlName(); - if (artifactName != null) { - artifactName = artifactName + ".yml"; - } - DcaeEvent dcaeEvent = new DcaeEvent(); - // set dcae events - dcaeEvent.setArtifactName(artifactName); - dcaeEvent.setEvent(DcaeEvent.EVENT_UNDEPLOYMENT); - CldsEvent.insEvent(cldsDao, model.getControlName(), getUserId(), dcaeEvent.getCldsActionCd(), - CldsEvent.ACTION_STATE_RECEIVED, null); - model.setDeploymentId(null); - model.save(cldsDao, getUserId()); - } else { - logger.info("Undeploy model (" + modelName + ") failed...Operation Status is - " + operationStatus); - util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "UndeployModel failed", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR); - throw new HttpClientErrorException(HttpStatus.INTERNAL_SERVER_ERROR, - "Undeploy model (" + modelName + ") failed...Operation Status is - " + operationStatus); - } - logger.info("Undeploy model (" + modelName + ") succeeded."); + model.setDeploymentStatusUrl( + dcaeDispatcherServices.deleteExistingDeployment(model.getDeploymentId(), model.getTypeId())); + CldsEvent.insEvent(cldsDao, model.getControlName(), getUserId(), CldsEvent.ACTION_UNDEPLOY, + CldsEvent.ACTION_STATE_INITIATED, null); + // clean the deployment ID + model.setDeploymentId(null); + model.save(cldsDao, getUserId()); + // This is a blocking call + checkDcaeDeploymentStatus(model, CldsEvent.ACTION_UNDEPLOY, true); + // Refresh the model object in any cases for new event + model = CldsModel.retrieve(cldsDao, model.getName(), false); // audit log LoggingUtils.setTimeContext(startTime, new Date()); auditLogger.info("Undeploy model completed"); } catch (Exception e) { - errorCase = true; + errorMessage = e.getMessage(); logger.error("Exception occured during unDeployModel", e); } - if (errorCase) { - util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "UndeployModel failed", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR); + if (!errorMessage.isEmpty()) { + model.setErrorMessageForUi(errorMessage); + util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "UndeployModel failed", Level.INFO, + ONAPLogConstants.ResponseStatus.ERROR); return new ResponseEntity<>(model, HttpStatus.INTERNAL_SERVER_ERROR); + } else { + util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); + return new ResponseEntity<>(model, HttpStatus.OK); + } + } + + private void checkDcaeDeploymentStatus(CldsModel model, String cldsEvent, boolean withRetry) + throws InterruptedException { + String operationStatus = withRetry + ? dcaeDispatcherServices.getOperationStatusWithRetry(model.getDeploymentStatusUrl()) + : dcaeDispatcherServices.getOperationStatus(model.getDeploymentStatusUrl()); + if ("succeeded".equalsIgnoreCase(operationStatus)) { + logger.info(cldsEvent + " model (" + model.getName() + ") succeeded...Deployment Id is - " + + model.getDeploymentId()); + CldsEvent.insEvent(cldsDao, model.getControlName(), getUserId(), cldsEvent, + CldsEvent.ACTION_STATE_COMPLETED, null); + } else { + String info = "DCAE " + cldsEvent + " (" + model.getName() + ") failed...Operation Status is - " + + operationStatus; + logger.info(info); + CldsEvent.insEvent(cldsDao, model.getControlName(), getUserId(), cldsEvent, CldsEvent.ACTION_STATE_ERROR, + null); + util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "DCAE operation(" + cldsEvent + ") failed", + Level.INFO, ONAPLogConstants.ResponseStatus.ERROR); + throw new HttpClientErrorException(HttpStatus.INTERNAL_SERVER_ERROR, info); } - util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); - return new ResponseEntity<>(model, HttpStatus.OK); } private void checkForDuplicateServiceVf(String modelName, String modelPropText) throws IOException { - JsonNode globalNode = JacksonUtils.getObjectMapperInstance().readTree(modelPropText).get("global"); - String service = AbstractModelElement.getValueByName(globalNode, "service"); - List resourceVf = AbstractModelElement.getValuesByName(globalNode, "vf"); + JsonElement globalNode = JsonUtils.GSON.fromJson(modelPropText, JsonObject.class).get("global"); + String service = JsonUtils.getStringValueByName(globalNode, "service"); + List resourceVf = JsonUtils.getStringValuesByName(globalNode, "vf"); if (service != null && resourceVf != null && !resourceVf.isEmpty()) { List cldsModelPropList = cldsDao.getDeployedModelProperties(); for (CldsModelProp cldsModelProp : cldsModelPropList) { - JsonNode currentNode = JacksonUtils.getObjectMapperInstance().readTree(cldsModelProp.getPropText()) + JsonElement currentNode = JsonUtils.GSON + .fromJson(cldsModelProp.getPropText(), JsonObject.class) .get("global"); - String currentService = AbstractModelElement.getValueByName(currentNode, "service"); - List currentVf = AbstractModelElement.getValuesByName(currentNode, "vf"); + String currentService = JsonUtils.getStringValueByName(currentNode, "service"); + List currentVf = JsonUtils.getStringValuesByName(currentNode, "vf"); if (currentVf != null && !currentVf.isEmpty()) { if (!modelName.equalsIgnoreCase(cldsModelProp.getName()) && service.equalsIgnoreCase(currentService) && resourceVf.get(0).equalsIgnoreCase(currentVf.get(0))) { throw new BadRequestException("Same Service/VF already exists in " + cldsModelProp.getName() - + " model, please select different Service/VF."); + + " model, please select different Service/VF."); } } } } } - private void updateAndInsertNewEvent(String cldsModelName, String cldsControlNamePrfx, CldsEvent event, - String newAction) { - // If model action is in submit/resubmit/distributed and user try - // to save then we are changing action back to create. - if (event != null && (CldsEvent.ACTION_SUBMIT.equalsIgnoreCase(event.getActionCd()) - || CldsEvent.ACTION_RESUBMIT.equalsIgnoreCase(event.getActionCd()) - || CldsEvent.ACTION_DISTRIBUTE.equalsIgnoreCase(event.getActionCd()))) { - CldsEvent newEvent = new CldsEvent(); - newEvent.setUserid(getUserId()); - newEvent.setActionCd(newAction); - newEvent.setActionStateCd(CldsEvent.ACTION_STATE_COMPLETED); - cldsDao.insEvent(cldsModelName, cldsControlNamePrfx, null, newEvent); - } - } - + /** + * Sets logging util. + * + * @param utilP the util p + */ // Created for the integration test - public void setLoggingUtil (LoggingUtils utilP) { - util = utilP; + public void setLoggingUtil(LoggingUtils utilP) { + util = utilP; } } \ No newline at end of file