[SDC-29] Amdocs OnBoard 1707 initial commit.
[sdc.git] / openecomp-be / lib / openecomp-heat-lib / src / main / java / org / openecomp / sdc / heat / services / tree / HeatTreeManagerUtil.java
index dac7cdb..b8df50b 100644 (file)
 
 package org.openecomp.sdc.heat.services.tree;
 
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
 import org.openecomp.core.utilities.file.FileContentHandler;
+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.HeatOrchestrationTemplate;
+import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes;
+import org.openecomp.sdc.heat.datatypes.model.PropertiesMapKeyTypes;
+import org.openecomp.sdc.heat.datatypes.model.Resource;
+import org.openecomp.sdc.heat.services.HeatStructureUtil;
+import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
+import org.openecomp.sdc.logging.types.LoggerTragetServiceName;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 
-/**
- * The type Heat tree manager util.
- */
 public class HeatTreeManagerUtil {
+
+  private static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
+
   /**
    * Init heat tree manager heat tree manager.
    *
@@ -40,4 +59,165 @@ public class HeatTreeManagerUtil {
 
     return heatTreeManager;
   }
+
+  /**
+   * Gets nested files.
+   *
+   * @param filename      the filename
+   * @param hot           the hot
+   * @param globalContext the global context
+   * @return the nested files
+   */
+  public static Set<String> getNestedFiles(String filename, HeatOrchestrationTemplate hot,
+                                           GlobalValidationContext globalContext) {
+
+
+    mdcDataDebugMessage.debugEntryMessage(null, null);
+
+    Set<String> nestedFileList = new HashSet<>();
+    Set<String> resourceDefNestedFiles;
+    hot.getResources().values().stream().filter(
+        resource -> (resource.getType().endsWith(".yaml") || resource.getType().endsWith(".yml")))
+        .forEach(resource -> nestedFileList.add(resource.getType()));
+
+    resourceDefNestedFiles = getResourceDefNestedFiles(filename, hot, globalContext);
+    nestedFileList.addAll(resourceDefNestedFiles);
+
+    mdcDataDebugMessage.debugExitMessage(null, null);
+    return nestedFileList;
+  }
+
+  /**
+   * Gets artifact files.
+   *
+   * @param filename      the filename
+   * @param hot           the hot
+   * @param globalContext the global context
+   * @return the artifact files
+   */
+  public static Set<String> getArtifactFiles(String filename, HeatOrchestrationTemplate hot,
+                                             GlobalValidationContext globalContext) {
+
+
+    mdcDataDebugMessage.debugEntryMessage(null, null);
+
+    Set<String> artifactSet = new HashSet<>();
+    Collection<Resource> resourcesValue =
+        hot.getResources() == null ? null : hot.getResources().values();
+    if (CollectionUtils.isNotEmpty(resourcesValue)) {
+      for (Resource resource : resourcesValue) {
+        Collection<Object> properties =
+            resource.getProperties() == null ? null : resource.getProperties().values();
+        if (CollectionUtils.isNotEmpty(properties)) {
+          for (Object property : properties) {
+            Set<String> artifactNames =
+                HeatStructureUtil.getReferencedValuesByFunctionName(filename, "get_file", property,
+                    globalContext);
+            artifactSet.addAll(artifactNames);
+          }
+        }
+      }
+    }
+
+    mdcDataDebugMessage.debugExitMessage(null, null);
+    return artifactSet;
+  }
+
+  private static Set<String> getResourceDefNestedFiles(String filename,
+                                                       HeatOrchestrationTemplate hot,
+                                                       GlobalValidationContext globalContext) {
+
+
+    mdcDataDebugMessage.debugEntryMessage(null, null);
+
+    Set<String> resourceDefNestedFiles = new HashSet<>();
+    hot.getResources()
+        .entrySet().stream().filter(entry -> entry.getValue().getType()
+        .equals(HeatResourcesTypes.RESOURCE_GROUP_RESOURCE_TYPE.getHeatResource()))
+        .filter(entry ->
+            getResourceDef(filename, entry.getKey(), entry.getValue(), globalContext) != null
+                && HeatStructureUtil.isNestedResource(
+                getResourceDef(filename, entry.getKey(), entry.getValue(), globalContext)
+                    .getType()))
+        .forEach(entry -> resourceDefNestedFiles.add(
+            getResourceDef(filename, entry.getKey(), entry.getValue(), globalContext).getType()));
+
+    mdcDataDebugMessage.debugExitMessage(null, null);
+    return resourceDefNestedFiles;
+  }
+
+  /**
+   * Gets resource def.
+   *
+   * @param filename      the filename
+   * @param resourceName  the resource name
+   * @param resource      the resource
+   * @param globalContext the global context
+   * @return the resource def
+   */
+  @SuppressWarnings("unchecked")
+  public static Resource getResourceDef(String filename, String resourceName, Resource resource,
+                                        GlobalValidationContext globalContext) {
+
+
+    mdcDataDebugMessage.debugEntryMessage(null, null);
+
+    Resource resourceDef = null;
+    Map<String, Object> resourceDefValueMap = resource.getProperties() == null ? null
+        : (Map<String, Object>) resource.getProperties().get(
+            PropertiesMapKeyTypes.RESOURCE_DEF.getKeyMap());
+    if (MapUtils.isNotEmpty(resourceDefValueMap)) {
+      Object resourceDefType = resourceDefValueMap.get("type");
+      if (Objects.nonNull(resourceDefType)) {
+        if (resourceDefType instanceof String) {
+          boolean isNested =
+              checkIfResourceGroupTypeIsNested(filename, resourceName, (String) resourceDefType,
+                  globalContext);
+          if (isNested) {
+            resourceDef = new Resource();
+            resourceDef.setType((String) resourceDefType);
+            //noinspection unchecked
+            resourceDef.setProperties((Map<String, Object>) resourceDefValueMap.get("properties"));
+          }
+        } else {
+          globalContext.addMessage(filename, ErrorLevel.WARNING, ErrorMessagesFormatBuilder
+                  .getErrorWithParameters(Messages.INVALID_RESOURCE_GROUP_TYPE.getErrorMessage(),
+                      resourceName, resourceDefType.toString()),
+              LoggerTragetServiceName.VALIDATE_RESOURCE_GROUP_TYPE, "Invalid resource group type");
+        }
+      } else {
+        globalContext.addMessage(filename, ErrorLevel.WARNING, ErrorMessagesFormatBuilder
+                .getErrorWithParameters(Messages.INVALID_RESOURCE_TYPE.getErrorMessage(), "null",
+                    resourceName), LoggerTragetServiceName.VALIDATE_RESOURCE_GROUP_TYPE,
+            "Invalid resource type");
+      }
+
+    }
+
+    mdcDataDebugMessage.debugExitMessage(null, null);
+    return resourceDef;
+  }
+
+  /**
+   * Check if resource group type is nested boolean.
+   *
+   * @param filename        the filename
+   * @param resourceName    the resource name
+   * @param resourceDefType the resource def type
+   * @param globalContext   the global context
+   * @return the boolean
+   */
+  public static boolean checkIfResourceGroupTypeIsNested(String filename, String resourceName,
+                                                         String resourceDefType,
+                                                         GlobalValidationContext globalContext) {
+    if (!HeatStructureUtil.isNestedResource(resourceDefType)) {
+      globalContext.addMessage(filename, ErrorLevel.WARNING, ErrorMessagesFormatBuilder
+              .getErrorWithParameters(Messages.INVALID_RESOURCE_GROUP_TYPE.getErrorMessage(),
+                  resourceName, resourceDefType),
+          LoggerTragetServiceName.VALIDATE_RESOURCE_GROUP_TYPE,
+          "Invalid resource group type");
+      return false;
+    }
+    return true;
+  }
 }