package com.sequenceiq.cloudbreak.cloud.mock; import static com.sequenceiq.cloudbreak.cloud.model.DiskType.diskType; import static com.sequenceiq.cloudbreak.cloud.model.Orchestrator.orchestrator; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.PostConstruct; import org.springframework.stereotype.Service; import com.google.common.collect.Lists; import com.sequenceiq.cloudbreak.cloud.PlatformParameters; import com.sequenceiq.cloudbreak.cloud.model.TagSpecification; import com.sequenceiq.cloudbreak.cloud.model.AvailabilityZone; import com.sequenceiq.cloudbreak.cloud.model.AvailabilityZones; import com.sequenceiq.cloudbreak.cloud.model.DiskType; import com.sequenceiq.cloudbreak.cloud.model.DiskTypes; import com.sequenceiq.cloudbreak.cloud.model.PlatformImage; import com.sequenceiq.cloudbreak.cloud.model.PlatformOrchestrator; import com.sequenceiq.cloudbreak.cloud.model.Region; import com.sequenceiq.cloudbreak.cloud.model.Regions; import com.sequenceiq.cloudbreak.cloud.model.ScriptParams; import com.sequenceiq.cloudbreak.cloud.model.StackParamValidation; import com.sequenceiq.cloudbreak.cloud.model.VmType; import com.sequenceiq.cloudbreak.cloud.model.VmTypeMeta; import com.sequenceiq.cloudbreak.cloud.model.VmTypes; import com.sequenceiq.cloudbreak.cloud.model.VolumeParameterConfig; import com.sequenceiq.cloudbreak.cloud.model.VolumeParameterType; import com.sequenceiq.cloudbreak.common.type.OrchestratorConstants; @Service public class MockPlatformParameters implements PlatformParameters { private enum MockedVmTypes { SMALL("small"), MEDIUM("medium"), LARGE("large"); private final String value; MockedVmTypes(String value) { this.value = value; } public String value() { return value; } public VmTypeMeta getVmTypeMeta() { VmTypeMeta vmTypeMeta = new VmTypeMeta(); vmTypeMeta.setSsdConfig(getVolumeConfig(VolumeParameterType.SSD)); vmTypeMeta.setEphemeralConfig(getVolumeConfig(VolumeParameterType.EPHEMERAL)); vmTypeMeta.setMagneticConfig(getVolumeConfig(VolumeParameterType.MAGNETIC)); vmTypeMeta.setAutoAttachedConfig(getVolumeConfig(VolumeParameterType.AUTO_ATTACHED)); return vmTypeMeta; } private VolumeParameterConfig getVolumeConfig(VolumeParameterType ssd) { return new VolumeParameterConfig(ssd, 1, Integer.MAX_VALUE, 0, Integer.MAX_VALUE); } } private static final Integer START_LABEL = 1; private static final ScriptParams SCRIPT_PARAMS = new ScriptParams("mockdisk", START_LABEL); private static final String MOCK_RESOURCE_DEFINITION = "{}"; private static final String[] EUROPE_AVAILABILITY_ZONES = {"europe-a", "europe-b"}; private static final String[] USA_AVAILABILITY_ZONES = {"usa-a", "usa-b", "usa-c"}; private Map<Region, List<AvailabilityZone>> regions = new HashMap<>(); private Map<AvailabilityZone, List<VmType>> vmTypes = new HashMap<>(); private Region defaultRegion; private VmType defaultVmType; @PostConstruct public void init() { this.regions = readRegionsMock(); this.vmTypes = readVmTypes(); this.defaultRegion = this.regions.keySet().iterator().next(); this.defaultVmType = this.vmTypes.get(this.vmTypes.keySet().iterator().next()).get(0); } private Map<Region, List<AvailabilityZone>> readRegionsMock() { Map<Region, List<AvailabilityZone>> regions = new HashMap<>(); regions.put(Region.region("USA"), getAvailabilityZones(USA_AVAILABILITY_ZONES)); regions.put(Region.region("Europe"), getAvailabilityZones(EUROPE_AVAILABILITY_ZONES)); return regions; } private List<AvailabilityZone> getAvailabilityZones(String[] availabilityZones) { List<AvailabilityZone> availabilityZoneList = new ArrayList<>(); for (String availabilityZone : availabilityZones) { availabilityZoneList.add(new AvailabilityZone(availabilityZone)); } return availabilityZoneList; } private Map<AvailabilityZone, List<VmType>> readVmTypes() { Map<AvailabilityZone, List<VmType>> availabilityZoneListHashMap = new HashMap<>(); List<AvailabilityZone> availabilityZoneList = new ArrayList<>(); availabilityZoneList.addAll(getAvailabilityZones(USA_AVAILABILITY_ZONES)); availabilityZoneList.addAll(getAvailabilityZones(EUROPE_AVAILABILITY_ZONES)); List<VmType> vmTypeList = new ArrayList<>(); for (MockedVmTypes vmType : MockedVmTypes.values()) { vmTypeList.add(VmType.vmTypeWithMeta(vmType.value, vmType.getVmTypeMeta(), true)); } for (AvailabilityZone availabilityZone : availabilityZoneList) { availabilityZoneListHashMap.put(availabilityZone, vmTypeList); } return availabilityZoneListHashMap; } @Override public ScriptParams scriptParams() { return SCRIPT_PARAMS; } @Override public DiskTypes diskTypes() { Map<String, VolumeParameterType> diskMappings = new HashMap<>(); diskMappings.put(MockDiskType.MAGNETIC_DISK.value(), VolumeParameterType.MAGNETIC); diskMappings.put(MockDiskType.SSD.value(), VolumeParameterType.SSD); diskMappings.put(MockDiskType.EPHEMERAL.value(), VolumeParameterType.EPHEMERAL); return new DiskTypes(getDiskTypes(), getDefaultDiskType(), diskMappings); } private Collection<DiskType> getDiskTypes() { Collection<DiskType> disks = Lists.newArrayList(); for (MockDiskType diskType : MockDiskType.values()) { disks.add(diskType(diskType.value)); } return disks; } private DiskType getDefaultDiskType() { return diskType(MockDiskType.MAGNETIC_DISK.value()); } @Override public Regions regions() { return new Regions(regions.keySet(), defaultRegion); } @Override public VmTypes vmTypes(Boolean extended) { Set<VmType> lists = new LinkedHashSet<>(); for (List<VmType> vmTypeList : vmTypes.values()) { lists.addAll(vmTypeList); } return new VmTypes(lists, defaultVmType); } @Override public Map<AvailabilityZone, VmTypes> vmTypesPerAvailabilityZones(Boolean extended) { VmTypes vmTypes = vmTypes(extended); Map<AvailabilityZone, VmTypes> result = new HashMap<>(); for (Map.Entry<Region, List<AvailabilityZone>> zones : regions.entrySet()) { for (AvailabilityZone zone : zones.getValue()) { result.put(zone, vmTypes); } } return result; } @Override public AvailabilityZones availabilityZones() { return new AvailabilityZones(regions); } @Override public String resourceDefinition(String resource) { return MOCK_RESOURCE_DEFINITION; } @Override public List<StackParamValidation> additionalStackParameters() { return new ArrayList<>(); } @Override public PlatformOrchestrator orchestratorParams() { return new PlatformOrchestrator(Arrays.asList(orchestrator(OrchestratorConstants.SALT), orchestrator(OrchestratorConstants.SWARM)), orchestrator(OrchestratorConstants.SWARM)); } @Override public PlatformImage images() { return new PlatformImage(new ArrayList<>(), imageRegex()); } @Override public String imageRegex() { return ""; } @Override public TagSpecification tagSpecification() { return null; } private enum MockDiskType { MAGNETIC_DISK("magnetic"), SSD("ssd"), EPHEMERAL("ephemeral"); private final String value; MockDiskType(String value) { this.value = value; } public String value() { return value; } } }