All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jclouds.compute.options.TemplateOptions Maven / Gradle / Ivy

The newest version!
/*
 * 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.compute.options;

import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;

import java.util.Arrays;
import java.util.Map;
import java.util.Set;

import org.jclouds.domain.LoginCredentials;
import org.jclouds.scriptbuilder.domain.Statement;
import org.jclouds.scriptbuilder.domain.Statements;

import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import com.google.common.primitives.Ints;

/**
 * Contains options supported in the {@code ComputeService#createNodesInGroup}
 * operation. 

* Usage

The recommended way to instantiate a TemplateOptions object is to * statically import TemplateOptions.* and invoke a static creation method * followed by any/all desired instance mutators. *

* * import static org.jclouds.compute.options.TemplateOptions.Builder.*; *

* ComputeService client = // get connection * templateBuilder.options(inboundPorts(22, 80, 8080, 443)); * Set set = client.createNodesInGroup(tag, 2, templateBuilder.build()); * *

* Note that options can only be assigned to a builder once, so if assigning e.g. inboundPorts and tags, * that must be done in with mutators in a single call to options -- * templateBuilder.options(inboundPorts(22, 80, 8080, 443).tags("I love it!")) * -- not as repeated calls to options. * * @author Adrian Cole */ public class TemplateOptions extends RunScriptOptions implements Cloneable { @Override public TemplateOptions clone() { TemplateOptions options = new TemplateOptions(); copyTo(options); return options; } public void copyTo(TemplateOptions to) { if (!Arrays.equals(to.getInboundPorts(), this.getInboundPorts())) to.inboundPorts(this.getInboundPorts()); if (this.getRunScript() != null) to.runScript(this.getRunScript()); if (this.getGroups().size() > 0) to.securityGroups(this.getGroups()); if (this.getPrivateKey() != null) to.installPrivateKey(this.getPrivateKey()); if (this.getPublicKey() != null) to.authorizePublicKey(this.getPublicKey()); if (this.getPort() != -1) to.blockOnPort(this.getPort(), this.getSeconds()); if (this.getUserMetadata().size() > 0) to.userMetadata(this.getUserMetadata()); if (this.getTags().size() > 0) to.tags(getTags()); if (!this.getNodeNames().isEmpty()) to.nodeNames(getNodeNames()); if (!this.shouldBlockUntilRunning()) to.blockUntilRunning(false); if (!this.shouldBlockOnComplete()) to.blockOnComplete(false); if (this.getLoginUser() != null) to.overrideLoginUser(this.getLoginUser()); if (this.getLoginPassword() != null) to.overrideLoginPassword(this.getLoginPassword()); if (this.getLoginPrivateKey() != null) to.overrideLoginPrivateKey(this.getLoginPrivateKey()); if (this.shouldAuthenticateSudo() != null) to.overrideAuthenticateSudo(this.shouldAuthenticateSudo()); if (this.getTaskName() != null) to.nameTask(this.getTaskName()); if (!this.getNetworks().isEmpty()) to.networks(this.getNetworks()); } public static class ImmutableTemplateOptions extends TemplateOptions { private final TemplateOptions delegate; @Override public TemplateOptions clone() { return delegate.clone(); } @Override public String getTaskName() { return delegate.getTaskName(); } @Override public int getPort() { return delegate.getPort(); } @Override public int getSeconds() { return delegate.getSeconds(); } @Override public boolean shouldRunAsRoot() { return delegate.shouldRunAsRoot(); } @Override public boolean shouldBlockOnComplete() { return delegate.shouldBlockOnComplete(); } @Override public boolean shouldWrapInInitScript() { return delegate.shouldWrapInInitScript(); } @Override public void copyTo(TemplateOptions to) { delegate.copyTo(to); } public ImmutableTemplateOptions(TemplateOptions delegate) { this.delegate = delegate; } @Override public String toString() { return delegate.toString(); } /** * unsupported as objects of this class are immutable */ @Override public TemplateOptions runScript(Statement script) { throw new IllegalArgumentException("script is immutable"); } @Override public TemplateOptions dontAuthorizePublicKey() { throw new IllegalArgumentException("public key is immutable"); } @Override public TemplateOptions blockOnPort(int port, int seconds) { throw new IllegalArgumentException("ports are immutable"); } @Override public TemplateOptions nameTask(String name) { throw new IllegalArgumentException("task name is immutable"); } @Override public TemplateOptions runAsRoot(boolean runAsRoot) { throw new IllegalArgumentException("runAsRoot is immutable"); } @Override public TemplateOptions wrapInInitScript(boolean wrapInInitScript) { throw new IllegalArgumentException("wrapInInitScript is immutable"); } @Override public TemplateOptions blockOnComplete(boolean blockOnComplete) { throw new IllegalArgumentException("blockOnComplete is immutable"); } @Override public TemplateOptions overrideLoginCredentials(LoginCredentials overridingCredentials) { throw new IllegalArgumentException("overridingCredentials is immutable"); } @Override public TemplateOptions overrideLoginPassword(String password) { throw new IllegalArgumentException("password is immutable"); } @Override public TemplateOptions overrideLoginPrivateKey(String privateKey) { throw new IllegalArgumentException("privateKey is immutable"); } @Override public TemplateOptions overrideAuthenticateSudo(boolean authenticateSudo) { throw new IllegalArgumentException("authenticateSudo is immutable"); } @Override public String getLoginUser() { return delegate.getLoginUser(); } @Override public Boolean shouldAuthenticateSudo() { return delegate.shouldAuthenticateSudo(); } @Override public String getLoginPassword() { return delegate.getLoginPassword(); } @Override public String getLoginPrivateKey() { return delegate.getLoginPrivateKey(); } @Override public TemplateOptions overrideLoginUser(String loginUser) { throw new IllegalArgumentException("loginUser is immutable"); } @Override public T as(Class clazz) { return delegate.as(clazz); } @Override public TemplateOptions authorizePublicKey(String publicKey) { throw new IllegalArgumentException("publicKey is immutable"); } /** * unsupported as objects of this class are immutable */ @Override public TemplateOptions blockUntilRunning(boolean blockUntilRunning) { throw new IllegalArgumentException("blockUntilRunning is immutable"); } @Override public int[] getInboundPorts() { return delegate.getInboundPorts(); } @Override public String getPrivateKey() { return delegate.getPrivateKey(); } @Override public String getPublicKey() { return delegate.getPublicKey(); } @Override public Statement getRunScript() { return delegate.getRunScript(); } @Override public boolean shouldBlockUntilRunning() { return delegate.shouldBlockUntilRunning(); } @Override public TemplateOptions inboundPorts(int... ports) { throw new IllegalArgumentException("ports are immutable"); } @Override public TemplateOptions installPrivateKey(String privateKey) { throw new IllegalArgumentException("privateKey is immutable"); } @Override public Set getTags() { return delegate.getTags(); } @Override public TemplateOptions tags(Iterable tags) { throw new IllegalArgumentException("tags are immutable"); } @Override public Set getNodeNames() { return delegate.getNodeNames(); } @Override public TemplateOptions nodeNames(Iterable nodeNames) { throw new IllegalArgumentException("nodeNames are immutable"); } @Override public Set getGroups() { return delegate.getGroups(); } @Override public TemplateOptions securityGroups(Iterable securityGroups) { throw new IllegalArgumentException("security groups are immutable"); } @Override public TemplateOptions securityGroups(String... securityGroups) { throw new IllegalArgumentException("security groups are immutable"); } @Override public TemplateOptions networks(Iterable networks) { throw new IllegalArgumentException("networks are immutable"); } @Override public TemplateOptions networks(String... networks) { throw new IllegalArgumentException("networks are immutable"); } @Override public TemplateOptions userMetadata(Map userMetadata) { throw new IllegalArgumentException("userMetadata is immutable"); } @Override public TemplateOptions userMetadata(String key, String value) { throw new IllegalArgumentException("userMetadata is immutable"); } @Override public Map getUserMetadata() { return delegate.getUserMetadata(); } } private static final Set DEFAULT_INBOUND_PORTS = ImmutableSet.of(22); public static final TemplateOptions NONE = new ImmutableTemplateOptions(new TemplateOptions()); protected Set inboundPorts = DEFAULT_INBOUND_PORTS; protected Statement script; protected Set tags = ImmutableSet.of(); protected Set securityGroups = ImmutableSet.of(); protected String privateKey; protected String publicKey; protected boolean blockUntilRunning = true; protected Map userMetadata = Maps.newLinkedHashMap(); protected Set nodeNames = ImmutableSet.of(); protected Set networks = ImmutableSet.of(); public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; TemplateOptions that = TemplateOptions.class.cast(o); return super.equals(that) && equal(this.inboundPorts, that.inboundPorts) && equal(this.script, that.script) && equal(this.publicKey, that.publicKey) && equal(this.privateKey, that.privateKey) && equal(this.blockUntilRunning, that.blockUntilRunning) && equal(this.tags, that.tags) && equal(this.securityGroups, that.securityGroups) && equal(this.userMetadata, that.userMetadata) && equal(this.nodeNames, that.nodeNames) && equal(this.networks, that.networks); } @Override public int hashCode() { return Objects.hashCode(super.hashCode(), inboundPorts, script, publicKey, privateKey, blockUntilRunning, tags, securityGroups, userMetadata, nodeNames, networks); } @Override public ToStringHelper string() { ToStringHelper toString = super.string(); if (!DEFAULT_INBOUND_PORTS.equals(inboundPorts)) toString.add("inboundPorts", inboundPorts); if (script != null) toString.add("scriptPresent", true); if (publicKey != null) toString.add("publicKeyPresent", true); if (privateKey != null) toString.add("privateKeyPresent", true); if (!blockUntilRunning) toString.add("blockUntilRunning", blockUntilRunning); if (tags.size() != 0) toString.add("tags", tags); if (!nodeNames.isEmpty()) toString.add("nodeNames", nodeNames); if (securityGroups.size() != 0) toString.add("securityGroups", securityGroups); if (userMetadata.size() != 0) toString.add("userMetadata", userMetadata); if (!networks.isEmpty()) toString.add("networks", networks); return toString; } public int[] getInboundPorts() { return Ints.toArray(inboundPorts); } public Statement getRunScript() { return script; } public Set getTags() { return tags; } public Set getNodeNames() { return nodeNames; } public Set getGroups() { return securityGroups; } public String getPrivateKey() { return privateKey; } public String getPublicKey() { return publicKey; } public Set getNetworks() { return networks; } /** * @see TemplateOptions#blockUntilRunning(boolean) */ public boolean shouldBlockUntilRunning() { return blockUntilRunning; } public T as(Class clazz) { return clazz.cast(this); } /** * This script will be executed as the root user upon system startup. This * script gets a prologue, so no #!/bin/bash required, path set up, etc * */ public TemplateOptions runScript(String script) { return runScript(Statements.exec(script)); } /** * This script will be executed as the root user upon system startup. This * script gets a prologue, so no #!/bin/bash required, path set up, etc * */ public TemplateOptions runScript(Statement script) { this.script = checkNotNull(script, "script"); return this; } /** * replaces the rsa ssh key used at login. */ public TemplateOptions installPrivateKey(String privateKey) { checkArgument(checkNotNull(privateKey, "privateKey").startsWith("-----BEGIN RSA PRIVATE KEY-----"), "key should start with -----BEGIN RSA PRIVATE KEY-----"); this.privateKey = privateKey; return this; } public TemplateOptions dontAuthorizePublicKey() { this.publicKey = null; return this; } /** * authorize an rsa ssh key. */ public TemplateOptions authorizePublicKey(String publicKey) { checkArgument(checkNotNull(publicKey, "publicKey").startsWith("ssh-rsa"), "key should start with ssh-rsa"); this.publicKey = publicKey; return this; } /** * assigns tags to the created nodes */ public TemplateOptions tags(Iterable tags) { this.tags = ImmutableSet.copyOf(checkNotNull(tags, "tags")); return this; } /** * specifies names to be used for the created nodes. * * Note that this does not guarantee uniqueness - if there are already existing nodes with a name * specified here, there will still be a new node created with the same name. Also, if more * nodes are to be created than there are names, subsequent names will use the default naming strategy * for that cloud. */ public TemplateOptions nodeNames(Iterable nodeNames) { this.nodeNames = ImmutableSet.copyOf(checkNotNull(nodeNames, "nodeNames")); return this; } /** * assigns the created nodes to these security groups */ public TemplateOptions securityGroups(Iterable securityGroups) { this.securityGroups = ImmutableSet.copyOf(checkNotNull(securityGroups, "securityGroups")); return this; } /** * @see TemplateOptions#securityGroups(Iterable) */ public TemplateOptions securityGroups(String... securityGroups) { return securityGroups(ImmutableSet.copyOf(securityGroups)); } /** * Assigns the created nodes to these networks */ public TemplateOptions networks(Iterable networks) { this.networks = ImmutableSet.copyOf(checkNotNull(networks, "networks")); return this; } /** * @see TemplateOptions#networks(Iterable) */ public TemplateOptions networks(String... networks) { return networks(ImmutableSet.copyOf(networks)); } /** * Opens the set of ports to public access. */ public TemplateOptions inboundPorts(int... ports) { for (int port : ports) checkArgument(port > 0 && port < 65536, "port must be a positive integer < 65535"); this.inboundPorts = ImmutableSet.copyOf(Ints.asList(ports)); return this; } public static class Builder extends org.jclouds.compute.options.RunScriptOptions.Builder { public static TemplateOptions nameTask(String name) { TemplateOptions options = new TemplateOptions(); return options.nameTask(name); } public static TemplateOptions overrideLoginUser(String user) { TemplateOptions options = new TemplateOptions(); return options.overrideLoginUser(user); } public static TemplateOptions overrideLoginPassword(String password) { TemplateOptions options = new TemplateOptions(); return options.overrideLoginPassword(password); } public static TemplateOptions overrideLoginPrivateKey(String privateKey) { TemplateOptions options = new TemplateOptions(); return options.overrideLoginPrivateKey(privateKey); } public static TemplateOptions overrideAuthenticateSudo(boolean authenticateSudo) { TemplateOptions options = new TemplateOptions(); return options.overrideAuthenticateSudo(authenticateSudo); } public static TemplateOptions overrideLoginCredentials(LoginCredentials credentials) { TemplateOptions options = new TemplateOptions(); return options.overrideLoginCredentials(credentials); } public static TemplateOptions runAsRoot(boolean value) { TemplateOptions options = new TemplateOptions(); return options.runAsRoot(value); } /** * @see TemplateOptions#blockOnPort */ public static TemplateOptions blockOnPort(int port, int seconds) { TemplateOptions options = new TemplateOptions(); return options.blockOnPort(port, seconds); } /** * @see TemplateOptions#inboundPorts */ public static TemplateOptions inboundPorts(int... ports) { TemplateOptions options = new TemplateOptions(); return options.inboundPorts(ports); } /** * @see TemplateOptions#tags */ public static TemplateOptions tags(Iterable tags) { TemplateOptions options = new TemplateOptions(); return options.tags(tags); } /** * @see TemplateOptions#nodeNames */ public static TemplateOptions nodeNames(Iterable nodeNames) { TemplateOptions options = new TemplateOptions(); return options.nodeNames(nodeNames); } /** * @see TemplateOptions#securityGroups */ public static TemplateOptions securityGroups(Iterable securityGroups) { TemplateOptions options = new TemplateOptions(); return options.securityGroups(securityGroups); } /** * @see TemplateOptions#securityGroups */ public static TemplateOptions securityGroups(String... securityGroups) { TemplateOptions options = new TemplateOptions(); return options.securityGroups(securityGroups); } /** * @see TemplateOptions#networks */ public static TemplateOptions networks(Iterable networks) { TemplateOptions options = new TemplateOptions(); return options.networks(networks); } /** * @see TemplateOptions#networks */ public static TemplateOptions networks(String... networks) { TemplateOptions options = new TemplateOptions(); return options.networks(networks); } /** * @see TemplateOptions#blockUntilRunning(boolean) */ public static TemplateOptions blockUntilRunning(boolean blockUntilRunning) { TemplateOptions options = new TemplateOptions(); return options.blockUntilRunning(blockUntilRunning); } /** * @see TemplateOptions#runScript(Statement) */ public static TemplateOptions runScript(Statement script) { TemplateOptions options = new TemplateOptions(); return options.runScript(script); } /** * @see TemplateOptions#runScript(String) */ public static TemplateOptions runScript(String script) { TemplateOptions options = new TemplateOptions(); return options.runScript(script); } /** * please use alternative that uses the {@link org.jclouds.io.Payload} * object * * @see org.jclouds.io.Payloads * @see #installPrivateKey(Payload) */ public static TemplateOptions installPrivateKey(String rsaKey) { TemplateOptions options = new TemplateOptions(); return options.installPrivateKey(rsaKey); } /** * please use alternative that uses the {@link org.jclouds.io.Payload} * object * * @see #authorizePublicKey(String) */ public static TemplateOptions authorizePublicKey(String rsaKey) { TemplateOptions options = new TemplateOptions(); return options.authorizePublicKey(rsaKey); } /** * @see TemplateOptions#userMetadata(Map) */ public static TemplateOptions userMetadata(Map userMetadata) { TemplateOptions options = new TemplateOptions(); return options.userMetadata(userMetadata); } /** * @see TemplateOptions#userMetadata(String, String) */ public static TemplateOptions userMetadata(String key, String value) { TemplateOptions options = new TemplateOptions(); return options.userMetadata(key, value); } public static TemplateOptions blockOnComplete(boolean value) { TemplateOptions options = new TemplateOptions(); return options.blockOnComplete(value); } } /** *

Note

As of version 1.1.0, this option is incompatible with * {@link TemplateOptions#runScript(Statement)} and * {@link RunScriptOptions#blockOnComplete(boolean)}, as all current * implementations utilize ssh in order to execute scripts. * * @param blockUntilRunning * (default true) whether to block until the nodes in this template * are in {@link Status#RUNNING} state */ public TemplateOptions blockUntilRunning(boolean blockUntilRunning) { this.blockUntilRunning = blockUntilRunning; if (!blockUntilRunning) port = seconds = -1; return this; } /** * * @param userMetadata * user-defined metadata to assign to this server */ public TemplateOptions userMetadata(Map userMetadata) { this.userMetadata.putAll(checkNotNull(userMetadata, "userMetadata")); return this; } /** * * @param key * key to place into the metadata map * @param value * value to associate with that key */ public TemplateOptions userMetadata(String key, String value) { this.userMetadata.put(checkNotNull(key, "key"), checkNotNull(value, "value")); return this; } /** * @see #userMetadata(Map) */ public Map getUserMetadata() { return userMetadata; } @Override public TemplateOptions blockOnPort(int port, int seconds) { return TemplateOptions.class.cast(super.blockOnPort(port, seconds)); } @Override public TemplateOptions nameTask(String name) { return TemplateOptions.class.cast(super.nameTask(name)); } @Override public TemplateOptions runAsRoot(boolean runAsRoot) { return TemplateOptions.class.cast(super.runAsRoot(runAsRoot)); } @Override public TemplateOptions wrapInInitScript(boolean wrapInInitScript) { return TemplateOptions.class.cast(super.wrapInInitScript(wrapInInitScript)); } @Override public TemplateOptions blockOnComplete(boolean blockOnComplete) { return TemplateOptions.class.cast(super.blockOnComplete(blockOnComplete)); } @Override public TemplateOptions overrideLoginCredentials(LoginCredentials overridingCredentials) { return TemplateOptions.class.cast(super.overrideLoginCredentials(overridingCredentials)); } @Override public TemplateOptions overrideLoginPassword(String password) { return TemplateOptions.class.cast(super.overrideLoginPassword(password)); } @Override public TemplateOptions overrideLoginPrivateKey(String privateKey) { return TemplateOptions.class.cast(super.overrideLoginPrivateKey(privateKey)); } @Override public TemplateOptions overrideLoginUser(String loginUser) { return TemplateOptions.class.cast(super.overrideLoginUser(loginUser)); } @Override public TemplateOptions overrideAuthenticateSudo(boolean authenticateSudo) { return TemplateOptions.class.cast(super.overrideAuthenticateSudo(authenticateSudo)); } }