X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fonap%2Fclamp%2Fclds%2Fservice%2FCldsService.java;h=2139b3d397547f81e45f79dd64eac416c084e8f3;hb=refs%2Fchanges%2F71%2F59971%2F3;hp=2b6862dc5bbabf01959dea5bb8e5f03d032d0b4e;hpb=f672d393226629afe58b660eaec92d487206f519;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 2b6862dc..2139b3d3 100644 --- a/src/main/java/org/onap/clamp/clds/service/CldsService.java +++ b/src/main/java/org/onap/clamp/clds/service/CldsService.java @@ -17,8 +17,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END============================================ + * Modifications copyright (c) 2018 Nokia * =================================================================== - * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * */ package org.onap.clamp.clds.service; @@ -30,29 +31,15 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import java.io.IOException; -import java.io.InputStream; import java.security.GeneralSecurityException; -import java.util.ArrayList; import java.util.Date; import java.util.List; -import java.util.Properties; +import java.util.Optional; import java.util.UUID; -import java.util.concurrent.TimeUnit; -import javax.annotation.PostConstruct; +import javax.servlet.http.HttpServletRequest; import javax.ws.rs.BadRequestException; -import javax.ws.rs.Consumes; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; import javax.ws.rs.NotAuthorizedException; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import javax.xml.transform.TransformerException; import org.apache.camel.Produce; @@ -70,7 +57,6 @@ 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.CldsHealthCheck; import org.onap.clamp.clds.model.CldsInfo; import org.onap.clamp.clds.model.CldsModel; import org.onap.clamp.clds.model.CldsModelProp; @@ -84,12 +70,16 @@ 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.LoggingUtils; +import org.onap.logging.ref.slf4j.ONAPLogConstants; +import org.slf4j.event.Level; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.client.HttpClientErrorException; @@ -97,147 +87,105 @@ import org.springframework.web.client.HttpClientErrorException; * Service to save and retrieve the CLDS model attributes. */ @Component -@Path("/clds") public class CldsService extends SecureServiceBase { @Produce(uri = "direct:processSubmit") private CamelProxy camelProxy; protected static final EELFLogger securityLogger = EELFManager.getInstance().getSecurityLogger(); - private static final String RESOURCE_NAME = "clds-version.properties"; + protected static final EELFLogger logger = EELFManager.getInstance().getLogger(CldsService.class); + public static final String GLOBAL_PROPERTIES_KEY = "files.globalProperties"; - @Value("${clamp.config.security.permission.type.cl:permission-type-cl}") - private String cldsPersmissionTypeCl; - @Value("${clamp.config.security.permission.type.cl.manage:permission-type-cl-manage}") - private String cldsPermissionTypeClManage; - @Value("${clamp.config.security.permission.type.cl.event:permission-type-cl-event}") - private String cldsPermissionTypeClEvent; - @Value("${clamp.config.security.permission.type.filter.vf:permission-type-filter-vf}") - private String cldsPermissionTypeFilterVf; - @Value("${clamp.config.security.permission.type.template:permission-type-template}") - private String cldsPermissionTypeTemplate; - @Value("${clamp.config.security.permission.instance:dev}") - private String cldsPermissionInstance; - private SecureServicePermission permissionReadCl; - private SecureServicePermission permissionUpdateCl; - private SecureServicePermission permissionReadTemplate; - private SecureServicePermission permissionUpdateTemplate; - - @PostConstruct - private final void afterConstruction() { + private final String cldsPersmissionTypeCl; + private final String cldsPermissionTypeClManage; + private final String cldsPermissionTypeClEvent; + private final String cldsPermissionTypeFilterVf; + private final String cldsPermissionTypeTemplate; + private final String cldsPermissionInstance; + final SecureServicePermission permissionReadCl; + final SecureServicePermission permissionUpdateCl; + final SecureServicePermission permissionReadTemplate; + final SecureServicePermission permissionUpdateTemplate; + + 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; + @Autowired + public CldsService(CldsDao cldsDao, XslTransformer cldsBpmnTransformer, ClampProperties refProp, + SdcCatalogServices sdcCatalogServices, 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.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"); permissionReadTemplate = SecureServicePermission.create(cldsPermissionTypeTemplate, cldsPermissionInstance, - "read"); + "read"); permissionUpdateTemplate = SecureServicePermission.create(cldsPermissionTypeTemplate, cldsPermissionInstance, - "update"); + "update"); } - @Autowired - private CldsDao cldsDao; - @Autowired - private XslTransformer cldsBpmnTransformer; - @Autowired - private ClampProperties refProp; - @Autowired - private SdcCatalogServices sdcCatalogServices; - @Autowired - private DcaeDispatcherServices dcaeDispatcherServices; - @Autowired - private DcaeInventoryServices dcaeInventoryServices; - /* * @return 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 - * (DCAEServiceTypeRequest generated in DCAE application). DEPLOYMENT_ID | - * Id 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. + * MODEL_NAME | Model Name in CLDS application SERVICE_TYPE_ID | TypeId returned + * from the DCAE application when the ClosedLoop is submitted + * (DCAEServiceTypeRequest generated in DCAE application). DEPLOYMENT_ID | Id + * 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. */ - @GET - @Path("/cldsDetails") - @Produces(MediaType.APPLICATION_JSON) public List getCLDSDetails() { + util.entering(request, "CldsService: GET model details"); Date startTime = new Date(); - LoggingUtils.setRequestContext("CldsService: GET model details", getPrincipalName()); - List cldsMonitoringDetailsList = new ArrayList(); - cldsMonitoringDetailsList = cldsDao.getCLDSMonitoringDetails(); + List cldsMonitoringDetailsList = cldsDao.getCLDSMonitoringDetails(); // audit log LoggingUtils.setTimeContext(startTime, new Date()); - LoggingUtils.setResponseContext("0", "Get cldsDetails success", this.getClass().getName()); auditLogger.info("GET cldsDetails completed"); + util.exiting("200", "Get cldsDetails success", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); return cldsMonitoringDetailsList; } /* - * 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 + * 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 */ - @GET - @Path("/cldsInfo") - @Produces(MediaType.APPLICATION_JSON) public CldsInfo getCldsInfo() { - CldsInfo cldsInfo = new CldsInfo(); + util.entering(request, "CldsService: GET cldsInfo"); Date startTime = new Date(); - LoggingUtils.setRequestContext("CldsService: GET cldsInfo", getPrincipalName()); LoggingUtils.setTimeContext(startTime, new Date()); - // Get the user info - cldsInfo.setUserName(getUserName()); - // Get CLDS application version - String cldsVersion = ""; - Properties props = new Properties(); - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - try (InputStream resourceStream = loader.getResourceAsStream(RESOURCE_NAME)) { - props.load(resourceStream); - cldsVersion = props.getProperty("clds.version"); - } catch (Exception ex) { - logger.error("Exception caught during the clds.version reading", ex); - } - cldsInfo.setCldsVersion(cldsVersion); - // Get the user list of permissions - cldsInfo.setPermissionReadCl(isAuthorizedNoException(permissionReadCl)); - cldsInfo.setPermissionUpdateCl(isAuthorizedNoException(permissionUpdateCl)); - cldsInfo.setPermissionReadTemplate(isAuthorizedNoException(permissionReadTemplate)); - cldsInfo.setPermissionUpdateTemplate(isAuthorizedNoException(permissionUpdateTemplate)); + + CldsInfoProvider cldsInfoProvider = new CldsInfoProvider(this); + CldsInfo cldsInfo = cldsInfoProvider.getCldsInfo(); + // audit log LoggingUtils.setTimeContext(startTime, new Date()); - LoggingUtils.setResponseContext("0", "Get cldsInfo success", this.getClass().getName()); securityLogger.info("GET cldsInfo completed"); + util.exiting("200", "Get cldsInfo success", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); return cldsInfo; } - /** - * REST service that retrieves clds healthcheck information. - * - * @return CldsHealthCheck class containing healthcheck info - */ - @GET - @Path("/healthcheck") - @Produces(MediaType.APPLICATION_JSON) - public CldsHealthCheck gethealthcheck() { - CldsHealthCheck cldsHealthCheck = new CldsHealthCheck(); - Date startTime = new Date(); - LoggingUtils.setRequestContext("CldsService: GET healthcheck", getPrincipalName()); - LoggingUtils.setTimeContext(startTime, new Date()); - try { - cldsDao.doHealthCheck(); - cldsHealthCheck.setHealthCheckComponent("CLDS-APP"); - cldsHealthCheck.setHealthCheckStatus("UP"); - cldsHealthCheck.setDescription("OK"); - } catch (Exception e) { - logger.error("CLAMP application DB Error", e); - cldsHealthCheck.setHealthCheckComponent("CLDS-APP"); - cldsHealthCheck.setHealthCheckStatus("DOWN"); - cldsHealthCheck.setDescription("NOT-OK"); - } - // audit log - LoggingUtils.setTimeContext(startTime, new Date()); - LoggingUtils.setResponseContext("0", "Get healthcheck success", this.getClass().getName()); - securityLogger.info("GET healthcheck completed"); - return cldsHealthCheck; - } - /** * 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 @@ -246,43 +194,37 @@ public class CldsService extends SecureServiceBase { * @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) { + public String getBpmnXml(String modelName) { + util.entering(request, "CldsService: GET model bpmn"); Date startTime = new Date(); - LoggingUtils.setRequestContext("CldsService: GET model bpmn", getPrincipalName()); isAuthorized(permissionReadCl); logger.info("GET bpmnText for modelName={}", modelName); CldsModel model = CldsModel.retrieve(cldsDao, modelName, false); // audit log LoggingUtils.setTimeContext(startTime, new Date()); - LoggingUtils.setResponseContext("0", "Get model bpmn success", this.getClass().getName()); auditLogger.info("GET model bpmn completed"); + util.exiting("200", "Get model bpmn success", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); return model.getBpmnText(); } /** - * 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. + * 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) { + public String getImageXml(String modelName) { + util.entering(request, "CldsService: GET model image"); Date startTime = new Date(); - LoggingUtils.setRequestContext("CldsService: GET model image", getPrincipalName()); isAuthorized(permissionReadCl); logger.info("GET imageText for modelName={}", modelName); CldsModel model = CldsModel.retrieve(cldsDao, modelName, false); // audit log LoggingUtils.setTimeContext(startTime, new Date()); - LoggingUtils.setResponseContext("0", "Get model image success", this.getClass().getName()); auditLogger.info("GET model image completed"); + util.exiting("200", "Get model image success", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); return model.getImageText(); } @@ -292,12 +234,9 @@ public class CldsService extends SecureServiceBase { * @param modelName * @return clds model - clds model for the given model name */ - @GET - @Path("/model/{modelName}") - @Produces(MediaType.APPLICATION_JSON) - public CldsModel getModel(@PathParam("modelName") String modelName) { + public CldsModel getModel(String modelName) { + util.entering(request, "CldsService: GET model"); Date startTime = new Date(); - LoggingUtils.setRequestContext("CldsService: GET model", getPrincipalName()); isAuthorized(permissionReadCl); logger.debug("GET model for modelName={}", modelName); CldsModel cldsModel = CldsModel.retrieve(cldsDao, modelName, false); @@ -314,8 +253,8 @@ public class CldsService extends SecureServiceBase { } // audit log LoggingUtils.setTimeContext(startTime, new Date()); - LoggingUtils.setResponseContext("0", "Get model success", this.getClass().getName()); auditLogger.info("GET model completed"); + util.exiting("200", "Get model success", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); return cldsModel; } @@ -324,13 +263,9 @@ public class CldsService extends SecureServiceBase { * * @param modelName */ - @PUT - @Path("/model/{modelName}") - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - public CldsModel putModel(@PathParam("modelName") String modelName, CldsModel cldsModel) { + public CldsModel putModel(String modelName, CldsModel cldsModel) { + util.entering(request, "CldsService: PUT model"); Date startTime = new Date(); - LoggingUtils.setRequestContext("CldsService: PUT model", getPrincipalName()); isAuthorized(permissionUpdateCl); isAuthorizedForVf(cldsModel); logger.info("PUT model for modelName={}", modelName); @@ -338,21 +273,14 @@ public class CldsService extends SecureServiceBase { 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()); - // This is to provide the Bpmn XML when Template part in UI is - // disabled - cldsModel.setBpmnText(template.getBpmnText()); - } - } + fillInCldsModel(cldsModel); + updateAndInsertNewEvent(cldsModel.getName(), cldsModel.getControlNamePrefix(), cldsModel.getEvent(), + CldsEvent.ACTION_MODIFY); cldsModel.save(cldsDao, getUserId()); // audit log LoggingUtils.setTimeContext(startTime, new Date()); - LoggingUtils.setResponseContext("0", "Put model success", this.getClass().getName()); auditLogger.info("PUT model completed"); + util.exiting("200", "Put model success", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); return cldsModel; } @@ -361,19 +289,16 @@ public class CldsService extends SecureServiceBase { * * @return model names in JSON */ - @GET - @Path("/model-names") - @Produces(MediaType.APPLICATION_JSON) public List getModelNames() { + util.entering(request, "CldsService: GET model names"); Date startTime = new Date(); - LoggingUtils.setRequestContext("CldsService: GET model names", getPrincipalName()); isAuthorized(permissionReadCl); logger.info("GET list of model names"); List names = cldsDao.getBpmnNames(); // audit log LoggingUtils.setTimeContext(startTime, new Date()); - LoggingUtils.setResponseContext("0", "Get model names success", this.getClass().getName()); auditLogger.info("GET model names completed"); + util.exiting("200", "Get model names success", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); return names; } @@ -396,33 +321,29 @@ public class CldsService extends SecureServiceBase { * * @param action * @param modelName - * @param test + * @param validateFlag * @param model * @return * @throws TransformerException - * In case of issues when doing the XSLT of the BPMN flow + * In case of issues when doing the XSLT of the BPMN flow * @throws ParseException - * In case of issues when parsing the JSON + * In case of issues when parsing the JSON * @throws GeneralSecurityException - * In case of issues when decrypting the password + * In case of issues when decrypting the password * @throws DecoderException - * In case of issues with the Hex String decoding + * In case of issues with the Hex String decoding */ - @PUT - @Path("/action/{action}/{modelName}") - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - public Response putModelAndProcessAction(@PathParam("action") String action, - @PathParam("modelName") String modelName, @QueryParam("test") String test, CldsModel model) + 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; try { - LoggingUtils.setRequestContext("CldsService: Process model action", getPrincipalName()); String actionCd = action.toUpperCase(); SecureServicePermission permisionManage = SecureServicePermission.create(cldsPermissionTypeClManage, - cldsPermissionInstance, actionCd); + cldsPermissionInstance, actionCd); isAuthorized(permisionManage); isAuthorizedForVf(model); String userId = getUserId(); @@ -437,6 +358,7 @@ public class CldsService extends SecureServiceBase { this.fillInCldsModel(model); // save model to db model.setName(modelName); + updateAndInsertNewEvent(modelName, model.getControlNamePrefix(), model.getEvent(), CldsEvent.ACTION_MODIFY); model.save(cldsDao, getUserId()); // get vars and format if necessary String prop = model.getPropText(); @@ -448,23 +370,19 @@ public class CldsService extends SecureServiceBase { // Flag indicates whether it is triggered by Validation Test button // from // UI - boolean isTest = false; - if (test != null && test.equalsIgnoreCase("true")) { - isTest = true; - } else { + boolean isTest = Boolean.valueOf(test); + if (!isTest) { String actionTestOverride = refProp.getStringValue("action.test.override"); - if (actionTestOverride != null && actionTestOverride.equalsIgnoreCase("true")) { + if (Boolean.valueOf(actionTestOverride)) { 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; - } + boolean isInsertTestEvent = Boolean.valueOf(insertTestEvent); + logger.info("PUT isInsertTestEvent={}", isInsertTestEvent); // determine if requested action is permitted model.validateAction(actionCd); @@ -472,34 +390,55 @@ public class CldsService extends SecureServiceBase { logger.info("docText - " + docText); try { String result = camelProxy.submit(actionCd, prop, bpmnJson, modelName, controlName, docText, isTest, - userId, isInsertTestEvent); + 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); } - // refresh model info from db (get fresh event info) - retrievedModel = CldsModel.retrieve(cldsDao, modelName, false); - if (!isTest && (actionCd.equalsIgnoreCase(CldsEvent.ACTION_SUBMIT) + 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 && (actionCd.equalsIgnoreCase(CldsEvent.ACTION_SUBMIT) || actionCd.equalsIgnoreCase(CldsEvent.ACTION_RESUBMIT) || actionCd.equalsIgnoreCase(CldsEvent.ACTION_SUBMITDCAE))) { - // To verify inventory status and modify model status to - // distribute - dcaeInventoryServices.setEventInventory(retrievedModel, getUserId()); - retrievedModel.save(cldsDao, getUserId()); + 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()); - LoggingUtils.setResponseContext("0", "Process model action success", this.getClass().getName()); - auditLogger.info("Process model action completed"); } catch (Exception e) { errorCase = true; logger.error("Exception occured during putModelAndProcessAction", e); } if (errorCase) { - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(retrievedModel).build(); + util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "putModelAndProcessAction failed", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR); + return new ResponseEntity<>(retrievedModel, HttpStatus.INTERNAL_SERVER_ERROR); } - return Response.status(Response.Status.OK).entity(retrievedModel).build(); + util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); + return new ResponseEntity<>(retrievedModel, HttpStatus.OK); } /** @@ -508,35 +447,28 @@ public class CldsService extends SecureServiceBase { * @param test * @param dcaeEvent */ - @POST - @Path("/dcae/event") - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - public String postDcaeEvent(@QueryParam("test") String test, DcaeEvent dcaeEvent) { + public String postDcaeEvent(String test, DcaeEvent dcaeEvent) { + util.entering(request, "CldsService: Post dcae event"); Date startTime = new Date(); - LoggingUtils.setRequestContext("CldsService: Post dcae event", getPrincipalName()); String userid = null; // TODO: allow auth checking to be turned off by removing the permission // type property if (cldsPermissionTypeClEvent != null && cldsPermissionTypeClEvent.length() > 0) { SecureServicePermission permissionEvent = SecureServicePermission.create(cldsPermissionTypeClEvent, - cldsPermissionInstance, dcaeEvent.getEvent()); + cldsPermissionInstance, dcaeEvent.getEvent()); isAuthorized(permissionEvent); userid = getUserId(); } // Flag indicates whether it is triggered by Validation Test button from // UI - boolean isTest = false; - if (test != null && test.equalsIgnoreCase("true")) { - isTest = true; - } + boolean isTest = Boolean.valueOf(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"); @@ -545,13 +477,13 @@ public class CldsService extends SecureServiceBase { CldsModel.insertModelInstance(cldsDao, dcaeEvent, userid); } else { CldsEvent.insEvent(cldsDao, dcaeEvent.getControlName(), userid, dcaeEvent.getCldsActionCd(), - CldsEvent.ACTION_STATE_RECEIVED, null); + CldsEvent.ACTION_STATE_RECEIVED, null); } } // audit log LoggingUtils.setTimeContext(startTime, new Date()); - LoggingUtils.setResponseContext("0", "Post dcae event success", this.getClass().getName()); auditLogger.info("Post dcae event completed"); + util.exiting("200", "Post dcae event success", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); return msgInfo; } @@ -559,16 +491,13 @@ public class CldsService extends SecureServiceBase { * REST service that retrieves sdc services * * @throws GeneralSecurityException - * In case of issue when decryting the SDC password + * In case of issue when decryting the SDC password * @throws DecoderException - * In case of issues with the decoding of the Hex String + * In case of issues with the decoding of the Hex String */ - @GET - @Path("/sdc/services") - @Produces(MediaType.APPLICATION_JSON) public String getSdcServices() throws GeneralSecurityException, DecoderException { + util.entering(request, "CldsService: GET sdc services"); Date startTime = new Date(); - LoggingUtils.setRequestContext("CldsService: GET sdc services", getPrincipalName()); String retStr; try { retStr = createUiServiceFormatJson(sdcCatalogServices.getSdcServicesInformation(null)); @@ -579,8 +508,8 @@ public class CldsService extends SecureServiceBase { logger.info("value of sdcServices : {}", retStr); // audit log LoggingUtils.setTimeContext(startTime, new Date()); - LoggingUtils.setResponseContext("0", "Get sdc services success", this.getClass().getName()); auditLogger.info("GET sdc services completed"); + util.exiting("200", "Get sdc services success", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); return retStr; } @@ -588,38 +517,31 @@ public class CldsService extends SecureServiceBase { * REST service that retrieves total properties required by UI * * @throws IOException - * In case of issues + * In case of issues */ - @GET - @Path("/properties") - @Produces(MediaType.APPLICATION_JSON) public String getSdcProperties() throws IOException { return createPropertiesObjectByUUID("{}"); } /** - * REST service that retrieves total properties by using invariantUUID based - * on refresh and non refresh + * 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 + * In case of issues with the decryting the encrypted password * @throws DecoderException - * In case of issues with the decoding of the Hex String + * In case of issues with the decoding of the Hex String * @throws IOException - * In case of issue to convert CldsServiceCache to InputStream + * In case of issue to convert CldsServiceCache to InputStream */ - @GET - @Path("/properties/{serviceInvariantUUID}") - @Produces(MediaType.APPLICATION_JSON) public String getSdcPropertiesByServiceUUIDForRefresh( - @PathParam("serviceInvariantUUID") String serviceInvariantUUID, - @DefaultValue("false") @QueryParam("refresh") boolean refresh) + String serviceInvariantUUID, Boolean refresh) throws GeneralSecurityException, DecoderException, IOException { + util.entering(request, "CldsService: GET sdc properties by uuid"); Date startTime = new Date(); - LoggingUtils.setRequestContext("CldsService: GET sdc properties by uuid", getPrincipalName()); CldsServiceData cldsServiceData = new CldsServiceData(); cldsServiceData.setServiceInvariantUUID(serviceInvariantUUID); - if (!refresh) { + if (!Optional.ofNullable(refresh).orElse(false)) { cldsServiceData = cldsDao.getCldsServiceCache(serviceInvariantUUID); } if (sdcCatalogServices.isCldsSdcCacheDataExpired(cldsServiceData)) { @@ -632,8 +554,8 @@ public class CldsService extends SecureServiceBase { String sdcProperties = sdcCatalogServices.createPropertiesObjectByUUID(cldsServiceData); // audit log LoggingUtils.setTimeContext(startTime, new Date()); - LoggingUtils.setResponseContext("0", "Get sdc properties by uuid success", this.getClass().getName()); auditLogger.info("GET sdc properties by uuid completed"); + util.exiting("200", "Get sdc properties by uuid success", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); return sdcProperties; } @@ -648,7 +570,7 @@ public class CldsService extends SecureServiceBase { public boolean isAuthorizedForVf(String vfInvariantUuid) { if (cldsPermissionTypeFilterVf != null && !cldsPermissionTypeFilterVf.isEmpty()) { SecureServicePermission permission = SecureServicePermission.create(cldsPermissionTypeFilterVf, - cldsPermissionInstance, vfInvariantUuid); + cldsPermissionInstance, vfInvariantUuid); return isAuthorized(permission); } else { // if CLDS_PERMISSION_TYPE_FILTER_VF property is not provided, then @@ -681,7 +603,7 @@ public class CldsService extends SecureServiceBase { } ObjectMapper objectMapper = JacksonUtils.getObjectMapperInstance(); List rawList = objectMapper.readValue(responseStr, - objectMapper.getTypeFactory().constructCollectionType(List.class, SdcServiceInfo.class)); + objectMapper.getTypeFactory().constructCollectionType(List.class, SdcServiceInfo.class)); ObjectNode invariantIdServiceNode = objectMapper.createObjectNode(); ObjectNode serviceNode = objectMapper.createObjectNode(); logger.info("value of cldsserviceiNfolist: {}", rawList); @@ -690,7 +612,7 @@ public class CldsService extends SecureServiceBase { for (SdcServiceInfo currCldsSdcServiceInfo : cldsSdcServiceInfoList) { if (currCldsSdcServiceInfo != null) { invariantIdServiceNode.put(currCldsSdcServiceInfo.getInvariantUUID(), - currCldsSdcServiceInfo.getName()); + currCldsSdcServiceInfo.getName()); } } serviceNode.putPOJO("service", invariantIdServiceNode); @@ -746,7 +668,7 @@ public class CldsService extends SecureServiceBase { // To remove repeated resource instance name from // resourceInstanceList List cldsSdcResourceList = sdcCatalogServices - .removeDuplicateSdcResourceInstances(rawCldsSdcResourceList); + .removeDuplicateSdcResourceInstances(rawCldsSdcResourceList); /** * Creating vf resource node using cldsSdcResource Object */ @@ -764,11 +686,11 @@ public class CldsService extends SecureServiceBase { ObjectNode locationJsonNode; try { locationJsonNode = (ObjectNode) mapper.readValue(refProp.getStringValue("ui.location.default"), - JsonNode.class); + 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); + "Unable to load ui.location.default JSON in clds-references.properties properly", e); } vfObjectNode2.putPOJO("location", locationJsonNode); /** @@ -782,7 +704,7 @@ public class CldsService extends SecureServiceBase { } 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); + e); } vfObjectNode2.putPOJO("alarmCondition", alarmStringJsonNode); } @@ -806,20 +728,20 @@ public class CldsService extends SecureServiceBase { return emptyvfcobjectNode; } - @PUT - @Path("/deploy/{modelName}") - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - public Response deployModel(@PathParam("modelName") String modelName, CldsModel model) { + public ResponseEntity deployModel(String modelName, CldsModel model) { + util.entering(request, "CldsService: Deploy model"); Date startTime = new Date(); - LoggingUtils.setRequestContext("CldsService: Deploy model", getPrincipalName()); Boolean errorCase = false; try { fillInCldsModel(model); String bpmnJson = cldsBpmnTransformer.doXslTransformToString(model.getBpmnText()); logger.info("PUT bpmnJson={}", bpmnJson); + SecureServicePermission permisionManage = SecureServicePermission.create(cldsPermissionTypeClManage, + cldsPermissionInstance, CldsEvent.ACTION_DEPLOY); + isAuthorized(permisionManage); + isAuthorizedForVf(model); ModelProperties modelProp = new ModelProperties(modelName, model.getControlName(), CldsEvent.ACTION_DEPLOY, - false, bpmnJson, model.getPropText()); + false, bpmnJson, model.getPropText()); checkForDuplicateServiceVf(modelName, model.getPropText()); String deploymentId = ""; // If model is already deployed then pass same deployment id @@ -829,16 +751,8 @@ public class CldsService extends SecureServiceBase { deploymentId = "closedLoop_" + UUID.randomUUID() + "_deploymentId"; } String createNewDeploymentStatusUrl = dcaeDispatcherServices.createNewDeployment(deploymentId, - model.getTypeId(), modelProp.getGlobal().getDeployParameters()); - String operationStatus = "processing"; - long waitingTime = System.nanoTime() + TimeUnit.MINUTES.toNanos(10); - while ("processing".equalsIgnoreCase(operationStatus)) { - // Break the loop if waiting for more than 10 mins - if (waitingTime < System.nanoTime()) { - break; - } - operationStatus = dcaeDispatcherServices.getOperationStatus(createNewDeploymentStatusUrl); - } + model.getTypeId(), modelProp.getGlobal().getDeployParameters()); + String operationStatus = dcaeDispatcherServices.getOperationStatusWithRetry(createNewDeploymentStatusUrl); if ("succeeded".equalsIgnoreCase(operationStatus)) { String artifactName = model.getControlName(); if (artifactName != null) { @@ -849,48 +763,43 @@ public class CldsService extends SecureServiceBase { dcaeEvent.setArtifactName(artifactName); dcaeEvent.setEvent(DcaeEvent.EVENT_DEPLOYMENT); CldsEvent.insEvent(cldsDao, dcaeEvent.getControlName(), getUserId(), dcaeEvent.getCldsActionCd(), - CldsEvent.ACTION_STATE_RECEIVED, null); + 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); + "Deploy model (" + modelName + ") failed...Operation Status is - " + operationStatus); } logger.info("Deploy model (" + modelName + ") succeeded...Deployment Id is - " + deploymentId); // audit log LoggingUtils.setTimeContext(startTime, new Date()); - LoggingUtils.setResponseContext("0", "Deploy model success", this.getClass().getName()); auditLogger.info("Deploy model completed"); } catch (Exception e) { errorCase = true; logger.error("Exception occured during deployModel", e); } if (errorCase) { - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(model).build(); + util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "DeployModel failed", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR); + return new ResponseEntity<>(model, HttpStatus.INTERNAL_SERVER_ERROR); } - return Response.status(Response.Status.OK).entity(model).build(); + util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); + return new ResponseEntity<>(model, HttpStatus.OK); } - @PUT - @Path("/undeploy/{modelName}") - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - public Response unDeployModel(@PathParam("modelName") String modelName, CldsModel model) { + public ResponseEntity unDeployModel(String modelName, CldsModel model) { + util.entering(request, "CldsService: Undeploy model"); Date startTime = new Date(); - LoggingUtils.setRequestContext("CldsService: Undeploy model", getPrincipalName()); Boolean errorCase = false; try { + SecureServicePermission permisionManage = SecureServicePermission.create(cldsPermissionTypeClManage, + cldsPermissionInstance, CldsEvent.ACTION_UNDEPLOY); + isAuthorized(permisionManage); + isAuthorizedForVf(model); String operationStatusUndeployUrl = dcaeDispatcherServices.deleteExistingDeployment(model.getDeploymentId(), - model.getTypeId()); - String operationStatus = "processing"; - long waitingTime = System.nanoTime() + TimeUnit.MINUTES.toNanos(10); - while ("processing".equalsIgnoreCase(operationStatus)) { - if (waitingTime < System.nanoTime()) { - break; - } - operationStatus = dcaeDispatcherServices.getOperationStatus(operationStatusUndeployUrl); - } + model.getTypeId()); + String operationStatus = dcaeDispatcherServices.getOperationStatusWithRetry(operationStatusUndeployUrl); if ("succeeded".equalsIgnoreCase(operationStatus)) { String artifactName = model.getControlName(); if (artifactName != null) { @@ -901,27 +810,29 @@ public class CldsService extends SecureServiceBase { dcaeEvent.setArtifactName(artifactName); dcaeEvent.setEvent(DcaeEvent.EVENT_UNDEPLOYMENT); CldsEvent.insEvent(cldsDao, model.getControlName(), getUserId(), dcaeEvent.getCldsActionCd(), - CldsEvent.ACTION_STATE_RECEIVED, null); + 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); + "Undeploy model (" + modelName + ") failed...Operation Status is - " + operationStatus); } logger.info("Undeploy model (" + modelName + ") succeeded."); // audit log LoggingUtils.setTimeContext(startTime, new Date()); - LoggingUtils.setResponseContext("0", "Undeploy model success", this.getClass().getName()); auditLogger.info("Undeploy model completed"); } catch (Exception e) { errorCase = true; logger.error("Exception occured during unDeployModel", e); } if (errorCase) { - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(model).build(); + util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "UndeployModel failed", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR); + return new ResponseEntity<>(model, HttpStatus.INTERNAL_SERVER_ERROR); } - return Response.status(Response.Status.OK).entity(model).build(); + 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 { @@ -932,17 +843,37 @@ public class CldsService extends SecureServiceBase { List cldsModelPropList = cldsDao.getDeployedModelProperties(); for (CldsModelProp cldsModelProp : cldsModelPropList) { JsonNode currentNode = JacksonUtils.getObjectMapperInstance().readTree(cldsModelProp.getPropText()) - .get("global"); + .get("global"); String currentService = AbstractModelElement.getValueByName(currentNode, "service"); List currentVf = AbstractModelElement.getValuesByName(currentNode, "vf"); if (currentVf != null && !currentVf.isEmpty()) { if (!modelName.equalsIgnoreCase(cldsModelProp.getName()) && service.equalsIgnoreCase(currentService) - && resourceVf.get(0).equalsIgnoreCase(currentVf.get(0))) { + && 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); + } + } + + // Created for the integration test + public void setLoggingUtil (LoggingUtils utilP) { + util = utilP; + } } \ No newline at end of file