use of org.jclouds.compute.RunNodesException in project hive by apache.
the class CloudExecutionContextProvider method createNodes.
private Set<NodeMetadata> createNodes(final int numHosts) throws CreateHostsFailedException {
Set<NodeMetadata> result = Sets.newHashSet();
int attempts = 0;
int numRequired = numHosts;
// pause so we don't get banned
try {
TimeUnit.SECONDS.sleep(mRetrySleepInterval);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
do {
boolean error = false;
LOG.info("Attempting to create " + numRequired + " nodes");
try {
result.addAll(mCloudComputeService.createNodes(Math.min(mMaxHostsPerCreateRequest, numRequired)));
} catch (RunNodesException e) {
error = true;
LOG.warn("Error creating nodes", e);
terminateInternal(e.getNodeErrors().keySet());
result.addAll(e.getSuccessfulNodes());
}
result = verifyHosts(result);
for (NodeMetadata node : result) {
mLiveHosts.put(publicIpOrHostname(node), System.currentTimeMillis());
}
LOG.info("Successfully created " + result.size() + " nodes");
numRequired = numHosts - result.size();
if (numRequired > 0) {
long sleepTime = mRetrySleepInterval;
if (error) {
sleepTime *= ++attempts;
}
LOG.info("Pausing creation process for " + sleepTime + " seconds");
try {
TimeUnit.SECONDS.sleep(sleepTime);
} catch (InterruptedException e) {
throw new CreateHostsFailedException("Interrupted while trying to create hosts", e);
}
}
} while (numRequired > 0);
Preconditions.checkState(result.size() >= numHosts, "Results should always be >= numHosts " + numHosts + " => " + result.size());
return result;
}
use of org.jclouds.compute.RunNodesException in project whirr by apache.
the class CassandraService method launchCluster.
@Override
public Cluster launchCluster(ClusterSpec clusterSpec) throws IOException {
ComputeServiceContext computeServiceContext = ComputeServiceContextBuilder.build(clusterSpec);
ComputeService computeService = computeServiceContext.getComputeService();
byte[] bootScript = RunUrlBuilder.runUrls("sun/java/install", "apache/cassandra/install");
TemplateBuilder templateBuilder = computeService.templateBuilder().osFamily(UBUNTU).options(runScript(bootScript).installPrivateKey(clusterSpec.readPrivateKey()).authorizePublicKey(clusterSpec.readPublicKey()));
// TODO extract this logic elsewhere
if (clusterSpec.getProvider().equals("ec2"))
templateBuilder.imageNameMatches(".*10\\.?04.*").osDescriptionMatches("^ubuntu-images.*").architecture(Architecture.X86_32);
Template template = templateBuilder.build();
InstanceTemplate instanceTemplate = clusterSpec.getInstanceTemplate(CASSANDRA_ROLE);
checkNotNull(instanceTemplate);
int clusterSize = instanceTemplate.getNumberOfInstances();
Set<? extends NodeMetadata> nodeMap;
try {
nodeMap = computeService.runNodesWithTag(clusterSpec.getClusterName(), clusterSize, template);
} catch (RunNodesException e) {
// TODO: can we do better here
throw new IOException(e);
}
FirewallSettings.authorizeIngress(computeServiceContext, nodeMap, clusterSpec, CLIENT_PORT);
List<NodeMetadata> nodes = Lists.newArrayList(nodeMap);
List<NodeMetadata> seeds = getSeeds(nodes);
// Pass list of all servers in cluster to configure script.
String servers = Joiner.on(' ').join(getPrivateIps(seeds));
byte[] configureScript = RunUrlBuilder.runUrls("apache/cassandra/post-configure " + servers);
try {
Map<? extends NodeMetadata, ExecResponse> responses = computeService.runScriptOnNodesMatching(runningWithTag(clusterSpec.getClusterName()), configureScript);
assert responses.size() > 0 : "no nodes matched " + clusterSpec.getClusterName();
} catch (RunScriptOnNodesException e) {
// TODO: retry
throw new IOException(e);
}
return new Cluster(getInstances(nodes));
}
use of org.jclouds.compute.RunNodesException in project legacy-jclouds-examples by jclouds.
the class MainApp method main.
public static void main(String[] args) {
if (args.length < PARAMETERS) {
throw new IllegalArgumentException(INVALID_SYNTAX);
}
String provider = args[0];
String identity = args[1];
String credential = args[2];
String groupName = args[3];
Action action = Action.valueOf(args[4].toUpperCase());
if ((action == Action.CHEF || action == Action.SOLO) && args.length < PARAMETERS + 1) {
throw new IllegalArgumentException("please provide the list of recipes to install, separated by commas");
}
String recipes = action == Action.CHEF || action == Action.SOLO ? args[5] : "apache2";
String minRam = System.getProperty("minRam");
// note that you can check if a provider is present ahead of time
checkArgument(contains(allKeys, provider), "provider %s not in supported list: %s", provider, allKeys);
LoginCredentials login = action != Action.DESTROY ? getLoginForCommandExecution(action) : null;
ComputeService compute = initComputeService(provider, identity, credential);
try {
switch(action) {
case ADD:
System.out.printf(">> adding node to group %s%n", groupName);
// Default template chooses the smallest size on an operating
// system that tested to work with java, which tends to be Ubuntu
// or CentOS
TemplateBuilder templateBuilder = compute.templateBuilder();
// can just tweak minRam
if (minRam != null) {
templateBuilder.minRam(Integer.parseInt(minRam));
}
// note this will create a user with the same name as you on the
// node. ex. you can connect via ssh publicip
Statement bootInstructions = AdminAccess.standard();
// to run commands as root, we use the runScript option in the
// template.
templateBuilder.options(runScript(bootInstructions));
NodeMetadata node = getOnlyElement(compute.createNodesInGroup(groupName, 1, templateBuilder.build()));
System.out.printf("<< node %s: %s%n", node.getId(), concat(node.getPrivateAddresses(), node.getPublicAddresses()));
case SOLO:
System.out.printf(">> installing [%s] on group %s as %s%n", recipes, groupName, login.identity);
Iterable<String> recipeList = Splitter.on(',').split(recipes);
ImmutableList.Builder<Statement> bootstrapBuilder = ImmutableList.builder();
bootstrapBuilder.add(new InstallGit());
// Clone community cookbooks into the node
for (String recipe : recipeList) {
bootstrapBuilder.add(CloneGitRepo.builder().repository("git://github.com/opscode-cookbooks/" + recipe + ".git").directory(//
"/var/chef/cookbooks/" + recipe).build());
}
// Configure Chef Solo to bootstrap the selected recipes
bootstrapBuilder.add(InstallRuby.builder().build());
bootstrapBuilder.add(InstallRubyGems.builder().build());
bootstrapBuilder.add(//
ChefSolo.builder().cookbookPath(//
"/var/chef/cookbooks").runlist(//
RunList.builder().recipes(recipeList).build()).build());
// Build the statement that will perform all the operations above
StatementList bootstrap = new StatementList(bootstrapBuilder.build());
// Run the script in the nodes of the group
runScriptOnGroup(compute, login, groupName, bootstrap);
break;
case CHEF:
// Create the connection to the Chef server
ChefService chef = initChefService(System.getProperty("chef.client"), System.getProperty("chef.validator"));
// Build the runlist for the deployed nodes
System.out.println("Configuring node runlist in the Chef server...");
List<String> runlist = new RunListBuilder().addRecipes(recipes.split(",")).build();
chef.updateRunListForGroup(runlist, groupName);
Statement chefServerBootstrap = chef.createBootstrapScriptForGroup(groupName);
// Run the script in the nodes of the group
System.out.printf(">> installing [%s] on group %s as %s%n", recipes, groupName, login.identity);
runScriptOnGroup(compute, login, groupName, chefServerBootstrap);
break;
case DESTROY:
System.out.printf(">> destroying nodes in group %s%n", groupName);
// you can use predicates to select which nodes you wish to
// destroy.
Set<? extends NodeMetadata> destroyed = //
compute.destroyNodesMatching(Predicates.<NodeMetadata>and(not(TERMINATED), inGroup(groupName)));
System.out.printf("<< destroyed nodes %s%n", destroyed);
break;
}
} catch (RunNodesException e) {
System.err.println("error adding node to group " + groupName + ": " + e.getMessage());
error = 1;
} catch (RunScriptOnNodesException e) {
System.err.println("error installing " + recipes + " on group " + groupName + ": " + e.getMessage());
error = 1;
} catch (Exception e) {
System.err.println("error: " + e.getMessage());
error = 1;
} finally {
compute.getContext().close();
System.exit(error);
}
}
use of org.jclouds.compute.RunNodesException in project legacy-jclouds-examples by jclouds.
the class MainApp method main.
public static void main(String[] args) {
if (args.length < PARAMETERS)
throw new IllegalArgumentException(INVALID_SYNTAX);
String provider = args[0];
String identity = args[1];
String credential = args[2];
String groupName = args[3];
Action action = Action.valueOf(args[4].toUpperCase());
if (action == Action.EXEC && args.length < PARAMETERS + 1)
throw new IllegalArgumentException("please quote the command to exec as the last parameter");
String command = (action == Action.EXEC) ? args[5] : "echo hello";
if (action == Action.RUN && args.length < PARAMETERS + 1)
throw new IllegalArgumentException("please pass the local file to run as the last parameter");
File file = null;
if (action == Action.RUN) {
file = new File(args[5]);
if (!file.exists())
throw new IllegalArgumentException("file must exist! " + file);
}
String minRam = System.getProperty("minRam");
String loginUser = System.getProperty("loginUser", "toor");
// note that you can check if a provider is present ahead of time
checkArgument(contains(allKeys, provider), "provider %s not in supported list: %s", provider, allKeys);
LoginCredentials login = (action != Action.DESTROY) ? getLoginForCommandExecution(action) : null;
ComputeService compute = initComputeService(provider, identity, credential);
try {
switch(action) {
case ADD:
System.out.printf(">> adding node to group %s%n", groupName);
// Default template chooses the smallest size on an operating system
// that tested to work with java, which tends to be Ubuntu or CentOS
TemplateBuilder templateBuilder = compute.templateBuilder();
// just tweak minRam
if (minRam != null)
templateBuilder.minRam(Integer.parseInt(minRam));
// note this will create a user with the same name as you on the
// node. ex. you can connect via ssh publicip
Statement bootInstructions = AdminAccess.standard();
// to run commands as root, we use the runScript option in the template.
if (provider.equalsIgnoreCase("virtualbox"))
templateBuilder.options(overrideLoginUser(loginUser).runScript(bootInstructions));
else
templateBuilder.options(runScript(bootInstructions));
NodeMetadata node = getOnlyElement(compute.createNodesInGroup(groupName, 1, templateBuilder.build()));
System.out.printf("<< node %s: %s%n", node.getId(), concat(node.getPrivateAddresses(), node.getPublicAddresses()));
case EXEC:
System.out.printf(">> running [%s] on group %s as %s%n", command, groupName, login.identity);
// when you run commands, you can pass options to decide whether to
// run it as root, supply or own credentials vs from cache, and wrap
// in an init script vs directly invoke
Map<? extends NodeMetadata, ExecResponse> responses = //
compute.runScriptOnNodesMatching(// predicate used to select nodes
inGroup(groupName), // what you actually intend to run
exec(command), // use my local user &
overrideLoginCredentials(login).runAsRoot(// don't attempt to run as root (sudo)
false).wrapInInitScript(// run command directly
false));
for (Entry<? extends NodeMetadata, ExecResponse> response : responses.entrySet()) {
System.out.printf("<< node %s: %s%n", response.getKey().getId(), concat(response.getKey().getPrivateAddresses(), response.getKey().getPublicAddresses()));
System.out.printf("<< %s%n", response.getValue());
}
break;
case RUN:
System.out.printf(">> running [%s] on group %s as %s%n", file, groupName, login.identity);
// when running a sequence of commands, you probably want to have jclouds use the default behavior,
// which is to fork a background process.
responses = //
compute.runScriptOnNodesMatching(inGroup(groupName), // passing in a string with the contents of the file
Files.toString(file, Charsets.UTF_8), overrideLoginCredentials(login).runAsRoot(false).nameTask(// ensuring task name isn't
"_" + file.getName().replaceAll("\\..*", "")));
for (Entry<? extends NodeMetadata, ExecResponse> response : responses.entrySet()) {
System.out.printf("<< node %s: %s%n", response.getKey().getId(), concat(response.getKey().getPrivateAddresses(), response.getKey().getPublicAddresses()));
System.out.printf("<< %s%n", response.getValue());
}
break;
case DESTROY:
System.out.printf(">> destroying nodes in group %s%n", groupName);
// you can use predicates to select which nodes you wish to destroy.
Set<? extends NodeMetadata> destroyed = //
compute.destroyNodesMatching(Predicates.<NodeMetadata>and(not(TERMINATED), inGroup(groupName)));
System.out.printf("<< destroyed nodes %s%n", destroyed);
break;
}
} catch (RunNodesException e) {
System.err.println("error adding node to group " + groupName + ": " + e.getMessage());
error = 1;
} catch (RunScriptOnNodesException e) {
System.err.println("error executing " + command + " on group " + groupName + ": " + e.getMessage());
error = 1;
} catch (Exception e) {
System.err.println("error: " + e.getMessage());
error = 1;
} finally {
compute.getContext().close();
System.exit(error);
}
}
use of org.jclouds.compute.RunNodesException in project legacy-jclouds-examples by jclouds.
the class WindowsInstanceStarter method run.
public void run() {
final String region = arguments.getRegion();
// Build a template
Template template = computeService.templateBuilder().locationId(region).imageNameMatches(arguments.getImageNamePattern()).hardwareId(arguments.getInstanceType()).build();
logger.info("Selected AMI is: %s", template.getImage().toString());
template.getOptions().inboundPorts(3389);
// Create the node
logger.info("Creating node and waiting for it to become available");
Set<? extends NodeMetadata> nodes = null;
try {
nodes = computeService.createNodesInGroup("basic-ami", 1, template);
} catch (RunNodesException e) {
logger.error(e, "Unable to start nodes; aborting");
return;
}
NodeMetadata node = Iterables.getOnlyElement(nodes);
// Wait for the administrator password
logger.info("Waiting for administrator password to become available");
// This predicate will call EC2's API to get the Windows Administrator
// password, and returns true if there is password data available.
Predicate<String> passwordReady = new Predicate<String>() {
@Override
public boolean apply(@Nullable String s) {
if (Strings.isNullOrEmpty(s))
return false;
PasswordData data = ec2Client.getWindowsServices().getPasswordDataInRegion(region, s);
if (data == null)
return false;
return !Strings.isNullOrEmpty(data.getPasswordData());
}
};
// Now wait, using RetryablePredicate
final int maxWait = 600;
final int period = 10;
final TimeUnit timeUnit = TimeUnit.SECONDS;
RetryablePredicate<String> passwordReadyRetryable = new RetryablePredicate<String>(passwordReady, maxWait, period, timeUnit);
boolean isPasswordReady = passwordReadyRetryable.apply(node.getProviderId());
if (!isPasswordReady) {
logger.error("Password is not ready after %s %s - aborting and shutting down node", maxWait, timeUnit.toString());
computeService.destroyNode(node.getId());
return;
}
// Now we can get the password data, decrypt it, and get a LoginCredentials instance
PasswordDataAndPrivateKey dataAndKey = new PasswordDataAndPrivateKey(ec2Client.getWindowsServices().getPasswordDataInRegion(region, node.getProviderId()), node.getCredentials().getPrivateKey());
WindowsLoginCredentialsFromEncryptedData f = context.getUtils().getInjector().getInstance(WindowsLoginCredentialsFromEncryptedData.class);
LoginCredentials credentials = f.apply(dataAndKey);
// Send to the log the details you need to log in to the instance with RDP
String publicIp = Iterables.getFirst(node.getPublicAddresses(), null);
logger.info("IP address: %s", publicIp);
logger.info("Login name: %s", credentials.getUser());
logger.info("Password: %s", credentials.getPassword());
// Wait for Enter on the console
logger.info("Hit Enter to shut down the node.");
InputStreamReader converter = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(converter);
try {
in.readLine();
} catch (IOException e) {
logger.error(e, "IOException while reading console input");
}
// Tidy up
logger.info("Shutting down");
computeService.destroyNode(node.getId());
}
Aggregations