blob: a9fa7e71b86bff657d7e1647179864ac916b3a43 [file] [log] [blame]
/**
* 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.compute;
import static com.google.common.base.Preconditions.checkNotNull;
import org.jclouds.compute.domain.Template;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.javax.annotation.Nullable;
/**
* A means of specifying the interface between the {@link ComputeService
* ComputeServices} and a concrete compute cloud implementation, jclouds or
* otherwise.
*
* @author Adrian Cole
*
*/
public interface ComputeServiceAdapter<N, H, I, L> {
/**
* {@link ComputeService#createNodesInGroup(String, int, Template)} generates
* the parameters passed into this method such that each node in the set has
* a unique name.
*
* <h4>note</h4> It is intentional to return the library native node object,
* as generic type {@code N}. If you are not using library-native objects
* (such as libvirt {@code Domain}) use
* {@link JCloudsNativeComputeServiceAdapter} instead.
*
* <h4>note</h4> Your responsibility is to create a node with the underlying
* library and return after storing its credentials in the supplied map
* corresponding to {@link ComputeServiceContext#getCredentialStore
* credentialStore}
*
* @param tag
* used to aggregate nodes with identical configuration
* @param name
* unique supplied name for the node, which has the tag encoded
* into it.
* @param template
* includes {@code imageId}, {@code locationId}, and
* {@code hardwareId} used to resume the instance.
* @return library-native representation of a node.
* TODO: return typed exception on createNodeFailure
* @see ComputeService#createNodesInGroup(String, int, Template)
*/
NodeAndInitialCredentials<N> createNodeWithGroupEncodedIntoName(String tag, String name, Template template);
public static class NodeAndInitialCredentials<N> {
private final N node;
private final String nodeId;
private final LoginCredentials credentials;
public NodeAndInitialCredentials(N node, String nodeId, @Nullable LoginCredentials credentials) {
this.node = checkNotNull(node, "node");
this.nodeId = checkNotNull(nodeId, "nodeId");
this.credentials = credentials;
}
/**
*
* @return cloud specific representation of the newly created node
*/
public N getNode() {
return node;
}
/**
*
* @return Stringifed version of the new node's id.
*/
public String getNodeId() {
return nodeId;
}
/**
*
* @return credentials given by the api for the node, or null if this
* information is not available
*/
@Nullable
public LoginCredentials getCredentials() {
return credentials;
}
}
/**
* Hardware profiles describe available cpu, memory, and disk configurations
* that can be used to run a node.
* <p/>
* To implement this method, return the library native hardware profiles
* available to the user. These will be used to launch nodes as a part of the
* template.
*
* @return a non-null iterable of available hardware profiles.
* @see ComputeService#listHardwareProfiles()
*/
Iterable<H> listHardwareProfiles();
/**
* Images are the available configured operating systems that someone can run
* a node with. *
* <p/>
* To implement this method, return the library native images available to
* the user. These will be used to launch nodes as a part of the template.
*
* @return a non-null iterable of available images.
* @see ComputeService#listImages()
*/
Iterable<I> listImages();
Iterable<L> listLocations();
N getNode(String id);
void destroyNode(String id);
void rebootNode(String id);
void resumeNode(String id);
void suspendNode(String id);
Iterable<N> listNodes();
}