X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fonap%2Fclamp%2Fclds%2Fclient%2FDcaeInventoryServices.java;h=7f209199de55264da1ebd0f6dc13f9b40325eea3;hb=f9433d61033f65e9ed1f685d1e0db99b077bb7e1;hp=4dfe089f95917e11b5b780f3c643c9a7c6e458cb;hpb=7c083746477e46a662ce3eb2664a050a210d971f;p=clamp.git diff --git a/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java b/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java index 4dfe089f..7f209199 100644 --- a/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java +++ b/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java @@ -17,38 +17,35 @@ * 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.client; import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; import java.io.IOException; -import java.security.GeneralSecurityException; import java.util.Date; import java.util.List; -import javax.ws.rs.BadRequestException; - -import org.apache.commons.codec.DecoderException; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; +import org.onap.clamp.clds.config.ClampProperties; import org.onap.clamp.clds.dao.CldsDao; import org.onap.clamp.clds.model.CldsEvent; import org.onap.clamp.clds.model.CldsModel; import org.onap.clamp.clds.model.DcaeEvent; -import org.onap.clamp.clds.model.prop.Global; -import org.onap.clamp.clds.model.prop.ModelProperties; -import org.onap.clamp.clds.model.refprop.RefProp; +import org.onap.clamp.clds.model.dcae.DcaeInventoryResponse; +import org.onap.clamp.clds.model.properties.Global; +import org.onap.clamp.clds.model.properties.ModelProperties; +import org.onap.clamp.clds.util.JsonUtils; import org.onap.clamp.clds.util.LoggingUtils; +import org.onap.clamp.util.HttpConnectionManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -61,31 +58,38 @@ public class DcaeInventoryServices { protected static final EELFLogger logger = EELFManager.getInstance().getLogger(DcaeInventoryServices.class); protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger(); protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger(); - private static final String DCAE_INVENTORY_URL = "DCAE_INVENTORY_URL"; - @Autowired - private RefProp refProp; + public static final String DCAE_INVENTORY_URL = "dcae.inventory.url"; + public static final String DCAE_INVENTORY_RETRY_INTERVAL = "dcae.intentory.retry.interval"; + public static final String DCAE_INVENTORY_RETRY_LIMIT = "dcae.intentory.retry.limit"; + private final ClampProperties refProp; + private final CldsDao cldsDao; + private final HttpConnectionManager httpConnectionManager; + + /** + * Constructor. + */ @Autowired - private CldsDao cldsDao; + public DcaeInventoryServices(ClampProperties refProp, CldsDao cldsDao, + HttpConnectionManager httpConnectionManager) { + this.refProp = refProp; + this.cldsDao = cldsDao; + this.httpConnectionManager = httpConnectionManager; + } /** * Set the event inventory. - * + * * @param cldsModel - * The CldsModel + * The CldsModel * @param userId - * The user ID - * @throws GeneralSecurityException - * In case of issue when decryting the DCAE password + * The user ID * @throws ParseException - * In case of DCAE Json parse exception - * @throws DecoderException - * In case of issues with HexString decoding + * In case of DCAE Json parse exception */ - public void setEventInventory(CldsModel cldsModel, String userId) - throws GeneralSecurityException, ParseException, DecoderException { + public void setEventInventory(CldsModel cldsModel, String userId) throws InterruptedException { String artifactName = cldsModel.getControlName(); DcaeEvent dcaeEvent = new DcaeEvent(); - String isDcaeInfoAvailable = null; + DcaeInventoryResponse dcaeResponse = null; Date startTime = new Date(); LoggingUtils.setTargetContext("DCAE", "setEventInventory"); if (artifactName != null) { @@ -93,8 +97,8 @@ public class DcaeInventoryServices { } try { // Below are the properties required for calling the dcae inventory - ModelProperties prop = new ModelProperties(cldsModel.getName(), cldsModel.getControlName(), null, false, - "{}", cldsModel.getPropText()); + ModelProperties prop = new ModelProperties(cldsModel.getName(), cldsModel.getControlName(), null, + false, "{}", cldsModel.getPropText()); Global global = prop.getGlobal(); String invariantServiceUuid = global.getService(); List resourceUuidList = global.getResourceVf(); @@ -103,12 +107,12 @@ public class DcaeInventoryServices { resourceUuid = resourceUuidList.get(0); } /* Inventory service url is called in this method */ - isDcaeInfoAvailable = getDcaeInformation(artifactName, invariantServiceUuid, resourceUuid); + dcaeResponse = getDcaeInformation(artifactName, invariantServiceUuid, resourceUuid); /* set dcae events */ dcaeEvent.setArtifactName(artifactName); dcaeEvent.setEvent(DcaeEvent.EVENT_DISTRIBUTION); LoggingUtils.setResponseContext("0", "Set inventory success", this.getClass().getName()); - } catch (JsonProcessingException e) { + } catch (ParseException e) { LoggingUtils.setResponseContext("900", "Set inventory failed", this.getClass().getName()); LoggingUtils.setErrorContext("900", "Set inventory error"); logger.error("Error during JSON decoding", e); @@ -120,27 +124,24 @@ public class DcaeInventoryServices { LoggingUtils.setTimeContext(startTime, new Date()); metricsLogger.info("setEventInventory complete"); } - /* Null whether the DCAE has items lenght or not */ - if (isDcaeInfoAvailable != null) { - /* Inserting Event in to DB */ - logger.info(isDcaeInfoAvailable); - JSONParser parser = new JSONParser(); - Object obj0 = parser.parse(isDcaeInfoAvailable); - JSONObject jsonObj = (JSONObject) obj0; + this.analyzeAndSaveDcaeResponse(dcaeResponse, cldsModel, dcaeEvent, userId); + } + + private void analyzeAndSaveDcaeResponse(DcaeInventoryResponse dcaeResponse, CldsModel cldsModel, + DcaeEvent dcaeEvent, String userId) { + if (dcaeResponse != null) { + logger.info("Dcae Response for query on inventory: " + dcaeResponse); String oldTypeId = cldsModel.getTypeId(); - String newTypeId = ""; - if (jsonObj.get("typeId") != null) { - newTypeId = jsonObj.get("typeId").toString(); - cldsModel.setTypeId(jsonObj.get("typeId").toString()); + if (dcaeResponse.getTypeId() != null) { + cldsModel.setTypeId(dcaeResponse.getTypeId()); } - // cldsModel.setTypeName(cldsModel.getControlName().toString()+".yml"); - if (jsonObj.get("typeName") != null) { - cldsModel.setTypeName(jsonObj.get("typeName").toString()); + if (dcaeResponse.getTypeName() != null) { + cldsModel.setTypeName(dcaeResponse.getTypeName()); } - if (oldTypeId == null || !oldTypeId.equalsIgnoreCase(newTypeId) - || cldsModel.getEvent().getActionCd().equalsIgnoreCase(CldsEvent.ACTION_SUBMITDCAE)) { + if (oldTypeId == null || !cldsModel.getEvent().getActionCd().equalsIgnoreCase(CldsEvent.ACTION_DISTRIBUTE) + || cldsModel.getEvent().getActionCd().equalsIgnoreCase(CldsEvent.ACTION_SUBMITDCAE)) { CldsEvent.insEvent(cldsDao, dcaeEvent.getControlName(), userId, dcaeEvent.getCldsActionCd(), - CldsEvent.ACTION_STATE_RECEIVED, null); + CldsEvent.ACTION_STATE_RECEIVED, null); } cldsModel.save(cldsDao, userId); } else { @@ -148,116 +149,77 @@ public class DcaeInventoryServices { } } + private int getTotalCountFromDcaeInventoryResponse(String responseStr) throws ParseException { + JSONParser parser = new JSONParser(); + Object obj0 = parser.parse(responseStr); + JSONObject jsonObj = (JSONObject) obj0; + Long totalCount = (Long) jsonObj.get("totalCount"); + return totalCount.intValue(); + } + + private DcaeInventoryResponse getItemsFromDcaeInventoryResponse(String responseStr) throws ParseException { + JSONParser parser = new JSONParser(); + Object obj0 = parser.parse(responseStr); + JSONObject jsonObj = (JSONObject) obj0; + JSONArray itemsArray = (JSONArray) jsonObj.get("items"); + JSONObject dcaeServiceType0 = (JSONObject) itemsArray.get(0); + return JsonUtils.GSON.fromJson(dcaeServiceType0.toString(), DcaeInventoryResponse.class); + } + /** * DO a query to DCAE to get some Information. - * + * * @param artifactName - * The artifact Name + * The artifact Name * @param serviceUuid - * The service UUID + * The service UUID * @param resourceUuid - * The resource UUID - * @return The DCAE inventory for the artifact + * The resource UUID + * @return The DCAE inventory for the artifact in DcaeInventoryResponse * @throws IOException - * In case of issues with the stream + * In case of issues with the stream * @throws ParseException - * In case of issues with the Json parsing + * In case of issues with the Json parsing */ - public String getDcaeInformation(String artifactName, String serviceUuid, String resourceUuid) - throws IOException, ParseException { - Date startTime = new Date(); + public DcaeInventoryResponse getDcaeInformation(String artifactName, String serviceUuid, String resourceUuid) + throws IOException, ParseException, InterruptedException { LoggingUtils.setTargetContext("DCAE", "getDcaeInformation"); String queryString = "?asdcResourceId=" + resourceUuid + "&asdcServiceId=" + serviceUuid + "&typeName=" - + artifactName; + + artifactName; String fullUrl = refProp.getStringValue(DCAE_INVENTORY_URL) + "/dcae-service-types" + queryString; logger.info("Dcae Inventory Service full url - " + fullUrl); - String daceInventoryResponse = null; - String responseStr = DcaeHttpConnectionManager.doDcaeHttpQuery(fullUrl, "GET", null, null); - JSONParser parser = new JSONParser(); - Object obj0 = parser.parse(responseStr); - JSONObject jsonObj = (JSONObject) obj0; - Long totalCount = (Long) jsonObj.get("totalCount"); - int numServices = totalCount.intValue(); - if (numServices == 0) { - daceInventoryResponse = null; - } else if (numServices > 0) { - JSONArray itemsArray = (JSONArray) jsonObj.get("items"); - JSONObject dcaeServiceType0 = (JSONObject) itemsArray.get(0); - daceInventoryResponse = dcaeServiceType0.toString(); - logger.info(daceInventoryResponse); - } + DcaeInventoryResponse response = queryDcaeInventory(fullUrl); LoggingUtils.setResponseContext("0", "Get Dcae Information success", this.getClass().getName()); + Date startTime = new Date(); LoggingUtils.setTimeContext(startTime, new Date()); - metricsLogger.info("getDcaeInformation complete: number services returned=" + numServices); - return daceInventoryResponse; + return response; } - /** - * Inserts a new DCAEServiceType or updates an existing instance. If the - * typeName is same second time(already exists) then the - * DCAEServiceTypeRequest is updated - * - * @param blueprintTemplate - * blueprint content - * @param owner - * owner of the data - * @param typeName - * The type/artifact Name - * @param typeVersion - * type version - * @param asdcServiceId - * The service UUID - * @param asdcResourceId - * The vf UUID - * @return The DCAE inventory type id - */ - public String createupdateDCAEServiceType(String blueprintTemplate, String owner, String typeName, int typeVersion, - String asdcServiceId, String asdcResourceId) { - Date startTime = new Date(); - LoggingUtils.setTargetContext("DCAE", "createDCAEServiceType"); - String typeId = null; - try { - ObjectMapper mapper = new ObjectMapper(); - ObjectNode dcaeServiceTypeRequest = mapper.createObjectNode(); - dcaeServiceTypeRequest.put("blueprintTemplate", blueprintTemplate); - dcaeServiceTypeRequest.put("owner", owner); - dcaeServiceTypeRequest.put("typeName", typeName); - dcaeServiceTypeRequest.put("typeVersion", typeVersion); - dcaeServiceTypeRequest.put("asdcServiceId", asdcServiceId); - dcaeServiceTypeRequest.put("asdcResourceId", asdcResourceId); - String apiBodyString = dcaeServiceTypeRequest.toString(); - logger.info("Dcae api Body String - " + apiBodyString); - String url = refProp.getStringValue(DCAE_INVENTORY_URL) + "/dcae-service-types"; - String responseStr = DcaeHttpConnectionManager.doDcaeHttpQuery(url, "POST", apiBodyString, - "application/json"); - // If the DCAEServiceTypeRequest is created successfully it will - // return a json object responce containing a node for newly created - // "typeId" - // The newly generated DCAEServiceTypeRequest can then be accessed - // via URL: https:///dcae-service-types/ - JSONParser parser = new JSONParser(); - Object obj0 = parser.parse(responseStr); - JSONObject jsonObj = (JSONObject) obj0; - typeId = (String) jsonObj.get("typeId"); // need to save this - // as - // service_type_id - // in model table - } catch (IOException | ParseException e) { - logger.error("Exception occurred during createupdateDCAEServiceType Operation with DCAE", e); - throw new BadRequestException("Exception occurred during createupdateDCAEServiceType Operation with DCAE", - e); - } finally { - if (typeId != null) { - LoggingUtils.setResponseContext("0", "Create update DCAE ServiceType success", - this.getClass().getName()); - } else { - LoggingUtils.setResponseContext("900", "Create update DCAE ServiceType failed", - this.getClass().getName()); - LoggingUtils.setErrorContext("900", "Create update DCAE ServiceType error"); + private DcaeInventoryResponse queryDcaeInventory(String fullUrl) + throws IOException, InterruptedException, ParseException { + int retryInterval = 0; + int retryLimit = 1; + if (refProp.getStringValue(DCAE_INVENTORY_RETRY_LIMIT) != null) { + retryLimit = Integer.valueOf(refProp.getStringValue(DCAE_INVENTORY_RETRY_LIMIT)); + } + if (refProp.getStringValue(DCAE_INVENTORY_RETRY_INTERVAL) != null) { + retryInterval = Integer.valueOf(refProp.getStringValue(DCAE_INVENTORY_RETRY_INTERVAL)); + } + for (int i = 0; i < retryLimit; i++) { + metricsLogger.info("Attempt n°" + i + " to contact DCAE inventory"); + String response = httpConnectionManager.doHttpRequest(fullUrl, "GET", null, null, "DCAE", null, null); + int totalCount = getTotalCountFromDcaeInventoryResponse(response); + metricsLogger.info("getDcaeInformation complete: totalCount returned=" + totalCount); + if (totalCount > 0) { + logger.info("getDcaeInformation, answer from DCAE inventory:" + response); + return getItemsFromDcaeInventoryResponse(response); } - LoggingUtils.setTimeContext(startTime, new Date()); - metricsLogger.info("createupdateDCAEServiceType complete"); + logger.info( + "Dcae inventory totalCount returned is 0, so waiting " + retryInterval + "ms before retrying ..."); + // wait for a while and try to connect to DCAE again + Thread.sleep(retryInterval); } - return typeId; + logger.warn("Dcae inventory totalCount returned is still 0, after " + retryLimit + " attempts, returning NULL"); + return null; } }