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