/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package edu.ucsb.jpregel.clouds; import api.MachineGroup; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.inject.Inject; import com.google.inject.Module; import com.google.inject.name.Named; import edu.ucsb.jpregel.system.ClientToMaster; import edu.ucsb.jpregel.system.ReservationServiceImpl; import edu.ucsb.jpregel.system.Worker; import java.io.File; import java.util.Iterator; import java.util.Properties; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import org.jclouds.ContextBuilder; import org.jclouds.apis.ApiMetadata; import org.jclouds.aws.ec2.reference.AWSEC2Constants; import org.jclouds.compute.ComputeService; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.RunNodesException; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.compute.options.TemplateOptions.Builder; import org.jclouds.logging.slf4j.config.SLF4JLoggingModule; import org.jclouds.scriptbuilder.domain.Statement; import org.jclouds.scriptbuilder.statements.login.AdminAccess; import org.jclouds.sshj.config.SshjSshClientModule; /** * * @author Charles */ public class CloudReservationService extends ReservationServiceImpl { private final ComputeService context; public static final String SECURITY_GROUP = "jpregelgroup"; private final String username = System.getProperty("user.name"); private final ApiMetadata storage; @Inject public CloudReservationService( @Named("compute") String compute, @Named("cUser") String cUser, @Named("cPass") String cPass, @Named("storage") ApiMetadata ap) { this.storage = ap; Properties properties = new Properties(); properties.setProperty(AWSEC2Constants.PROPERTY_EC2_AMI_QUERY, "owner-id=137112412989;state=available;image-type=machine"); properties.setProperty(AWSEC2Constants.PROPERTY_EC2_CC_AMI_QUERY, "owner-id=137112412989;state=available;image-type=machine"); properties.setProperty(AWSEC2Constants.PROPERTY_EC2_GENERATE_INSTANCE_NAMES, "false"); Iterable<Module> modules = ImmutableSet.<Module>of(new SLF4JLoggingModule(), new SshjSshClientModule()); context = ContextBuilder.newBuilder(compute) .credentials(cUser, cPass) .overrides(properties) .modules(modules) .build(ComputeServiceContext.class) .getComputeService(); System.out.println(context); } @Override public MachineGroup<Worker> callWorker(String instanceType, int numberOfWorkers) { try { Set<? extends NodeMetadata> reserveNodes = reserveNodes(instanceType, numberOfWorkers); return new CloudWorkerMachineGroup(reserveNodes, context, storage); } catch (RunNodesException ex) { Logger.getLogger(CloudReservationService.class.getName()).log(Level.SEVERE, null, ex); return null; } } @Override public MachineGroup<ClientToMaster> callMaster(String instanceType) { try { Set<? extends NodeMetadata> createNodesInGroup = reserveNodes(instanceType, 1); return new CloudMasterMachineGroup(createNodesInGroup, context, storage); } catch (RunNodesException ex) { Logger.getLogger(CloudReservationService.class.getName()).log(Level.SEVERE, null, ex); return null; } } @Override public MachineGroup[] callBoth(String instanceType, int numberOfWorkers) { MachineGroup[] m = new MachineGroup[2]; try { Set<? extends NodeMetadata> reserveNodes = reserveNodes(instanceType, numberOfWorkers + 1); ImmutableSet<NodeMetadata> master = ImmutableSet.of(Iterables.getFirst(reserveNodes, null)); Iterator i = reserveNodes.iterator(); i.next(); ImmutableSet copyOf = ImmutableSet.copyOf(i); m[0] = new CloudMasterMachineGroup(master, context, storage); m[1] = new CloudWorkerMachineGroup(copyOf, context, storage); } catch (RunNodesException ex) { Logger.getLogger(CloudReservationService.class.getName()).log(Level.SEVERE, null, ex); } return m; } private Set<? extends NodeMetadata> reserveNodes(String instanceType, int count) throws RunNodesException { System.out.printf(">> adding nodes to group %s %n", SECURITY_GROUP, count); TemplateBuilder templateBuilder = context.templateBuilder(); Statement bootInstructions = AdminAccess.builder() .adminPublicKey(new File("key.pub")) .adminPrivateKey(new File("key")) .authorizeAdminPublicKey(true) .adminUsername(username) .installAdminPrivateKey(true) .build(); Template build = templateBuilder.options(Builder.runScript(bootInstructions)) .hardwareId(instanceType) .build(); System.out.println(build.getOptions().getPublicKey()); System.out.println(build.getOptions().getPrivateKey()); Set<? extends NodeMetadata> createNodesInGroup = context .createNodesInGroup(SECURITY_GROUP, count, build); System.out.println(createNodesInGroup.iterator().next().getCredentials().getPrivateKey()); return createNodesInGroup; } }