1 /** 2 * 3 * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com> 4 * 5 * ==================================================================== 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 * ==================================================================== 18 */ 19 package org.jclouds.compute; 20 21 import java.util.Map; 22 import java.util.NoSuchElementException; 23 import java.util.Set; 24 25 import org.jclouds.compute.domain.ComputeMetadata; 26 import org.jclouds.compute.domain.ExecResponse; 27 import org.jclouds.compute.domain.Hardware; 28 import org.jclouds.compute.domain.Image; 29 import org.jclouds.compute.domain.NodeMetadata; 30 import org.jclouds.compute.domain.Template; 31 import org.jclouds.compute.domain.TemplateBuilder; 32 import org.jclouds.compute.internal.BaseComputeService; 33 import org.jclouds.compute.options.RunScriptOptions; 34 import org.jclouds.compute.options.TemplateOptions; 35 import org.jclouds.domain.Location; 36 import org.jclouds.io.Payload; 37 import org.jclouds.scriptbuilder.domain.Statement; 38 39 import com.google.common.base.Predicate; 40 import com.google.inject.ImplementedBy; 41 42 /** 43 * Provides portable access to launching compute instances. 44 * 45 * @author Adrian Cole 46 * @author Ivan Meredith 47 */ 48 @ImplementedBy(BaseComputeService.class) 49 public interface ComputeService { 50 51 /** 52 * @return a reference to the context that created this ComputeService. 53 */ 54 ComputeServiceContext getContext(); 55 56 /** 57 * Makes a new template builder for this service 58 */ 59 TemplateBuilder templateBuilder(); 60 61 /** 62 * Makes a new set of options for running nodes 63 */ 64 TemplateOptions templateOptions(); 65 66 /** 67 * The list hardware profiles command shows you the options including virtual cpu count, memory, 68 * and disks. cpu count is not a portable quantity across clouds, as they are measured 69 * differently. However, it is a good indicator of relative speed within a cloud. memory is 70 * measured in megabytes and disks in gigabytes. 71 * 72 * @return a map of hardware profiles by ID, conceding that in some clouds the "id" is not used. 73 */ 74 Set<? extends Hardware> listHardwareProfiles(); 75 76 /** 77 * Images define the operating system and metadata related to a node. In some clouds, Images are 78 * bound to a specific region, and their identifiers are different across these regions. For this 79 * reason, you should consider matching image requirements like operating system family with 80 * TemplateBuilder as opposed to choosing an image explicitly. The getImages() command returns a 81 * map of images by id. 82 */ 83 Set<? extends Image> listImages(); 84 85 /** 86 * all nodes available to the current user by id. If possible, the returned set will include 87 * {@link NodeMetadata} objects. 88 */ 89 Set<? extends ComputeMetadata> listNodes(); 90 91 /** 92 * The list locations command returns all the valid locations for nodes. A location has a scope, 93 * which is typically region or zone. A region is a general area, like eu-west, where a zone is 94 * similar to a datacenter. If a location has a parent, that implies it is within that location. 95 * For example a location can be a rack, whose parent is likely to be a zone. 96 */ 97 Set<? extends Location> listAssignableLocations(); 98 99 /** 100 * 101 * The compute api treats nodes as a group based on the name you specify. Using this group, you 102 * can choose to operate one or many nodes as a logical unit without regard to the implementation 103 * details of the cloud. 104 * <p/> 105 * 106 * The set that is returned will include credentials you can use to ssh into the nodes. The "key" 107 * part of the credentials is either a password or a private key. You have to inspect the value 108 * to determine this. 109 * 110 * <pre> 111 * if (node.getCredentials().key.startsWith("-----BEGIN RSA PRIVATE KEY-----")) 112 * // it is a private key, not a password. 113 * </pre> 114 * 115 * <p/> 116 * Note. if all you want to do is execute a script at bootup, you should consider use of the 117 * runscript option. 118 * <p/> 119 * If resources such as security groups are needed, they will be reused or created for you. 120 * Inbound port 22 will always be opened up. 121 * 122 * @param group 123 * - common identifier to group nodes by, cannot contain hyphens 124 * @param count 125 * - how many to fire up. 126 * @param template 127 * - how to configure the nodes 128 * @return all of the nodes the api was able to launch in a running state. 129 * 130 * @throws RunNodesException 131 * when there's a problem applying options to nodes. Note that successful and failed 132 * nodes are a part of this exception, so be sure to inspect this carefully. 133 */ 134 Set<? extends NodeMetadata> createNodesInGroup(String group, int count, Template template) throws RunNodesException; 135 136 /** 137 * Like {@link ComputeService#createNodesInGroup(String,int,Template)}, except that the template 138 * is default, equivalent to {@code templateBuilder().any().options(templateOptions)}. 139 */ 140 Set<? extends NodeMetadata> createNodesInGroup(String group, int count, TemplateOptions templateOptions) 141 throws RunNodesException; 142 143 /** 144 * Like {@link ComputeService#createNodesInGroup(String,int,TemplateOptions)}, except that the 145 * options are default, as specified in {@link ComputeService#templateOptions}. 146 */ 147 Set<? extends NodeMetadata> createNodesInGroup(String group, int count) throws RunNodesException; 148 149 /** 150 * @see #createNodesInGroup(String , int , Template ) 151 */ 152 @Deprecated 153 Set<? extends NodeMetadata> runNodesWithTag(String tag, int count, Template template) throws RunNodesException; 154 155 /** 156 * @see #createNodesInGroup(String , int , TemplateOptions ) 157 */ 158 @Deprecated 159 Set<? extends NodeMetadata> runNodesWithTag(String tag, int count, TemplateOptions templateOptions) 160 throws RunNodesException; 161 162 /** 163 * @see #createNodesInGroup(String , int ) 164 */ 165 @Deprecated 166 Set<? extends NodeMetadata> runNodesWithTag(String tag, int count) throws RunNodesException; 167 168 /** 169 * resume the node from {@link org.jclouds.compute.domain.NodeState#SUSPENDED suspended} state, 170 * given its id. 171 * 172 * <h4>note</h4> 173 * 174 * affected nodes may not resume with the same IP address(es) 175 */ 176 void resumeNode(String id); 177 178 /** 179 * nodes matching the filter are treated as a logical set. Using the resume command, you can save 180 * time by resumeing the nodes in parallel. 181 * 182 * <h4>note</h4> 183 * 184 * affected nodes may not resume with the same IP address(es) 185 * 186 * @throws UnsupportedOperationException 187 * if the underlying provider doesn't support suspend/resume 188 * @throws NoSuchElementException 189 * if no nodes matched the predicate specified 190 */ 191 void resumeNodesMatching(Predicate<NodeMetadata> filter); 192 193 /** 194 * suspend the node, given its id. This will result in 195 * {@link org.jclouds.compute.domain.NodeState#SUSPENDED suspended} state. 196 * 197 * <h4>note</h4> 198 * 199 * affected nodes may not resume with the same IP address(es) 200 * 201 * @throws UnsupportedOperationException 202 * if the underlying provider doesn't support suspend/resume 203 */ 204 void suspendNode(String id); 205 206 /** 207 * nodes matching the filter are treated as a logical set. Using the suspend command, you can 208 * save time by suspending the nodes in parallel. 209 * 210 * <h4>note</h4> 211 * 212 * affected nodes may not resume with the same IP address(es) 213 * 214 * @throws UnsupportedOperationException 215 * if the underlying provider doesn't support suspend/resume 216 * @throws NoSuchElementException 217 * if no nodes matched the predicate specified 218 */ 219 void suspendNodesMatching(Predicate<NodeMetadata> filter); 220 221 /** 222 * destroy the node, given its id. If it is the only node in a tag set, the dependent resources 223 * will also be destroyed. 224 */ 225 void destroyNode(String id); 226 227 /** 228 * nodes matching the filter are treated as a logical set. Using the delete command, you can save 229 * time by removing the nodes in parallel. When the last node in a set is destroyed, any indirect 230 * resources it uses, such as keypairs, are also destroyed. 231 * 232 * @return list of nodes destroyed 233 */ 234 Set<? extends NodeMetadata> destroyNodesMatching(Predicate<NodeMetadata> filter); 235 236 /** 237 * reboot the node, given its id. 238 */ 239 void rebootNode(String id); 240 241 /** 242 * nodes matching the filter are treated as a logical set. Using this command, you can save time 243 * by rebooting the nodes in parallel. 244 * 245 * @throws NoSuchElementException 246 * if no nodes matched the predicate specified 247 */ 248 void rebootNodesMatching(Predicate<NodeMetadata> filter); 249 250 /** 251 * Find a node by its id. 252 */ 253 NodeMetadata getNodeMetadata(String id); 254 255 /** 256 * get all nodes including details such as image and ip addresses even if it incurs extra 257 * requests to the service. 258 * 259 * @param filter 260 * how to select the nodes you are interested in details on. 261 */ 262 Set<? extends NodeMetadata> listNodesDetailsMatching(Predicate<ComputeMetadata> filter); 263 264 /** 265 * @see org.jclouds.io.Payloads 266 * @see ComputeService#runScriptOnNodesMatching(Predicate, Statement, RunScriptOptions) 267 */ 268 @Deprecated 269 Map<? extends NodeMetadata, ExecResponse> runScriptOnNodesMatching(Predicate<NodeMetadata> filter, Payload runScript) 270 throws RunScriptOnNodesException; 271 272 /** 273 * @see org.jclouds.io.Payloads 274 * @see ComputeService#runScriptOnNodesMatching(Predicate, Statement, RunScriptOptions) 275 */ 276 @Deprecated 277 Map<? extends NodeMetadata, ExecResponse> runScriptOnNodesMatching(Predicate<NodeMetadata> filter, 278 Payload runScript, RunScriptOptions options) throws RunScriptOnNodesException; 279 280 /** 281 * 282 * @see ComputeService#runScriptOnNodesMatching(Predicate, Statement, RunScriptOptions) 283 */ 284 Map<? extends NodeMetadata, ExecResponse> runScriptOnNodesMatching(Predicate<NodeMetadata> filter, String runScript) 285 throws RunScriptOnNodesException; 286 287 /** 288 * 289 * @see ComputeService#runScriptOnNodesMatching(Predicate, Statement, RunScriptOptions) 290 */ 291 Map<? extends NodeMetadata, ExecResponse> runScriptOnNodesMatching(Predicate<NodeMetadata> filter, 292 Statement runScript) throws RunScriptOnNodesException; 293 294 /** 295 * 296 * @see ComputeService#runScriptOnNodesMatching(Predicate, Statement, RunScriptOptions) 297 */ 298 Map<? extends NodeMetadata, ExecResponse> runScriptOnNodesMatching(Predicate<NodeMetadata> filter, String runScript, 299 RunScriptOptions options) throws RunScriptOnNodesException; 300 301 /** 302 * Run the script on all nodes with the specific predicate. 303 * 304 * @param filter 305 * Predicate-based filter to define on which nodes the script is to be executed 306 * @param runScript 307 * statement containing the script to run 308 * @param options 309 * nullable options to how to run the script, whether to override credentials 310 * @return map with node identifiers and corresponding responses 311 * @throws NoSuchElementException 312 * if no nodes matched the predicate specified 313 * @throws RunScriptOnNodesException 314 * if anything goes wrong during script execution 315 * 316 * @see org.jclouds.compute.predicates.NodePredicates#runningWithTag(String) 317 * @see org.jclouds.scriptbuilder.domain.Statements 318 */ 319 Map<? extends NodeMetadata, ExecResponse> runScriptOnNodesMatching(Predicate<NodeMetadata> filter, 320 Statement runScript, RunScriptOptions options) throws RunScriptOnNodesException; 321 322 }