com.wrmsr.neurosis.aws.ec2.Ec2InstanceTypeDetails.java Source code

Java tutorial

Introduction

Here is the source code for com.wrmsr.neurosis.aws.ec2.Ec2InstanceTypeDetails.java

Source

/*
 * 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.
 */
package com.wrmsr.neurosis.aws.ec2;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.wrmsr.neurosis.util.Serialization;
import org.apache.commons.lang3.tuple.ImmutablePair;

import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import static com.google.common.collect.Maps.newHashMap;
import static com.wrmsr.neurosis.util.ImmutableCollectors.toImmutableMap;

public class Ec2InstanceTypeDetails {
    public static final String URL = "https://github.com/toelen/spymemcached-jcache";
    public static final String RESOURCE = "com/wrmsr/presto/aws/ec2/instance-types.json";

    public static Map<String, Ec2InstanceTypeDetails> read() throws IOException {
        List<Ec2InstanceTypeDetails> lst;
        try (InputStream in = Ec2InstanceTypeDetails.class.getClassLoader().getResourceAsStream(RESOURCE)) {
            lst = Serialization.JSON_OBJECT_MAPPER.get().readValue(in,
                    new TypeReference<List<Ec2InstanceTypeDetails>>() {
                    });
        }
        return lst.stream().map(i -> new ImmutablePair<>(i.instanceType, i)).collect(toImmutableMap());
    }

    @JsonSerialize(using = RegionPricing.Serializer.class)
    @JsonDeserialize(using = RegionPricing.Deserializer.class)
    public static final class RegionPricing {
        public static class Serializer extends JsonSerializer<RegionPricing> {
            @Override
            public void serialize(RegionPricing value, JsonGenerator jgen, SerializerProvider provider)
                    throws IOException, JsonProcessingException {
                if (value != null) {
                    jgen.writeObject(value.getPlatformPricing());
                } else {
                    jgen.writeNull();
                }
            }
        }

        public static class Deserializer extends JsonDeserializer<RegionPricing> {
            @Override
            public RegionPricing deserialize(JsonParser jp, DeserializationContext ctxt)
                    throws IOException, JsonProcessingException {
                ObjectMapper mapper = (ObjectMapper) jp.getCodec();
                ObjectNode node = jp.getCodec().readTree(jp);
                Iterator<Map.Entry<String, JsonNode>> it = node.fields();
                Map<String, PlatformPricing> m = newHashMap();
                while (it.hasNext()) {
                    Map.Entry<String, JsonNode> e = it.next();
                    JsonParser contentParser = mapper.treeAsTokens(e.getValue());
                    PlatformPricing p = mapper.readValue(contentParser, PlatformPricing.class);
                    m.put(e.getKey(), p);
                }
                return new RegionPricing(m);
            }
        }

        private final Map<String, PlatformPricing> platformPricing;

        public RegionPricing(Map<String, PlatformPricing> platformPricing) {
            this.platformPricing = platformPricing;
        }

        public Map<String, PlatformPricing> getPlatformPricing() {
            return platformPricing;
        }

        @Override
        public String toString() {
            return Serialization.toJsonString(this);
        }
    }

    public static final class PlatformPricing {
        private final Map<String, String> reserved;
        private final String ondemand;

        @JsonCreator
        public PlatformPricing(@JsonProperty("reserved") Map<String, String> reserved,
                @JsonProperty("ondemand") String ondemand) {
            this.reserved = reserved;
            this.ondemand = ondemand;
        }

        @JsonProperty("reserved")
        public Map<String, String> getReserved() {
            return reserved;
        }

        @JsonProperty("ondemand")
        public String getOndemand() {
            return ondemand;
        }

        @Override
        public String toString() {
            return Serialization.toJsonString(this);
        }
    }

    public static final class Vpc {
        private final int ipsPerEni;
        private final int maxEnis;

        @JsonCreator
        public Vpc(@JsonProperty("ips_per_eni") int ipsPerEni, @JsonProperty("max_enis") int maxEnis) {
            this.ipsPerEni = ipsPerEni;
            this.maxEnis = maxEnis;
        }

        @JsonProperty("ips_per_eni")
        public int getIpsPerEni() {
            return ipsPerEni;
        }

        @JsonProperty("max_enis")
        public int getMaxEnis() {
            return maxEnis;
        }

        @Override
        public String toString() {
            return Serialization.toJsonString(this);
        }
    }

    public static final class Storage {
        private final boolean ssd;
        private final int devices;
        private final int size;

        @JsonCreator
        public Storage(@JsonProperty("ssd") boolean ssd, @JsonProperty("devices") int devices,
                @JsonProperty("size") int size) {
            this.ssd = ssd;
            this.devices = devices;
            this.size = size;
        }

        @JsonProperty("ssd")
        public boolean isSsd() {
            return ssd;
        }

        @JsonProperty("devices")
        public int getDevices() {
            return devices;
        }

        @JsonProperty("size")
        public int getSize() {
            return size;
        }

        @Override
        public String toString() {
            return Serialization.toJsonString(this);
        }
    }

    private final String family;
    private final boolean enhancedNetworking;
    private final int vCpu;
    private final String generation;
    private final int ebsIops;
    private final String networkPerformance;
    private final int ebsThroughput;
    private final Map<String, RegionPricing> regionPricing;
    private final Vpc vpc;
    private final List<String> arch;
    private final List<String> linuxVirtualizationTypes;
    private final boolean ebsOptimized;
    private final Storage storage;
    private final int maxBandwidth;
    private final String instanceType;
    private final BigDecimal ecu;
    private final BigDecimal memory;

    @JsonCreator
    public Ec2InstanceTypeDetails(@JsonProperty("family") String family,
            @JsonProperty("enhanced_networking") boolean enhancedNetworking, @JsonProperty("vCPU") int vCpu,
            @JsonProperty("generation") String generation, @JsonProperty("ebs_iops") int ebsIops,
            @JsonProperty("network_performance") String networkPerformance,
            @JsonProperty("ebs_throughput") int ebsThroughput,
            @JsonProperty("pricing") Map<String, RegionPricing> regionPricing, @JsonProperty("vpc") Vpc vpc,
            @JsonProperty("arch") List<String> arch,
            @JsonProperty("linux_virtualization_types") List<String> linuxVirtualizationTypes,
            @JsonProperty("ebs_optimized") boolean ebsOptimized, @JsonProperty("storage") Storage storage,
            @JsonProperty("max_bandwidth") int maxBandwidth, @JsonProperty("instance_type") String instanceType,
            @JsonProperty("ECU") BigDecimal ecu, @JsonProperty("memory") BigDecimal memory) {
        this.family = family;
        this.enhancedNetworking = enhancedNetworking;
        this.vCpu = vCpu;
        this.generation = generation;
        this.ebsIops = ebsIops;
        this.networkPerformance = networkPerformance;
        this.ebsThroughput = ebsThroughput;
        this.regionPricing = regionPricing;
        this.vpc = vpc;
        this.arch = arch;
        this.linuxVirtualizationTypes = linuxVirtualizationTypes;
        this.ebsOptimized = ebsOptimized;
        this.storage = storage;
        this.maxBandwidth = maxBandwidth;
        this.instanceType = instanceType;
        this.ecu = ecu;
        this.memory = memory;
    }

    @JsonProperty("family")
    public String getFamily() {
        return family;
    }

    @JsonProperty("enhanced_networking")
    public boolean isEnhancedNetworking() {
        return enhancedNetworking;
    }

    @JsonProperty("vCPU")
    public int getvCpu() {
        return vCpu;
    }

    @JsonProperty("generation")
    public String getGeneration() {
        return generation;
    }

    @JsonProperty("ebs_iops")
    public int getEbsIops() {
        return ebsIops;
    }

    @JsonProperty("network_performance")
    public String getNetworkPerformance() {
        return networkPerformance;
    }

    @JsonProperty("ebs_throughput")
    public int getEbsThroughput() {
        return ebsThroughput;
    }

    @JsonProperty("pricing")
    public Map<String, RegionPricing> getRegionPricing() {
        return regionPricing;
    }

    @JsonProperty("vpc")
    public Vpc getVpc() {
        return vpc;
    }

    @JsonProperty("arch")
    public List<String> getArch() {
        return arch;
    }

    @JsonProperty("linux_virtualization_types")
    public List<String> getLinuxVirtualizationTypes() {
        return linuxVirtualizationTypes;
    }

    @JsonProperty("ebs_optimized")
    public boolean isEbsOptimized() {
        return ebsOptimized;
    }

    @JsonProperty("storage")
    public Storage getStorage() {
        return storage;
    }

    @JsonProperty("max_bandwidth")
    public int getMaxBandwidth() {
        return maxBandwidth;
    }

    @JsonProperty("instance_type")
    public String getInstanceType() {
        return instanceType;
    }

    @JsonProperty("ECU")
    public BigDecimal getEcu() {
        return ecu;
    }

    @JsonProperty("memory")
    public BigDecimal getMemory() {
        return memory;
    }

    @Override
    public String toString() {
        return Serialization.toJsonString(this);
    }
}