Adds suspend and resume interfaces to MachineManagementMixins. And uses them in JcloudsLocation.
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/415d0834 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/415d0834 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/415d0834 Branch: refs/heads/master Commit: 415d08349cfd8ffb2848cf89f97fc693346f4444 Parents: e761f42 Author: Sam Corbett <[email protected]> Authored: Tue Jul 21 12:00:44 2015 +0100 Committer: Sam Corbett <[email protected]> Committed: Wed Jul 29 16:59:17 2015 +0100 ---------------------------------------------------------------------- .../location/MachineManagementMixins.java | 45 +++++++++++++++++--- .../location/jclouds/JcloudsLocation.java | 36 +++++++++++++++- 2 files changed, 73 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/415d0834/api/src/main/java/brooklyn/location/MachineManagementMixins.java ---------------------------------------------------------------------- diff --git a/api/src/main/java/brooklyn/location/MachineManagementMixins.java b/api/src/main/java/brooklyn/location/MachineManagementMixins.java index 77ffea5..99038ba 100644 --- a/api/src/main/java/brooklyn/location/MachineManagementMixins.java +++ b/api/src/main/java/brooklyn/location/MachineManagementMixins.java @@ -20,18 +20,28 @@ package brooklyn.location; import java.util.Map; +import com.google.common.annotations.Beta; + +/** + * Defines mixins for interesting locations. + */ public class MachineManagementMixins { - public interface RichMachineProvisioningLocation<T extends MachineLocation> extends MachineProvisioningLocation<T>, ListsMachines, GivesMachineMetadata, KillsMachines {} - + public interface RichMachineProvisioningLocation<T extends MachineLocation> extends + MachineProvisioningLocation<T>, ListsMachines, GivesMachineMetadata, KillsMachines {} + public interface ListsMachines { - /** returns map of machine ID to metadata record for all machines known in a given cloud location */ + /** + * @return A map of machine ID to metadata record for all machines known in a given cloud location. + */ Map<String,MachineMetadata> listMachines(); } public interface GivesMachineMetadata { - /** returns the MachineMetadata for a given (brooklyn) machine location instance, - * or null if not matched */ + /** + * @return the {@link MachineMetadata} for a given (brooklyn) machine location instance, + * or null if not matched. + */ MachineMetadata getMachineMetadata(MachineLocation location); } @@ -55,5 +65,28 @@ public class MachineManagementMixins { /** original metadata object, if available; e.g. ComputeMetadata when using jclouds */ Object getOriginalMetadata(); } - + + /** + * Implement to indicate that a location can suspend and resume machines. + */ + @Beta + public interface SuspendResumeLocation extends SuspendsMachines, ResumesMachines {}; + + + @Beta + public interface SuspendsMachines { + /** + * Suspend the indicated machine. + */ + void suspendMachine(MachineLocation location); + } + + @Beta + public interface ResumesMachines { + /** + * Resume the indicated machine. + */ + void resumeMachine(MachineLocation location); + } + } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/415d0834/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java ---------------------------------------------------------------------- diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java index c7d9f95..4916de5 100644 --- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java +++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java @@ -126,6 +126,7 @@ import brooklyn.location.MachineLocation; import brooklyn.location.MachineLocationCustomizer; import brooklyn.location.MachineManagementMixins.MachineMetadata; import brooklyn.location.MachineManagementMixins.RichMachineProvisioningLocation; +import brooklyn.location.MachineManagementMixins.SuspendsMachines; import brooklyn.location.NoMachinesAvailableException; import brooklyn.location.access.PortForwardManager; import brooklyn.location.access.PortMapping; @@ -187,7 +188,9 @@ import io.cloudsoft.winrm4j.pywinrm.WinRMFactory; * Configuration flags are defined in {@link JcloudsLocationConfig}. */ @SuppressWarnings("serial") -public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation implements JcloudsLocationConfig, RichMachineProvisioningLocation<MachineLocation>, LocationWithObjectStore { +public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation implements + JcloudsLocationConfig, RichMachineProvisioningLocation<MachineLocation>, + LocationWithObjectStore, SuspendsMachines { // TODO After converting from Groovy to Java, this is now very bad code! It relies entirely on putting // things into and taking them out of maps; it's not type-safe, and it's thus very error-prone. @@ -1023,6 +1026,35 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im } } + // ------------- suspend and resume ------------------------------------ + + /** + * Suspends the given location. + * <p> + * Note that this method does <b>not</b> call the lifecycle methods of any + * {@link #getCustomizers(ConfigBag) customizers} attached to this location. + */ + @Override + public void suspendMachine(MachineLocation rawLocation) { + String instanceId = vmInstanceIds.remove(rawLocation); + if (instanceId == null) { + LOG.info("Attempt to suspend unknown machine " + rawLocation + " in " + this); + throw new IllegalArgumentException("Unknown machine " + rawLocation); + } + LOG.info("Suspending machine {} in {}, instance id {}", new Object[]{rawLocation, this, instanceId}); + Exception toThrow = null; + try { + getComputeService().suspendNode(instanceId); + } catch (Exception e) { + toThrow = e; + LOG.error("Problem suspending machine " + rawLocation + " in " + this + ", instance id " + instanceId, e); + } + removeChild(rawLocation); + if (toThrow != null) { + throw Exceptions.propagate(toThrow); + } + } + // ------------- constructing the template, etc ------------------------ private static interface CustomizeTemplateBuilder { @@ -2159,7 +2191,7 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im throw new IllegalArgumentException("Unknown machine "+rawMachine); } JcloudsMachineLocation machine = (JcloudsMachineLocation) rawMachine; - + LOG.info("Releasing machine {} in {}, instance id {}", new Object[] {machine, this, instanceId}); Exception tothrow = null;
