blob: 5aff1ac37a029c4b7cb02192fe74c3436a99da80 [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.checkNotNull;
import java.beans.ConstructorProperties;
import java.util.Date;
import java.util.Map;
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.MoreObjects.ToStringHelper;
import com.google.common.base.Optional;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Multimap;
/**
* A server is a virtual machine instance in the compute system. Flavor and image are requisite
* elements when creating a server.
*
* @see <a href=
* "http://docs.openstack.org/api/openstack-compute/1.1/content/Get_Server_Details-d1e2623.html"
* />
*/
public class Server extends Resource {
public static final String DISK_CONFIG_MANUAL = "MANUAL";
public static final String DISK_CONFIG_AUTO = "AUTO";
/**
* Servers contain a status attribute that can be used as an indication of the current server
* state. Servers with an ACTIVE status are available for use.
* <p/>
* Other possible values for the status attribute include: BUILD, REBUILD, SUSPENDED, RESIZE,
* VERIFY_RESIZE, REVERT_RESIZE, PASSWORD, REBOOT, HARD_REBOOT, DELETED, UNKNOWN, and ERROR.
*
*/
public static enum Status {
ACTIVE, BUILD, REBUILD, SUSPENDED, PAUSED, RESIZE, VERIFY_RESIZE, REVERT_RESIZE, PASSWORD, REBOOT, HARD_REBOOT,
DELETED, UNKNOWN, ERROR,
/**
* @deprecated please use {@code Status.SHUTOFF} instead. To be removed in jclouds 2.0.
*/
@Deprecated STOPPED,
UNRECOGNIZED, MIGRATING, SHUTOFF, RESCUE, SOFT_DELETED, SHELVED, SHELVED_OFFLOADED;
public String value() {
return name();
}
public static Status fromValue(String v) {
try {
return valueOf(v.replaceAll("\\(.*", ""));
} catch (IllegalArgumentException e) {
return UNRECOGNIZED;
}
}
}
public static Builder<?> builder() {
return new ConcreteBuilder();
}
public Builder<?> toBuilder() {
return new ConcreteBuilder().fromServer(this);
}
public abstract static class Builder<T extends Builder<T>> extends Resource.Builder<T> {
protected String uuid;
protected String tenantId;
protected String userId;
protected Date updated;
protected Date created;
protected String hostId;
protected String accessIPv4;
protected String accessIPv6;
protected Server.Status status;
protected Resource image;
protected Resource flavor;
protected String keyName;
protected String configDrive;
protected Multimap<String, Address> addresses = ImmutableMultimap.of();
protected Map<String, String> metadata = ImmutableMap.of();
protected ServerExtendedStatus extendedStatus;
protected ServerExtendedAttributes extendedAttributes;
protected String diskConfig;
protected String availabilityZone;
/**
* @see Server#getUuid()
*/
public T uuid(String uuid) {
this.uuid = uuid;
return self();
}
/**
* @see Server#getTenantId()
*/
public T tenantId(String tenantId) {
this.tenantId = tenantId;
return self();
}
/**
* @see Server#getUserId()
*/
public T userId(String userId) {
this.userId = userId;
return self();
}
/**
* @see Server#getUpdated()
*/
public T updated(Date updated) {
this.updated = updated;
return self();
}
/**
* @see Server#getCreated()
*/
public T created(Date created) {
this.created = created;
return self();
}
/**
* @see Server#getHostId()
*/
public T hostId(String hostId) {
this.hostId = hostId;
return self();
}
/**
* @see Server#getAccessIPv4()
*/
public T accessIPv4(String accessIPv4) {
this.accessIPv4 = accessIPv4;
return self();
}
/**
* @see Server#getAccessIPv6()
*/
public T accessIPv6(String accessIPv6) {
this.accessIPv6 = accessIPv6;
return self();
}
/**
* @see Server#getStatus()
*/
public T status(Server.Status status) {
this.status = status;
return self();
}
/**
* @see Server#getImage()
*/
public T image(Resource image) {
this.image = image;
return self();
}
/**
* @see Server#getFlavor()
*/
public T flavor(Resource flavor) {
this.flavor = flavor;
return self();
}
/**
* @see Server#getKeyName()
*/
public T keyName(String keyName) {
this.keyName = keyName;
return self();
}
/**
* @see Server#getConfigDrive()
*/
public T configDrive(String configDrive) {
this.configDrive = configDrive;
return self();
}
/**
* @see Server#getAddresses()
*/
public T addresses(Multimap<String, Address> addresses) {
this.addresses = addresses;
return self();
}
/**
* @see Server#getMetadata()
*/
public T metadata(Map<String, String> metadata) {
this.metadata = ImmutableMap.copyOf(checkNotNull(metadata, "metadata"));
return self();
}
/**
* @see Server#getExtendedStatus()
*/
public T extendedStatus(ServerExtendedStatus extendedStatus) {
this.extendedStatus = extendedStatus;
return self();
}
/**
* @see Server#getExtendedAttributes()
*/
public T extendedAttributes(ServerExtendedAttributes extendedAttributes) {
this.extendedAttributes = extendedAttributes;
return self();
}
/**
* @see Server#getDiskConfig()
*/
public T diskConfig(String diskConfig) {
this.diskConfig = diskConfig;
return self();
}
/**
* @see Server#getAvailabilityZone()
*/
public T availabilityZone(String availabilityZone) {
this.availabilityZone = availabilityZone;
return self();
}
public Server build() {
return new Server(id, name, links, uuid, tenantId, userId, updated, created, hostId, accessIPv4, accessIPv6,
status, image, flavor, keyName, configDrive, addresses, metadata, extendedStatus,
extendedAttributes, diskConfig, availabilityZone);
}
public T fromServer(Server in) {
return super.fromResource(in)
.uuid(in.getUuid())
.tenantId(in.getTenantId())
.userId(in.getUserId())
.updated(in.getUpdated())
.created(in.getCreated())
.hostId(in.getHostId())
.accessIPv4(in.getAccessIPv4())
.accessIPv6(in.getAccessIPv6())
.status(in.getStatus())
.image(in.getImage())
.flavor(in.getFlavor())
.keyName(in.getKeyName())
.configDrive(in.getConfigDrive())
.addresses(in.getAddresses())
.metadata(in.getMetadata())
.extendedStatus(in.getExtendedStatus().orNull())
.extendedAttributes(in.getExtendedAttributes().orNull())
.diskConfig(in.getDiskConfig().orNull())
.availabilityZone(in.getAvailabilityZone().orNull());
}
}
private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
@Override
protected ConcreteBuilder self() {
return this;
}
}
private final String uuid;
@Named("tenant_id")
private final String tenantId;
@Named("user_id")
private final String userId;
private final Date updated;
private final Date created;
private final String hostId;
private final String accessIPv4;
private final String accessIPv6;
private final Server.Status status;
private final Resource image;
private final Resource flavor;
@Named("key_name")
private final String keyName;
@Named("config_drive")
private final String configDrive;
private final Multimap<String, Address> addresses;
private final Map<String, String> metadata;
private final Optional<ServerExtendedStatus> extendedStatus;
private final Optional<ServerExtendedAttributes> extendedAttributes;
@Named("OS-DCF:diskConfig")
private final Optional<String> diskConfig;
@Named("OS-EXT-AZ:availability_zone")
private final Optional<String> availabilityZone;
@ConstructorProperties({"id", "name", "links", "uuid", "tenant_id", "user_id", "updated", "created", "hostId", "accessIPv4", "accessIPv6", "status", "image", "flavor", "key_name", "config_drive", "addresses", "metadata", "extendedStatus", "extendedAttributes", "OS-DCF:diskConfig", "OS-EXT-AZ:availability_zone"})
protected Server(String id, @Nullable String name, java.util.Set<Link> links, @Nullable String uuid, String tenantId,
String userId, @Nullable Date updated, Date created, @Nullable String hostId, @Nullable String accessIPv4,
@Nullable String accessIPv6, Server.Status status, @Nullable Resource image, Resource flavor, @Nullable String keyName,
@Nullable String configDrive, Multimap<String, Address> addresses, Map<String, String> metadata,
@Nullable ServerExtendedStatus extendedStatus, @Nullable ServerExtendedAttributes extendedAttributes,
@Nullable String diskConfig, @Nullable String availabilityZone) {
super(id, name, links);
this.uuid = uuid;
this.tenantId = checkNotNull(tenantId, "tenantId");
this.userId = checkNotNull(userId, "userId");
this.updated = updated;
this.created = checkNotNull(created, "created");
this.hostId = Strings.emptyToNull(hostId);
this.accessIPv4 = Strings.emptyToNull(accessIPv4);
this.accessIPv6 = Strings.emptyToNull(accessIPv6);
this.status = checkNotNull(status, "status");
this.image = image;
this.flavor = checkNotNull(flavor, "flavor");
this.keyName = Strings.emptyToNull(keyName);
this.configDrive = Strings.emptyToNull(configDrive);
this.addresses = ImmutableMultimap.copyOf(checkNotNull(addresses, "addresses"));
this.metadata = ImmutableMap.copyOf(checkNotNull(metadata, "metadata"));
this.extendedStatus = Optional.fromNullable(extendedStatus);
this.extendedAttributes = Optional.fromNullable(extendedAttributes);
this.diskConfig = Optional.fromNullable(diskConfig);
this.availabilityZone = Optional.fromNullable(availabilityZone);
}
/**
* only present until the id is in uuid form
*
* @return uuid, if id is an integer val
*/
@Nullable
public String getUuid() {
return this.uuid;
}
public String getTenantId() {
return this.tenantId;
}
public String getUserId() {
return this.userId;
}
@Nullable
public Date getUpdated() {
return this.updated;
}
public Date getCreated() {
return this.created;
}
/**
* @return host identifier, or null if in {@link Status#BUILD}
*/
@Nullable
public String getHostId() {
return this.hostId;
}
@Nullable
public String getAccessIPv4() {
return this.accessIPv4;
}
@Nullable
public String getAccessIPv6() {
return this.accessIPv6;
}
public Status getStatus() {
return this.status;
}
@Nullable
public String getConfigDrive() {
return this.configDrive;
}
public Resource getImage() {
return this.image;
}
public Resource getFlavor() {
return this.flavor;
}
public Map<String, String> getMetadata() {
return metadata;
}
/**
* @return the ip addresses assigned to the server
*/
public Multimap<String, Address> getAddresses() {
return addresses;
}
/**
* @return keyName if extension is present and there is a value for this server
* @see KeyPairApi
*/
@Nullable
public String getKeyName() {
return keyName;
}
/**
* Retrieves the extended server status fields (alias "OS-EXT-STS")
* <p/>
* NOTE: This field is only present if the Extended Status extension is installed.
*
* @see org.jclouds.openstack.nova.v2_0.features.ExtensionApi#getExtensionByAlias
* @see org.jclouds.openstack.nova.v2_0.extensions.ExtensionNamespaces#EXTENDED_STATUS
*/
public Optional<ServerExtendedStatus> getExtendedStatus() {
return this.extendedStatus;
}
/**
* Retrieves the extended server attributes fields (alias "OS-EXT-SRV-ATTR")
* <p/>
* NOTE: This field is only present if the The Extended Server Attributes API extension is installed.
*
* @see org.jclouds.openstack.nova.v2_0.features.ExtensionApi#getExtensionByAlias
* @see org.jclouds.openstack.nova.v2_0.extensions.ExtensionNamespaces#EXTENDED_STATUS
*/
public Optional<ServerExtendedAttributes> getExtendedAttributes() {
return this.extendedAttributes;
}
/**
* Disk config attribute from the Disk Config Extension (alias "OS-DCF").
* One of {@link Server#DISK_CONFIG_AUTO} or {@link Server#DISK_CONFIG_MANUAL}.
* This field is only present if the Disk Config extension is installed.
* <p/>
* NOTE: Typically a field like this would be implemented as an enum but this field was
* originally implmented as a String and {@link Server#DISK_CONFIG_AUTO} and
* {@link Server#DISK_CONFIG_MANUAL} were added later as Strings to preserve backwards
* compatibility.
*
* @see org.jclouds.openstack.nova.v2_0.features.ExtensionApi#getExtensionByAlias
* @see org.jclouds.openstack.nova.v2_0.extensions.ExtensionNamespaces#DISK_CONFIG
* @see CreateServerOptions#getDiskConfig()
*/
public Optional<String> getDiskConfig() {
return this.diskConfig;
}
/**
* return the Availability Zone of a server
* @see org.jclouds.openstack.nova.v2_0.extensions.ExtensionNamespaces#AVAILABILITY_ZONE
*/
@Nullable
public Optional<String> getAvailabilityZone() {
return this.availabilityZone;
}
// hashCode/equals from super is ok
@Override
protected ToStringHelper string() {
return super.string()
.add("uuid", uuid).add("tenantId", tenantId).add("userId", userId).add("updated", updated).add("created", created)
.add("hostId", hostId).add("accessIPv4", accessIPv4).add("accessIPv6", accessIPv6).add("status", status).add("image", image)
.add("flavor", flavor).add("keyName", keyName).add("configDrive", configDrive).add("addresses", addresses)
.add("metadata", metadata).add("extendedStatus", extendedStatus).add("extendedAttributes", extendedAttributes)
.add("diskConfig", diskConfig)
.add("availabilityZone", availabilityZone);
}
}