org.openecomp.sdc.translator.services.heattotosca.helper.VolumeTranslationHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.openecomp.sdc.translator.services.heattotosca.helper.VolumeTranslationHelper.java

Source

/*-
 * ============LICENSE_START=======================================================
 * SDC
 * ================================================================================
 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 * ================================================================================
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ============LICENSE_END=========================================================
 */

package org.openecomp.sdc.translator.services.heattotosca.helper;

import org.apache.commons.collections4.CollectionUtils;
import org.openecomp.core.utilities.yaml.YamlUtil;
import org.openecomp.sdc.heat.datatypes.manifest.FileData;
import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate;
import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes;
import org.openecomp.sdc.heat.datatypes.model.Output;
import org.openecomp.sdc.heat.datatypes.model.Resource;
import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId;
import org.openecomp.sdc.translator.datatypes.heattotosca.to.ResourceFileDataAndIDs;
import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo;
import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil;
import org.openecomp.sdc.translator.services.heattotosca.TranslationContext;
import org.openecomp.sdc.translator.services.heattotosca.impl.ResourceTranslationBase;
import org.slf4j.Logger;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class VolumeTranslationHelper {
    private final Logger logger;

    public VolumeTranslationHelper(Logger logger) {
        this.logger = logger;
    }

    /**
     * Gets file data containing volume.
     *
     * @param filesToSearch the files to search
     * @param resourceId    the resource id
     * @param translateTo   the translate to
     * @param types         the types
     * @return the file data containing volume
     */
    public Optional<ResourceFileDataAndIDs> getFileDataContainingVolume(List<FileData> filesToSearch,
            String resourceId, TranslateTo translateTo, FileData.Type... types) {
        if (CollectionUtils.isEmpty(filesToSearch)) {
            return Optional.empty();
        }

        List<FileData> fileDatas = Objects.isNull(types) ? filesToSearch
                : HeatToToscaUtil.getFilteredListOfFileDataByTypes(filesToSearch, types);
        Optional<ResourceFileDataAndIDs> fileDataAndIDs = getResourceFileDataAndIDsForVolumeConnection(resourceId,
                translateTo, fileDatas);
        if (fileDataAndIDs.isPresent()) {
            return fileDataAndIDs;
        }
        return Optional.empty();
    }

    private Optional<ResourceFileDataAndIDs> getResourceFileDataAndIDsForVolumeConnection(String resourceId,
            TranslateTo translateTo, List<FileData> fileDatas) {
        for (FileData data : fileDatas) {
            HeatOrchestrationTemplate heatOrchestrationTemplate = new YamlUtil().yamlToObject(
                    translateTo.getContext().getFiles().getFileContent(data.getFile()),
                    HeatOrchestrationTemplate.class);
            Map<String, Output> outputs = heatOrchestrationTemplate.getOutputs();
            if (Objects.isNull(outputs)) {
                continue;
            }
            Output output = outputs.get(resourceId);
            if (Objects.nonNull(output)) {
                Optional<AttachedResourceId> attachedOutputId = HeatToToscaUtil.extractAttachedResourceId(
                        data.getFile(), heatOrchestrationTemplate, translateTo.getContext(), output.getValue());
                if (attachedOutputId.isPresent()) {
                    AttachedResourceId attachedResourceId = attachedOutputId.get();
                    if (!isOutputIsGetResource(resourceId, data, attachedResourceId)) {
                        continue;
                    }
                    String translatedId = (String) attachedResourceId.getTranslatedId();
                    if (isOutputOfTypeCinderVolume(translateTo, data, heatOrchestrationTemplate, translatedId)) {
                        ResourceFileDataAndIDs fileDataAndIDs = new ResourceFileDataAndIDs(
                                (String) attachedResourceId.getEntityId(), translatedId, data);
                        return Optional.of(fileDataAndIDs);
                    } else {
                        logger.warn("output: '" + resourceId + "' in file '" + data.getFile() + "' is not of type '"
                                + HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource() + "'");
                    }
                }
            } else {
                logger.warn("output: '" + resourceId + "' in file '" + data.getFile() + "' is not found");
            }
        }
        return Optional.empty();
    }

    private boolean isOutputOfTypeCinderVolume(TranslateTo translateTo, FileData data,
            HeatOrchestrationTemplate heatOrchestrationTemplate, String translatedId) {
        return getResourceByTranslatedResourceId(data.getFile(), heatOrchestrationTemplate, translatedId,
                translateTo, HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource()).isPresent();
    }

    private Optional<List<Map.Entry<String, Resource>>> getResourceByTranslatedResourceId(String fileName,
            HeatOrchestrationTemplate heatOrchestrationTemplate, String translatedResourceId,
            TranslateTo translateTo, String heatResourceType) {
        List<Map.Entry<String, Resource>> list = heatOrchestrationTemplate.getResources().entrySet().stream()
                .filter(entry -> getPredicatesForTranslatedIdToResourceId(fileName, heatOrchestrationTemplate,
                        translatedResourceId, translateTo.getContext(), heatResourceType).stream()
                                .allMatch(p -> p.test(entry)))
                .collect(Collectors.toList());
        if (CollectionUtils.isEmpty(list)) {
            return Optional.empty();
        } else {
            return Optional.of(list);
        }
    }

    private List<Predicate<Map.Entry<String, Resource>>> getPredicatesForTranslatedIdToResourceId(String fileName,
            HeatOrchestrationTemplate heatOrchestrationTemplate, String translatedResourceId,
            TranslationContext context, String heatResourceType) {
        List<Predicate<Map.Entry<String, Resource>>> list = new ArrayList<>();
        list.add(entry -> entry.getValue().getType().equals(heatResourceType));
        list.add(entry -> {
            Optional<String> resourceTranslatedId = ResourceTranslationBase.getResourceTranslatedId(fileName,
                    heatOrchestrationTemplate, entry.getKey(), context);
            return resourceTranslatedId.isPresent() && resourceTranslatedId.get().equals(translatedResourceId);
        });
        return list;
    }

    private boolean isOutputIsGetResource(String resourceId, FileData data, AttachedResourceId attachedResourceId) {
        if (attachedResourceId.isGetResource()) {
            return true;
        } else {
            logger.warn("output: '" + resourceId + "' in file '" + data.getFile()
                    + "' is not defined as get_resource and therefor not supported.");
            return false;
        }
    }
}