summaryrefslogtreecommitdiffstats
path: root/openecomp-be/lib/openecomp-sdc-translator-lib
diff options
context:
space:
mode:
authorshiria <shiri.amichai@amdocs.com>2018-06-04 11:07:29 +0300
committerAvi Gaffa <avi.gaffa@amdocs.com>2018-06-05 14:31:34 +0000
commit09c6320df7f768e42edeaedd7ba69e6fb13d433d (patch)
tree92883e0297c3d47ab039685ca91f2f47a1dbcd46 /openecomp-be/lib/openecomp-sdc-translator-lib
parentd9cae980e80021dfad0bc9366d32d2cf996cfa90 (diff)
fix get flat node type
update node type interface update return value to object which include the type hierarchy Change-Id: I97623c7bbad0223a174370d13aabf4c3efe9c21e Issue-ID: SDC-1394 Signed-off-by: shiria <shiri.amichai@amdocs.com>
Diffstat (limited to 'openecomp-be/lib/openecomp-sdc-translator-lib')
-rw-r--r--openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/HeatToToscaUtil.java2754
1 files changed, 1323 insertions, 1431 deletions
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/HeatToToscaUtil.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/HeatToToscaUtil.java
index 33afabc3a5..d8e81422a3 100644
--- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/HeatToToscaUtil.java
+++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/HeatToToscaUtil.java
@@ -105,281 +105,263 @@ import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatT
*/
public class HeatToToscaUtil {
- private static final Logger LOGGER = LoggerFactory.getLogger(HeatToToscaUtil.class);
- private static final String FQ_NAME = "fq_name";
- private static final String GET_PARAM = "get_param";
- private static final String GET_ATTR = "get_attr";
- private static final String GET_RESOURCE = "get_resource";
- private static final String UNDERSCORE = "_";
- private static final String WORDS_REGEX = "(\\w+)";
- private static final String PORT_RESOURCE_ID_REGEX_SUFFIX = "(_\\d+)*";
- private static final String PORT_RESOURCE_ID_REGEX_PREFIX =
- WORDS_REGEX + PORT_RESOURCE_ID_REGEX_SUFFIX;
- private static final String PORT_INT_RESOURCE_ID_REGEX_PREFIX = PORT_RESOURCE_ID_REGEX_PREFIX
- + UNDERSCORE + "int_"+ WORDS_REGEX + UNDERSCORE;
- private static final String SUB_INTERFACE_INT_RESOURCE_ID_REGEX_PREFIX =
- PORT_RESOURCE_ID_REGEX_PREFIX + UNDERSCORE + "subint_"+ WORDS_REGEX + UNDERSCORE;
- private static final String SUB_INTERFACE_REGEX = WORDS_REGEX + PORT_RESOURCE_ID_REGEX_SUFFIX
- + "_subint_(\\w_+)*vmi" + PORT_RESOURCE_ID_REGEX_SUFFIX;
-
- /**
- * Load and translate template data translator output.
- *
- * @param fileNameContentMap the file name content map
- * @return the translator output
- */
- public static TranslatorOutput loadAndTranslateTemplateData(
- FileContentHandler fileNameContentMap) {
- HeatToToscaTranslator heatToToscaTranslator =
- HeatToToscaTranslatorFactory.getInstance().createInterface();
-
- try (InputStream fileContent = fileNameContentMap.getFileContent(SdcCommon.MANIFEST_NAME)) {
- heatToToscaTranslator
- .addManifest(SdcCommon.MANIFEST_NAME, FileUtils.toByteArray(fileContent));
- } catch (IOException e) {
- throw new RuntimeException("Failed to read manifest", e);
- }
-
- fileNameContentMap.getFileList().stream()
- .filter(fileName -> !(fileName.equals(SdcCommon.MANIFEST_NAME))).forEach(
- fileName -> heatToToscaTranslator
- .addFile(fileName, FileUtils.toByteArray
- (fileNameContentMap.getFileContent(fileName))));
-
- Map<String, List<ErrorMessage>> errors = heatToToscaTranslator.validate();
- if (MapUtils.isNotEmpty(MessageContainerUtil.getMessageByLevel(ErrorLevel.ERROR, errors))) {
- TranslatorOutput translatorOutput = new TranslatorOutput();
- translatorOutput.setErrorMessages(errors);
- return translatorOutput;
- }
-
- try (InputStream structureFile = getHeatStructureTreeFile(fileNameContentMap)) {
- heatToToscaTranslator.addExternalArtifacts(SdcCommon.HEAT_META, structureFile);
- return heatToToscaTranslator.translate();
- } catch (IOException e) {
- // rethrow as a RuntimeException to keep the signature backward compatible
- throw new RuntimeException("Failed to read Heat template tree", e);
- }
- }
-
-
- private static InputStream getHeatStructureTreeFile(FileContentHandler fileNameContentMap) {
- HeatTreeManager heatTreeManager = HeatTreeManagerUtil.initHeatTreeManager(fileNameContentMap);
- heatTreeManager.createTree();
- HeatStructureTree tree = heatTreeManager.getTree();
- ValidationStructureList validationStructureList = new ValidationStructureList(tree);
- return FileUtils.convertToInputStream(validationStructureList, FileUtils.FileExtension.JSON);
- }
-
- /**
- * Build list of files to search optional.
- *
- * @param heatFileName the heat file name
- * @param filesDataList the files data list
- * @param types the types
- * @return the optional
- */
- public static Optional<List<FileData>> buildListOfFilesToSearch(String heatFileName,
- List<FileData> filesDataList,
- FileData.Type... types) {
- List<FileData> list = new ArrayList<>(filesDataList);
- Optional<FileData> resourceFileData = HeatToToscaUtil.getFileData(heatFileName, filesDataList);
- if (resourceFileData.isPresent() && Objects.nonNull(resourceFileData.get().getData())) {
- list.addAll(resourceFileData.get().getData());
- }
- return Optional.ofNullable(HeatToToscaUtil.getFilteredListOfFileDataByTypes(list, types));
- }
-
- /**
- * Gets filtered list of file data by types.
- *
- * @param filesToSearch the files to search
- * @param types the types
- * @return the filtered list of file data by types
- */
- public static List<FileData> getFilteredListOfFileDataByTypes(List<FileData> filesToSearch,
- FileData.Type... types) {
- return filesToSearch.stream().filter(FileData.buildFileDataPredicateByType(types))
- .collect(Collectors.toList());
- }
-
- /**
- * Gets file data from the list according to the input heat file name.
- *
- * @param heatFileName the heat file name
- * @param fileDataList the file data list
- * @return the file data
- */
- public static Optional<FileData> getFileData(String heatFileName,
- Collection<FileData> fileDataList) {
- for (FileData file : fileDataList) {
- if (file.getFile().equals(heatFileName)) {
- return Optional.of(file);
- }
- }
- return Optional.empty();
- }
-
- /**
- * Gets file data which is supported by the translator, from the context according the input heat
- * file name.
- *
- * @param heatFileName the heat file name
- * @param context the translation context
- * @return the file data
- */
- public static FileData getFileData(String heatFileName, TranslationContext context) {
- List<FileData> fileDataList = context.getManifest().getContent().getData();
- for (FileData fileData : fileDataList) {
- if (TranslationService.getTypesToProcessByTranslator().contains(fileData.getType())
- && fileData.getFile().equals(heatFileName)) {
- return fileData;
- }
+ private static final Logger LOGGER = LoggerFactory.getLogger(HeatToToscaUtil.class);
+ private static final String FQ_NAME = "fq_name";
+ private static final String GET_PARAM = "get_param";
+ private static final String GET_ATTR = "get_attr";
+ private static final String GET_RESOURCE = "get_resource";
+ private static final String UNDERSCORE = "_";
+ private static final String WORDS_REGEX = "(\\w+)";
+ private static final String PORT_RESOURCE_ID_REGEX_SUFFIX = "(_\\d+)*";
+ private static final String PORT_RESOURCE_ID_REGEX_PREFIX = WORDS_REGEX + PORT_RESOURCE_ID_REGEX_SUFFIX;
+ private static final String PORT_INT_RESOURCE_ID_REGEX_PREFIX =
+ PORT_RESOURCE_ID_REGEX_PREFIX + UNDERSCORE + "int_" + WORDS_REGEX + UNDERSCORE;
+ private static final String SUB_INTERFACE_INT_RESOURCE_ID_REGEX_PREFIX =
+ PORT_RESOURCE_ID_REGEX_PREFIX + UNDERSCORE + "subint_" + WORDS_REGEX + UNDERSCORE;
+ private static final String SUB_INTERFACE_REGEX =
+ WORDS_REGEX + PORT_RESOURCE_ID_REGEX_SUFFIX + "_subint_(\\w_+)*vmi" + PORT_RESOURCE_ID_REGEX_SUFFIX;
+
+ /**
+ * Load and translate template data translator output.
+ *
+ * @param fileNameContentMap the file name content map
+ * @return the translator output
+ */
+ public static TranslatorOutput loadAndTranslateTemplateData(FileContentHandler fileNameContentMap) {
+ HeatToToscaTranslator heatToToscaTranslator = HeatToToscaTranslatorFactory.getInstance().createInterface();
+
+ try (InputStream fileContent = fileNameContentMap.getFileContent(SdcCommon.MANIFEST_NAME)) {
+ heatToToscaTranslator.addManifest(SdcCommon.MANIFEST_NAME, FileUtils.toByteArray(fileContent));
+ } catch (IOException e) {
+ throw new RuntimeException("Failed to read manifest", e);
+ }
+
+ fileNameContentMap.getFileList().stream().filter(fileName -> !(fileName.equals(SdcCommon.MANIFEST_NAME)))
+ .forEach(fileName -> heatToToscaTranslator.addFile(fileName,
+ FileUtils.toByteArray(fileNameContentMap.getFileContent(fileName))));
+
+ Map<String, List<ErrorMessage>> errors = heatToToscaTranslator.validate();
+ if (MapUtils.isNotEmpty(MessageContainerUtil.getMessageByLevel(ErrorLevel.ERROR, errors))) {
+ TranslatorOutput translatorOutput = new TranslatorOutput();
+ translatorOutput.setErrorMessages(errors);
+ return translatorOutput;
+ }
+
+ try (InputStream structureFile = getHeatStructureTreeFile(fileNameContentMap)) {
+ heatToToscaTranslator.addExternalArtifacts(SdcCommon.HEAT_META, structureFile);
+ return heatToToscaTranslator.translate();
+ } catch (IOException e) {
+ // rethrow as a RuntimeException to keep the signature backward compatible
+ throw new RuntimeException("Failed to read Heat template tree", e);
+ }
}
- return null;
- }
- static FileDataCollection getFileCollectionsByFilter(List<FileData> fileDataList,
- Set<FileData.Type> typeFilter,
- TranslationContext translationContext) {
- FileDataCollection fileDataCollection = new FileDataCollection();
- Map<String, FileData> filteredFiles = filterFileDataListByType(fileDataList, typeFilter);
- Set<String> referenced = new HashSet<>();
- for (FileData fileData : filteredFiles.values()) {
- String fileName = fileData.getFile();
+ private static InputStream getHeatStructureTreeFile(FileContentHandler fileNameContentMap) {
+ HeatTreeManager heatTreeManager = HeatTreeManagerUtil.initHeatTreeManager(fileNameContentMap);
+ heatTreeManager.createTree();
+ HeatStructureTree tree = heatTreeManager.getTree();
+ ValidationStructureList validationStructureList = new ValidationStructureList(tree);
+ return FileUtils.convertToInputStream(validationStructureList, FileUtils.FileExtension.JSON);
+ }
+
+ /**
+ * Build list of files to search optional.
+ *
+ * @param heatFileName the heat file name
+ * @param filesDataList the files data list
+ * @param types the types
+ * @return the optional
+ */
+ public static Optional<List<FileData>> buildListOfFilesToSearch(String heatFileName, List<FileData> filesDataList,
+ FileData.Type... types) {
+ List<FileData> list = new ArrayList<>(filesDataList);
+ Optional<FileData> resourceFileData = HeatToToscaUtil.getFileData(heatFileName, filesDataList);
+ if (resourceFileData.isPresent() && Objects.nonNull(resourceFileData.get().getData())) {
+ list.addAll(resourceFileData.get().getData());
+ }
+ return Optional.ofNullable(HeatToToscaUtil.getFilteredListOfFileDataByTypes(list, types));
+ }
+
+ /**
+ * Gets filtered list of file data by types.
+ *
+ * @param filesToSearch the files to search
+ * @param types the types
+ * @return the filtered list of file data by types
+ */
+ public static List<FileData> getFilteredListOfFileDataByTypes(List<FileData> filesToSearch,
+ FileData.Type... types) {
+ return filesToSearch.stream().filter(FileData.buildFileDataPredicateByType(types)).collect(Collectors.toList());
+ }
+
+ /**
+ * Gets file data from the list according to the input heat file name.
+ *
+ * @param heatFileName the heat file name
+ * @param fileDataList the file data list
+ * @return the file data
+ */
+ public static Optional<FileData> getFileData(String heatFileName, Collection<FileData> fileDataList) {
+ for (FileData file : fileDataList) {
+ if (file.getFile().equals(heatFileName)) {
+ return Optional.of(file);
+ }
+ }
+ return Optional.empty();
+ }
+
+ /**
+ * Gets file data which is supported by the translator, from the context according the input heat
+ * file name.
+ *
+ * @param heatFileName the heat file name
+ * @param context the translation context
+ * @return the file data
+ */
+ public static FileData getFileData(String heatFileName, TranslationContext context) {
+ List<FileData> fileDataList = context.getManifest().getContent().getData();
+ for (FileData fileData : fileDataList) {
+ if (TranslationService.getTypesToProcessByTranslator().contains(fileData.getType()) && fileData.getFile()
+ .equals(heatFileName)) {
+ return fileData;
+ }
+ }
+ return null;
+ }
+
+ static FileDataCollection getFileCollectionsByFilter(List<FileData> fileDataList, Set<FileData.Type> typeFilter,
+ TranslationContext translationContext) {
+ FileDataCollection fileDataCollection = new FileDataCollection();
+ Map<String, FileData> filteredFiles = filterFileDataListByType(fileDataList, typeFilter);
+ Set<String> referenced = new HashSet<>();
+
+ for (FileData fileData : filteredFiles.values()) {
+ String fileName = fileData.getFile();
+
+ if (FileData.isHeatFile(fileData.getType())) {
+ if (fileData.getBase() != null && fileData.getBase()) {
+ fileDataCollection.addBaseFiles(fileData);
+ }
+ HeatOrchestrationTemplate heatOrchestrationTemplate = new YamlUtil().yamlToObject(
+ translationContext.getFileContent(fileName), HeatOrchestrationTemplate.class);
+ if (MapUtils.isNotEmpty(heatOrchestrationTemplate.getResources())) {
+ applyFilterOnFileCollection(heatOrchestrationTemplate, translationContext, fileDataCollection,
+ filteredFiles, referenced);
+ }
+
+ } else {
+ fileDataCollection.addArtifactFiles(fileData);
+ filteredFiles.remove(fileData.getFile());
+ }
+ }
- if (FileData.isHeatFile(fileData.getType())) {
- if (fileData.getBase() != null && fileData.getBase()) {
- fileDataCollection.addBaseFiles(fileData);
+ referenced.forEach(filteredFiles::remove);
+ if (!CollectionUtils.isEmpty(fileDataCollection.getBaseFile())) {
+ for (FileData fileData : fileDataCollection.getBaseFile()) {
+ filteredFiles.remove(fileData.getFile());
+ }
}
- HeatOrchestrationTemplate heatOrchestrationTemplate = new YamlUtil()
- .yamlToObject(translationContext.getFileContent(fileName),
- HeatOrchestrationTemplate.class);
- if (MapUtils.isNotEmpty(heatOrchestrationTemplate.getResources())) {
- applyFilterOnFileCollection(heatOrchestrationTemplate, translationContext,
- fileDataCollection, filteredFiles, referenced);
+ fileDataCollection.setAddOnFiles(filteredFiles.values());
+ return fileDataCollection;
+ }
+
+ private static void applyFilterOnFileCollection(HeatOrchestrationTemplate heatOrchestrationTemplate,
+ TranslationContext translationContext,
+ FileDataCollection fileDataCollection,
+ Map<String, FileData> filteredFiles,
+ Set<String> referenced) {
+ List<String> filenames = extractFilenamesFromFileDataList(filteredFiles.values());
+
+ for (Resource resource : heatOrchestrationTemplate.getResources().values()) {
+ if (filenames.contains(resource.getType())) {
+ handleNestedFile(translationContext, fileDataCollection, filteredFiles, referenced, resource.getType());
+ } else if (resource.getType().equals(HeatResourcesTypes.RESOURCE_GROUP_RESOURCE_TYPE.getHeatResource())) {
+ handleResourceGrpNestedFile(resource, translationContext, fileDataCollection, filteredFiles, filenames,
+ referenced);
+ }
}
+ }
- } else {
- fileDataCollection.addArtifactFiles(fileData);
- filteredFiles.remove(fileData.getFile());
- }
+ private static void handleResourceGrpNestedFile(Resource resource, TranslationContext translationContext,
+ FileDataCollection fileDataCollection,
+ Map<String, FileData> filteredFiles, List<String> filenames,
+ Set<String> referenced) {
+ Object resourceDef = resource.getProperties().get(HeatConstants.RESOURCE_DEF_PROPERTY_NAME);
+ Object innerTypeDef = ((Map) resourceDef).get(HeatConstants.RESOURCE_DEF_TYPE_PROPERTY_NAME);
+ if (innerTypeDef instanceof String) {
+ String internalResourceType = (String) innerTypeDef;
+ if (filenames.contains(internalResourceType)) {
+ handleNestedFile(translationContext, fileDataCollection, filteredFiles, referenced,
+ internalResourceType);
+ }
+ }
}
- referenced.forEach(filteredFiles::remove);
- if (!CollectionUtils.isEmpty(fileDataCollection.getBaseFile())) {
- for (FileData fileData : fileDataCollection.getBaseFile()) {
- filteredFiles.remove(fileData.getFile());
- }
+ private static void handleNestedFile(TranslationContext translationContext, FileDataCollection fileDataCollection,
+ Map<String, FileData> filteredFiles, Set<String> referenced,
+ String nestedFileName) {
+ referenced.add(nestedFileName);
+ fileDataCollection.addNestedFiles(filteredFiles.get(nestedFileName));
+ translationContext.getNestedHeatsFiles().add(nestedFileName);
}
- fileDataCollection.setAddOnFiles(filteredFiles.values());
- return fileDataCollection;
- }
-
- private static void applyFilterOnFileCollection(
- HeatOrchestrationTemplate heatOrchestrationTemplate,
- TranslationContext translationContext,
- FileDataCollection fileDataCollection, Map<String, FileData> filteredFiles,
- Set<String> referenced) {
- List<String> filenames = extractFilenamesFromFileDataList(filteredFiles.values());
-
- for (Resource resource : heatOrchestrationTemplate.getResources().values()) {
- if (filenames.contains(resource.getType())) {
- handleNestedFile(translationContext, fileDataCollection, filteredFiles, referenced,
- resource.getType());
- } else if (resource.getType()
- .equals(HeatResourcesTypes.RESOURCE_GROUP_RESOURCE_TYPE.getHeatResource())) {
- handleResourceGrpNestedFile(resource, translationContext, fileDataCollection,
- filteredFiles, filenames, referenced);
- }
+
+ private static Map<String, FileData> filterFileDataListByType(List<FileData> fileDataList,
+ Set<FileData.Type> typesToGet) {
+ Map<String, FileData> filtered = new HashMap<>();
+ fileDataList.stream().filter(file -> typesToGet.contains(file.getType()))
+ .forEach(file -> filtered.put(file.getFile(), file));
+ return filtered;
}
- }
-
- private static void handleResourceGrpNestedFile(Resource resource,
- TranslationContext translationContext,
- FileDataCollection fileDataCollection,
- Map<String, FileData> filteredFiles,
- List<String> filenames,
- Set<String> referenced) {
- Object resourceDef = resource.getProperties().get(HeatConstants.RESOURCE_DEF_PROPERTY_NAME);
- Object innerTypeDef = ((Map) resourceDef).get(HeatConstants.RESOURCE_DEF_TYPE_PROPERTY_NAME);
- if (innerTypeDef instanceof String) {
- String internalResourceType = (String) innerTypeDef;
- if (filenames.contains(internalResourceType)) {
- handleNestedFile(translationContext, fileDataCollection, filteredFiles,
- referenced, internalResourceType);
- }
+
+ private static List<String> extractFilenamesFromFileDataList(Collection<FileData> fileDataList) {
+ return fileDataList.stream().map(FileData::getFile).collect(Collectors.toList());
}
- }
-
- private static void handleNestedFile(TranslationContext translationContext,
- FileDataCollection fileDataCollection,
- Map<String, FileData> filteredFiles, Set<String> referenced,
- String nestedFileName) {
- referenced.add(nestedFileName);
- fileDataCollection.addNestedFiles(filteredFiles.get(nestedFileName));
- translationContext.getNestedHeatsFiles().add(nestedFileName);
- }
-
- private static Map<String, FileData> filterFileDataListByType(List<FileData> fileDataList,
- Set<FileData.Type> typesToGet) {
- Map<String, FileData> filtered = new HashMap<>();
- fileDataList.stream().filter(file -> typesToGet.contains(file.getType()))
- .forEach(file -> filtered.put(file.getFile(), file));
- return filtered;
- }
-
- private static List<String> extractFilenamesFromFileDataList(Collection<FileData> fileDataList) {
- return fileDataList.stream().map(FileData::getFile).collect(Collectors.toList());
- }
-
- /**
- * Extract attached resource id optional.
- *
- * @param translateTo the translate to
- * @param propertyName the property name
- * @return the optional
- */
- public static Optional<AttachedResourceId> extractAttachedResourceId(TranslateTo translateTo,
- String propertyName) {
- Object propertyValue = translateTo.getResource().getProperties().get(propertyName);
- if (propertyValue == null) {
- return Optional.empty();
- }
- return extractAttachedResourceId(translateTo.getHeatFileName(),
- translateTo.getHeatOrchestrationTemplate(), translateTo.getContext(), propertyValue);
- }
-
- /**
- * Extract attached resource id optional.
- *
- * @param heatFileName the heat file name
- * @param heatOrchestrationTemplate the heat orchestration template
- * @param context the context
- * @param propertyValue the property value
- * @return the optional
- */
- public static Optional<AttachedResourceId> extractAttachedResourceId(
- String heatFileName,
- HeatOrchestrationTemplate heatOrchestrationTemplate,
- TranslationContext context,
- Object propertyValue) {
-
- Object entity;
- Object translatedId;
-
- if (Objects.isNull(propertyValue)) {
- return Optional.empty();
- }
-
- ReferenceType referenceType = ReferenceType.OTHER;
- if (propertyValue instanceof Map && !((Map) propertyValue).isEmpty()) {
- Map<String, Object> propMap = (Map) propertyValue;
- Map.Entry<String, Object> entry = propMap.entrySet().iterator().next();
- entity = entry.getValue();
- String key = entry.getKey();
- referenceType = getReferenceTypeFromAttachedResouce(key);
+
+ /**
+ * Extract attached resource id optional.
+ *
+ * @param translateTo the translate to
+ * @param propertyName the property name
+ * @return the optional
+ */
+ public static Optional<AttachedResourceId> extractAttachedResourceId(TranslateTo translateTo, String propertyName) {
+ Object propertyValue = translateTo.getResource().getProperties().get(propertyName);
+ if (propertyValue == null) {
+ return Optional.empty();
+ }
+ return extractAttachedResourceId(translateTo.getHeatFileName(), translateTo.getHeatOrchestrationTemplate(),
+ translateTo.getContext(), propertyValue);
+ }
+
+ /**
+ * Extract attached resource id optional.
+ *
+ * @param heatFileName the heat file name
+ * @param heatOrchestrationTemplate the heat orchestration template
+ * @param context the context
+ * @param propertyValue the property value
+ * @return the optional
+ */
+ public static Optional<AttachedResourceId> extractAttachedResourceId(String heatFileName,
+ HeatOrchestrationTemplate heatOrchestrationTemplate,
+ TranslationContext context,
+ Object propertyValue) {
+
+ Object entity;
+ Object translatedId;
+
+ if (Objects.isNull(propertyValue)) {
+ return Optional.empty();
+ }
+
+ ReferenceType referenceType = ReferenceType.OTHER;
+ if (propertyValue instanceof Map && !((Map) propertyValue).isEmpty()) {
+ Map<String, Object> propMap = (Map) propertyValue;
+ Map.Entry<String, Object> entry = propMap.entrySet().iterator().next();
+ entity = entry.getValue();
+ String key = entry.getKey();
+ referenceType = getReferenceTypeFromAttachedResouce(key);
if (!FunctionTranslationFactory.getInstance(entry.getKey()).isPresent()) {
translatedId = null;
@@ -394,1206 +376,1116 @@ public class HeatToToscaUtil {
translatedId = null;
}
- } else {
- translatedId = propertyValue;
- entity = propertyValue;
- }
-
- return Optional.of(new AttachedResourceId(translatedId, entity, referenceType));
- }
-
- private static ReferenceType getReferenceTypeFromAttachedResouce(String key) {
- ReferenceType referenceType;
- switch (key) {
- case GET_RESOURCE:
- referenceType = ReferenceType.GET_RESOURCE;
- break;
- case GET_PARAM:
- referenceType = ReferenceType.GET_PARAM;
- break;
- case GET_ATTR:
- referenceType = ReferenceType.GET_ATTR;
- break;
- default:
- referenceType = ReferenceType.OTHER;
- break;
- }
-
- return referenceType;
- }
-
- /**
- * Gets contrail attached heat resource id.
- *
- * @param attachedResource the attached resource
- * @return the contrail attached heat resource id
- */
- public static Optional<String> getContrailAttachedHeatResourceId(
- AttachedResourceId attachedResource) {
- if (attachedResource == null) {
- return Optional.empty();
- }
-
- if (attachedResource.isGetResource()) {
- return Optional.of((String) attachedResource.getEntityId());
- }
-
- if (attachedResource.isGetAttr()) {
- return getResourceId(attachedResource.getEntityId());
- }
- return Optional.empty();
- }
-
- /**
- * Extract property optional.
- *
- * @param propertyValue the property value
- * @return the optional
- */
- private static Optional<AttachedPropertyVal> extractProperty(Object propertyValue) {
- Object attachedPropertyVal;
- if (Objects.isNull(propertyValue)) {
- return Optional.empty();
- }
-
- ReferenceType referenceType = ReferenceType.OTHER;
- if (propertyValue instanceof Map && !((Map) propertyValue).isEmpty()) {
- Map<String, Object> propMap = (Map) propertyValue;
- Map.Entry<String, Object> entry = propMap.entrySet().iterator().next();
- attachedPropertyVal = entry.getValue();
- String key = entry.getKey();
- switch (key) {
- case GET_RESOURCE:
- referenceType = ReferenceType.GET_RESOURCE;
- break;
- case GET_PARAM:
- referenceType = ReferenceType.GET_PARAM;
- break;
- case GET_ATTR:
- referenceType = ReferenceType.GET_ATTR;
- break;
- default:
- break;
- }
+ } else {
+ translatedId = propertyValue;
+ entity = propertyValue;
+ }
+
+ return Optional.of(new AttachedResourceId(translatedId, entity, referenceType));
+ }
+
+ private static ReferenceType getReferenceTypeFromAttachedResouce(String key) {
+ ReferenceType referenceType;
+ switch (key) {
+ case GET_RESOURCE:
+ referenceType = ReferenceType.GET_RESOURCE;
+ break;
+ case GET_PARAM:
+ referenceType = ReferenceType.GET_PARAM;
+ break;
+ case GET_ATTR:
+ referenceType = ReferenceType.GET_ATTR;
+ break;
+ default:
+ referenceType = ReferenceType.OTHER;
+ break;
+ }
+
+ return referenceType;
+ }
+
+ /**
+ * Gets contrail attached heat resource id.
+ *
+ * @param attachedResource the attached resource
+ * @return the contrail attached heat resource id
+ */
+ public static Optional<String> getContrailAttachedHeatResourceId(AttachedResourceId attachedResource) {
+ if (attachedResource == null) {
+ return Optional.empty();
+ }
+
+ if (attachedResource.isGetResource()) {
+ return Optional.of((String) attachedResource.getEntityId());
+ }
+
+ if (attachedResource.isGetAttr()) {
+ return getResourceId(attachedResource.getEntityId());
+ }
+ return Optional.empty();
+ }
+
+ /**
+ * Extract property optional.
+ *
+ * @param propertyValue the property value
+ * @return the optional
+ */
+ private static Optional<AttachedPropertyVal> extractProperty(Object propertyValue) {
+ Object attachedPropertyVal;
+ if (Objects.isNull(propertyValue)) {
+ return Optional.empty();
+ }
- } else {
- attachedPropertyVal = propertyValue;
- }
- return Optional.of(new AttachedPropertyVal(attachedPropertyVal, referenceType));
- }
-
- /**
- * Map boolean.
- *
- * @param nodeTemplate the node template
- * @param propertyKey the property key
- */
- public static void mapBoolean(NodeTemplate nodeTemplate, String propertyKey) {
- Object value = nodeTemplate.getProperties().get(propertyKey);
- if (value != null && !(value instanceof Map)) {
- nodeTemplate.getProperties().put(propertyKey, HeatBoolean.eval(value));
- }
- }
-
- /**
- * Map boolean list.
- *
- * @param nodeTemplate the node template
- * @param propertyListKey the property list key
- */
- public static void mapBooleanList(NodeTemplate nodeTemplate, String propertyListKey) {
- Object listValue = nodeTemplate.getProperties().get(propertyListKey);
- if (listValue instanceof List) {
- List booleanList = (List) listValue;
- for (int i = 0; i < booleanList.size(); i++) {
- Object value = booleanList.get(i);
+ ReferenceType referenceType = ReferenceType.OTHER;
+ if (propertyValue instanceof Map && !((Map) propertyValue).isEmpty()) {
+ Map<String, Object> propMap = (Map) propertyValue;
+ Map.Entry<String, Object> entry = propMap.entrySet().iterator().next();
+ attachedPropertyVal = entry.getValue();
+ String key = entry.getKey();
+ switch (key) {
+ case GET_RESOURCE:
+ referenceType = ReferenceType.GET_RESOURCE;
+ break;
+ case GET_PARAM:
+ referenceType = ReferenceType.GET_PARAM;
+ break;
+ case GET_ATTR:
+ referenceType = ReferenceType.GET_ATTR;
+ break;
+ default:
+ break;
+ }
+
+ } else {
+ attachedPropertyVal = propertyValue;
+ }
+ return Optional.of(new AttachedPropertyVal(attachedPropertyVal, referenceType));
+ }
+
+ /**
+ * Map boolean.
+ *
+ * @param nodeTemplate the node template
+ * @param propertyKey the property key
+ */
+ public static void mapBoolean(NodeTemplate nodeTemplate, String propertyKey) {
+ Object value = nodeTemplate.getProperties().get(propertyKey);
if (value != null && !(value instanceof Map)) {
- booleanList.set(i, HeatBoolean.eval(value));
+ nodeTemplate.getProperties().put(propertyKey, HeatBoolean.eval(value));
}
- }
}
- }
-
-
- /**
- * Is yml file type boolean.
- *
- * @param filename the filename
- * @return the boolean
- */
- public static boolean isYmlFileType(String filename) {
- String extension = FilenameUtils.getExtension(filename);
- return "yaml".equalsIgnoreCase(extension)
- || "yml".equalsIgnoreCase(extension);
- }
-
- /**
- * Is nested resource boolean.
- *
- * @param resource the resource
- * @return the boolean
- */
- public static boolean isNestedResource(Resource resource) {
- String resourceType = resource.getType();
-
- if (resourceType.equals(HeatResourcesTypes.RESOURCE_GROUP_RESOURCE_TYPE.getHeatResource())) {
- Object resourceDef = resource.getProperties().get(HeatConstants.RESOURCE_DEF_PROPERTY_NAME);
- if (!(((Map) resourceDef).get(HeatConstants.RESOURCE_DEF_TYPE_PROPERTY_NAME) instanceof
- String)) {
- //currently only resource group which is poinitng to nested heat file is supported
- //dynamic type is currently not supported
+
+ /**
+ * Map boolean list.
+ *
+ * @param nodeTemplate the node template
+ * @param propertyListKey the property list key
+ */
+ public static void mapBooleanList(NodeTemplate nodeTemplate, String propertyListKey) {
+ Object listValue = nodeTemplate.getProperties().get(propertyListKey);
+ if (listValue instanceof List) {
+ List booleanList = (List) listValue;
+ for (int i = 0; i < booleanList.size(); i++) {
+ Object value = booleanList.get(i);
+ if (value != null && !(value instanceof Map)) {
+ booleanList.set(i, HeatBoolean.eval(value));
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Is yml file type boolean.
+ *
+ * @param filename the filename
+ * @return the boolean
+ */
+ public static boolean isYmlFileType(String filename) {
+ String extension = FilenameUtils.getExtension(filename);
+ return "yaml".equalsIgnoreCase(extension) || "yml".equalsIgnoreCase(extension);
+ }
+
+ /**
+ * Is nested resource boolean.
+ *
+ * @param resource the resource
+ * @return the boolean
+ */
+ public static boolean isNestedResource(Resource resource) {
+ String resourceType = resource.getType();
+
+ if (resourceType.equals(HeatResourcesTypes.RESOURCE_GROUP_RESOURCE_TYPE.getHeatResource())) {
+ Object resourceDef = resource.getProperties().get(HeatConstants.RESOURCE_DEF_PROPERTY_NAME);
+ if (!(((Map) resourceDef).get(HeatConstants.RESOURCE_DEF_TYPE_PROPERTY_NAME) instanceof String)) {
+ //currently only resource group which is poinitng to nested heat file is supported
+ //dynamic type is currently not supported
+ return false;
+ }
+ String internalResourceType =
+ (String) ((Map) resourceDef).get(HeatConstants.RESOURCE_DEF_TYPE_PROPERTY_NAME);
+ if (isYamlFile(internalResourceType)) {
+ return true;
+ }
+ } else if (isYamlFile(resourceType)) {
+ return true;
+ }
return false;
- }
- String internalResourceType = (String) ((Map) resourceDef).get(HeatConstants
- .RESOURCE_DEF_TYPE_PROPERTY_NAME);
- if (isYamlFile(internalResourceType)) {
- return true;
- }
- } else if (isYamlFile(resourceType)) {
- return true;
- }
- return false;
- }
-
- /**
- * Checks if the current HEAT resource if of type sub interface.
- *
- * @param resource the resource
- * @return true if the resource is of sub interface type and false otherwise
- */
- public static boolean isSubInterfaceResource(Resource resource, TranslationContext context) {
- if (!ToggleableFeature.VLAN_TAGGING.isActive()) {
- //Remove this once feature is stable and moved to production
- return false;
- }
- //Check if resource group is a nested resource
- if (!isNestedResource(resource)) {
- return false;
- }
- Optional<String> nestedHeatFileName = HeatToToscaUtil.getNestedHeatFileName(resource);
- return nestedHeatFileName.filter(fileName ->
- isNestedVlanResource(fileName, context)).isPresent();
- }
-
- private static boolean isNestedVlanResource(String nestedHeatFileName,
- TranslationContext translationContext) {
- HeatOrchestrationTemplate nestedHeatOrchestrationTemplate = new YamlUtil()
- .yamlToObject(translationContext.getFileContent(nestedHeatFileName),
- HeatOrchestrationTemplate.class);
- return Objects.nonNull(nestedHeatOrchestrationTemplate.getResources())
- && nestedHeatOrchestrationTemplate.getResources().values().stream()
- .anyMatch(new ContrailV2VirtualMachineInterfaceHelper()::isVlanSubInterfaceResource);
- }
-
- public static Optional<String> getSubInterfaceParentPortNodeTemplateId(
- TranslateTo subInterfaceTo) {
- String subInterfaceResourceType = getSubInterfaceResourceType(subInterfaceTo.getResource());
- HeatOrchestrationTemplate nestedHeatOrchestrationTemplate = new YamlUtil()
- .yamlToObject(subInterfaceTo.getContext().getFileContent(subInterfaceResourceType),
- HeatOrchestrationTemplate.class);
- if (Objects.isNull(nestedHeatOrchestrationTemplate.getResources())) {
- return Optional.empty();
- }
- for (Map.Entry<String, Resource> resourceEntry : nestedHeatOrchestrationTemplate
- .getResources().entrySet()) {
- Resource resource = resourceEntry.getValue();
- if (isVmiRefsPropertyExists(resource)) {
- Object toscaPropertyValue =
- TranslatorHeatToToscaPropertyConverter
- .getToscaPropertyValue(subInterfaceTo.getServiceTemplate(),
- resourceEntry.getKey(), HeatConstants.VMI_REFS_PROPERTY_NAME,
- resource.getProperties().get(HeatConstants.VMI_REFS_PROPERTY_NAME),
- resource.getType(), subInterfaceResourceType, nestedHeatOrchestrationTemplate,
- null, subInterfaceTo.getContext());
- return getParentNodeTemplateIdFromPropertyValue(toscaPropertyValue, subInterfaceTo);
- }
}
- return Optional.empty();
- }
-
- private static boolean isVmiRefsPropertyExists(Resource resource) {
- return HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE
- .getHeatResource().equals(resource.getType())
- && MapUtils.isNotEmpty(resource.getProperties())
- && resource.getProperties().containsKey(HeatConstants.VMI_REFS_PROPERTY_NAME);
- }
-
- public static String getSubInterfaceResourceType(Resource resource) {
- if (!HeatToToscaUtil.isYamlFile(resource.getType())) {
- return ((Map) resource.getProperties()
- .get(HeatConstants.RESOURCE_DEF_PROPERTY_NAME))
- .get(HeatConstants.RESOURCE_DEF_TYPE_PROPERTY_NAME)
- .toString();
- }
- return resource.getType();
- }
-
- private static Optional<String> getParentNodeTemplateIdFromPropertyValue(
- Object toscaPropertyValue,
- TranslateTo subInterfaceTo) {
- if (toscaPropertyValue instanceof List
- && ((List) toscaPropertyValue).get(0) instanceof Map) {
- Resource subInterfaceResource = subInterfaceTo.getResource();
- Map<String, String> toscaPropertyValueMap = (Map) ((List) toscaPropertyValue).get(0);
- String parentPortPropertyInput = toscaPropertyValueMap.get(ToscaFunctions.GET_INPUT
- .getDisplayName());
- Map<String, Object> resourceDefPropertiesMap;
- if (!isYamlFile(subInterfaceResource.getType())) {
- resourceDefPropertiesMap = (Map) ((Map) subInterfaceResource
- .getProperties().get(HeatConstants.RESOURCE_DEF_PROPERTY_NAME))
- .get(HeatConstants.RESOURCE_DEF_PROPERTIES);
- } else {
- resourceDefPropertiesMap = subInterfaceResource.getProperties();
- }
- Object parentPortObj = resourceDefPropertiesMap.get(parentPortPropertyInput);
- if (parentPortObj instanceof Map) {
- Map<String, String> parentPortPropertyValue = (Map) parentPortObj;
- if (parentPortPropertyValue.keySet().contains(ResourceReferenceFunctions
- .GET_RESOURCE.getFunction())) {
- return ResourceTranslationBase.getResourceTranslatedId(subInterfaceTo.getHeatFileName(),
- subInterfaceTo.getHeatOrchestrationTemplate(),
- parentPortPropertyValue.get(ResourceReferenceFunctions.GET_RESOURCE.getFunction()),
- subInterfaceTo.getContext());
+
+ /**
+ * Checks if the current HEAT resource if of type sub interface.
+ *
+ * @param resource the resource
+ * @return true if the resource is of sub interface type and false otherwise
+ */
+ public static boolean isSubInterfaceResource(Resource resource, TranslationContext context) {
+ if (!ToggleableFeature.VLAN_TAGGING.isActive()) {
+ //Remove this once feature is stable and moved to production
+ return false;
}
- }
+ //Check if resource group is a nested resource
+ if (!isNestedResource(resource)) {
+ return false;
+ }
+ Optional<String> nestedHeatFileName = HeatToToscaUtil.getNestedHeatFileName(resource);
+ return nestedHeatFileName.filter(fileName -> isNestedVlanResource(fileName, context)).isPresent();
}
- return Optional.empty();
- }
-
- /**
- * Checks if the nested resource represents a VFC or a complex VFC (Heat file should contain at
- * least one or more compute nodes).
- *
- * @param resource the resource
- * @param context the context
- * @return true if the resource represents a VFC and false otherwise.
- */
- public static boolean isNestedVfcResource(Resource resource, TranslationContext context) {
- Optional<String> nestedHeatFileName = HeatToToscaUtil.getNestedHeatFileName(resource);
- HeatOrchestrationTemplate nestedHeatOrchestrationTemplate = new YamlUtil()
- .yamlToObject(context.getFileContent(nestedHeatFileName.get()),
- HeatOrchestrationTemplate.class);
- if (Objects.nonNull(nestedHeatOrchestrationTemplate.getResources())) {
- for (String innerResourceId : nestedHeatOrchestrationTemplate.getResources().keySet()) {
- if (ConsolidationDataUtil
- .isComputeResource(nestedHeatOrchestrationTemplate, innerResourceId)) {
- return true;
+
+ private static boolean isNestedVlanResource(String nestedHeatFileName, TranslationContext translationContext) {
+ HeatOrchestrationTemplate nestedHeatOrchestrationTemplate = new YamlUtil().yamlToObject(
+ translationContext.getFileContent(nestedHeatFileName), HeatOrchestrationTemplate.class);
+ return Objects.nonNull(nestedHeatOrchestrationTemplate.getResources()) && nestedHeatOrchestrationTemplate
+ .getResources().values()
+ .stream().anyMatch(
+ new ContrailV2VirtualMachineInterfaceHelper()::isVlanSubInterfaceResource);
+ }
+
+ public static Optional<String> getSubInterfaceParentPortNodeTemplateId(TranslateTo subInterfaceTo) {
+ String subInterfaceResourceType = getSubInterfaceResourceType(subInterfaceTo.getResource());
+ HeatOrchestrationTemplate nestedHeatOrchestrationTemplate = new YamlUtil().yamlToObject(
+ subInterfaceTo.getContext().getFileContent(subInterfaceResourceType), HeatOrchestrationTemplate.class);
+ if (Objects.isNull(nestedHeatOrchestrationTemplate.getResources())) {
+ return Optional.empty();
}
- }
+ for (Map.Entry<String, Resource> resourceEntry : nestedHeatOrchestrationTemplate.getResources().entrySet()) {
+ Resource resource = resourceEntry.getValue();
+ if (isVmiRefsPropertyExists(resource)) {
+ Object toscaPropertyValue = TranslatorHeatToToscaPropertyConverter
+ .getToscaPropertyValue(subInterfaceTo.getServiceTemplate(),
+ resourceEntry.getKey(),
+ HeatConstants.VMI_REFS_PROPERTY_NAME,
+ resource.getProperties()
+ .get(HeatConstants.VMI_REFS_PROPERTY_NAME),
+ resource.getType(), subInterfaceResourceType,
+ nestedHeatOrchestrationTemplate, null,
+ subInterfaceTo.getContext());
+ return getParentNodeTemplateIdFromPropertyValue(toscaPropertyValue, subInterfaceTo);
+ }
+ }
+ return Optional.empty();
}
- return false;
- }
-
- /**
- * Get nested heat file name in case of nested resource.
- *
- * @param resource the resource
- * @return the nested heat file name
- */
- private static Optional<String> getNestedHeatFileName(Resource resource) {
- if (!isNestedResource(resource)) {
- return Optional.empty();
- }
-
- String resourceType = resource.getType();
-
- if (resourceType.equals(HeatResourcesTypes.RESOURCE_GROUP_RESOURCE_TYPE.getHeatResource())) {
- Object resourceDef = resource.getProperties().get(HeatConstants.RESOURCE_DEF_PROPERTY_NAME);
- String internalResourceType = (String) ((Map) resourceDef).get(HeatConstants
- .RESOURCE_DEF_TYPE_PROPERTY_NAME);
- return Optional.of(internalResourceType);
- }
- return Optional.of(resourceType);
- }
-
- /**
- * Gets nested file.
- *
- * @param resource the resource
- * @return the nested file
- */
- public static Optional<String> getNestedFile(Resource resource) {
- if (!isNestedResource(resource)) {
- return Optional.empty();
- }
- String resourceType = resource.getType();
- if (resourceType.equals(HeatResourcesTypes.RESOURCE_GROUP_RESOURCE_TYPE.getHeatResource())) {
- Object resourceDef = resource.getProperties().get(HeatConstants.RESOURCE_DEF_PROPERTY_NAME);
- String internalResourceType = (String) ((Map) resourceDef).get(HeatConstants
- .RESOURCE_DEF_TYPE_PROPERTY_NAME);
- return Optional.of(internalResourceType);
- } else {
- return Optional.of(resourceType);
- }
- }
-
- public static boolean isYamlFile(String fileName) {
- return fileName.endsWith(".yaml") || fileName.endsWith(".yml");
- }
-
- /**
- * Gets resource.
- *
- * @param heatOrchestrationTemplate the heat orchestration template
- * @param resourceId the resource id
- * @param heatFileName the heat file name
- * @return the resource
- */
- public static Resource getResource(HeatOrchestrationTemplate heatOrchestrationTemplate,
- String resourceId, String heatFileName) {
- Resource resource = heatOrchestrationTemplate.getResources().get(resourceId);
- if (resource == null) {
- throw new CoreException(
- new ResourceNotFoundInHeatFileErrorBuilder(resourceId, heatFileName).build());
- }
- return resource;
- }
-
-
- /**
- * Get resource type.
- *
- * @param resourceId the resource id
- * @param heatOrchestrationTemplate heat orchestration template
- * @param heatFileName heat file name
- * @return resource type
- */
- public static String getResourceType(String resourceId,
- HeatOrchestrationTemplate heatOrchestrationTemplate,
- String heatFileName) {
- return HeatToToscaUtil.getResource(heatOrchestrationTemplate, resourceId, heatFileName)
- .getType();
- }
-
- /**
- * Is heat file nested boolean.
- *
- * @param translateTo the translate to
- * @param heatFileName the heat file name
- * @return the boolean
- */
- public static boolean isHeatFileNested(TranslateTo translateTo, String heatFileName) {
- return isHeatFileNested(translateTo.getContext(), heatFileName);
- }
-
- public static boolean isHeatFileNested(TranslationContext context, String heatFileName) {
- return context.getNestedHeatsFiles().contains(heatFileName);
- }
-
- /**
- * Extract contrail get resource attached heat resource id optional.
- *
- * @param propertyValue the property value
- * @return the optional
- */
- public static Optional<String> extractContrailGetResourceAttachedHeatResourceId(
- Object propertyValue) {
- if (propertyValue instanceof Map) {
- if (((Map) propertyValue).containsKey(GET_ATTR)) {
- return getResourceId(((Map) propertyValue).get(GET_ATTR));
- } else if (((Map) propertyValue).containsKey(GET_RESOURCE)) {
- return getHeatResourceIdFromResource((Map) propertyValue);
- } else {
- Collection valCollection = ((Map) propertyValue).values();
- return evaluateHeatResourceId(valCollection);
- }
- } else if (propertyValue instanceof List) {
- return evaluateHeatResourceId((List) propertyValue);
- }
- return Optional.empty();
- }
-
- private static Optional<String> getResourceId(Object data) {
- if (data instanceof List && CollectionUtils.size(data) > 1
- && FQ_NAME.equals(((List) data).get(1))
- && ((List) data).get(0) instanceof String) {
- return Optional.of((String) ((List) data).get(0));
- } else {
- LOGGER.warn("invalid format of 'get_attr' function - " + data.toString());
- return Optional.empty();
- }
- }
-
- private static Optional<String> getHeatResourceIdFromResource(Map propertyValue) {
- Object value = propertyValue.get(GET_RESOURCE);
- if (value instanceof String) {
- return Optional.of((String) value);
- } else {
- LOGGER.warn("invalid format of 'get_resource' function - " + propertyValue.toString());
- return Optional.empty();
- }
- }
-
- private static Optional<String> evaluateHeatResourceId(Collection propertyValue) {
- for (Object prop : propertyValue) {
- Optional<String> ret = extractContrailGetResourceAttachedHeatResourceId(prop);
- if (ret.isPresent()) {
- return ret;
- }
+
+ private static boolean isVmiRefsPropertyExists(Resource resource) {
+ return HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource()
+ .equals(resource.getType())
+ && MapUtils.isNotEmpty(resource.getProperties()) && resource.getProperties().containsKey(
+ HeatConstants.VMI_REFS_PROPERTY_NAME);
}
- return Optional.empty();
- }
-
- /**
- * Gets tosca service model.
- *
- * @param context translation context
- * @return the tosca service model
- */
- public static ToscaServiceModel getToscaServiceModel(TranslationContext context) {
- Map<String, String> metadata = new HashMap<>();
- metadata.put(ToscaConstants.ST_METADATA_TEMPLATE_NAME, Constants.MAIN_TEMPLATE_NAME);
- return getToscaServiceModel(context, metadata);
- }
-
- /**
- * Gets tosca service model.
- *
- * @param context translation context
- * @param entryDefinitionMetadata template name of the entry definition servie template
- * @return the tosca service model
- */
- private static ToscaServiceModel getToscaServiceModel(
- TranslationContext context,
- Map<String, String> entryDefinitionMetadata) {
- Map<String, ServiceTemplate> serviceTemplates =
- new HashMap<>(context.getGlobalServiceTemplates());
- Collection<ServiceTemplate> tmpServiceTemplates =
- context.getTranslatedServiceTemplates().values();
- for (ServiceTemplate serviceTemplate : tmpServiceTemplates) {
- ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, serviceTemplate);
- }
- return new ToscaServiceModel(null, serviceTemplates,
- ToscaUtil.getServiceTemplateFileName(entryDefinitionMetadata));
- }
-
- /**
- * Gets service template from context.
- *
- * @param serviceTemplateFileName the service template file name
- * @param context the context
- * @return the service template from context
- */
- public static Optional<ServiceTemplate> getServiceTemplateFromContext(
- String serviceTemplateFileName, TranslationContext context) {
- for (ServiceTemplate serviceTemplate : context.getTranslatedServiceTemplates().values()) {
- if (ToscaUtil.getServiceTemplateFileName(serviceTemplate).equals(serviceTemplateFileName)) {
- return Optional.of(serviceTemplate);
- }
+
+ public static String getSubInterfaceResourceType(Resource resource) {
+ if (!HeatToToscaUtil.isYamlFile(resource.getType())) {
+ return ((Map) resource.getProperties().get(HeatConstants.RESOURCE_DEF_PROPERTY_NAME))
+ .get(HeatConstants.RESOURCE_DEF_TYPE_PROPERTY_NAME).toString();
+ }
+ return resource.getType();
+ }
+
+ private static Optional<String> getParentNodeTemplateIdFromPropertyValue(Object toscaPropertyValue,
+ TranslateTo subInterfaceTo) {
+ if (toscaPropertyValue instanceof List && ((List) toscaPropertyValue).get(0) instanceof Map) {
+ Resource subInterfaceResource = subInterfaceTo.getResource();
+ Map<String, String> toscaPropertyValueMap = (Map) ((List) toscaPropertyValue).get(0);
+ String parentPortPropertyInput = toscaPropertyValueMap.get(ToscaFunctions.GET_INPUT.getDisplayName());
+ Map<String, Object> resourceDefPropertiesMap;
+ if (!isYamlFile(subInterfaceResource.getType())) {
+ resourceDefPropertiesMap =
+ (Map) ((Map) subInterfaceResource.getProperties().get(HeatConstants.RESOURCE_DEF_PROPERTY_NAME))
+ .get(HeatConstants.RESOURCE_DEF_PROPERTIES);
+ } else {
+ resourceDefPropertiesMap = subInterfaceResource.getProperties();
+ }
+ Object parentPortObj = resourceDefPropertiesMap.get(parentPortPropertyInput);
+ if (parentPortObj instanceof Map) {
+ Map<String, String> parentPortPropertyValue = (Map) parentPortObj;
+ if (parentPortPropertyValue.keySet().contains(ResourceReferenceFunctions.GET_RESOURCE.getFunction())) {
+ return ResourceTranslationBase.getResourceTranslatedId(subInterfaceTo.getHeatFileName(),
+ subInterfaceTo.getHeatOrchestrationTemplate(),
+ parentPortPropertyValue.get(ResourceReferenceFunctions.GET_RESOURCE.getFunction()),
+ subInterfaceTo.getContext());
+ }
+ }
+ }
+ return Optional.empty();
+ }
+
+ /**
+ * Checks if the nested resource represents a VFC or a complex VFC (Heat file should contain at
+ * least one or more compute nodes).
+ *
+ * @param resource the resource
+ * @param context the context
+ * @return true if the resource represents a VFC and false otherwise.
+ */
+ public static boolean isNestedVfcResource(Resource resource, TranslationContext context) {
+ Optional<String> nestedHeatFileName = HeatToToscaUtil.getNestedHeatFileName(resource);
+ HeatOrchestrationTemplate nestedHeatOrchestrationTemplate = new YamlUtil().yamlToObject(
+ context.getFileContent(nestedHeatFileName.get()), HeatOrchestrationTemplate.class);
+ if (Objects.nonNull(nestedHeatOrchestrationTemplate.getResources())) {
+ for (String innerResourceId : nestedHeatOrchestrationTemplate.getResources().keySet()) {
+ if (ConsolidationDataUtil.isComputeResource(nestedHeatOrchestrationTemplate, innerResourceId)) {
+ return true;
+ }
+ }
+ }
+ return false;
}
- return Optional.empty();
- }
-
- /**
- * Adding link requerment from port node template to network node template.
- *
- * @param portNodeTemplate port node template
- * @param networkTranslatedId network node template id
- */
- public static RequirementAssignment addLinkReqFromPortToNetwork(NodeTemplate portNodeTemplate,
- String networkTranslatedId) {
- RequirementAssignment requirement = new RequirementAssignment();
- requirement.setCapability(ToscaCapabilityType.NATIVE_NETWORK_LINKABLE);
- requirement.setRelationship(ToscaRelationshipType.NATIVE_NETWORK_LINK_TO);
- requirement.setNode(networkTranslatedId);
- DataModelUtil.addRequirementAssignment(portNodeTemplate,
- ToscaConstants.LINK_REQUIREMENT_ID, requirement);
- return requirement;
- }
-
- /**
- * Adding binding requerment from sub interface node template to interface (port) node template.
- *
- * @param subInterfaceNodeTemplate sub interface template
- * @param interfaceTranslatedId interface node template id
- */
- public static void addBindingReqFromSubInterfaceToInterface(
- NodeTemplate subInterfaceNodeTemplate, String interfaceTranslatedId) {
- RequirementAssignment requirement = new RequirementAssignment();
- requirement.setCapability(ToscaCapabilityType.NATIVE_NETWORK_BINDABLE);
- requirement.setRelationship(ToscaRelationshipType.NATIVE_NETWORK_BINDS_TO);
- requirement.setNode(interfaceTranslatedId);
- DataModelUtil
- .addRequirementAssignment(subInterfaceNodeTemplate,
- ToscaConstants.BINDING_REQUIREMENT_ID, requirement);
- }
-
- /**
- * Get property Parameter Name Value.
- *
- * @param property property
- * @return Parameter name in case the property include "get_param" function
- */
- public static Optional<String> getPropertyParameterNameValue(Object property) {
- if (Objects.isNull(property)) {
- return Optional.empty();
- }
- Optional<AttachedPropertyVal> extractedProperty = extractProperty(property);
- if (extractedProperty.isPresent()) {
- return getParameterName(extractedProperty.get());
- }
- return Optional.empty();
- }
-
- private static Optional<String> getParameterName(AttachedPropertyVal extractedProperty) {
- if (!extractedProperty.isGetParam()) {
- return Optional.empty();
- }
- Object getParamFuncValue = extractedProperty.getPropertyValue();
- if (getParamFuncValue instanceof String) {
- return Optional.of((String) getParamFuncValue);
- } else {
- return Optional.of((String) ((List) getParamFuncValue).get(0));
- }
- }
-
- public static String getToscaPropertyName(TranslationContext context, String heatResourceType,
- String heatPropertyName) {
- return context.getElementMapping(heatResourceType, Constants.PROP, heatPropertyName);
- }
-
- /**
- * Gets tosca property name.
- *
- * @param translateTo the translate to
- * @param heatPropertyName the heat property name
- * @return the tosca property name
- */
- public static String getToscaPropertyName(TranslateTo translateTo, String heatPropertyName) {
- return translateTo.getContext()
- .getElementMapping(translateTo.getResource().getType(), Constants.PROP, heatPropertyName);
- }
-
- /**
- * Gets tosca attribute name.
- *
- * @param context the context
- * @param heatResourceType the heat resource type
- * @param heatAttrName the heat attr name
- * @return the tosca attribute name
- */
- public static String getToscaAttributeName(TranslationContext context, String heatResourceType,
- String heatAttrName) {
- return context.getElementMapping(heatResourceType, Constants.ATTR, heatAttrName);
- }
-
- /**
- * Gets tosca attribute name.
- *
- * @param translateTo the translate to
- * @param heatAttrName the heat attr name
- * @return the tosca attribute name
- */
- public static String getToscaAttributeName(TranslateTo translateTo, String heatAttrName) {
- return translateTo.getContext()
- .getElementMapping(translateTo.getResource().getType(), Constants.ATTR, heatAttrName);
- }
-
- /**
- * Create init substitution service template service template.
- *
- * @param templateName the template name
- * @return the service template
- */
- public static ServiceTemplate createInitSubstitutionServiceTemplate(String templateName) {
- ServiceTemplate nestedSubstitutionServiceTemplate = new ServiceTemplate();
- Map<String, String> templateMetadata = new HashMap<>();
- templateMetadata.put(ToscaConstants.ST_METADATA_TEMPLATE_NAME, templateName);
- nestedSubstitutionServiceTemplate.setMetadata(templateMetadata);
- nestedSubstitutionServiceTemplate
- .setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION);
- nestedSubstitutionServiceTemplate.setTopology_template(new TopologyTemplate());
- List<Map<String, Import>> globalTypesImportList =
- GlobalTypesGenerator.getGlobalTypesImportList();
- globalTypesImportList.addAll(
- HeatToToscaUtil.createImportList(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME));
- nestedSubstitutionServiceTemplate.setImports(globalTypesImportList);
- return nestedSubstitutionServiceTemplate;
- }
-
- /**
- * Create init global substitution service template service template.
- *
- * @return the service template
- */
- private static ServiceTemplate createInitGlobalSubstitutionServiceTemplate() {
- ServiceTemplate globalSubstitutionServiceTemplate = new ServiceTemplate();
- Map<String, String> templateMetadata = new HashMap<>();
- templateMetadata.put(ToscaConstants.ST_METADATA_TEMPLATE_NAME,
- Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME);
- globalSubstitutionServiceTemplate.setMetadata(templateMetadata);
- globalSubstitutionServiceTemplate
- .setImports(GlobalTypesGenerator.getGlobalTypesImportList());
- globalSubstitutionServiceTemplate
- .setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION);
- return globalSubstitutionServiceTemplate;
- }
-
- /**
- * Create substitution node type node type.
- *
- * @param substitutionServiceTemplate the substitution service template
- * @return the node type
- */
- public NodeType createSubstitutionNodeType(ServiceTemplate substitutionServiceTemplate) {
- NodeType substitutionNodeType = new NodeType();
- substitutionNodeType.setDerived_from(ToscaNodeType.ABSTRACT_SUBSTITUTE);
- substitutionNodeType.setDescription(substitutionServiceTemplate.getDescription());
- substitutionNodeType
- .setProperties(manageSubstitutionNodeTypeProperties(substitutionServiceTemplate));
- substitutionNodeType
- .setAttributes(manageSubstitutionNodeTypeAttributes(substitutionServiceTemplate));
- return substitutionNodeType;
- }
-
- private Map<String, PropertyDefinition> manageSubstitutionNodeTypeProperties(
- ServiceTemplate substitutionServiceTemplate) {
- Map<String, PropertyDefinition> substitutionNodeTypeProperties = new HashMap<>();
- Map<String, ParameterDefinition> properties =
- substitutionServiceTemplate.getTopology_template().getInputs();
- if (properties == null) {
- return null;
- }
-
- PropertyDefinition propertyDefinition;
- String toscaPropertyName;
- for (Map.Entry<String, ParameterDefinition> entry : properties.entrySet()) {
- toscaPropertyName = entry.getKey();
- propertyDefinition = new PropertyDefinition();
- ParameterDefinition parameterDefinition =
- substitutionServiceTemplate.getTopology_template().getInputs().get(toscaPropertyName);
- propertyDefinition.setType(parameterDefinition.getType());
- propertyDefinition.setDescription(parameterDefinition.getDescription());
- propertyDefinition.setRequired(parameterDefinition.getRequired());
- propertyDefinition.set_default(parameterDefinition.get_default());
- propertyDefinition.setConstraints(parameterDefinition.getConstraints());
- propertyDefinition.setEntry_schema(parameterDefinition.getEntry_schema());
- propertyDefinition.setStatus(parameterDefinition.getStatus());
- substitutionNodeTypeProperties.put(toscaPropertyName, propertyDefinition);
- }
- return substitutionNodeTypeProperties;
- }
-
- private Map<String, AttributeDefinition> manageSubstitutionNodeTypeAttributes(
- ServiceTemplate substitutionServiceTemplate) {
- Map<String, AttributeDefinition> substitutionNodeTypeAttributes = new HashMap<>();
- Map<String, ParameterDefinition> attributes =
- substitutionServiceTemplate.getTopology_template().getOutputs();
- if (attributes == null) {
- return null;
- }
- AttributeDefinition attributeDefinition;
- String toscaAttributeName;
-
- for (Map.Entry<String, ParameterDefinition> entry : attributes.entrySet()) {
- attributeDefinition = new AttributeDefinition();
- toscaAttributeName = entry.getKey();
- ParameterDefinition parameterDefinition =
- substitutionServiceTemplate.getTopology_template().getOutputs().get(toscaAttributeName);
- if (parameterDefinition.getType() != null && !parameterDefinition.getType().isEmpty()) {
- attributeDefinition.setType(parameterDefinition.getType());
- } else {
- attributeDefinition.setType(PropertyType.STRING.getDisplayName());
- }
- attributeDefinition.setDescription(parameterDefinition.getDescription());
- attributeDefinition.set_default(parameterDefinition.get_default());
- attributeDefinition.setEntry_schema(parameterDefinition.getEntry_schema());
- attributeDefinition.setStatus(parameterDefinition.getStatus());
- substitutionNodeTypeAttributes.put(toscaAttributeName, attributeDefinition);
- }
- return substitutionNodeTypeAttributes;
- }
-
- /**
- * .
- * Create and add substitution mapping to the nested substitution service template, and update
- * the subtitution node type accordingly with the exposed requerments and capabilities
- *
- * @param context the translation context
- * @param substitutionNodeTypeKey the substitution node type key
- * @param nestedSubstitutionServiceTemplate the nested substitution service template
- * @param substitutionNodeType the substitution node type
- */
- public static void handleSubstitutionMapping(
- TranslationContext context,
- String substitutionNodeTypeKey,
- ServiceTemplate nestedSubstitutionServiceTemplate,
- NodeType substitutionNodeType) {
- Map<String, Map<String, List<String>>> substitutionMapping =
- getSubstitutionNodeTypeExposedConnectionPoints(substitutionNodeType,
- nestedSubstitutionServiceTemplate, context);
- //add substitution mapping after capability and requirement expose calculation
- nestedSubstitutionServiceTemplate.getTopology_template().setSubstitution_mappings(
- DataModelUtil.createSubstitutionTemplateSubMapping(substitutionNodeTypeKey,
- substitutionNodeType, substitutionMapping));
- }
-
- /**
- * Gets node type with flat hierarchy.
- *
- * @param nodeTypeId the node type id
- * @param serviceTemplate the service template
- * @param context the context
- * @return the node type with flat hierarchy
- */
- public static NodeType getNodeTypeWithFlatHierarchy(String nodeTypeId,
- ServiceTemplate serviceTemplate,
- TranslationContext context) {
- ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
- ToscaServiceModel toscaServiceModel = HeatToToscaUtil
- .getToscaServiceModel(context, serviceTemplate.getMetadata());
- return (NodeType) toscaAnalyzerService
- .getFlatEntity(ToscaElementTypes.NODE_TYPE, nodeTypeId, serviceTemplate, toscaServiceModel);
- }
-
- /**
- * Create substitution node template node template.
- *
- * @param translateTo the translate to
- * @param templateName the template name
- * @param substitutionNodeTypeKey the substitution node type key
- * @return the node template
- */
- public NodeTemplate createSubstitutionNodeTemplate(TranslateTo translateTo, String templateName,
- String substitutionNodeTypeKey) {
- NodeTemplate substitutionNodeTemplate = new NodeTemplate();
- List<String> directiveList = new ArrayList<>();
- directiveList.add(ToscaConstants.NODE_TEMPLATE_DIRECTIVE_SUBSTITUTABLE);
- substitutionNodeTemplate.setDirectives(directiveList);
- substitutionNodeTemplate.setType(substitutionNodeTypeKey);
- substitutionNodeTemplate.setProperties(
- managerSubstitutionNodeTemplateProperties(translateTo, substitutionNodeTemplate,
- templateName));
- return substitutionNodeTemplate;
- }
-
- /**
- * Create abstract substitution node template.
- *
- * @param translateTo the translate to
- * @param templateName the template name
- * @param substitutionNodeTypeKey the substitution node type key
- * @return the abstract substitute node template
- */
- public static NodeTemplate createAbstractSubstitutionNodeTemplate(
- TranslateTo translateTo,
- String templateName,
- String substitutionNodeTypeKey) {
- NodeTemplate substitutionNodeTemplate = new NodeTemplate();
- List<String> directiveList = new ArrayList<>();
- directiveList.add(ToscaConstants.NODE_TEMPLATE_DIRECTIVE_SUBSTITUTABLE);
- substitutionNodeTemplate.setDirectives(directiveList);
- substitutionNodeTemplate.setType(substitutionNodeTypeKey);
- substitutionNodeTemplate.setProperties(
- managerSubstitutionNodeTemplateProperties(translateTo, substitutionNodeTemplate,
- templateName));
- return substitutionNodeTemplate;
- }
-
-
- /**
- * Checks if the source and target resource is a valid candidate for adding tosca dependency
- * relationship.
- *
- * @param sourceResource the source resource
- * @param targetResource the target resource
- * @param dependencyEntity the dependency entity
- * @return true if the candidate resources are a valid combination for the dependency relationship
- * and false otherwise
- */
- public static boolean isValidDependsOnCandidate(Resource sourceResource,
- Resource targetResource,
- ConsolidationEntityType dependencyEntity,
- TranslationContext context) {
- dependencyEntity.setEntityType(sourceResource, targetResource, context);
- ConsolidationEntityType sourceEntityType = dependencyEntity.getSourceEntityType();
- ConsolidationEntityType targetEntityType = dependencyEntity.getTargetEntityType();
-
- return ConsolidationTypesConnectivity
- .isDependsOnRelationshipValid(sourceEntityType, targetEntityType);
- }
-
- private static Map<String, Object> managerSubstitutionNodeTemplateProperties(
- TranslateTo translateTo,
- Template template,
- String templateName) {
- Map<String, Object> substitutionProperties = new HashMap<>();
- Map<String, Object> heatProperties = translateTo.getResource().getProperties();
- if (Objects.nonNull(heatProperties)) {
- for (Map.Entry<String, Object> entry : heatProperties.entrySet()) {
- Object property = TranslatorHeatToToscaPropertyConverter
- .getToscaPropertyValue(translateTo.getServiceTemplate(),
- translateTo.getTranslatedId(), entry.getKey(),
- entry.getValue(), null, translateTo.getHeatFileName(),
- translateTo.getHeatOrchestrationTemplate(), template, translateTo.getContext());
- substitutionProperties.put(entry.getKey(), property);
- }
+
+ /**
+ * Get nested heat file name in case of nested resource.
+ *
+ * @param resource the resource
+ * @return the nested heat file name
+ */
+ private static Optional<String> getNestedHeatFileName(Resource resource) {
+ if (!isNestedResource(resource)) {
+ return Optional.empty();
+ }
+
+ String resourceType = resource.getType();
+
+ if (resourceType.equals(HeatResourcesTypes.RESOURCE_GROUP_RESOURCE_TYPE.getHeatResource())) {
+ Object resourceDef = resource.getProperties().get(HeatConstants.RESOURCE_DEF_PROPERTY_NAME);
+ String internalResourceType =
+ (String) ((Map) resourceDef).get(HeatConstants.RESOURCE_DEF_TYPE_PROPERTY_NAME);
+ return Optional.of(internalResourceType);
+ }
+ return Optional.of(resourceType);
+ }
+
+ /**
+ * Gets nested file.
+ *
+ * @param resource the resource
+ * @return the nested file
+ */
+ public static Optional<String> getNestedFile(Resource resource) {
+ if (!isNestedResource(resource)) {
+ return Optional.empty();
+ }
+ String resourceType = resource.getType();
+ if (resourceType.equals(HeatResourcesTypes.RESOURCE_GROUP_RESOURCE_TYPE.getHeatResource())) {
+ Object resourceDef = resource.getProperties().get(HeatConstants.RESOURCE_DEF_PROPERTY_NAME);
+ String internalResourceType =
+ (String) ((Map) resourceDef).get(HeatConstants.RESOURCE_DEF_TYPE_PROPERTY_NAME);
+ return Optional.of(internalResourceType);
+ } else {
+ return Optional.of(resourceType);
+ }
+ }
+
+ public static boolean isYamlFile(String fileName) {
+ return fileName.endsWith(".yaml") || fileName.endsWith(".yml");
}
- return addAbstractSubstitutionProperty(templateName, substitutionProperties);
- }
-
- private static Map<String, Object> addAbstractSubstitutionProperty(String templateName,
- Map<String, Object>
- substitutionProperties) {
- Map<String, Object> innerProps = new HashMap<>();
- innerProps.put(ToscaConstants.SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME,
- ToscaUtil.getServiceTemplateFileName(templateName));
- substitutionProperties.put(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME, innerProps);
- return substitutionProperties;
- }
-
- private static Map<String, Map<String, List<String>>>
- getSubstitutionNodeTypeExposedConnectionPoints(NodeType substitutionNodeType,
- ServiceTemplate substitutionServiceTemplate,
- TranslationContext context) {
- Map<String, NodeTemplate> nodeTemplates =
- substitutionServiceTemplate.getTopology_template().getNode_templates();
- String nodeTemplateId;
- NodeTemplate nodeTemplate;
- String nodeType;
- Map<String, Map<String, List<String>>> substitutionMapping = new HashMap<>();
- if (nodeTemplates == null) {
- return substitutionMapping;
- }
-
- Map<String, List<String>> capabilitySubstitutionMapping = new HashMap<>();
- Map<String, List<String>> requirementSubstitutionMapping = new HashMap<>();
- substitutionMapping.put("capability", capabilitySubstitutionMapping);
- substitutionMapping.put("requirement", requirementSubstitutionMapping);
- List<Map<String, RequirementDefinition>> nodeTypeRequirementsDefinition;
- Map<String, RequirementAssignment> nodeTemplateRequirementsAssignment;
- List<Map<String, RequirementDefinition>> exposedRequirementsDefinition;
- Map<String, Map<String, RequirementAssignment>> fullFilledRequirementsDefinition =
- new HashMap<>();
- Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition = new HashMap<>();
- Map<String, CapabilityDefinition> exposedCapabilitiesDefinition;
- ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
-
- for (Map.Entry<String, NodeTemplate> entry : nodeTemplates.entrySet()) {
- nodeTemplateId = entry.getKey();
- nodeTemplate = entry.getValue();
- nodeType = nodeTemplate.getType();
-
- // get requirements
- nodeTypeRequirementsDefinition =
- getNodeTypeReqs(nodeType, nodeTemplateId, substitutionServiceTemplate,
- requirementSubstitutionMapping, context);
- nodeTemplateRequirementsAssignment = DataModelUtil.getNodeTemplateRequirements(nodeTemplate);
- fullFilledRequirementsDefinition.put(nodeTemplateId, nodeTemplateRequirementsAssignment);
- //set substitution node type requirements
- exposedRequirementsDefinition =
- toscaAnalyzerService.calculateExposedRequirements(nodeTypeRequirementsDefinition,
- nodeTemplateRequirementsAssignment);
- DataModelUtil
- .addSubstitutionNodeTypeRequirements(substitutionNodeType, exposedRequirementsDefinition,
- nodeTemplateId);
-
- //get capabilities
- addNodeTypeCapabilitiesToSubMapping(nodeTypeCapabilitiesDefinition,
- capabilitySubstitutionMapping, nodeType,
- nodeTemplateId, substitutionServiceTemplate, context);
- }
-
- exposedCapabilitiesDefinition =
- toscaAnalyzerService.calculateExposedCapabilities(nodeTypeCapabilitiesDefinition,
- fullFilledRequirementsDefinition);
- DataModelUtil.addNodeTypeCapabilitiesDef(substitutionNodeType, exposedCapabilitiesDefinition);
- return substitutionMapping;
- }
-
- private static void addNodeTypeCapabilitiesToSubMapping(
- Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition,
- Map<String, List<String>> capabilitySubstitutionMapping, String type, String templateName,
- ServiceTemplate serviceTemplate, TranslationContext context) {
- NodeType flatNodeType =
- getNodeTypeWithFlatHierarchy(type, serviceTemplate, context);
-
- if (flatNodeType.getCapabilities() != null) {
- flatNodeType.getCapabilities()
- .entrySet()
- .stream()
- .forEach(capabilityNodeEntry ->
- addCapabilityToSubMapping(
- templateName, capabilityNodeEntry, nodeTypeCapabilitiesDefinition,
- capabilitySubstitutionMapping));
- }
- }
-
- public static boolean shouldAnnotationsToBeAdded() {
- return ToggleableFeature.ANNOTATIONS.isActive();
- }
-
- private static void addCapabilityToSubMapping(String templateName,
- Map.Entry<String, CapabilityDefinition> capabilityNodeEntry,
- Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition,
- Map<String, List<String>> capabilitySubstitutionMapping) {
- String capabilityKey;
- List<String> capabilityMapping;
- capabilityKey = capabilityNodeEntry.getKey() + UNDERSCORE + templateName;
- nodeTypeCapabilitiesDefinition.put(capabilityKey, capabilityNodeEntry.getValue().clone());
- capabilityMapping = new ArrayList<>();
- capabilityMapping.add(templateName);
- capabilityMapping.add(capabilityNodeEntry.getKey());
- capabilitySubstitutionMapping.put(capabilityKey, capabilityMapping);
- }
-
- private static List<Map<String, RequirementDefinition>> getNodeTypeReqs(
- String type,
- String templateName,
- ServiceTemplate serviceTemplate,
- Map<String, List<String>> requirementSubstitutionMapping,
- TranslationContext context) {
- List<Map<String, RequirementDefinition>> requirementList = new ArrayList<>();
- NodeType flatNodeType = getNodeTypeWithFlatHierarchy(type, serviceTemplate, context);
- List<String> requirementMapping;
-
- if (flatNodeType.getRequirements() == null) {
- return requirementList;
- }
-
- for (Map<String, RequirementDefinition> requirementMap : flatNodeType.getRequirements()) {
- for (Map.Entry<String, RequirementDefinition> requirementNodeEntry : requirementMap
- .entrySet()) {
- ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil();
- RequirementDefinition requirementNodeEntryValue = toscaExtensionYamlUtil
- .yamlToObject(toscaExtensionYamlUtil.objectToYaml(requirementNodeEntry.getValue()),
- RequirementDefinition.class);
- if (Objects.isNull(requirementNodeEntryValue.getOccurrences())) {
- requirementNodeEntryValue.setOccurrences(new Object[]{1, 1});
- }
- Map<String, RequirementDefinition> requirementDef = new HashMap<>();
- requirementDef.put(requirementNodeEntry.getKey(), requirementNodeEntryValue);
- DataModelUtil.addRequirementToList(requirementList, requirementDef);
- requirementMapping = new ArrayList<>();
- requirementMapping.add(templateName);
- requirementMapping.add(requirementNodeEntry.getKey());
- requirementSubstitutionMapping
- .put(requirementNodeEntry.getKey() + UNDERSCORE + templateName, requirementMapping);
- if (Objects.isNull(requirementNodeEntryValue.getNode())) {
- requirementNodeEntryValue.setOccurrences(new Object[]{1, 1});
+
+ /**
+ * Gets resource.
+ *
+ * @param heatOrchestrationTemplate the heat orchestration template
+ * @param resourceId the resource id
+ * @param heatFileName the heat file name
+ * @return the resource
+ */
+ public static Resource getResource(HeatOrchestrationTemplate heatOrchestrationTemplate, String resourceId,
+ String heatFileName) {
+ Resource resource = heatOrchestrationTemplate.getResources().get(resourceId);
+ if (resource == null) {
+ throw new CoreException(new ResourceNotFoundInHeatFileErrorBuilder(resourceId, heatFileName).build());
}
- }
+ return resource;
+ }
+
+
+ /**
+ * Get resource type.
+ *
+ * @param resourceId the resource id
+ * @param heatOrchestrationTemplate heat orchestration template
+ * @param heatFileName heat file name
+ * @return resource type
+ */
+ public static String getResourceType(String resourceId, HeatOrchestrationTemplate heatOrchestrationTemplate,
+ String heatFileName) {
+ return HeatToToscaUtil.getResource(heatOrchestrationTemplate, resourceId, heatFileName).getType();
+ }
+
+ /**
+ * Is heat file nested boolean.
+ *
+ * @param translateTo the translate to
+ * @param heatFileName the heat file name
+ * @return the boolean
+ */
+ public static boolean isHeatFileNested(TranslateTo translateTo, String heatFileName) {
+ return isHeatFileNested(translateTo.getContext(), heatFileName);
+ }
+
+ public static boolean isHeatFileNested(TranslationContext context, String heatFileName) {
+ return context.getNestedHeatsFiles().contains(heatFileName);
+ }
+
+ /**
+ * Extract contrail get resource attached heat resource id optional.
+ *
+ * @param propertyValue the property value
+ * @return the optional
+ */
+ public static Optional<String> extractContrailGetResourceAttachedHeatResourceId(Object propertyValue) {
+ if (propertyValue instanceof Map) {
+ if (((Map) propertyValue).containsKey(GET_ATTR)) {
+ return getResourceId(((Map) propertyValue).get(GET_ATTR));
+ } else if (((Map) propertyValue).containsKey(GET_RESOURCE)) {
+ return getHeatResourceIdFromResource((Map) propertyValue);
+ } else {
+ Collection valCollection = ((Map) propertyValue).values();
+ return evaluateHeatResourceId(valCollection);
+ }
+ } else if (propertyValue instanceof List) {
+ return evaluateHeatResourceId((List) propertyValue);
+ }
+ return Optional.empty();
}
- return requirementList;
- }
-
- /**
- * Fetch global substitution service template service template.
- *
- * @param serviceTemplate the service template
- * @param context the context
- * @return the service template
- */
- public static ServiceTemplate fetchGlobalSubstitutionServiceTemplate(
- ServiceTemplate serviceTemplate,
- TranslationContext context) {
- ServiceTemplate globalSubstitutionServiceTemplate =
- context.getTranslatedServiceTemplates()
- .get(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME);
- if (globalSubstitutionServiceTemplate == null) {
- globalSubstitutionServiceTemplate =
- HeatToToscaUtil.createInitGlobalSubstitutionServiceTemplate();
- context.getTranslatedServiceTemplates()
- .put(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME,
- globalSubstitutionServiceTemplate);
- }
- boolean isImportAddedToServiceTemplate =
- DataModelUtil.isImportAddedToServiceTemplate(serviceTemplate.getImports(), Constants
- .GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME);
- if (!isImportAddedToServiceTemplate) {
- serviceTemplate.getImports()
- .addAll(
- HeatToToscaUtil.createImportList(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME));
- }
- return globalSubstitutionServiceTemplate;
- }
-
- public static List<Map<String, Import>> createImportList(String templateName) {
- List<Map<String, Import>> imports = new ArrayList<>();
- Map<String, Import> importsMap = new HashMap<>();
- importsMap.put(templateName, HeatToToscaUtil.createServiceTemplateImport(templateName));
- imports.add(importsMap);
- return imports;
- }
-
- /**
- * Create service template import import.
- *
- * @param serviceTemplate the service template
- * @return the import
- */
- public static Import createServiceTemplateImport(ServiceTemplate serviceTemplate) {
- Import serviceTemplateImport = new Import();
- serviceTemplateImport.setFile(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
- return serviceTemplateImport;
- }
-
- /**
- * Create service template import import.
- *
- * @param metadataTemplateName the service template name
- * @return the import
- */
- private static Import createServiceTemplateImport(String metadataTemplateName) {
- Import serviceTemplateImport = new Import();
- serviceTemplateImport.setFile(ToscaUtil.getServiceTemplateFileName(metadataTemplateName));
- return serviceTemplateImport;
- }
-
- public static ToscaServiceModel createToscaServiceModel(ServiceTemplate
- entryDefinitionServiceTemplate,
- TranslationContext translationContext) {
- return new ToscaServiceModel(getCsarArtifactFiles(translationContext),
- getServiceTemplates(translationContext),
- ToscaUtil.getServiceTemplateFileName(entryDefinitionServiceTemplate));
- }
-
- private static FileContentHandler getCsarArtifactFiles(TranslationContext translationContext) {
- FileContentHandler artifactFiles = new FileContentHandler();
- artifactFiles.setFiles(translationContext.getFiles());
- artifactFiles.setFiles(translationContext.getExternalArtifacts());
-
- HeatTreeManager heatTreeManager =
- HeatTreeManagerUtil.initHeatTreeManager(translationContext.getFiles());
- heatTreeManager.createTree();
- ValidationStructureList validationStructureList =
- new ValidationStructureList(heatTreeManager.getTree());
- byte[] validationStructureFile =
- FileUtils.convertToBytes(validationStructureList, FileUtils.FileExtension.JSON);
- artifactFiles.addFile("HEAT.meta", validationStructureFile);
- return artifactFiles;
- }
-
-
- private static Map<String, ServiceTemplate> getServiceTemplates(TranslationContext
- translationContext) {
- List<ServiceTemplate> serviceTemplates = new ArrayList<>();
- serviceTemplates.addAll(GlobalTypesGenerator
- .getGlobalTypesServiceTemplate(OnboardingTypesEnum.ZIP).values());
- serviceTemplates.addAll(translationContext.getTranslatedServiceTemplates().values());
- Map<String, ServiceTemplate> serviceTemplatesMap = new HashMap<>();
-
- for (ServiceTemplate template : serviceTemplates) {
- serviceTemplatesMap.put(ToscaUtil.getServiceTemplateFileName(template), template);
- }
- return serviceTemplatesMap;
- }
-
- public static String getNestedResourceTypePrefix(TranslateTo translateTo) {
- if (isSubInterfaceResource(translateTo.getResource(), translateTo.getContext())
- && isSubInterfaceBoundToPort(translateTo)) {
- return ToscaNodeType.VLAN_SUB_INTERFACE_RESOURCE_TYPE_PREFIX;
- }
- return ToscaNodeType.NESTED_HEAT_RESOURCE_TYPE_PREFIX;
- }
-
- private static boolean isSubInterfaceBoundToPort(TranslateTo translateTo) {
- return HeatToToscaUtil.getSubInterfaceParentPortNodeTemplateId(translateTo).isPresent();
- }
-
- //Method evaluate the network role from sub interface node template id, designed considering
- // only single sub interface present in nested file else it will return null
- public static Optional<String> getNetworkRoleFromSubInterfaceId(Resource resource,
- TranslationContext translationContext) {
- Optional<String> networkRole = Optional.empty();
- Optional<String> nestedHeatFileName = HeatToToscaUtil.getNestedHeatFileName(resource);
-
- if (!nestedHeatFileName.isPresent()) {
- return networkRole;
- }
-
- HeatOrchestrationTemplate nestedHeatOrchestrationTemplate = new YamlUtil()
- .yamlToObject(translationContext.getFileContent(nestedHeatFileName.get()),
- HeatOrchestrationTemplate.class);
-
- if (MapUtils.isNotEmpty(nestedHeatOrchestrationTemplate.getResources())) {
- ContrailV2VirtualMachineInterfaceHelper contrailV2VirtualMachineInterfaceHelper =
- new ContrailV2VirtualMachineInterfaceHelper();
- Optional<Map.Entry<String, Resource>> vlanSubInterfaceResource =
- nestedHeatOrchestrationTemplate
- .getResources().entrySet().stream()
- .filter(resourceEntry -> contrailV2VirtualMachineInterfaceHelper
- .isVlanSubInterfaceResource(resourceEntry.getValue()))
- .findFirst();
- if (vlanSubInterfaceResource.isPresent()) {
- Map.Entry<String, Resource> vlanSubInterfaceResourceEntry = vlanSubInterfaceResource.get();
- networkRole = extractNetworkRoleFromSubInterfaceId(vlanSubInterfaceResourceEntry.getKey(),
- vlanSubInterfaceResourceEntry.getValue().getType());
- }
+
+ private static Optional<String> getResourceId(Object data) {
+ if (data instanceof List && CollectionUtils.size(data) > 1 && FQ_NAME.equals(((List) data).get(1))
+ && ((List) data).get(0) instanceof String) {
+ return Optional.of((String) ((List) data).get(0));
+ } else {
+ LOGGER.warn("invalid format of 'get_attr' function - " + data.toString());
+ return Optional.empty();
+ }
}
- return networkRole;
- }
- public static Optional<String> evaluateNetworkRoleFromResourceId(String resourceId,
- String resourceType) {
- Optional<PortType> portType = getPortType(resourceType);
- if (portType.isPresent()) {
- String portResourceIdRegex =
- PORT_RESOURCE_ID_REGEX_PREFIX + UNDERSCORE + WORDS_REGEX + UNDERSCORE
- + portType.get().getPortTypeName() + PORT_RESOURCE_ID_REGEX_SUFFIX;
- String portIntResourceIdRegex =
- PORT_INT_RESOURCE_ID_REGEX_PREFIX + portType.get().getPortTypeName()
- + PORT_RESOURCE_ID_REGEX_SUFFIX;
+ private static Optional<String> getHeatResourceIdFromResource(Map propertyValue) {
+ Object value = propertyValue.get(GET_RESOURCE);
+ if (value instanceof String) {
+ return Optional.of((String) value);
+ } else {
+ LOGGER.warn("invalid format of 'get_resource' function - " + propertyValue.toString());
+ return Optional.empty();
+ }
+ }
- String portNetworkRole = getNetworkRole(resourceId, portResourceIdRegex);
- String portIntNetworkRole = getNetworkRole(resourceId, portIntResourceIdRegex);
+ private static Optional<String> evaluateHeatResourceId(Collection propertyValue) {
+ for (Object prop : propertyValue) {
+ Optional<String> ret = extractContrailGetResourceAttachedHeatResourceId(prop);
+ if (ret.isPresent()) {
+ return ret;
+ }
+ }
+ return Optional.empty();
+ }
+
+ /**
+ * Gets tosca service model.
+ *
+ * @param context translation context
+ * @return the tosca service model
+ */
+ public static ToscaServiceModel getToscaServiceModel(TranslationContext context) {
+ Map<String, String> metadata = new HashMap<>();
+ metadata.put(ToscaConstants.ST_METADATA_TEMPLATE_NAME, Constants.MAIN_TEMPLATE_NAME);
+ return getToscaServiceModel(context, metadata);
+ }
+
+ /**
+ * Gets tosca service model.
+ *
+ * @param context translation context
+ * @param entryDefinitionMetadata template name of the entry definition servie template
+ * @return the tosca service model
+ */
+ private static ToscaServiceModel getToscaServiceModel(TranslationContext context,
+ Map<String, String> entryDefinitionMetadata) {
+ Map<String, ServiceTemplate> serviceTemplates = new HashMap<>(context.getGlobalServiceTemplates());
+ Collection<ServiceTemplate> tmpServiceTemplates = context.getTranslatedServiceTemplates().values();
+ for (ServiceTemplate serviceTemplate : tmpServiceTemplates) {
+ ToscaUtil.addServiceTemplateToMapWithKeyFileName(serviceTemplates, serviceTemplate);
+ }
+ return new ToscaServiceModel(null, serviceTemplates,
+ ToscaUtil.getServiceTemplateFileName(entryDefinitionMetadata));
+ }
+
+ /**
+ * Gets service template from context.
+ *
+ * @param serviceTemplateFileName the service template file name
+ * @param context the context
+ * @return the service template from context
+ */
+ public static Optional<ServiceTemplate> getServiceTemplateFromContext(String serviceTemplateFileName,
+ TranslationContext context) {
+ for (ServiceTemplate serviceTemplate : context.getTranslatedServiceTemplates().values()) {
+ if (ToscaUtil.getServiceTemplateFileName(serviceTemplate).equals(serviceTemplateFileName)) {
+ return Optional.of(serviceTemplate);
+ }
+ }
+ return Optional.empty();
+ }
+
+ /**
+ * Adding link requerment from port node template to network node template.
+ *
+ * @param portNodeTemplate port node template
+ * @param networkTranslatedId network node template id
+ */
+ public static RequirementAssignment addLinkReqFromPortToNetwork(NodeTemplate portNodeTemplate,
+ String networkTranslatedId) {
+ RequirementAssignment requirement = new RequirementAssignment();
+ requirement.setCapability(ToscaCapabilityType.NATIVE_NETWORK_LINKABLE);
+ requirement.setRelationship(ToscaRelationshipType.NATIVE_NETWORK_LINK_TO);
+ requirement.setNode(networkTranslatedId);
+ DataModelUtil.addRequirementAssignment(portNodeTemplate, ToscaConstants.LINK_REQUIREMENT_ID, requirement);
+ return requirement;
+ }
+
+ /**
+ * Adding binding requerment from sub interface node template to interface (port) node template.
+ *
+ * @param subInterfaceNodeTemplate sub interface template
+ * @param interfaceTranslatedId interface node template id
+ */
+ public static void addBindingReqFromSubInterfaceToInterface(NodeTemplate subInterfaceNodeTemplate,
+ String interfaceTranslatedId) {
+ RequirementAssignment requirement = new RequirementAssignment();
+ requirement.setCapability(ToscaCapabilityType.NATIVE_NETWORK_BINDABLE);
+ requirement.setRelationship(ToscaRelationshipType.NATIVE_NETWORK_BINDS_TO);
+ requirement.setNode(interfaceTranslatedId);
+ DataModelUtil
+ .addRequirementAssignment(subInterfaceNodeTemplate, ToscaConstants.BINDING_REQUIREMENT_ID, requirement);
+ }
+
+ /**
+ * Get property Parameter Name Value.
+ *
+ * @param property property
+ * @return Parameter name in case the property include "get_param" function
+ */
+ public static Optional<String> getPropertyParameterNameValue(Object property) {
+ if (Objects.isNull(property)) {
+ return Optional.empty();
+ }
+ Optional<AttachedPropertyVal> extractedProperty = extractProperty(property);
+ if (extractedProperty.isPresent()) {
+ return getParameterName(extractedProperty.get());
+ }
+ return Optional.empty();
+ }
- return Optional.ofNullable(Objects.nonNull(portNetworkRole)
- ? portNetworkRole : portIntNetworkRole);
+ private static Optional<String> getParameterName(AttachedPropertyVal extractedProperty) {
+ if (!extractedProperty.isGetParam()) {
+ return Optional.empty();
+ }
+ Object getParamFuncValue = extractedProperty.getPropertyValue();
+ if (getParamFuncValue instanceof String) {
+ return Optional.of((String) getParamFuncValue);
+ } else {
+ return Optional.of((String) ((List) getParamFuncValue).get(0));
+ }
}
- return Optional.empty();
- }
- private static Optional<PortType> getPortType(String resourceType) {
- if (resourceType.equals(
- HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource())) {
- return Optional.of(PortType.VMI);
- } else if (resourceType.equals(
- HeatResourcesTypes.NEUTRON_PORT_RESOURCE_TYPE.getHeatResource())) {
- return Optional.of(PortType.PORT);
+ public static String getToscaPropertyName(TranslationContext context, String heatResourceType,
+ String heatPropertyName) {
+ return context.getElementMapping(heatResourceType, Constants.PROP, heatPropertyName);
+ }
+
+ /**
+ * Gets tosca property name.
+ *
+ * @param translateTo the translate to
+ * @param heatPropertyName the heat property name
+ * @return the tosca property name
+ */
+ public static String getToscaPropertyName(TranslateTo translateTo, String heatPropertyName) {
+ return translateTo.getContext()
+ .getElementMapping(translateTo.getResource().getType(), Constants.PROP, heatPropertyName);
+ }
+
+ /**
+ * Gets tosca attribute name.
+ *
+ * @param context the context
+ * @param heatResourceType the heat resource type
+ * @param heatAttrName the heat attr name
+ * @return the tosca attribute name
+ */
+ public static String getToscaAttributeName(TranslationContext context, String heatResourceType,
+ String heatAttrName) {
+ return context.getElementMapping(heatResourceType, Constants.ATTR, heatAttrName);
+ }
+
+ /**
+ * Gets tosca attribute name.
+ *
+ * @param translateTo the translate to
+ * @param heatAttrName the heat attr name
+ * @return the tosca attribute name
+ */
+ public static String getToscaAttributeName(TranslateTo translateTo, String heatAttrName) {
+ return translateTo.getContext()
+ .getElementMapping(translateTo.getResource().getType(), Constants.ATTR, heatAttrName);
+ }
+
+ /**
+ * Create init substitution service template service template.
+ *
+ * @param templateName the template name
+ * @return the service template
+ */
+ public static ServiceTemplate createInitSubstitutionServiceTemplate(String templateName) {
+ ServiceTemplate nestedSubstitutionServiceTemplate = new ServiceTemplate();
+ Map<String, String> templateMetadata = new HashMap<>();
+ templateMetadata.put(ToscaConstants.ST_METADATA_TEMPLATE_NAME, templateName);
+ nestedSubstitutionServiceTemplate.setMetadata(templateMetadata);
+ nestedSubstitutionServiceTemplate.setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION);
+ nestedSubstitutionServiceTemplate.setTopology_template(new TopologyTemplate());
+ List<Map<String, Import>> globalTypesImportList = GlobalTypesGenerator.getGlobalTypesImportList();
+ globalTypesImportList
+ .addAll(HeatToToscaUtil.createImportList(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME));
+ nestedSubstitutionServiceTemplate.setImports(globalTypesImportList);
+ return nestedSubstitutionServiceTemplate;
+ }
+
+ /**
+ * Create init global substitution service template service template.
+ *
+ * @return the service template
+ */
+ private static ServiceTemplate createInitGlobalSubstitutionServiceTemplate() {
+ ServiceTemplate globalSubstitutionServiceTemplate = new ServiceTemplate();
+ Map<String, String> templateMetadata = new HashMap<>();
+ templateMetadata
+ .put(ToscaConstants.ST_METADATA_TEMPLATE_NAME, Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME);
+ globalSubstitutionServiceTemplate.setMetadata(templateMetadata);
+ globalSubstitutionServiceTemplate.setImports(GlobalTypesGenerator.getGlobalTypesImportList());
+ globalSubstitutionServiceTemplate.setTosca_definitions_version(ToscaConstants.TOSCA_DEFINITIONS_VERSION);
+ return globalSubstitutionServiceTemplate;
+ }
+
+ /**
+ * Create substitution node type node type.
+ *
+ * @param substitutionServiceTemplate the substitution service template
+ * @return the node type
+ */
+ public NodeType createSubstitutionNodeType(ServiceTemplate substitutionServiceTemplate) {
+ NodeType substitutionNodeType = new NodeType();
+ substitutionNodeType.setDerived_from(ToscaNodeType.ABSTRACT_SUBSTITUTE);
+ substitutionNodeType.setDescription(substitutionServiceTemplate.getDescription());
+ substitutionNodeType.setProperties(manageSubstitutionNodeTypeProperties(substitutionServiceTemplate));
+ substitutionNodeType.setAttributes(manageSubstitutionNodeTypeAttributes(substitutionServiceTemplate));
+ return substitutionNodeType;
+ }
+
+ private Map<String, PropertyDefinition> manageSubstitutionNodeTypeProperties(ServiceTemplate substitutionServiceTemplate) {
+ Map<String, PropertyDefinition> substitutionNodeTypeProperties = new HashMap<>();
+ Map<String, ParameterDefinition> properties = substitutionServiceTemplate.getTopology_template().getInputs();
+ if (properties == null) {
+ return null;
+ }
+
+ PropertyDefinition propertyDefinition;
+ String toscaPropertyName;
+ for (Map.Entry<String, ParameterDefinition> entry : properties.entrySet()) {
+ toscaPropertyName = entry.getKey();
+ propertyDefinition = new PropertyDefinition();
+ ParameterDefinition parameterDefinition =
+ substitutionServiceTemplate.getTopology_template().getInputs().get(toscaPropertyName);
+ propertyDefinition.setType(parameterDefinition.getType());
+ propertyDefinition.setDescription(parameterDefinition.getDescription());
+ propertyDefinition.setRequired(parameterDefinition.getRequired());
+ propertyDefinition.set_default(parameterDefinition.get_default());
+ propertyDefinition.setConstraints(parameterDefinition.getConstraints());
+ propertyDefinition.setEntry_schema(parameterDefinition.getEntry_schema());
+ propertyDefinition.setStatus(parameterDefinition.getStatus());
+ substitutionNodeTypeProperties.put(toscaPropertyName, propertyDefinition);
+ }
+ return substitutionNodeTypeProperties;
}
- return Optional.empty();
- }
- public static Optional<String> extractNetworkRoleFromSubInterfaceId(String resourceId,
- String resourceType) {
- Optional<PortType> portType = getPortType(resourceType);
- if (portType.isPresent()) {
- String subInterfaceResourceIdRegex =
- SUB_INTERFACE_INT_RESOURCE_ID_REGEX_PREFIX + portType.get().getPortTypeName()
- + PORT_RESOURCE_ID_REGEX_SUFFIX;
+ private Map<String, AttributeDefinition> manageSubstitutionNodeTypeAttributes(ServiceTemplate substitutionServiceTemplate) {
+ Map<String, AttributeDefinition> substitutionNodeTypeAttributes = new HashMap<>();
+ Map<String, ParameterDefinition> attributes = substitutionServiceTemplate.getTopology_template().getOutputs();
+ if (attributes == null) {
+ return null;
+ }
+ AttributeDefinition attributeDefinition;
+ String toscaAttributeName;
+
+ for (Map.Entry<String, ParameterDefinition> entry : attributes.entrySet()) {
+ attributeDefinition = new AttributeDefinition();
+ toscaAttributeName = entry.getKey();
+ ParameterDefinition parameterDefinition =
+ substitutionServiceTemplate.getTopology_template().getOutputs().get(toscaAttributeName);
+ if (parameterDefinition.getType() != null && !parameterDefinition.getType().isEmpty()) {
+ attributeDefinition.setType(parameterDefinition.getType());
+ } else {
+ attributeDefinition.setType(PropertyType.STRING.getDisplayName());
+ }
+ attributeDefinition.setDescription(parameterDefinition.getDescription());
+ attributeDefinition.set_default(parameterDefinition.get_default());
+ attributeDefinition.setEntry_schema(parameterDefinition.getEntry_schema());
+ attributeDefinition.setStatus(parameterDefinition.getStatus());
+ substitutionNodeTypeAttributes.put(toscaAttributeName, attributeDefinition);
+ }
+ return substitutionNodeTypeAttributes;
+ }
+
+ /**
+ * .
+ * Create and add substitution mapping to the nested substitution service template, and update
+ * the subtitution node type accordingly with the exposed requerments and capabilities
+ *
+ * @param context the translation context
+ * @param substitutionNodeTypeKey the substitution node type key
+ * @param nestedSubstitutionServiceTemplate the nested substitution service template
+ * @param substitutionNodeType the substitution node type
+ */
+ public static void handleSubstitutionMapping(TranslationContext context, String substitutionNodeTypeKey,
+ ServiceTemplate nestedSubstitutionServiceTemplate,
+ NodeType substitutionNodeType) {
+ Map<String, Map<String, List<String>>> substitutionMapping =
+ getSubstitutionNodeTypeExposedConnectionPoints(substitutionNodeType, nestedSubstitutionServiceTemplate,
+ context);
+ //add substitution mapping after capability and requirement expose calculation
+ nestedSubstitutionServiceTemplate.getTopology_template().setSubstitution_mappings(DataModelUtil
+ .createSubstitutionTemplateSubMapping(
+ substitutionNodeTypeKey,
+ substitutionNodeType,
+ substitutionMapping));
+ }
+
+ /**
+ * Gets node type with flat hierarchy.
+ *
+ * @param nodeTypeId the node type id
+ * @param serviceTemplate the service template
+ * @param context the context
+ * @return the node type with flat hierarchy
+ */
+ public static NodeType getNodeTypeWithFlatHierarchy(String nodeTypeId, ServiceTemplate serviceTemplate,
+ TranslationContext context) {
+ ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
+ ToscaServiceModel toscaServiceModel =
+ HeatToToscaUtil.getToscaServiceModel(context, serviceTemplate.getMetadata());
+ return (NodeType) toscaAnalyzerService.getFlatEntity(ToscaElementTypes.NODE_TYPE, nodeTypeId, serviceTemplate,
+ toscaServiceModel).getFlatEntity();
+ }
+
+
+ /**
+ * Create abstract substitution node template.
+ *
+ * @param translateTo the translate to
+ * @param templateName the template name
+ * @param substitutionNodeTypeKey the substitution node type key
+ * @return the abstract substitute node template
+ */
+ public static NodeTemplate createAbstractSubstitutionNodeTemplate(TranslateTo translateTo, String templateName,
+ String substitutionNodeTypeKey) {
+ NodeTemplate substitutionNodeTemplate = new NodeTemplate();
+ List<String> directiveList = new ArrayList<>();
+ directiveList.add(ToscaConstants.NODE_TEMPLATE_DIRECTIVE_SUBSTITUTABLE);
+ substitutionNodeTemplate.setDirectives(directiveList);
+ substitutionNodeTemplate.setType(substitutionNodeTypeKey);
+ substitutionNodeTemplate.setProperties(
+ managerSubstitutionNodeTemplateProperties(translateTo, substitutionNodeTemplate, templateName));
+ return substitutionNodeTemplate;
+ }
+
+
+ /**
+ * Checks if the source and target resource is a valid candidate for adding tosca dependency
+ * relationship.
+ *
+ * @param sourceResource the source resource
+ * @param targetResource the target resource
+ * @param dependencyEntity the dependency entity
+ * @return true if the candidate resources are a valid combination for the dependency relationship
+ * and false otherwise
+ */
+ public static boolean isValidDependsOnCandidate(Resource sourceResource, Resource targetResource,
+ ConsolidationEntityType dependencyEntity,
+ TranslationContext context) {
+ dependencyEntity.setEntityType(sourceResource, targetResource, context);
+ ConsolidationEntityType sourceEntityType = dependencyEntity.getSourceEntityType();
+ ConsolidationEntityType targetEntityType = dependencyEntity.getTargetEntityType();
+
+ return ConsolidationTypesConnectivity.isDependsOnRelationshipValid(sourceEntityType, targetEntityType);
+ }
+
+ private static Map<String, Object> managerSubstitutionNodeTemplateProperties(TranslateTo translateTo,
+ Template template,
+ String templateName) {
+ Map<String, Object> substitutionProperties = new HashMap<>();
+ Map<String, Object> heatProperties = translateTo.getResource().getProperties();
+ if (Objects.nonNull(heatProperties)) {
+ for (Map.Entry<String, Object> entry : heatProperties.entrySet()) {
+ Object property = TranslatorHeatToToscaPropertyConverter
+ .getToscaPropertyValue(translateTo.getServiceTemplate(),
+ translateTo.getTranslatedId(), entry.getKey(), entry.getValue(), null,
+ translateTo.getHeatFileName(),
+ translateTo.getHeatOrchestrationTemplate(), template,
+ translateTo.getContext());
+ substitutionProperties.put(entry.getKey(), property);
+ }
+ }
+ return addAbstractSubstitutionProperty(templateName, substitutionProperties);
+ }
+
+ private static Map<String, Object> addAbstractSubstitutionProperty(String templateName,
+ Map<String, Object> substitutionProperties) {
+ Map<String, Object> innerProps = new HashMap<>();
+ innerProps.put(ToscaConstants.SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME,
+ ToscaUtil.getServiceTemplateFileName(templateName));
+ substitutionProperties.put(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME, innerProps);
+ return substitutionProperties;
+ }
+
+ private static Map<String, Map<String, List<String>>> getSubstitutionNodeTypeExposedConnectionPoints(NodeType substitutionNodeType,
+ ServiceTemplate substitutionServiceTemplate,
+ TranslationContext context) {
+ Map<String, NodeTemplate> nodeTemplates =
+ substitutionServiceTemplate.getTopology_template().getNode_templates();
+ String nodeTemplateId;
+ NodeTemplate nodeTemplate;
+ String nodeType;
+ Map<String, Map<String, List<String>>> substitutionMapping = new HashMap<>();
+ if (nodeTemplates == null) {
+ return substitutionMapping;
+ }
- return Optional.ofNullable(getNetworkRole(resourceId, subInterfaceResourceIdRegex));
+ Map<String, List<String>> capabilitySubstitutionMapping = new HashMap<>();
+ Map<String, List<String>> requirementSubstitutionMapping = new HashMap<>();
+ substitutionMapping.put("capability", capabilitySubstitutionMapping);
+ substitutionMapping.put("requirement", requirementSubstitutionMapping);
+ List<Map<String, RequirementDefinition>> nodeTypeRequirementsDefinition;
+ Map<String, RequirementAssignment> nodeTemplateRequirementsAssignment;
+ List<Map<String, RequirementDefinition>> exposedRequirementsDefinition;
+ Map<String, Map<String, RequirementAssignment>> fullFilledRequirementsDefinition = new HashMap<>();
+ Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition = new HashMap<>();
+ Map<String, CapabilityDefinition> exposedCapabilitiesDefinition;
+ ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
+
+ for (Map.Entry<String, NodeTemplate> entry : nodeTemplates.entrySet()) {
+ nodeTemplateId = entry.getKey();
+ nodeTemplate = entry.getValue();
+ nodeType = nodeTemplate.getType();
+
+ // get requirements
+ nodeTypeRequirementsDefinition = getNodeTypeReqs(nodeType, nodeTemplateId, substitutionServiceTemplate,
+ requirementSubstitutionMapping, context);
+ nodeTemplateRequirementsAssignment = DataModelUtil.getNodeTemplateRequirements(nodeTemplate);
+ fullFilledRequirementsDefinition.put(nodeTemplateId, nodeTemplateRequirementsAssignment);
+ //set substitution node type requirements
+ exposedRequirementsDefinition = toscaAnalyzerService
+ .calculateExposedRequirements(nodeTypeRequirementsDefinition,
+ nodeTemplateRequirementsAssignment);
+ DataModelUtil.addSubstitutionNodeTypeRequirements(substitutionNodeType, exposedRequirementsDefinition,
+ nodeTemplateId);
+
+ //get capabilities
+ addNodeTypeCapabilitiesToSubMapping(nodeTypeCapabilitiesDefinition, capabilitySubstitutionMapping, nodeType,
+ nodeTemplateId, substitutionServiceTemplate, context);
+ }
+
+ exposedCapabilitiesDefinition = toscaAnalyzerService
+ .calculateExposedCapabilities(nodeTypeCapabilitiesDefinition,
+ fullFilledRequirementsDefinition);
+ DataModelUtil.addNodeTypeCapabilitiesDef(substitutionNodeType, exposedCapabilitiesDefinition);
+ return substitutionMapping;
}
- return Optional.empty();
- }
- private enum PortType {
- PORT("port"),
- VMI("vmi");
+ private static void addNodeTypeCapabilitiesToSubMapping(Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition,
+ Map<String, List<String>> capabilitySubstitutionMapping,
+ String type, String templateName,
+ ServiceTemplate serviceTemplate,
+ TranslationContext context) {
+ NodeType flatNodeType = getNodeTypeWithFlatHierarchy(type, serviceTemplate, context);
- private String portTypeName;
+ if (flatNodeType.getCapabilities() != null) {
+ flatNodeType.getCapabilities().entrySet().stream().forEach(
+ capabilityNodeEntry -> addCapabilityToSubMapping(templateName, capabilityNodeEntry,
+ nodeTypeCapabilitiesDefinition, capabilitySubstitutionMapping));
+ }
+ }
- PortType(String portTypeName) {
- this.portTypeName = portTypeName;
+ public static boolean shouldAnnotationsToBeAdded() {
+ return ToggleableFeature.ANNOTATIONS.isActive();
}
- public String getPortTypeName() {
- return portTypeName;
+ private static void addCapabilityToSubMapping(String templateName,
+ Map.Entry<String, CapabilityDefinition> capabilityNodeEntry,
+ Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition,
+ Map<String, List<String>> capabilitySubstitutionMapping) {
+ String capabilityKey;
+ List<String> capabilityMapping;
+ capabilityKey = capabilityNodeEntry.getKey() + UNDERSCORE + templateName;
+ nodeTypeCapabilitiesDefinition.put(capabilityKey, capabilityNodeEntry.getValue().clone());
+ capabilityMapping = new ArrayList<>();
+ capabilityMapping.add(templateName);
+ capabilityMapping.add(capabilityNodeEntry.getKey());
+ capabilitySubstitutionMapping.put(capabilityKey, capabilityMapping);
}
- }
- private static String getNetworkRole(String portResourceId, String portIdRegex) {
- Pattern pattern = Pattern.compile(portIdRegex);
- Matcher matcher = pattern.matcher(portResourceId);
- if (matcher.matches()) {
- String networkRole = matcher.group(3);
- //Assuming network role will not contain ONLY digits
- if (!networkRole.matches("\\d+")) {
- return matcher.group(3);
- }
+ private static List<Map<String, RequirementDefinition>> getNodeTypeReqs(String type, String templateName,
+ ServiceTemplate serviceTemplate,
+ Map<String, List<String>> requirementSubstitutionMapping,
+ TranslationContext context) {
+ List<Map<String, RequirementDefinition>> requirementList = new ArrayList<>();
+ NodeType flatNodeType = getNodeTypeWithFlatHierarchy(type, serviceTemplate, context);
+ List<String> requirementMapping;
+
+ if (flatNodeType.getRequirements() == null) {
+ return requirementList;
+ }
+
+ for (Map<String, RequirementDefinition> requirementMap : flatNodeType.getRequirements()) {
+ for (Map.Entry<String, RequirementDefinition> requirementNodeEntry : requirementMap.entrySet()) {
+ ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil();
+ RequirementDefinition requirementNodeEntryValue = toscaExtensionYamlUtil.yamlToObject(
+ toscaExtensionYamlUtil.objectToYaml(requirementNodeEntry.getValue()),
+ RequirementDefinition.class);
+ if (Objects.isNull(requirementNodeEntryValue.getOccurrences())) {
+ requirementNodeEntryValue.setOccurrences(new Object[] {1, 1});
+ }
+ Map<String, RequirementDefinition> requirementDef = new HashMap<>();
+ requirementDef.put(requirementNodeEntry.getKey(), requirementNodeEntryValue);
+ DataModelUtil.addRequirementToList(requirementList, requirementDef);
+ requirementMapping = new ArrayList<>();
+ requirementMapping.add(templateName);
+ requirementMapping.add(requirementNodeEntry.getKey());
+ requirementSubstitutionMapping
+ .put(requirementNodeEntry.getKey() + UNDERSCORE + templateName, requirementMapping);
+ if (Objects.isNull(requirementNodeEntryValue.getNode())) {
+ requirementNodeEntryValue.setOccurrences(new Object[] {1, 1});
+ }
+ }
+ }
+ return requirementList;
+ }
+
+ /**
+ * Fetch global substitution service template service template.
+ *
+ * @param serviceTemplate the service template
+ * @param context the context
+ * @return the service template
+ */
+ public static ServiceTemplate fetchGlobalSubstitutionServiceTemplate(ServiceTemplate serviceTemplate,
+ TranslationContext context) {
+ ServiceTemplate globalSubstitutionServiceTemplate =
+ context.getTranslatedServiceTemplates().get(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME);
+ if (globalSubstitutionServiceTemplate == null) {
+ globalSubstitutionServiceTemplate = HeatToToscaUtil.createInitGlobalSubstitutionServiceTemplate();
+ context.getTranslatedServiceTemplates()
+ .put(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME, globalSubstitutionServiceTemplate);
+ }
+ boolean isImportAddedToServiceTemplate = DataModelUtil
+ .isImportAddedToServiceTemplate(serviceTemplate.getImports(),
+ Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME);
+ if (!isImportAddedToServiceTemplate) {
+ serviceTemplate.getImports()
+ .addAll(HeatToToscaUtil.createImportList(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME));
+ }
+ return globalSubstitutionServiceTemplate;
+ }
+
+ public static List<Map<String, Import>> createImportList(String templateName) {
+ List<Map<String, Import>> imports = new ArrayList<>();
+ Map<String, Import> importsMap = new HashMap<>();
+ importsMap.put(templateName, HeatToToscaUtil.createServiceTemplateImport(templateName));
+ imports.add(importsMap);
+ return imports;
+ }
+
+ /**
+ * Create service template import import.
+ *
+ * @param serviceTemplate the service template
+ * @return the import
+ */
+ public static Import createServiceTemplateImport(ServiceTemplate serviceTemplate) {
+ Import serviceTemplateImport = new Import();
+ serviceTemplateImport.setFile(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
+ return serviceTemplateImport;
+ }
+
+ /**
+ * Create service template import import.
+ *
+ * @param metadataTemplateName the service template name
+ * @return the import
+ */
+ private static Import createServiceTemplateImport(String metadataTemplateName) {
+ Import serviceTemplateImport = new Import();
+ serviceTemplateImport.setFile(ToscaUtil.getServiceTemplateFileName(metadataTemplateName));
+ return serviceTemplateImport;
+ }
+
+ public static ToscaServiceModel createToscaServiceModel(ServiceTemplate entryDefinitionServiceTemplate,
+ TranslationContext translationContext) {
+ return new ToscaServiceModel(getCsarArtifactFiles(translationContext), getServiceTemplates(translationContext),
+ ToscaUtil.getServiceTemplateFileName(entryDefinitionServiceTemplate));
+ }
+
+ private static FileContentHandler getCsarArtifactFiles(TranslationContext translationContext) {
+ FileContentHandler artifactFiles = new FileContentHandler();
+ artifactFiles.setFiles(translationContext.getFiles());
+ artifactFiles.setFiles(translationContext.getExternalArtifacts());
+
+ HeatTreeManager heatTreeManager = HeatTreeManagerUtil.initHeatTreeManager(translationContext.getFiles());
+ heatTreeManager.createTree();
+ ValidationStructureList validationStructureList = new ValidationStructureList(heatTreeManager.getTree());
+ byte[] validationStructureFile =
+ FileUtils.convertToBytes(validationStructureList, FileUtils.FileExtension.JSON);
+ artifactFiles.addFile("HEAT.meta", validationStructureFile);
+ return artifactFiles;
+ }
+
+
+ private static Map<String, ServiceTemplate> getServiceTemplates(TranslationContext translationContext) {
+ List<ServiceTemplate> serviceTemplates = new ArrayList<>();
+ serviceTemplates.addAll(GlobalTypesGenerator.getGlobalTypesServiceTemplate(OnboardingTypesEnum.ZIP).values());
+ serviceTemplates.addAll(translationContext.getTranslatedServiceTemplates().values());
+ Map<String, ServiceTemplate> serviceTemplatesMap = new HashMap<>();
+
+ for (ServiceTemplate template : serviceTemplates) {
+ serviceTemplatesMap.put(ToscaUtil.getServiceTemplateFileName(template), template);
+ }
+ return serviceTemplatesMap;
+ }
+
+ public static String getNestedResourceTypePrefix(TranslateTo translateTo) {
+ if (isSubInterfaceResource(translateTo.getResource(), translateTo.getContext()) && isSubInterfaceBoundToPort(
+ translateTo)) {
+ return ToscaNodeType.VLAN_SUB_INTERFACE_RESOURCE_TYPE_PREFIX;
+ }
+ return ToscaNodeType.NESTED_HEAT_RESOURCE_TYPE_PREFIX;
+ }
+
+ private static boolean isSubInterfaceBoundToPort(TranslateTo translateTo) {
+ return HeatToToscaUtil.getSubInterfaceParentPortNodeTemplateId(translateTo).isPresent();
+ }
+
+ //Method evaluate the network role from sub interface node template id, designed considering
+ // only single sub interface present in nested file else it will return null
+ public static Optional<String> getNetworkRoleFromSubInterfaceId(Resource resource,
+ TranslationContext translationContext) {
+ Optional<String> networkRole = Optional.empty();
+ Optional<String> nestedHeatFileName = HeatToToscaUtil.getNestedHeatFileName(resource);
+
+ if (!nestedHeatFileName.isPresent()) {
+ return networkRole;
+ }
+
+ HeatOrchestrationTemplate nestedHeatOrchestrationTemplate = new YamlUtil().yamlToObject(
+ translationContext.getFileContent(nestedHeatFileName.get()), HeatOrchestrationTemplate.class);
+
+ if (MapUtils.isNotEmpty(nestedHeatOrchestrationTemplate.getResources())) {
+ ContrailV2VirtualMachineInterfaceHelper contrailV2VirtualMachineInterfaceHelper =
+ new ContrailV2VirtualMachineInterfaceHelper();
+ Optional<Map.Entry<String, Resource>> vlanSubInterfaceResource =
+ nestedHeatOrchestrationTemplate.getResources().entrySet().stream()
+ .filter(resourceEntry -> contrailV2VirtualMachineInterfaceHelper
+ .isVlanSubInterfaceResource(
+ resourceEntry.getValue()))
+ .findFirst();
+ if (vlanSubInterfaceResource.isPresent()) {
+ Map.Entry<String, Resource> vlanSubInterfaceResourceEntry = vlanSubInterfaceResource.get();
+ networkRole = extractNetworkRoleFromSubInterfaceId(vlanSubInterfaceResourceEntry.getKey(),
+ vlanSubInterfaceResourceEntry.getValue().getType());
+ }
+ }
+ return networkRole;
+ }
+
+ public static Optional<String> evaluateNetworkRoleFromResourceId(String resourceId, String resourceType) {
+ Optional<PortType> portType = getPortType(resourceType);
+ if (portType.isPresent()) {
+ String portResourceIdRegex =
+ PORT_RESOURCE_ID_REGEX_PREFIX + UNDERSCORE + WORDS_REGEX + UNDERSCORE + portType.get()
+ .getPortTypeName()
+ + PORT_RESOURCE_ID_REGEX_SUFFIX;
+ String portIntResourceIdRegex = PORT_INT_RESOURCE_ID_REGEX_PREFIX + portType.get().getPortTypeName()
+ + PORT_RESOURCE_ID_REGEX_SUFFIX;
+
+ String portNetworkRole = getNetworkRole(resourceId, portResourceIdRegex);
+ String portIntNetworkRole = getNetworkRole(resourceId, portIntResourceIdRegex);
+
+ return Optional.ofNullable(Objects.nonNull(portNetworkRole) ? portNetworkRole : portIntNetworkRole);
+ }
+ return Optional.empty();
+ }
+
+ private static Optional<PortType> getPortType(String resourceType) {
+ if (resourceType
+ .equals(HeatResourcesTypes.CONTRAIL_V2_VIRTUAL_MACHINE_INTERFACE_RESOURCE_TYPE.getHeatResource())) {
+ return Optional.of(PortType.VMI);
+ } else if (resourceType.equals(HeatResourcesTypes.NEUTRON_PORT_RESOURCE_TYPE.getHeatResource())) {
+ return Optional.of(PortType.PORT);
+ }
+ return Optional.empty();
+ }
+
+ public static Optional<String> extractNetworkRoleFromSubInterfaceId(String resourceId, String resourceType) {
+ Optional<PortType> portType = getPortType(resourceType);
+ if (portType.isPresent()) {
+ String subInterfaceResourceIdRegex =
+ SUB_INTERFACE_INT_RESOURCE_ID_REGEX_PREFIX + portType.get().getPortTypeName()
+ + PORT_RESOURCE_ID_REGEX_SUFFIX;
+
+ return Optional.ofNullable(getNetworkRole(resourceId, subInterfaceResourceIdRegex));
+ }
+ return Optional.empty();
+ }
+
+ private enum PortType {
+ PORT("port"), VMI("vmi");
+
+ private String portTypeName;
+
+ PortType(String portTypeName) {
+ this.portTypeName = portTypeName;
+ }
+
+ public String getPortTypeName() {
+ return portTypeName;
+ }
+ }
+
+ private static String getNetworkRole(String portResourceId, String portIdRegex) {
+ Pattern pattern = Pattern.compile(portIdRegex);
+ Matcher matcher = pattern.matcher(portResourceId);
+ if (matcher.matches()) {
+ String networkRole = matcher.group(3);
+ //Assuming network role will not contain ONLY digits
+ if (!networkRole.matches("\\d+")) {
+ return matcher.group(3);
+ }
+ }
+ return null;
}
- return null;
- }
}