X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fmain%2Fjava%2Forg%2Fonap%2Fclamp%2Floop%2FLoopOperation.java;h=87effa5fd830246bf1092304d9526d576e7509a4;hb=8f180977ef87e9bff646e257386689fad28c50e6;hp=7def783b57b5aae762413f123f3010f8c8813ab0;hpb=3ae0ad2234422c6660ae4fbdcf37e8e78dbf7e61;p=clamp.git diff --git a/src/main/java/org/onap/clamp/loop/LoopOperation.java b/src/main/java/org/onap/clamp/loop/LoopOperation.java index 7def783b..87effa5f 100644 --- a/src/main/java/org/onap/clamp/loop/LoopOperation.java +++ b/src/main/java/org/onap/clamp/loop/LoopOperation.java @@ -25,347 +25,241 @@ package org.onap.clamp.loop; import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonNull; import com.google.gson.JsonObject; -import com.google.gson.JsonPrimitive; import java.io.IOException; -import java.lang.reflect.Array; -import java.util.Collection; -import java.util.Date; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; +import java.util.Iterator; +import java.util.Set; +import java.util.UUID; import org.apache.camel.Exchange; -import org.onap.clamp.clds.client.DcaeDispatcherServices; -import org.onap.clamp.clds.config.ClampProperties; -import org.onap.clamp.clds.util.LoggingUtils; -import org.onap.clamp.clds.util.ONAPLogConstants; -import org.onap.clamp.exception.OperationException; -import org.onap.clamp.policy.PolicyOperation; -import org.onap.clamp.util.HttpConnectionManager; -import org.slf4j.event.Level; +import org.apache.camel.Message; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; +import org.onap.clamp.policy.operational.OperationalPolicy; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; -import org.yaml.snakeyaml.Yaml; /** - * Closed loop operations + * Closed loop operations. */ @Component public class LoopOperation { - protected static final EELFLogger logger = EELFManager.getInstance().getLogger(LoopOperation.class); - protected static final EELFLogger auditLogger = EELFManager.getInstance().getMetricsLogger(); - private final DcaeDispatcherServices dcaeDispatcherServices; + protected static final EELFLogger logger = EELFManager.getInstance().getLogger(LoopOperation.class); + protected static final EELFLogger auditLogger = EELFManager.getInstance().getMetricsLogger(); + private static final String DCAE_LINK_FIELD = "links"; + private static final String DCAE_STATUS_FIELD = "status"; + private static final String DCAE_SERVICETYPE_ID = "serviceTypeId"; + private static final String DCAE_INPUTS = "inputs"; + private static final String DCAE_DEPLOYMENT_PREFIX = "CLAMP_"; + private static final String DEPLOYMENT_PARA = "dcaeDeployParameters"; private final LoopService loopService; - private LoggingUtils util = new LoggingUtils(logger); - private PolicyOperation policyOp; - @Autowired - private HttpServletRequest request; + public enum TempLoopState { + NOT_SUBMITTED, SUBMITTED, DEPLOYED, NOT_DEPLOYED, PROCESSING, IN_ERROR; + } + /** + * The constructor. + * + * @param loopService + * The loop service + * @param refProp + * The clamp properties + */ @Autowired - public LoopOperation(LoopService loopService, DcaeDispatcherServices dcaeDispatcherServices, - ClampProperties refProp, HttpConnectionManager httpConnectionManager, PolicyOperation policyOp) { + public LoopOperation(LoopService loopService) { this.loopService = loopService; - this.dcaeDispatcherServices = dcaeDispatcherServices; - this.policyOp = policyOp; } /** - * Deploy the closed loop. + * Get the payload used to send the deploy closed loop request. * - * @param loopName the loop name - * @return the updated loop - * @throws Exceptions during the operation + * @param loop + * The loop + * @return The payload used to send deploy closed loop request + * @throws IOException + * IOException */ - public Loop deployLoop(Exchange camelExchange, String loopName) throws OperationException { - util.entering(request, "CldsService: Deploy model"); - Date startTime = new Date(); - Loop loop = loopService.getLoop(loopName); + public String getDeployPayload(Loop loop) throws IOException { + JsonObject globalProp = loop.getGlobalPropertiesJson(); + JsonObject deploymentProp = globalProp.getAsJsonObject(DEPLOYMENT_PARA); - if (loop == null) { - String msg = "Deploy loop exception: Not able to find closed loop:" + loopName; - util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), msg, Level.INFO, - ONAPLogConstants.ResponseStatus.ERROR); - throw new OperationException(msg); - } + String serviceTypeId = loop.getDcaeBlueprintId(); - // verify the current closed loop state - if (loop.getLastComputedState() != LoopState.SUBMITTED) { - String msg = "Deploy loop exception: This closed loop is in state:" + loop.getLastComputedState() - + ". It could be deployed only when it is in SUBMITTED state."; - util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO, - ONAPLogConstants.ResponseStatus.ERROR); - throw new OperationException(msg); + JsonObject rootObject = new JsonObject(); + rootObject.addProperty(DCAE_SERVICETYPE_ID, serviceTypeId); + if (deploymentProp != null) { + rootObject.add(DCAE_INPUTS, deploymentProp); } + String apiBodyString = rootObject.toString(); + logger.info("Dcae api Body String - " + apiBodyString); + return apiBodyString; + } + + /** + * Get the deployment id. + * + * @param loop + * The loop + * @return The deployment id + * @throws IOException + * IOException + */ + public String getDeploymentId(Loop loop) { // Set the deploymentId if not present yet String deploymentId = ""; // If model is already deployed then pass same deployment id if (loop.getDcaeDeploymentId() != null && !loop.getDcaeDeploymentId().isEmpty()) { deploymentId = loop.getDcaeDeploymentId(); } else { - loop.setDcaeDeploymentId(deploymentId = "closedLoop_" + loopName + "_deploymentId"); + deploymentId = DCAE_DEPLOYMENT_PREFIX + UUID.randomUUID(); } - - Yaml yaml = new Yaml(); - Map yamlMap = yaml.load(loop.getBlueprint()); - JsonObject bluePrint = wrapSnakeObject(yamlMap).getAsJsonObject(); - - loop.setDcaeDeploymentStatusUrl(dcaeDispatcherServices.createNewDeployment(deploymentId, loop.getDcaeBlueprintId(), bluePrint)); - loop.setLastComputedState(LoopState.DEPLOYED); - // save the updated loop - loopService.saveOrUpdateLoop (loop); - - // audit log - LoggingUtils.setTimeContext(startTime, new Date()); - auditLogger.info("Deploy model completed"); - util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); - return loop; + return deploymentId; } /** - * Un deploy closed loop. + * Update the loop info. * - * @param loopName the loop name - * @return the updated loop + * @param camelExchange + * The camel exchange + * @param loop + * The loop + * @param deploymentId + * The deployment id + * @throws ParseException + * The parse exception */ - public Loop unDeployLoop(String loopName) throws OperationException { - util.entering(request, "LoopOperation: Undeploy the closed loop"); - Date startTime = new Date(); - Loop loop = loopService.getLoop(loopName); - - if (loop == null) { - String msg = "Undeploy loop exception: Not able to find closed loop:" + loopName; - util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), msg, Level.INFO, - ONAPLogConstants.ResponseStatus.ERROR); - throw new OperationException(msg); - } - - // verify the current closed loop state - if (loop.getLastComputedState() != LoopState.DEPLOYED) { - String msg = "Unploy loop exception: This closed loop is in state:" + loop.getLastComputedState() - + ". It could be undeployed only when it is in DEPLOYED state."; - util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO, - ONAPLogConstants.ResponseStatus.ERROR); - throw new OperationException(msg); - } - - loop.setDcaeDeploymentStatusUrl( - dcaeDispatcherServices.deleteExistingDeployment(loop.getDcaeDeploymentId(), loop.getDcaeBlueprintId())); - - // clean the deployment ID - loop.setDcaeDeploymentId(null); - loop.setLastComputedState(LoopState.SUBMITTED); - - // save the updated loop - loopService.saveOrUpdateLoop (loop); - - // audit log - LoggingUtils.setTimeContext(startTime, new Date()); - auditLogger.info("Undeploy model completed"); - util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); - return loop; - } - - private JsonElement wrapSnakeObject(Object o) { - //NULL => JsonNull - if (o == null) - return JsonNull.INSTANCE; - - // Collection => JsonArray - if (o instanceof Collection) { - JsonArray array = new JsonArray(); - for (Object childObj : (Collection)o) - array.add(wrapSnakeObject(childObj)); - return array; - } - - // Array => JsonArray - if (o.getClass().isArray()) { - JsonArray array = new JsonArray(); + public void updateLoopInfo(Exchange camelExchange, Loop loop, String deploymentId) throws ParseException { + Message in = camelExchange.getIn(); + String msg = in.getBody(String.class); - int length = Array.getLength(array); - for (int i=0; i JsonObject - if (o instanceof Map) { - Map map = (Map)o; + JSONObject linksObj = (JSONObject) jsonObj.get(DCAE_LINK_FIELD); + String statusUrl = (String) linksObj.get(DCAE_STATUS_FIELD); - JsonObject jsonObject = new JsonObject(); - for (final Map.Entry entry : map.entrySet()) { - final String name = String.valueOf(entry.getKey()); - final Object value = entry.getValue(); - jsonObject.add(name, wrapSnakeObject(value)); - } - return jsonObject; + if (deploymentId == null) { + loop.setDcaeDeploymentId(null); + loop.setDcaeDeploymentStatusUrl(null); + } else { + loop.setDcaeDeploymentId(deploymentId); + loop.setDcaeDeploymentStatusUrl(statusUrl.replaceAll("http:", "http4:").replaceAll("https:", "https4:")); } - - // otherwise take it as a string - return new JsonPrimitive(String.valueOf(o)); + loopService.saveOrUpdateLoop(loop); } /** - * Submit the Ms policies. + * Get the Closed Loop status based on the reply from Policy. * - * @param loopName the loop name - * @return the updated loop - * @throws IOException IO exception - * @throws Exceptions during the operation + * @param statusCode + * The status code + * @return The state based on policy response + * @throws ParseException + * The parse exception */ - public Loop submitMsPolicies (String loopName) throws OperationException, IOException { - util.entering(request, "LoopOperation: delete microservice policies"); - Date startTime = new Date(); - Loop loop = loopService.getLoop(loopName); - - if (loop == null) { - String msg = "Submit MS policies exception: Not able to find closed loop:" + loopName; - util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), msg, Level.INFO, - ONAPLogConstants.ResponseStatus.ERROR); - throw new OperationException(msg); - } - - // verify the current closed loop state - if (loop.getLastComputedState() != LoopState.SUBMITTED && loop.getLastComputedState() != LoopState.DESIGN) { - String msg = "Submit MS policies exception: This closed loop is in state:" + loop.getLastComputedState() - + ". It could be deleted only when it is in SUBMITTED state."; - util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO, - ONAPLogConstants.ResponseStatus.ERROR); - throw new OperationException(msg); + public String analysePolicyResponse(int statusCode) { + if (statusCode == 200) { + return TempLoopState.SUBMITTED.toString(); + } else if (statusCode == 404) { + return TempLoopState.NOT_SUBMITTED.toString(); } - - // Establish the api call to Policy to create the ms services - policyOp.createMsPolicy(loop.getMicroServicePolicies()); - - // audit log - LoggingUtils.setTimeContext(startTime, new Date()); - auditLogger.info("Deletion of MS policies completed"); - util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); - return loop; + return TempLoopState.IN_ERROR.toString(); } - /** - * Delete the Ms policies. + * Get the name of the first Operational policy. * - * @param loopName the loop name - * @return the updated loop - * @throws IOException IO exception - * @throws Exceptions during the operation + * @param loop + * The closed loop + * @return The name of the first operational policy */ - public Loop deleteMsPolicies (Exchange camelExchange, String loopName) throws OperationException, IOException { - util.entering(request, "LoopOperation: delete microservice policies"); - Date startTime = new Date(); - Loop loop = loopService.getLoop(loopName); - - if (loop == null) { - String msg = "Delete MS policies exception: Not able to find closed loop:" + loopName; - util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), msg, Level.INFO, - ONAPLogConstants.ResponseStatus.ERROR); - throw new OperationException(msg); + public String getOperationalPolicyName(Loop loop) { + Set opSet = loop.getOperationalPolicies(); + Iterator iterator = opSet.iterator(); + while (iterator.hasNext()) { + OperationalPolicy policy = iterator.next(); + return policy.getName(); } - - // verify the current closed loop state - if (loop.getLastComputedState() != LoopState.SUBMITTED) { - String msg = "Delete MS policies exception: This closed loop is in state:" + loop.getLastComputedState() - + ". It could be deleted only when it is in SUBMITTED state."; - util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO, - ONAPLogConstants.ResponseStatus.ERROR); - throw new OperationException(msg); - } - - // Establish the api call to Policy to create the ms services - policyOp.deleteMsPolicy(loop.getMicroServicePolicies()); - - // audit log - LoggingUtils.setTimeContext(startTime, new Date()); - auditLogger.info("Deletion of MS policies completed"); - util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); - return loop; + return null; } /** - * Delete the operational policy. + * Get the Closed Loop status based on the reply from DCAE. * - * @param loopName the loop name - * @return the updated loop - * @throws Exceptions during the operation + * @param camelExchange + * The camel exchange + * @return The state based on DCAE response + * @throws ParseException + * The parse exception */ - public Loop deleteOpPolicy (Exchange camelExchange, String loopName) throws OperationException { - util.entering(request, "LoopOperation: delete guard policy"); - Date startTime = new Date(); - Loop loop = loopService.getLoop(loopName); - - if (loop == null) { - String msg = "Delete guard policy exception: Not able to find closed loop:" + loopName; - util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), msg, Level.INFO, - ONAPLogConstants.ResponseStatus.ERROR); - throw new OperationException(msg); + public String analyseDcaeResponse(Exchange camelExchange, Integer statusCode) throws ParseException { + if (statusCode == null) { + return TempLoopState.NOT_DEPLOYED.toString(); } - - // verify the current closed loop state - if (loop.getLastComputedState() != LoopState.SUBMITTED) { - String msg = "Delete MS policies exception: This closed loop is in state:" + loop.getLastComputedState() - + ". It could be deleted only when it is in SUBMITTED state."; - util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO, - ONAPLogConstants.ResponseStatus.ERROR); - throw new OperationException(msg); + if (statusCode == 200) { + Message in = camelExchange.getIn(); + String msg = in.getBody(String.class); + + JSONParser parser = new JSONParser(); + Object obj0 = parser.parse(msg); + JSONObject jsonObj = (JSONObject) obj0; + + String opType = (String) jsonObj.get("operationType"); + String status = (String) jsonObj.get("status"); + + // status = processing/successded/failed + if (status.equals("succeeded")) { + if (opType.equals("install")) { + return TempLoopState.DEPLOYED.toString(); + } else if (opType.equals("uninstall")) { + return TempLoopState.NOT_DEPLOYED.toString(); + } + } else if (status.equals("processing")) { + return TempLoopState.PROCESSING.toString(); + } + } else if (statusCode == 404) { + return TempLoopState.NOT_DEPLOYED.toString(); } - - // Establish the api call to Policy to delete operational policy - //client.deleteOpPolicy(); - - // audit log - LoggingUtils.setTimeContext(startTime, new Date()); - auditLogger.info("Deletion of Guard policy completed"); - util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); - return loop; + return TempLoopState.IN_ERROR.toString(); } /** - * Delete the Guard policy. + * Update the status of the closed loop based on the response from Policy and + * DCAE. * - * @param loopName the loop name - * @return the updated loop - * @throws Exceptions during the operation + * @param loop + * The closed loop + * @param policyState + * The state get from Policy + * @param dcaeState + * The state get from DCAE + * @throws ParseException + * The parse exception */ - public Loop deleteGuardPolicy (Exchange camelExchange, String loopName) throws OperationException { - util.entering(request, "LoopOperation: delete operational policy"); - Date startTime = new Date(); - Loop loop = loopService.getLoop(loopName); - - if (loop == null) { - String msg = "Delete operational policy exception: Not able to find closed loop:" + loopName; - util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), msg, Level.INFO, - ONAPLogConstants.ResponseStatus.ERROR); - throw new OperationException(msg); - } - - // verify the current closed loop state - if (loop.getLastComputedState() != LoopState.SUBMITTED) { - String msg = "Delete MS policies exception: This closed loop is in state:" + loop.getLastComputedState() - + ". It could be deleted only when it is in SUBMITTED state."; - util.exiting(HttpStatus.CONFLICT.toString(), msg, Level.INFO, - ONAPLogConstants.ResponseStatus.ERROR); - throw new OperationException(msg); + public LoopState updateLoopStatus(Loop loop, TempLoopState policyState, TempLoopState dcaeState) { + LoopState clState = LoopState.IN_ERROR; + if (policyState == TempLoopState.SUBMITTED) { + if (dcaeState == TempLoopState.DEPLOYED) { + clState = LoopState.DEPLOYED; + } else if (dcaeState == TempLoopState.PROCESSING) { + clState = LoopState.WAITING; + } else if (dcaeState == TempLoopState.NOT_DEPLOYED) { + clState = LoopState.SUBMITTED; + } + } else if (policyState == TempLoopState.NOT_SUBMITTED) { + if (dcaeState == TempLoopState.NOT_DEPLOYED) { + clState = LoopState.DESIGN; + } } - - // Establish the api call to Policy to delete Guard policy - //client.deleteOpPolicy(); - - // audit log - LoggingUtils.setTimeContext(startTime, new Date()); - auditLogger.info("Deletion of operational policy completed"); - util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED); - return loop; + loop.setLastComputedState(clState); + loopService.saveOrUpdateLoop(loop); + return clState; } + }