package com.sequenceiq.cloudbreak.service.decorator; import java.util.Collection; import java.util.Map; import java.util.NoSuchElementException; import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; import com.sequenceiq.cloudbreak.cloud.model.Platform; import com.sequenceiq.cloudbreak.cloud.model.VmType; import com.sequenceiq.cloudbreak.cloud.model.VolumeParameterConfig; import com.sequenceiq.cloudbreak.cloud.model.VolumeParameterType; import com.sequenceiq.cloudbreak.domain.Template; import com.sequenceiq.cloudbreak.service.stack.CloudParameterService; @Component public class TemplateDecorator implements Decorator<Template> { private static final Logger LOGGER = LoggerFactory.getLogger(TemplateDecorator.class); @Inject private CloudParameterService cloudParameterService; private Supplier<Map<Platform, Collection<VmType>>> virtualMachines = Suppliers.memoize(() -> cloudParameterService.getVmtypes(true).getVirtualMachines()); private Supplier<Map<Platform, Map<String, VolumeParameterType>>> diskMappings = Suppliers.memoize(() -> cloudParameterService.getDiskTypes().getDiskMappings()); @Override public Template decorate(final Template subject, Object... data) { Supplier<VolumeParameterConfig> config = Suppliers.memoize(() -> { try { Platform platform = Platform.platform(subject.cloudPlatform()); VmType vmType = virtualMachines.get().get(platform).stream().filter(curr -> curr.value().equals(subject.getInstanceType())).findFirst().get(); Map<String, VolumeParameterType> map = diskMappings.get().get(platform); VolumeParameterType volumeParameterType = map.get(subject.getVolumeType()); return vmType.getVolumeParameterbyVolumeParameterType(volumeParameterType); } catch (NoSuchElementException e) { LOGGER.info("No VolumeParameterConfig found, which might be normal for platforms like OpenStack"); return VolumeParameterConfig.EMPTY; } }); if (config.get().volumeParameterType() != null) { if (subject.getVolumeCount() == null) { subject.setVolumeCount(config.get().maximumNumber()); } if (subject.getVolumeSize() == null) { subject.setVolumeSize(config.get().maximumSize()); } } return subject; } }