/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.twill.api; import com.google.common.collect.Iterables; import org.apache.twill.internal.DefaultResourceSpecification; import java.util.Arrays; import java.util.Collection; import java.util.LinkedList; import java.util.List; /** * This interface provides specifications for resource requirements including set and get methods * for number of cores, amount of memory, and number of instances. */ public interface ResourceSpecification { final ResourceSpecification BASIC = Builder.with().setVirtualCores(1).setMemory(512, SizeUnit.MEGA).build(); /** * Unit for specifying memory size. */ enum SizeUnit { MEGA(1), GIGA(1024); private final int multiplier; private SizeUnit(int multiplier) { this.multiplier = multiplier; } } /** * Returns the number of virtual CPU cores. DEPRECATED, use getVirtualCores instead. * @return Number of virtual CPU cores. */ @Deprecated int getCores(); /** * Returns the number of virtual CPU cores. * @return Number of virtual CPU cores. */ int getVirtualCores(); /** * Returns the memory size in MB. * @return Memory size */ int getMemorySize(); /** * Returns the uplink bandwidth in Mbps. * @return Uplink bandwidth or -1 representing unlimited bandwidth. */ int getUplink(); /** * Returns the downlink bandwidth in Mbps. * @return Downlink bandwidth or -1 representing unlimited bandwidth. */ int getDownlink(); /** * Returns number of execution instances. * @return Number of execution instances. */ int getInstances(); /** * Returns the execution hosts, expects Fully Qualified Domain Names host + domain. * This is a suggestion for the scheduler depending on cluster load it may ignore it * @return An array containing the hosts where the containers should run */ List<String> getHosts(); /** * Returns the execution racks. * This is a suggestion for the scheduler depending on cluster load it may ignore it * @return An array containing the racks where the containers should run */ List<String> getRacks(); /** * Builder for creating {@link ResourceSpecification}. */ static final class Builder { private int cores; private int memory; private int uplink = -1; private int downlink = -1; private int instances = 1; private List<String> hosts = new LinkedList<String>(); private List<String> racks = new LinkedList<String>(); public static CoreSetter with() { return new Builder().new CoreSetter(); } public final class CoreSetter { @Deprecated public MemorySetter setCores(int cores) { Builder.this.cores = cores; return new MemorySetter(); } public MemorySetter setVirtualCores(int cores) { Builder.this.cores = cores; return new MemorySetter(); } } public final class MemorySetter { public AfterMemory setMemory(int size, SizeUnit unit) { Builder.this.memory = size * unit.multiplier; return new AfterMemory(); } } public final class AfterMemory extends Build { public AfterInstances setInstances(int instances) { Builder.this.instances = instances; return new AfterInstances(); } } public final class AfterInstances extends Build { public AfterUplink setUplink(int uplink, SizeUnit unit) { Builder.this.uplink = uplink * unit.multiplier; return new AfterUplink(); } } public final class AfterUplink extends Build { public AfterDownlink setDownlink(int downlink, SizeUnit unit) { Builder.this.downlink = downlink * unit.multiplier; return new AfterDownlink(); } } public final class AfterHosts extends Build { public Done setRacks(String... racks) { if (racks != null) { Builder.this.racks = Arrays.asList(racks); } return new Done(); } public Done setRacks(Iterable<String> racks){ if (racks != null){ Iterables.addAll(Builder.this.racks, racks); } return new Done(); } } public final class AfterDownlink extends Build { public AfterHosts setHosts(String... hosts) { if (hosts != null) { Builder.this.hosts = Arrays.asList(hosts); } return new AfterHosts(); } public AfterHosts setHosts(Iterable<String> hosts){ if (hosts != null){ Iterables.addAll(Builder.this.hosts, hosts); } return new AfterHosts(); } } public final class Done extends Build { } public abstract class Build { public ResourceSpecification build() { return new DefaultResourceSpecification(cores, memory, instances, uplink, downlink, hosts, racks); } } private Builder() {} } }