diff options
Diffstat (limited to 'openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/main/java/org/openecomp/sdc/validation/impl/validators/heatresource/NeutronPortResourceValidator.java')
-rw-r--r-- | openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/main/java/org/openecomp/sdc/validation/impl/validators/heatresource/NeutronPortResourceValidator.java | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/main/java/org/openecomp/sdc/validation/impl/validators/heatresource/NeutronPortResourceValidator.java b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/main/java/org/openecomp/sdc/validation/impl/validators/heatresource/NeutronPortResourceValidator.java new file mode 100644 index 0000000000..09afec3faf --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/main/java/org/openecomp/sdc/validation/impl/validators/heatresource/NeutronPortResourceValidator.java @@ -0,0 +1,166 @@ +package org.openecomp.sdc.validation.impl.validators.heatresource; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.openecomp.core.validation.errors.ErrorMessagesFormatBuilder; +import org.openecomp.core.validation.types.GlobalValidationContext; +import org.openecomp.sdc.common.errors.Messages; +import org.openecomp.sdc.datatypes.error.ErrorLevel; +import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.heat.datatypes.model.ResourceReferenceFunctions; +import org.openecomp.sdc.heat.services.HeatStructureUtil; +import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage; +import org.openecomp.sdc.logging.types.LoggerErrorDescription; +import org.openecomp.sdc.logging.types.LoggerTragetServiceName; +import org.openecomp.sdc.validation.ResourceValidator; +import org.openecomp.sdc.validation.ValidationContext; +import org.openecomp.sdc.validation.type.HeatResourceValidationContext; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +/** + * Created by TALIO on 2/22/2017. + */ +public class NeutronPortResourceValidator implements ResourceValidator { + private static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage(); + + @Override + public void validate(String fileName, Map.Entry<String, Resource> resourceEntry, + GlobalValidationContext globalContext, ValidationContext validationContext) { + + validateNovaServerPortBinding + (fileName, resourceEntry, (HeatResourceValidationContext)validationContext, globalContext); + } + + + @SuppressWarnings("unchecked") + private static void validateNovaServerPortBinding(String fileName, + Map.Entry<String, Resource> resourceEntry, + HeatResourceValidationContext heatResourceValidationContext, + GlobalValidationContext globalContext) { + + mdcDataDebugMessage.debugEntryMessage("file", fileName); + + Map<String, Map<String, List<String>>> portIdToPointingResources = + heatResourceValidationContext.getFileLevelResourceDependencies() + .get(HeatResourcesTypes.NEUTRON_PORT_RESOURCE_TYPE.getHeatResource()); + + if(MapUtils.isEmpty(portIdToPointingResources)){ + globalContext + .addMessage(fileName, ErrorLevel.WARNING, + ErrorMessagesFormatBuilder + .getErrorWithParameters( + Messages.PORT_NO_BIND_TO_ANY_NOVA_SERVER.getErrorMessage(), + resourceEntry.getKey()), LoggerTragetServiceName.CHECK_FOR_ORPHAN_PORTS, + LoggerErrorDescription.NO_BIND_FROM_PORT_TO_NOVA); + + return; + } + + for (Map.Entry<String, Map<String, List<String>>> portEntry : + portIdToPointingResources.entrySet()) { + checkPortBindingFromMap(fileName, portEntry, globalContext); + } + + mdcDataDebugMessage.debugExitMessage("file", fileName); + } + + private static void checkPortBindingFromMap(String fileName, + Map.Entry<String, Map<String, List<String>>> portEntry, + GlobalValidationContext globalContext) { + Map<String, List<String>> pointingResourcesToCurrPort = portEntry.getValue(); + List<String> pointingNovaServers = pointingResourcesToCurrPort + .get(HeatResourcesTypes.NOVA_SERVER_RESOURCE_TYPE.getHeatResource()); + + if (CollectionUtils.isEmpty(pointingNovaServers)) { + return; + } + + handleErrorEventsForPortBinding(fileName, portEntry, globalContext, pointingNovaServers); + + + } + + private static void handleErrorEventsForPortBinding(String fileName, + Map.Entry<String, Map<String, List<String>>> portEntry, + GlobalValidationContext globalContext, + List<String> pointingNovaServers) { + if (isThereMoreThanOneBindFromNovaToPort(pointingNovaServers)) { + globalContext + .addMessage(fileName, ErrorLevel.ERROR, + ErrorMessagesFormatBuilder + .getErrorWithParameters( + Messages.MORE_THAN_ONE_BIND_FROM_NOVA_TO_PORT.getErrorMessage(), + portEntry.getKey()), + LoggerTragetServiceName.VALIDATE_NOVA_SERVER_PORT_BINDING, + LoggerErrorDescription.PORT_BINDS_MORE_THAN_ONE_NOVA); + } + + if(isNoNovaPointingToPort(pointingNovaServers)){ + globalContext + .addMessage(fileName, ErrorLevel.WARNING, + ErrorMessagesFormatBuilder + .getErrorWithParameters( + Messages.PORT_NO_BIND_TO_ANY_NOVA_SERVER.getErrorMessage(), + portEntry.getKey()), LoggerTragetServiceName.CHECK_FOR_ORPHAN_PORTS, + LoggerErrorDescription.NO_BIND_FROM_PORT_TO_NOVA); + } + } + + private static boolean isNoNovaPointingToPort(List<String> pointingNovaServers) { + return pointingNovaServers.size() == 0; + } + + private static boolean isThereMoreThanOneBindFromNovaToPort(List<String> pointingNovaServers) { + return pointingNovaServers.size() > 1; + } + + @SuppressWarnings("unchecked") + private static void validateAllSecurityGroupsAreUsed(String filename, + Map.Entry<String, Resource> resourceEntry, + List<String> securityGroupResourceNameList, + GlobalValidationContext globalContext) { + + mdcDataDebugMessage.debugEntryMessage("file", filename); + + Map<String, Object> propertiesMap = resourceEntry.getValue().getProperties(); + + if (MapUtils.isEmpty(propertiesMap)) { + return; + } + + Object securityGroupsValue = propertiesMap.get("security_groups"); + + if (Objects.isNull(securityGroupsValue)) { + return; + } + + if (securityGroupsValue instanceof List) { + List<Object> securityGroupsListFromCurrResource = + (List<Object>) propertiesMap.get("security_groups"); + for (Object securityGroup : securityGroupsListFromCurrResource) { + removeSecurityGroupNamesFromListByGivenFunction(filename, + ResourceReferenceFunctions.GET_RESOURCE.getFunction(), securityGroup, + securityGroupResourceNameList, globalContext); + } + } + + mdcDataDebugMessage.debugExitMessage("file", filename); + } + + private static void removeSecurityGroupNamesFromListByGivenFunction(String filename, + String functionName, + Object securityGroup, + Collection<String> + securityGroupResourceNameList, + GlobalValidationContext globalContext) { + Set<String> securityGroupsNamesFromFunction = HeatStructureUtil + .getReferencedValuesByFunctionName(filename, functionName, securityGroup, globalContext); + securityGroupsNamesFromFunction.forEach(securityGroupResourceNameList::remove); + } +} |