diff --git a/iaas/src/main/java/com/alterjoc/caliper/iaas/Compute.java b/iaas/src/main/java/com/alterjoc/caliper/iaas/Compute.java index 7abab7b..f2ff660 100644 --- a/iaas/src/main/java/com/alterjoc/caliper/iaas/Compute.java +++ b/iaas/src/main/java/com/alterjoc/caliper/iaas/Compute.java @@ -4,17 +4,15 @@ package com.alterjoc.caliper.iaas; -import org.jclouds.compute.RunNodesException; /** * @author Matej Lazar */ public interface Compute { - String createInstance() throws RunNodesException; - String scaleUp() throws RunNodesException; + String scaleUp(); - void scaleDown() throws Exception; + void scaleDown(); /** * Destroys all instances diff --git a/iaas/src/main/java/com/alterjoc/caliper/iaas/ComputeImpl.java b/iaas/src/main/java/com/alterjoc/caliper/iaas/ComputeImpl.java index 297bc18..67cb63c 100644 --- a/iaas/src/main/java/com/alterjoc/caliper/iaas/ComputeImpl.java +++ b/iaas/src/main/java/com/alterjoc/caliper/iaas/ComputeImpl.java @@ -5,6 +5,7 @@ import java.util.NoSuchElementException; import java.util.Properties; import java.util.Set; +import java.util.logging.Logger; import org.jclouds.compute.ComputeService; import org.jclouds.compute.ComputeServiceContext; @@ -22,6 +23,8 @@ */ public class ComputeImpl implements Compute { + private static final Logger log = Logger.getLogger(SimpleMonitorManager.class.getName()); + private IaasProperties iaasProperties; private ComputeService service; private List runningInstances = new ArrayList(); @@ -43,6 +46,11 @@ ImmutableSet. of(), } public String createInstance() throws RunNodesException { + if (iaasProperties == null) { + logSkipping(); + return ""; + } + String keyPairName = iaasProperties.getKeyPairName(); String imageId = iaasProperties.getImageId(); @@ -64,13 +72,20 @@ public String createInstance() throws RunNodesException { return node.getId(); } - public String scaleUp() throws RunNodesException { - return createInstance(); + public String scaleUp() { + try { + return createInstance(); + } catch (RunNodesException e) { + log.warning("Cannot create instance."); + } + return null; } - public void scaleDown() throws Exception { + public void scaleDown() { NodeMetadata instance = getLastInstance(); - destroy(instance); + if (instance != null) { + destroy(instance); + } } public void terminate() { @@ -80,16 +95,26 @@ public void terminate() { } private void destroy(NodeMetadata instance) { + if (iaasProperties == null) { + logSkipping(); + return; + } service.destroyNode(instance.getId()); runningInstances.remove(instance); } - private NodeMetadata getLastInstance() throws Exception { + private NodeMetadata getLastInstance() { int lastIndex = runningInstances.size() - 1; - if (lastIndex < 0) { - throw new Exception("No more instances."); + if (lastIndex > 0) { + return runningInstances.get(lastIndex ); + } else { + return null; } - return runningInstances.get(lastIndex ); + + } + + private void logSkipping() { + log.info("Skipping iaas operation because of incomplete properties."); } } diff --git a/iaas/src/main/java/com/alterjoc/caliper/iaas/IaasProperties.java b/iaas/src/main/java/com/alterjoc/caliper/iaas/IaasProperties.java index 3892f8e..766c946 100644 --- a/iaas/src/main/java/com/alterjoc/caliper/iaas/IaasProperties.java +++ b/iaas/src/main/java/com/alterjoc/caliper/iaas/IaasProperties.java @@ -1,5 +1,10 @@ package com.alterjoc.caliper.iaas; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; +import java.util.logging.Logger; + /** * @author Matej Lazar */ @@ -9,29 +14,37 @@ public class IaasProperties { private String imageId; private String userName; private String password; - private String keyPairName = "caliperKey"; - private String[] securityGroups = new String[]{"default"}; - private String group = "caliper"; - - public IaasProperties(String provider, String providerUrl, String imageId, String userName, String password) { - super(); - this.provider = provider; - this.providerUrl = providerUrl; - this.imageId = imageId; - this.userName = userName; - this.password = password; + private String keyPairName; + private String[] securityGroups; + private String group; + + private static final Logger log = Logger.getLogger(IaasProperties.class.getName()); + + private IaasProperties() throws IOException { + + Properties prop = new Properties(); + InputStream in = null; + try { + in = getClass().getResourceAsStream("iaas.properties"); + prop.load(in); + } finally { + if (in != null) { + in.close(); + } + } + setProperties(prop); } - public IaasProperties(String provider, String providerUrl, String imageId, String userName, String password, String keyPairName, String[] securityGroups, String group) { - super(); - this.provider = provider; - this.providerUrl = providerUrl; - this.imageId = imageId; - this.userName = userName; - this.password = password; - this.keyPairName = keyPairName; - this.securityGroups = securityGroups; - this.group = group; + private void setProperties(Properties prop) { + this.provider = prop.getProperty("provider"); + this.providerUrl = prop.getProperty("provider-url"); + this.imageId = prop.getProperty("image-id"); + this.userName = prop.getProperty("username"); + this.password = prop.getProperty("password"); + + this.keyPairName = prop.getProperty("key-pair-name"); + this.securityGroups = prop.getProperty("security-groups").split(":"); + this.group = prop.getProperty("group"); } public String getProvider() { @@ -65,4 +78,34 @@ public String[] getSecurityGroups() { public String getGroup() { return group ; } + + public static IaasProperties getInstance() { + IaasProperties iaasProp; + try { + iaasProp = new IaasProperties(); + if (iaasProp.isValid()) { + return iaasProp; + } else { + log.warning("Iaas properties are not complete."); + } + } catch (IOException e) { + log.warning("Cannot read iaas properties."); + } + return null; + } + + private boolean isValid() { + if (provider == null || provider.equals("")) { + return false; + } else if (providerUrl == null || providerUrl.equals("")) { + return false; + } else if (imageId == null || imageId.equals("")) { + return false; + } else if (userName == null || userName.equals("")) { + return false; + } else if (password == null || password.equals("")) { + return false; + } + return true; + } } diff --git a/iaas/src/main/java/com/alterjoc/caliper/iaas/SimpleMonitorManager.java b/iaas/src/main/java/com/alterjoc/caliper/iaas/SimpleMonitorManager.java index cd38fe8..42e6a0c 100644 --- a/iaas/src/main/java/com/alterjoc/caliper/iaas/SimpleMonitorManager.java +++ b/iaas/src/main/java/com/alterjoc/caliper/iaas/SimpleMonitorManager.java @@ -9,9 +9,10 @@ import java.util.Set; import java.util.logging.Logger; +import org.kohsuke.MetaInfServices; + import com.alterjoc.caliper.agent.monitor.AbstractMonitorManager; import com.alterjoc.caliper.agent.monitor.MonitorManager; -import org.kohsuke.MetaInfServices; /** * @author Ales Justin @@ -26,6 +27,11 @@ public class SimpleMonitorManager extends AbstractMonitorManager { private static final Logger log = Logger.getLogger(SimpleMonitorManager.class.getName()); private Set apps = new HashSet(); + private Compute compute; + + public SimpleMonitorManager() { + compute = new ComputeImpl(IaasProperties.getInstance()); + } private static boolean isCreateApp(Class clazz, String name) { return APP_FACTORY.equals(clazz.getName()) && CREATE_APP.equals(name); @@ -52,10 +58,12 @@ public void postMonitorStatic(Class clazz, String name, Class[] types, Object[] if (size == Counter.LIMIT_SIZE && (diff < 1000 * 60)) { // less than 1min? log.info("Scale up -- " + apps + " !!!"); + String instanceId = compute.scaleUp(); counter.reset(); } else if (diff > 1000 * 60 * 5) { // more than 5min log.info("Scale down -- " + apps + " !!!"); + compute.scaleDown(); counter.reset(); } } diff --git a/iaas/src/main/resources/iaas.properties b/iaas/src/main/resources/iaas.properties new file mode 100644 index 0000000..65b491f --- /dev/null +++ b/iaas/src/main/resources/iaas.properties @@ -0,0 +1,21 @@ +#iaas provider name +provider= + +#url of iaas provider REST API +provider-url= + +#ID of image to instantiate +image-id= + +username= + +password= + +#ssh kex name +key-pair-name=caliperKey + +#iaas securtiy group name +security-groups=default + +#iaas instance group +group=caliper \ No newline at end of file