Search in sources :

Example 1 with RunListBuilder

use of org.jclouds.chef.util.RunListBuilder 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 2 with RunListBuilder

use of org.jclouds.chef.util.RunListBuilder in project gora by apache.

the class ChefSoftwareProvisioning method performChefComputeServiceBootstrapping.

private static void performChefComputeServiceBootstrapping(Properties properties) throws IOException, InstantiationException, IllegalAccessException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
    // Get the credentials that will be used to authenticate to the Chef server
    String rsContinent = DataStoreFactory.findProperty(properties, MemStore.class.getDeclaredConstructor().newInstance(), RS_CONTINENT, "rackspace-cloudservers-us");
    String rsUser = DataStoreFactory.findProperty(properties, MemStore.class.getDeclaredConstructor().newInstance(), RS_USERNAME, "asf-gora");
    String rsApiKey = DataStoreFactory.findProperty(properties, MemStore.class.getDeclaredConstructor().newInstance(), RS_APIKEY, null);
    String rsRegion = DataStoreFactory.findProperty(properties, MemStore.class.getDeclaredConstructor().newInstance(), RS_REGION, "DFW");
    String client = DataStoreFactory.findProperty(properties, MemStore.class.getDeclaredConstructor().newInstance(), CHEF_CLIENT, System.getProperty("user.name"));
    String organization = DataStoreFactory.findProperty(properties, MemStore.class.getDeclaredConstructor().newInstance(), CHEF_ORGANIZATION, null);
    String pemFile = System.getProperty("user.home") + "/.chef/" + client + ".pem";
    String credential = Files.toString(new File(pemFile), Charsets.UTF_8);
    // Provide the validator information to let the nodes to auto-register themselves
    // in the Chef server during bootstrap
    String validator = organization + "-validator";
    String validatorPemFile = System.getProperty("user.home") + "/.chef/" + validator + ".pem";
    String validatorCredential = Files.toString(new File(validatorPemFile), Charsets.UTF_8);
    Properties chefConfig = new Properties();
    chefConfig.put(ChefProperties.CHEF_VALIDATOR_NAME, validator);
    chefConfig.put(ChefProperties.CHEF_VALIDATOR_CREDENTIAL, validatorCredential);
    // Create the connection to the Chef server
    ChefApi chefApi = ContextBuilder.newBuilder(new ChefApiMetadata()).endpoint("https://api.opscode.com/organizations/" + organization).credentials(client, credential).overrides(chefConfig).buildApi(ChefApi.class);
    // Create the connection to the compute provider. Note that ssh will be used to bootstrap chef
    ComputeServiceContext computeContext = ContextBuilder.newBuilder(rsContinent).endpoint(rsRegion).credentials(rsUser, rsApiKey).modules(ImmutableSet.<Module>of(new SshjSshClientModule())).buildView(ComputeServiceContext.class);
    // Group all nodes in both Chef and the compute provider by this group
    String group = "jclouds-chef-goraci";
    // Set the recipe to install and the configuration values to override
    String recipe = "apache2";
    JsonBall attributes = new JsonBall("{\"apache\": {\"listen_ports\": \"8080\"}}");
    // Check to see if the recipe you want exists
    List<String> runlist = null;
    Iterable<? extends CookbookVersion> cookbookVersions = chefApi.chefService().listCookbookVersions();
    if (any(cookbookVersions, CookbookVersionPredicates.containsRecipe(recipe))) {
        runlist = new RunListBuilder().addRecipe(recipe).build();
    }
    for (Iterator<String> iterator = runlist.iterator(); iterator.hasNext(); ) {
        String string = (String) iterator.next();
        LOG.info(string);
    }
    // Update the chef service with the run list you wish to apply to all nodes in the group
    // and also provide the json configuration used to customize the desired values
    BootstrapConfig config = BootstrapConfig.builder().runList(runlist).attributes(attributes).build();
    chefApi.chefService().updateBootstrapConfigForGroup(group, config);
    // Build the script that will bootstrap the node
    Statement bootstrap = chefApi.chefService().createBootstrapScriptForGroup(group);
    TemplateBuilder templateBuilder = computeContext.getComputeService().templateBuilder();
    templateBuilder.options(runScript(bootstrap));
    // Run a node on the compute provider that bootstraps chef
    try {
        Set<? extends NodeMetadata> nodes = computeContext.getComputeService().createNodesInGroup(group, 1, templateBuilder.build());
        for (NodeMetadata nodeMetadata : nodes) {
            LOG.info("<< node %s: %s%n", nodeMetadata.getId(), concat(nodeMetadata.getPrivateAddresses(), nodeMetadata.getPublicAddresses()));
        }
    } catch (RunNodesException e) {
        throw new RuntimeException(e.getMessage());
    }
    // Release resources
    chefApi.close();
    computeContext.close();
}
Also used : Statement(org.jclouds.scriptbuilder.domain.Statement) BootstrapConfig(org.jclouds.chef.domain.BootstrapConfig) TemplateBuilder(org.jclouds.compute.domain.TemplateBuilder) ComputeServiceContext(org.jclouds.compute.ComputeServiceContext) Properties(java.util.Properties) ChefProperties(org.jclouds.chef.config.ChefProperties) ChefApi(org.jclouds.chef.ChefApi) ChefApiMetadata(org.jclouds.chef.ChefApiMetadata) NodeMetadata(org.jclouds.compute.domain.NodeMetadata) RunNodesException(org.jclouds.compute.RunNodesException) SshjSshClientModule(org.jclouds.sshj.config.SshjSshClientModule) RunListBuilder(org.jclouds.chef.util.RunListBuilder) Module(com.google.inject.Module) SshjSshClientModule(org.jclouds.sshj.config.SshjSshClientModule) JsonBall(org.jclouds.domain.JsonBall) File(java.io.File)

Aggregations

RunListBuilder (org.jclouds.chef.util.RunListBuilder)2 RunNodesException (org.jclouds.compute.RunNodesException)2 NodeMetadata (org.jclouds.compute.domain.NodeMetadata)2 TemplateBuilder (org.jclouds.compute.domain.TemplateBuilder)2 Statement (org.jclouds.scriptbuilder.domain.Statement)2 ImmutableList (com.google.common.collect.ImmutableList)1 Module (com.google.inject.Module)1 File (java.io.File)1 Properties (java.util.Properties)1 ChefApi (org.jclouds.chef.ChefApi)1 ChefApiMetadata (org.jclouds.chef.ChefApiMetadata)1 ChefService (org.jclouds.chef.ChefService)1 ChefProperties (org.jclouds.chef.config.ChefProperties)1 BootstrapConfig (org.jclouds.chef.domain.BootstrapConfig)1 ComputeService (org.jclouds.compute.ComputeService)1 ComputeServiceContext (org.jclouds.compute.ComputeServiceContext)1 RunScriptOnNodesException (org.jclouds.compute.RunScriptOnNodesException)1 Builder.overrideLoginCredentials (org.jclouds.compute.options.TemplateOptions.Builder.overrideLoginCredentials)1 JsonBall (org.jclouds.domain.JsonBall)1 LoginCredentials (org.jclouds.domain.LoginCredentials)1