blob: c33ffda2d2928e12bac122e5796c5f50fce6e02a [file] [log] [blame]
/*
* 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.jclouds.openstack.nova.v2_0.domain;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import java.beans.ConstructorProperties;
import javax.inject.Named;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.openstack.v2_0.domain.Link;
import org.jclouds.openstack.v2_0.domain.Resource;
import com.google.common.base.Objects;
import com.google.common.base.MoreObjects.ToStringHelper;
import com.google.common.base.Optional;
/**
* A flavor is an available hardware configuration for a server. Each flavor has
* a unique combination of disk space and memory capacity.
*
* @see <a href=
"http://docs.openstack.org/api/openstack-compute/2/content/List_Flavors-d1e4188.html"
/>
*/
public class Flavor extends Resource {
public static Builder<?> builder() {
return new ConcreteBuilder();
}
public Builder<?> toBuilder() {
return new ConcreteBuilder().fromFlavor(this);
}
public abstract static class Builder<T extends Builder<T>> extends Resource.Builder<T> {
protected int ram;
protected int disk;
protected int vcpus;
protected String swap;
protected Double rxtxFactor;
protected Integer ephemeral;
/**
* @see Flavor#getRam()
*/
public T ram(int ram) {
this.ram = ram;
return self();
}
/**
* @see Flavor#getDisk()
*/
public T disk(int disk) {
this.disk = disk;
return self();
}
/**
* @see Flavor#getVcpus()
*/
public T vcpus(int vcpus) {
this.vcpus = vcpus;
return self();
}
/**
* @see Flavor#getSwap()
*/
public T swap(String swap) {
this.swap = swap;
return self();
}
/**
* @see Flavor#getRxtxFactor()
*/
public T rxtxFactor(Double rxtxFactor) {
this.rxtxFactor = rxtxFactor;
return self();
}
/**
* @see Flavor#getEphemeral()
*/
public T ephemeral(Integer ephemeral) {
this.ephemeral = ephemeral;
return self();
}
public Flavor build() {
return new Flavor(id, name, links, ram, disk, vcpus, swap, rxtxFactor, ephemeral);
}
public T fromFlavor(Flavor in) {
return super.fromResource(in)
.ram(in.getRam())
.disk(in.getDisk())
.vcpus(in.getVcpus())
.swap(in.getSwap().orNull())
.rxtxFactor(in.getRxtxFactor().orNull())
.ephemeral(in.getEphemeral().orNull());
}
}
private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
@Override
protected ConcreteBuilder self() {
return this;
}
}
private final int ram;
private final int disk;
private final int vcpus;
private final Optional<String> swap;
@Named("rxtx_factor")
private final Optional<Double> rxtxFactor;
@Named("OS-FLV-EXT-DATA:ephemeral")
private final Optional<Integer> ephemeral;
@ConstructorProperties({
"id", "name", "links", "ram", "disk", "vcpus", "swap", "rxtx_factor", "OS-FLV-EXT-DATA:ephemeral"
})
protected Flavor(String id, String name, java.util.Set<Link> links, int ram, int disk, int vcpus,
@Nullable String swap, @Nullable Double rxtxFactor, @Nullable Integer ephemeral) {
super(id, checkNotNull(name, "name"), links);
checkArgument(ram > 0, "Value of ram has to greater than 0");
checkArgument(vcpus > 0, "Value of vcpus has to greater than 0");
this.ram = ram;
this.disk = disk;
this.vcpus = vcpus;
this.swap = Optional.fromNullable(swap);
this.rxtxFactor = Optional.fromNullable(rxtxFactor);
this.ephemeral = Optional.fromNullable(ephemeral);
}
public int getRam() {
return this.ram;
}
public int getDisk() {
return this.disk;
}
public int getVcpus() {
return this.vcpus;
}
public Optional<String> getSwap() {
return this.swap;
}
public Optional<Double> getRxtxFactor() {
return this.rxtxFactor;
}
/**
* Retrieves ephemeral disk space in GB
* <p/>
* NOTE: This field is only present if the Flavor Extra Data extension is installed (alias "OS-FLV-EXT-DATA").
*
* @see org.jclouds.openstack.nova.v2_0.features.ExtensionApi#getExtensionByAlias
* @see org.jclouds.openstack.nova.v2_0.extensions.ExtensionNamespaces#FLAVOR_EXTRA_DATA
*/
public Optional<Integer> getEphemeral() {
return this.ephemeral;
}
@Override
public int hashCode() {
return Objects.hashCode(ram, disk, vcpus, swap, rxtxFactor, ephemeral);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Flavor that = Flavor.class.cast(obj);
return super.equals(that) && Objects.equal(this.ram, that.ram)
&& Objects.equal(this.disk, that.disk)
&& Objects.equal(this.vcpus, that.vcpus)
&& Objects.equal(this.swap, that.swap)
&& Objects.equal(this.rxtxFactor, that.rxtxFactor)
&& Objects.equal(this.ephemeral, that.ephemeral);
}
protected ToStringHelper string() {
return super.string()
.add("ram", ram).add("disk", disk).add("vcpus", vcpus).add("swap", swap).add("rxtxFactor", rxtxFactor).add("ephemeral", ephemeral);
}
}