diff options
5 files changed, 240 insertions, 33 deletions
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/services/VendorSoftwareProductsImpl.java b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/services/VendorSoftwareProductsImpl.java index 4167785c02..9e4d3bf51b 100644 --- a/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/services/VendorSoftwareProductsImpl.java +++ b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/services/VendorSoftwareProductsImpl.java @@ -405,58 +405,101 @@ public class VendorSoftwareProductsImpl implements VendorSoftwareProducts { List<VersionedVendorSoftwareProductInfo> vspList = Objects.requireNonNull( vendorSoftwareProductManager.listVsps(VersionStatus.Final.name(), user)); + int skippedCounter = 0; + final int vspListSizeBefore = vspList.size(); + + for (VersionedVendorSoftwareProductInfo versionVspInfo : vspList) { + final VspDetails vspDetails = versionVspInfo.getVspDetails(); + final String vspId = vspDetails.getId(); + final Version latestFinalVersion = + getVersionInfo(vspId, VersionableEntityAction.Read, user).getLatestFinalVersion(); + + if (latestFinalVersion.getStatus().equals(VersionStatus.Locked)) { + logger.info("Skipping processing VSP name [{}]/id [{}] due to status LOCKED", vspDetails + .getName(), + vspId); + skippedCounter++; + vspList.remove(versionVspInfo); + } + } + + logger.info("Removed {} VSPs out of {} from processing due to status LOCKED", skippedCounter, + vspListSizeBefore); int healingCounter = 0; int failedCounter = 0; + int totalCounter = 0; - try { - logger.info("Total number of VSPs: {}. Performing healing and " + - "resubmit for all non-Manual VSPs in submitted status.\n No need to pre-set oldVersion " + - "field", vspList.size()); - - for (VersionedVendorSoftwareProductInfo versionVspInfo : vspList) { + final int vspListSize = vspList.size(); + logger.info("Total number of VSPs: {}. Performing healing and " + + "resubmit for all non-Manual VSPs in submitted status.\n No need to pre-set oldVersion " + + "field", vspListSize); + for (VersionedVendorSoftwareProductInfo versionVspInfo : vspList) { + try { + totalCounter++; + final Version activeVersion = versionVspInfo.getVersionInfo().getActiveVersion(); final VspDetails vspDetails = versionVspInfo.getVspDetails(); final String vspId = vspDetails.getId(); final Version latestFinalVersion = getVersionInfo(vspId, VersionableEntityAction.Read, user).getLatestFinalVersion(); + final String vspName = vspDetails.getName(); + logger.info("VSP Name {}, VSP id [{}], Active Version {} , Active Version Status {}," + + "Latest Final Version {} , " + + "Latest Final Version Status {}", vspName, vspId, activeVersion + .toString(), + activeVersion.getStatus(), latestFinalVersion.toString(), + latestFinalVersion.getStatus()); + if (Objects.nonNull(latestFinalVersion) && (!OnboardingMethod.Manual.name().equals(vspDetails.getOnboardingMethod()))) { - reSubmit(vspDetails, user); + reSubmit(vspDetails, user, totalCounter, vspListSize); healingCounter++; } + } catch (Exception e) { + failedCounter++; } - - } catch (Exception e) { - logger.error("Failed during resubmitAll", e); - failedCounter++; - } finally { - logger.info("Finished attempted healing and resubmit for {} VSPs out " + - "of total # of {} submitted VSPs. Failure count during resubmitAll: {}", - healingCounter, vspList.size(), failedCounter); } + logger.info("Total VSPs processed {}. Completed running healing and resubmit for {} VSPs out" + + " " + + "of total # of {} submitted VSPs. Failures count during resubmitAll: {}", + totalCounter, healingCounter, vspListSize, failedCounter); + return Response.ok().build(); } - private void reSubmit(VspDetails vspDetails, String user) throws IOException { + private void reSubmit(VspDetails vspDetails, String user, int currentCount, int total) throws + Exception { final String vspId = vspDetails.getId(); - long startTime = System.currentTimeMillis(); - logger.info("Starting on healing and resubmit for VSP id[{}]", vspId); + final String vspName = vspDetails.getName(); + final Version versionBefore = vspDetails.getVersion(); + Version finalVersion; + + logger.info("Starting on healing and resubmit for VSP [{}], #{} out of total {}", vspName, + currentCount, total); vspDetails.setOldVersion("true"); - vendorSoftwareProductManager.healAndAdvanceFinalVersion(vspId, vspDetails, user); + try { + finalVersion = + vendorSoftwareProductManager.healAndAdvanceFinalVersion(vspId, vspDetails, user); - long endTime = System.currentTimeMillis(); - long seconds = (endTime - startTime) / 1000; + } catch (Exception e) { + + logger.error("Failed during resubmit, VSP [{}] , version before:{}, version after:{}, " + + "status after:{}, with exception:{}", + vspName, versionBefore.toString(), vspDetails.getVersion().toString(), vspDetails + .getVersion().getStatus().name(), e.getMessage()); + throw e; + } - logger.info("Completed healing and resubmit for VSP id [{}], duration: {} seconds", - vspId, seconds); + logger.info("Completed healing and resubmit for VSP [{}], version before:{}, version after:" + + " {}", vspName, versionBefore.toString(), finalVersion); } private static void printAuditForErrors(List<ErrorMessage> errorList, String vspId, diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-utilities-lib/src/main/java/org/openecomp/core/utilities/deserializers/RequirementDefinitionDeserializer.java b/openecomp-be/lib/openecomp-core-lib/openecomp-utilities-lib/src/main/java/org/openecomp/core/utilities/deserializers/RequirementDefinitionDeserializer.java new file mode 100644 index 0000000000..b341a52c56 --- /dev/null +++ b/openecomp-be/lib/openecomp-core-lib/openecomp-utilities-lib/src/main/java/org/openecomp/core/utilities/deserializers/RequirementDefinitionDeserializer.java @@ -0,0 +1,87 @@ +package org.openecomp.core.utilities.deserializers; + +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.JsonPrimitive; +import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; + +import java.lang.reflect.Type; +import java.util.Objects; +import java.util.Optional; + +public class RequirementDefinitionDeserializer implements JsonDeserializer<RequirementDefinition> { + + private static final String CAPABILITY = "capability"; + private static final String NODE = "node"; + private static final String RELATIONSHIP = "relationship"; + private static final String OCCURRENCES = "occurrences"; + + @Override + public RequirementDefinition deserialize(JsonElement jsonElement, Type type, + JsonDeserializationContext jsonDeserializationContext) + throws JsonParseException { + + JsonObject jsonObject = jsonElement.getAsJsonObject(); + + RequirementDefinition requirementDefinition = new RequirementDefinition(); + setRequirementValues(jsonObject, requirementDefinition); + + Optional<Object[]> occurrences = handleOccurrences(jsonObject); + occurrences.ifPresent(requirementDefinition::setOccurrences); + + return requirementDefinition; + } + + + private void setRequirementValues(JsonObject jsonObject, + RequirementDefinition requirementDefinition) { + + JsonElement capabilityElement = jsonObject.get(CAPABILITY); + if (!Objects.isNull(capabilityElement)) { + requirementDefinition.setCapability(capabilityElement.getAsString()); + } + + JsonElement nodeElement = jsonObject.get(NODE); + if (!Objects.isNull(nodeElement)) { + requirementDefinition.setNode(nodeElement.getAsString()); + } + + JsonElement relationshipElement = jsonObject.get(RELATIONSHIP); + if (!Objects.isNull(relationshipElement)) { + requirementDefinition.setRelationship(relationshipElement.getAsString()); + } + } + + private Optional<Object[]> handleOccurrences(JsonObject jsonObject) { + + JsonElement occurrencesElement = jsonObject.get(OCCURRENCES); + + if(Objects.isNull(occurrencesElement)){ + return Optional.empty(); + } + + JsonArray occurrences = occurrencesElement.getAsJsonArray(); + Object[] fixedOccurrences = new Object[occurrences.size()]; + + for (int i = 0; i < occurrences.size(); i++) { + JsonElement currElement = occurrences.get(i); + + // values inside occurrences array can be either String or Integer + if (currElement.isJsonPrimitive()) { + JsonPrimitive jsonPrimitive = currElement.getAsJsonPrimitive(); + + if (jsonPrimitive.isNumber()) { + fixedOccurrences[i] = jsonPrimitive.getAsNumber().intValue(); + } else { + fixedOccurrences[i] = jsonPrimitive.getAsString(); + } + } + } + + return Optional.of(fixedOccurrences); + } +} diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-utilities-lib/src/main/java/org/openecomp/core/utilities/json/JsonUtil.java b/openecomp-be/lib/openecomp-core-lib/openecomp-utilities-lib/src/main/java/org/openecomp/core/utilities/json/JsonUtil.java index 8454bc61a8..c3d32df447 100644 --- a/openecomp-be/lib/openecomp-core-lib/openecomp-utilities-lib/src/main/java/org/openecomp/core/utilities/json/JsonUtil.java +++ b/openecomp-be/lib/openecomp-core-lib/openecomp-utilities-lib/src/main/java/org/openecomp/core/utilities/json/JsonUtil.java @@ -32,8 +32,10 @@ import org.everit.json.schema.ValidationException; import org.everit.json.schema.loader.SchemaLoader; import org.json.JSONObject; import org.openecomp.core.utilities.CommonMethods; +import org.openecomp.core.utilities.deserializers.RequirementDefinitionDeserializer; import org.openecomp.sdc.logging.api.Logger; import org.openecomp.sdc.logging.api.LoggerFactory; +import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; import java.io.BufferedReader; import java.io.IOException; @@ -51,6 +53,15 @@ import java.util.stream.Collectors; */ public class JsonUtil { private static final Logger logger = LoggerFactory.getLogger(JsonUtil.class); + private static final GsonBuilder gsonBuilder; + private static final Gson gson; + + static { + gsonBuilder = new GsonBuilder(); + gsonBuilder.registerTypeAdapter(RequirementDefinition.class, new + RequirementDefinitionDeserializer()); + gson = gsonBuilder.create(); + } /** * Object 2 json string. @@ -86,9 +97,7 @@ public class JsonUtil { T typ; try { try (Reader br = new StringReader(json)) { - typ = new Gson().fromJson(br, classOfT); - } catch (IOException exception) { - throw exception; + typ = gson.fromJson(br, classOfT); } } catch (JsonIOException | JsonSyntaxException | IOException exception) { throw new RuntimeException(exception); diff --git a/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-core/src/main/java/org/openecomp/sdc/healing/impl/HealingManagerImpl.java b/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-core/src/main/java/org/openecomp/sdc/healing/impl/HealingManagerImpl.java index 16f9c60d7f..1c895ffc6f 100644 --- a/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-core/src/main/java/org/openecomp/sdc/healing/impl/HealingManagerImpl.java +++ b/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-core/src/main/java/org/openecomp/sdc/healing/impl/HealingManagerImpl.java @@ -92,7 +92,7 @@ public class HealingManagerImpl implements HealingManager { MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB, LoggerTragetServiceName.SELF_HEALING, ErrorLevel.ERROR.name(), LoggerErrorCode .DATA_ERROR.getErrorCode(), LoggerErrorDescription.CANT_HEAL); - healingFailureMessages.add(e.getMessage()); + healingFailureMessages.add(e.getMessage() + " ,healer name :" + healerImplClassName); } return null; } diff --git a/openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-core/src/test/java/org/openecomp/core/converter/impl/ToscaConverterImplTest.java b/openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-core/src/test/java/org/openecomp/core/converter/impl/ToscaConverterImplTest.java index 4abed3e316..f29ca4a427 100644 --- a/openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-core/src/test/java/org/openecomp/core/converter/impl/ToscaConverterImplTest.java +++ b/openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-core/src/test/java/org/openecomp/core/converter/impl/ToscaConverterImplTest.java @@ -1,26 +1,30 @@ package org.openecomp.core.converter.impl; import org.apache.commons.collections.CollectionUtils; +import org.junit.Assert; import org.junit.Test; import org.openecomp.core.converter.ToscaConverter; import org.openecomp.core.impl.ToscaConverterImpl; import org.openecomp.core.utilities.file.FileContentHandler; import org.openecomp.core.utilities.file.FileUtils; +import org.openecomp.core.utilities.json.JsonUtil; import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; +import org.openecomp.sdc.tosca.datatypes.model.NodeType; import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment; +import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; import org.openecomp.sdc.tosca.services.ToscaExtensionYamlUtil; import org.openecomp.sdc.tosca.services.YamlUtil; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.nio.file.NotDirectoryException; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.ListIterator; @@ -33,7 +37,10 @@ import static org.openecomp.core.converter.datatypes.Constants.mainStName; public class ToscaConverterImplTest { - private static ToscaConverter toscaConverter = new ToscaConverterImpl(); + private static final ToscaConverter toscaConverter = new ToscaConverterImpl(); + private static final String VIRTUAL_LINK = "virtualLink"; + private static final String UNBOUNDED = "UNBOUNDED"; + private static String inputFilesPath; private static String outputFilesPath; private static Map<String, ServiceTemplate> expectedOutserviceTemplates; @@ -57,7 +64,72 @@ public class ToscaConverterImplTest { checkSTResults(expectedOutserviceTemplates, null, mainSt); } + @Test + public void testOccurrencesUpperString() { + Object[] occurrences = buildOccurrences("0", UNBOUNDED); + Assert.assertEquals(occurrences[0], 0); + Assert.assertEquals(occurrences[1], UNBOUNDED); + } + + @Test + public void testOccurrencesAsInts() { + Object[] occurrences = buildOccurrences("0", "1"); + Assert.assertEquals(occurrences[0], 0); + Assert.assertEquals(occurrences[1], 1); + } + + @Test + public void testOccurrencesAsStrings() { + String test = "TEST_A"; + Object[] occurrences = buildOccurrences(UNBOUNDED, test); + Assert.assertEquals(occurrences[0], UNBOUNDED); + Assert.assertEquals(occurrences[1], test); + } + + @Test + public void testOccurrencesLowerString() { + Object[] occurrences = buildOccurrences(UNBOUNDED, "100"); + Assert.assertEquals(occurrences[0], UNBOUNDED); + Assert.assertEquals(occurrences[1], 100); + } + + @Test + public void testOccurrencesEmpty() { + Object[] occurrences = buildOccurrences(); + Assert.assertEquals(occurrences.length, 0); + } + + @Test + public void testOccurrencesMany() { + String test = "TEST_B"; + Object[] occurrences = buildOccurrences("1", "2", test); + Assert.assertEquals(occurrences[0], 1); + Assert.assertEquals(occurrences[1], 2); + Assert.assertEquals(occurrences[2], test); + } + + @Test + public void testDefaultOccurrences() { + Object[] occurrences = buildOccurrences((List<String>) null); + Assert.assertEquals(1, occurrences[0]); + Assert.assertEquals(1, occurrences[1]); + } + + private Object[] buildOccurrences(String... bounds) { + return buildOccurrences(Arrays.asList(bounds)); + } + private Object[] buildOccurrences(List<String> bounds) { + NodeType nodeType = JsonUtil.json2Object("{derived_from=tosca.nodes.Root, description=MME_VFC, " + + "properties={vendor={type=string, default=ERICSSON}, " + + "csarVersion={type=string, default=v1.0}, csarProvider={type=string, default=ERICSSON}, " + + "id={type=string, default=vMME}, version={type=string, default=v1.0}, csarType={type=string, default=NFAR}}, " + + "requirements=[{virtualLink={" + + (bounds == null ? "" : "occurrences=[" + String.join(", ", bounds) + "], ") + + "capability=tosca.capabilities.network.Linkable}}]}", NodeType.class); + List<Map<String, RequirementDefinition>> requirements = nodeType.getRequirements(); + return requirements.get(0).get(VIRTUAL_LINK).getOccurrences(); + } private FileContentHandler createFileContentHandlerFromInput(String inputFilesPath) throws IOException { @@ -141,10 +213,6 @@ public class ToscaConverterImplTest { yamlFile.close(); } catch (IOException ignore) { } - } catch (FileNotFoundException e) { - throw e; - } catch (IOException e) { - throw e; } } } |