org.jclouds.openstack.nova.v2_0.domain.Server.java Source code

Java tutorial

Introduction

Here is the source code for org.jclouds.openstack.nova.v2_0.domain.Server.java

Source

/*
 * 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.Objects.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.
 *
 * @author Adrian Cole
 * @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.
     *
     * @author Adrian Cole
     */
    public static enum Status {

        ACTIVE, BUILD, REBUILD, SUSPENDED, PAUSED, RESIZE, VERIFY_RESIZE, REVERT_RESIZE, PASSWORD, REBOOT, HARD_REBOOT, DELETED, UNKNOWN, ERROR, STOPPED, UNRECOGNIZED;

        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;

        /**
         * @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();
        }

        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);
        }

        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());
        }
    }

    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;

    @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" })
    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, 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) {
        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 = checkNotNull(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);
    }

    /**
     * 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;
    }

    // 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);
    }

}