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

Java tutorial

Introduction

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

Source

/**
 * Licensed to jclouds, Inc. (jclouds) under one or more
 * contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  jclouds 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.v1_1.domain;

import static com.google.common.base.Preconditions.checkNotNull;

import java.util.Date;
import java.util.Map;
import java.util.Set;

import org.jclouds.compute.domain.NodeState;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.openstack.domain.Link;
import org.jclouds.openstack.domain.Resource;
import org.jclouds.openstack.nova.v1_1.extensions.KeyPairClient;
import org.jclouds.util.Multimaps2;

import com.google.common.base.Objects.ToStringHelper;
import com.google.common.base.Predicates;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.gson.annotations.SerializedName;

/**
 * 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 {

    /**
     * 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.
     * 
     * 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(NodeState.RUNNING), BUILD(NodeState.PENDING), REBUILD(NodeState.PENDING), SUSPENDED(
                NodeState.SUSPENDED), RESIZE(NodeState.PENDING), VERIFY_RESIZE(NodeState.PENDING), REVERT_RESIZE(
                        NodeState.PENDING), PASSWORD(NodeState.PENDING), REBOOT(NodeState.PENDING), HARD_REBOOT(
                                NodeState.PENDING), DELETED(NodeState.TERMINATED), UNKNOWN(
                                        NodeState.UNRECOGNIZED), ERROR(
                                                NodeState.ERROR), UNRECOGNIZED(NodeState.UNRECOGNIZED);

        private final NodeState nodeState;

        Status(NodeState nodeState) {
            this.nodeState = nodeState;
        }

        public String value() {
            return name();
        }

        public static Status fromValue(String v) {
            try {
                return valueOf(v.replaceAll("\\(.*", ""));
            } catch (IllegalArgumentException e) {
                return UNRECOGNIZED;
            }
        }

        public NodeState getNodeState() {
            return nodeState;
        }
    }

    public static Builder builder() {
        return new Builder();
    }

    public Builder toBuilder() {
        return builder().fromServer(this);
    }

    public static class Builder extends Resource.Builder {
        private String uuid;
        private String tenantId;
        private String userId;
        private Date updated;
        private Date created;
        private String hostId;
        private String accessIPv4;
        private String accessIPv6;
        private Status status;
        private String configDrive;
        private Resource image;
        private Resource flavor;
        private Map<String, String> metadata = Maps.newHashMap();
        // TODO: get gson multimap ad
        private Multimap<String, Address> addresses = LinkedHashMultimap.create();
        private String adminPass;
        private String keyName;

        /**
         * @see Server#getUuid()
         */
        public Builder uuid(@Nullable String uuid) {
            this.uuid = uuid;
            return this;
        }

        /**
         * @see Server#getTenantId()
         */
        public Builder tenantId(String tenantId) {
            this.tenantId = tenantId;
            return this;
        }

        /**
         * @see Server#getUserId()
         */
        public Builder userId(String userId) {
            this.userId = userId;
            return this;
        }

        /**
         * @see Server#getUpdated()
         */
        public Builder updated(Date updated) {
            this.updated = updated;
            return this;
        }

        /**
         * @see Server#getCreated()
         */
        public Builder created(Date created) {
            this.created = created;
            return this;
        }

        /**
         * @see Server#getHostId()
         */
        public Builder hostId(@Nullable String hostId) {
            this.hostId = hostId;
            return this;
        }

        /**
         * @see Server#getAccessIPv4()
         */
        public Builder accessIPv4(@Nullable String accessIPv4) {
            this.accessIPv4 = accessIPv4;
            return this;
        }

        /**
         * @see Server#getAccessIPv6()
         */
        public Builder accessIPv6(@Nullable String accessIPv6) {
            this.accessIPv6 = accessIPv6;
            return this;
        }

        /**
         * @see Server#getStatus()
         */
        public Builder status(Status status) {
            this.status = status;
            return this;
        }

        /**
         * @see Server#getConfigDrive()
         */
        public Builder configDrive(@Nullable String configDrive) {
            this.configDrive = configDrive;
            return this;
        }

        /**
         * @see Server#getImage()
         */
        public Builder image(Resource image) {
            this.image = image;
            return this;
        }

        /**
         * @see Server#getImage()
         */
        public Builder flavor(Resource flavor) {
            this.flavor = flavor;
            return this;
        }

        /**
         * @see Server#getMetadata()
         */
        public Builder metadata(Map<String, String> metadata) {
            this.metadata = ImmutableMap.copyOf(metadata);
            return this;
        }

        /**
         * @see Server#getAddresses()
         */
        public Builder addresses(Multimap<String, Address> addresses) {
            this.addresses = ImmutableMultimap.copyOf(checkNotNull(addresses, "addresses"));
            return this;
        }

        /**
         * @see Server#getAdminPass()
         */
        public Builder adminPass(String adminPass) {
            this.adminPass = adminPass;
            return this;
        }

        /**
         * @see Server#getKeyName()
         */
        public Builder keyName(@Nullable String keyName) {
            this.keyName = keyName;
            return this;
        }

        @Override
        public Server build() {
            return new Server(id, name, links, uuid, tenantId, userId, updated, created, hostId, accessIPv4,
                    accessIPv6, status, configDrive, image, flavor, adminPass, keyName, addresses, metadata);
        }

        public Builder fromServer(Server in) {
            return 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())
                    .configDrive(in.getConfigDrive()).image(in.getImage()).flavor(in.getFlavor())
                    .adminPass(in.getAdminPass()).keyName(in.getKeyName()).addresses(in.getAddresses())
                    .metadata(in.getMetadata());
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public Builder id(String id) {
            return Builder.class.cast(super.id(id));
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public Builder name(String name) {
            return Builder.class.cast(super.name(name));
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public Builder links(Set<Link> links) {
            return Builder.class.cast(super.links(links));
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public Builder links(Link... links) {
            return Builder.class.cast(super.links(links));
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public Builder fromResource(Resource in) {
            return Builder.class.cast(super.fromResource(in));
        }
    }

    protected final String uuid;
    @SerializedName("tenant_id")
    protected final String tenantId;
    @SerializedName("user_id")
    protected final String userId;
    protected final Date updated;
    protected final Date created;
    protected final String hostId;
    protected final String accessIPv4;
    protected final String accessIPv6;
    protected final Status status;
    protected final Resource image;
    protected final Resource flavor;
    protected final String adminPass;
    @SerializedName("key_name")
    protected final String keyName;
    @SerializedName("config_drive")
    protected final String configDrive;
    // TODO: get gson multimap adapter!
    protected final Map<String, Set<Address>> addresses;
    protected final Map<String, String> metadata;

    protected Server(String id, String name, Set<Link> links, @Nullable String uuid, String tenantId, String userId,
            Date updated, Date created, @Nullable String hostId, @Nullable String accessIPv4,
            @Nullable String accessIPv6, Status status, @Nullable String configDrive, Resource image,
            Resource flavor, String adminPass, @Nullable String keyName, Multimap<String, Address> addresses,
            Map<String, String> metadata) {
        super(id, name, links);
        this.uuid = uuid; // TODO: see what version this came up in
        this.tenantId = checkNotNull(tenantId, "tenantId");
        this.userId = checkNotNull(userId, "userId");
        this.updated = checkNotNull(updated, "updated");
        this.created = checkNotNull(created, "created");
        this.hostId = hostId;
        this.accessIPv4 = accessIPv4;
        this.accessIPv6 = accessIPv6;
        this.status = checkNotNull(status, "status");
        this.configDrive = configDrive;
        this.image = checkNotNull(image, "image");
        this.flavor = checkNotNull(flavor, "flavor");
        this.metadata = Maps.newHashMap(metadata);
        this.addresses = Multimaps2.toOldSchool(ImmutableMultimap.copyOf(checkNotNull(addresses, "addresses")));
        this.adminPass = adminPass;
        this.keyName = keyName;
    }

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

    public Date getUpdated() {
        return this.updated;
    }

    public Date getCreated() {
        return this.created;
    }

    /**
     * 
     * @return host identifier, or null if in {@link ServerState#BUILD}
     */
    @Nullable
    public String getHostId() {
        return Strings.emptyToNull(this.hostId);
    }

    @Nullable
    public String getAccessIPv4() {
        return Strings.emptyToNull(this.accessIPv4);
    }

    @Nullable
    public String getAccessIPv6() {
        return Strings.emptyToNull(this.accessIPv6);
    }

    public Status getStatus() {
        return this.status;
    }

    @Nullable
    public String getConfigDrive() {
        return Strings.emptyToNull(this.configDrive);
    }

    public Resource getImage() {
        return this.image;
    }

    public Resource getFlavor() {
        return this.flavor;
    }

    public Map<String, String> getMetadata() {
        // in case this was assigned in gson
        return ImmutableMap.copyOf(Maps.filterValues(this.metadata, Predicates.notNull()));
    }

    /**
     * @return the ip addresses assigned to the server
     */
    public Multimap<String, Address> getAddresses() {
        return Multimaps2.fromOldSchool(addresses);
    }

    /**
     * @return the administrative password for this server; only present on first request.
     */
    @Nullable
    public String getAdminPass() {
        return adminPass;
    }

    /**
     * @return keyName if extension is present and there is a valur for this server
     * @see KeyPairClient
     */
    @Nullable
    public String getKeyName() {
        return keyName;
    }

    // hashCode/equals from super is ok

    @Override
    protected ToStringHelper string() {
        return super.string().add("uuid", uuid).add("tenantId", tenantId).add("userId", userId)
                .add("hostId", getHostId()).add("updated", updated).add("created", created)
                .add("accessIPv4", getAccessIPv4()).add("accessIPv6", getAccessIPv6()).add("status", status)
                .add("configDrive", getConfigDrive()).add("image", image).add("flavor", flavor)
                .add("metadata", metadata).add("addresses", getAddresses()).add("adminPass", adminPass);
    }
}