package com.neverwinterdp.vm.tool; import java.util.HashMap; import java.util.List; import java.util.Map; import com.google.inject.Guice; import com.google.inject.Injector; import com.neverwinterdp.module.AppModule; import com.neverwinterdp.registry.Registry; import com.neverwinterdp.registry.RegistryConfig; import com.neverwinterdp.registry.zk.RegistryImpl; import com.neverwinterdp.vm.VMDescriptor; import com.neverwinterdp.vm.VMStatus; import com.neverwinterdp.vm.client.VMClient; import com.neverwinterdp.vm.command.VMCommand; import com.neverwinterdp.vm.event.VMWaitingEventListener; import com.neverwinterdp.vm.service.VMService; public class VMClusterBuilder { protected VMClient vmClient ; public VMClusterBuilder() { } public VMClusterBuilder(VMClient vmClient) { this.vmClient = vmClient ; } public VMClient getVMClient() { return this.vmClient ; } protected void init(VMClient vmClient) { this.vmClient = vmClient; } public void clean() throws Exception { } public void start() throws Exception { if(!vmClient.getRegistry().isConnect()) { vmClient.getRegistry().connect() ; } VMWaitingEventListener waitingListener = createVMMaster("vm-master-1"); waitingListener.waitForEvents(60000); } public void shutdown() throws Exception { List<VMDescriptor> list = vmClient.getRunningVMDescriptors() ; for(VMDescriptor vmDescriptor : list) { vmClient.execute(vmDescriptor, new VMCommand.Shutdown()); } } public VMWaitingEventListener createVMMaster(String name) throws Exception { if(!vmClient.getRegistry().isConnect()) { vmClient.getRegistry().connect() ; } VMWaitingEventListener waitingListener = new VMWaitingEventListener(vmClient.getRegistry()); waitingListener.waitVMStatus(format("Expect %s with running status", name), name, VMStatus.RUNNING); waitingListener.waitHeartbeat(format("Expect %s has connected heartbeat", name), name, true); waitingListener.waitVMServiceStatus("Wait for the master status running", VMService.Status.RUNNING); h1(format("Create VM master %s", name)); vmClient.createVMMaster(name); return waitingListener; } public <T> Injector newAppContainer() { Map<String, String> props = new HashMap<String, String>(); props.put("registry.connect", "127.0.0.1:2181") ; props.put("registry.db-domain", "/NeverwinterDP") ; props.put("implementation:" + Registry.class.getName(), RegistryImpl.class.getName()) ; AppModule module = new AppModule(props) ; return Guice.createInjector(module); } public RegistryConfig getRegistryConfig() { return vmClient.getRegistry().getRegistryConfig() ; } public Registry newRegistry() { return new RegistryImpl(getRegistryConfig()); } static public void h1(String title) { System.out.println("\n\n"); System.out.println("------------------------------------------------------------------------"); System.out.println(title); System.out.println("------------------------------------------------------------------------"); } static public void h2(String title) { System.out.println(title); StringBuilder b = new StringBuilder() ; for(int i = 0; i < title.length(); i++) { b.append("-"); } System.out.println(b) ; } static public String format(String tmpl, Object ... args) { return String.format(tmpl, args) ; } }