Search in sources :

Example 1 with RunNodesException

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;
}
Also used : NodeMetadata(org.jclouds.compute.domain.NodeMetadata) RunNodesException(org.jclouds.compute.RunNodesException)

Example 2 with RunNodesException

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));
}
Also used : ExecResponse(org.jclouds.ssh.ExecResponse) TemplateBuilder(org.jclouds.compute.domain.TemplateBuilder) Cluster(org.apache.whirr.service.Cluster) ComputeServiceContext(org.jclouds.compute.ComputeServiceContext) IOException(java.io.IOException) ComputeService(org.jclouds.compute.ComputeService) Template(org.jclouds.compute.domain.Template) InstanceTemplate(org.apache.whirr.service.ClusterSpec.InstanceTemplate) NodeMetadata(org.jclouds.compute.domain.NodeMetadata) RunNodesException(org.jclouds.compute.RunNodesException) RunScriptOnNodesException(org.jclouds.compute.RunScriptOnNodesException) InstanceTemplate(org.apache.whirr.service.ClusterSpec.InstanceTemplate)

Example 3 with RunNodesException

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);
    }
}
Also used : Statement(org.jclouds.scriptbuilder.domain.Statement) ImmutableList(com.google.common.collect.ImmutableList) TemplateBuilder(org.jclouds.compute.domain.TemplateBuilder) InstallGit(org.jclouds.scriptbuilder.statements.git.InstallGit) ChefService(org.jclouds.chef.ChefService) ComputeService(org.jclouds.compute.ComputeService) RunNodesException(org.jclouds.compute.RunNodesException) RunScriptOnNodesException(org.jclouds.compute.RunScriptOnNodesException) NodeMetadata(org.jclouds.compute.domain.NodeMetadata) Builder.overrideLoginCredentials(org.jclouds.compute.options.TemplateOptions.Builder.overrideLoginCredentials) LoginCredentials(org.jclouds.domain.LoginCredentials) RunNodesException(org.jclouds.compute.RunNodesException) StatementList(org.jclouds.scriptbuilder.domain.StatementList) RunListBuilder(org.jclouds.chef.util.RunListBuilder) RunScriptOnNodesException(org.jclouds.compute.RunScriptOnNodesException)

Example 4 with RunNodesException

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);
    }
}
Also used : ExecResponse(org.jclouds.compute.domain.ExecResponse) Statement(org.jclouds.scriptbuilder.domain.Statement) TemplateBuilder(org.jclouds.compute.domain.TemplateBuilder) ComputeService(org.jclouds.compute.ComputeService) RunScriptOnNodesException(org.jclouds.compute.RunScriptOnNodesException) RunNodesException(org.jclouds.compute.RunNodesException) NodeMetadata(org.jclouds.compute.domain.NodeMetadata) LoginCredentials(org.jclouds.domain.LoginCredentials) Builder.overrideLoginCredentials(org.jclouds.compute.options.TemplateOptions.Builder.overrideLoginCredentials) RunNodesException(org.jclouds.compute.RunNodesException) File(java.io.File) RunScriptOnNodesException(org.jclouds.compute.RunScriptOnNodesException)

Example 5 with RunNodesException

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());
}
Also used : RetryablePredicate(org.jclouds.predicates.RetryablePredicate) WindowsLoginCredentialsFromEncryptedData(org.jclouds.ec2.compute.functions.WindowsLoginCredentialsFromEncryptedData) InputStreamReader(java.io.InputStreamReader) IOException(java.io.IOException) Template(org.jclouds.compute.domain.Template) Predicate(com.google.common.base.Predicate) RetryablePredicate(org.jclouds.predicates.RetryablePredicate) NodeMetadata(org.jclouds.compute.domain.NodeMetadata) LoginCredentials(org.jclouds.domain.LoginCredentials) RunNodesException(org.jclouds.compute.RunNodesException) PasswordData(org.jclouds.ec2.domain.PasswordData) BufferedReader(java.io.BufferedReader) TimeUnit(java.util.concurrent.TimeUnit) PasswordDataAndPrivateKey(org.jclouds.ec2.compute.domain.PasswordDataAndPrivateKey) Nullable(javax.annotation.Nullable)

Aggregations

RunNodesException (org.jclouds.compute.RunNodesException)12 NodeMetadata (org.jclouds.compute.domain.NodeMetadata)11 Template (org.jclouds.compute.domain.Template)7 TemplateBuilder (org.jclouds.compute.domain.TemplateBuilder)7 ComputeService (org.jclouds.compute.ComputeService)6 IOException (java.io.IOException)5 ComputeServiceContext (org.jclouds.compute.ComputeServiceContext)4 RunScriptOnNodesException (org.jclouds.compute.RunScriptOnNodesException)4 Statement (org.jclouds.scriptbuilder.domain.Statement)4 File (java.io.File)3 InstanceTemplate (org.apache.whirr.service.ClusterSpec.InstanceTemplate)3 LoginCredentials (org.jclouds.domain.LoginCredentials)3 Properties (java.util.Properties)2 RunListBuilder (org.jclouds.chef.util.RunListBuilder)2 Builder.overrideLoginCredentials (org.jclouds.compute.options.TemplateOptions.Builder.overrideLoginCredentials)2 RetryablePredicate (org.jclouds.predicates.RetryablePredicate)2 Predicate (com.google.common.base.Predicate)1 ImmutableList (com.google.common.collect.ImmutableList)1 Module (com.google.inject.Module)1 BufferedReader (java.io.BufferedReader)1