You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2015/08/19 13:10:12 UTC
[54/72] [abbrv] incubator-brooklyn git commit: BROOKLYN-162 - jclouds
last few package prefixes needed,
and tidy in core and elsewhere related (or observed in the process)
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/location/winrm/WinRmMachineLocation.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/location/winrm/WinRmMachineLocation.java b/core/src/main/java/org/apache/brooklyn/location/winrm/WinRmMachineLocation.java
new file mode 100644
index 0000000..fb68c77
--- /dev/null
+++ b/core/src/main/java/org/apache/brooklyn/location/winrm/WinRmMachineLocation.java
@@ -0,0 +1,362 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.location.winrm;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.net.InetAddress;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.annotation.Nullable;
+
+import org.apache.brooklyn.api.location.MachineDetails;
+import org.apache.brooklyn.api.location.MachineLocation;
+import org.apache.brooklyn.api.location.OsDetails;
+import org.apache.brooklyn.config.ConfigKey;
+import org.apache.brooklyn.core.config.ConfigKeys;
+import org.apache.commons.codec.binary.Base64;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Charsets;
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import com.google.common.net.HostAndPort;
+import com.google.common.reflect.TypeToken;
+
+import org.apache.brooklyn.location.access.PortForwardManager;
+import org.apache.brooklyn.location.core.AbstractLocation;
+import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.stream.Streams;
+import org.apache.brooklyn.util.time.Duration;
+import org.apache.brooklyn.util.time.Time;
+
+import io.cloudsoft.winrm4j.winrm.WinRmTool;
+import io.cloudsoft.winrm4j.winrm.WinRmToolResponse;
+
+public class WinRmMachineLocation extends AbstractLocation implements MachineLocation {
+
+ private static final Logger LOG = LoggerFactory.getLogger(WinRmMachineLocation.class);
+
+ // FIXME Respect `port` config when using {@link WinRmTool}
+ public static final ConfigKey<Integer> WINRM_PORT = ConfigKeys.newIntegerConfigKey(
+ "port",
+ "WinRM port to use when connecting to the remote machine",
+ 5985);
+
+ // TODO merge with {link SshTool#PROP_USER} and {@link SshMachineLocation#user}
+ public static final ConfigKey<String> USER = ConfigKeys.newStringConfigKey("user",
+ "Username to use when connecting to the remote machine");
+
+ // TODO merge with {link SshTool#PROP_PASSWORD}
+ public static final ConfigKey<String> PASSWORD = ConfigKeys.newStringConfigKey("password",
+ "Password to use when connecting to the remote machine");
+
+ public static final ConfigKey<Integer> COPY_FILE_CHUNK_SIZE_BYTES = ConfigKeys.newIntegerConfigKey("windows.copy.file.size.bytes",
+ "Size of file chunks (in bytes) to be used when copying a file to the remote server", 1024);
+
+ public static final ConfigKey<InetAddress> ADDRESS = ConfigKeys.newConfigKey(
+ InetAddress.class,
+ "address",
+ "Address of the remote machine");
+
+ public static final ConfigKey<Integer> EXECUTION_ATTEMPTS = ConfigKeys.newIntegerConfigKey(
+ "windows.exec.attempts",
+ "Number of attempts to execute a remote command",
+ 1);
+
+ // TODO See SshTool#PROP_SSH_TRIES, where it was called "sshTries"; remove duplication? Merge into one well-named thing?
+ public static final ConfigKey<Integer> EXEC_TRIES = ConfigKeys.newIntegerConfigKey(
+ "execTries",
+ "Max number of times to attempt WinRM operations",
+ 10);
+
+ public static final ConfigKey<Iterable<String>> PRIVATE_ADDRESSES = ConfigKeys.newConfigKey(
+ new TypeToken<Iterable<String>>() {},
+ "privateAddresses",
+ "Private addresses of this machine, e.g. those within the private network",
+ null);
+
+ public static final ConfigKey<Map<Integer, String>> TCP_PORT_MAPPINGS = ConfigKeys.newConfigKey(
+ new TypeToken<Map<Integer, String>>() {},
+ "tcpPortMappings",
+ "NAT'ed ports, giving the mapping from private TCP port to a public host:port",
+ null);
+
+ @Override
+ public InetAddress getAddress() {
+ return getConfig(ADDRESS);
+ }
+
+ @Override
+ public OsDetails getOsDetails() {
+ return null;
+ }
+
+ @Override
+ public MachineDetails getMachineDetails() {
+ return null;
+ }
+
+ @Nullable
+ @Override
+ public String getHostname() {
+ InetAddress address = getAddress();
+ return (address != null) ? address.getHostAddress() : null;
+ }
+
+ @Nullable
+ protected String getHostAndPort() {
+ String host = getHostname();
+ return (host == null) ? null : host + ":" + config().get(WINRM_PORT);
+ }
+
+ @Override
+ public Set<String> getPublicAddresses() {
+ InetAddress address = getAddress();
+ return (address == null) ? ImmutableSet.<String>of() : ImmutableSet.of(address.getHostAddress());
+ }
+
+ @Override
+ public Set<String> getPrivateAddresses() {
+ Iterable<String> result = getConfig(PRIVATE_ADDRESSES);
+ return (result == null) ? ImmutableSet.<String>of() : ImmutableSet.copyOf(result);
+ }
+
+ public WinRmToolResponse executeScript(String script) {
+ return executeScript(ImmutableList.of(script));
+ }
+
+ public WinRmToolResponse executeScript(List<String> script) {
+ int execTries = getRequiredConfig(EXEC_TRIES);
+ Collection<Throwable> exceptions = Lists.newArrayList();
+ for (int i = 0; i < execTries; i++) {
+ try {
+ return executeScriptNoRetry(script);
+ } catch (Exception e) {
+ Exceptions.propagateIfFatal(e);
+ if (i == (execTries+1)) {
+ LOG.info("Propagating WinRM exception (attempt "+(i+1)+" of "+execTries+")", e);
+ } else if (i == 0) {
+ LOG.warn("Ignoring WinRM exception and retrying (attempt "+(i+1)+" of "+execTries+")", e);
+ } else {
+ LOG.debug("Ignoring WinRM exception and retrying (attempt "+(i+1)+" of "+execTries+")", e);
+ }
+ exceptions.add(e);
+ }
+ }
+ throw Exceptions.propagate("failed to execute shell script", exceptions);
+ }
+
+ protected WinRmToolResponse executeScriptNoRetry(List<String> script) {
+ WinRmTool winRmTool = WinRmTool.connect(getHostAndPort(), getUser(), getPassword());
+ WinRmToolResponse response = winRmTool.executeScript(script);
+ return response;
+ }
+
+ public WinRmToolResponse executePsScript(String psScript) {
+ return executePsScript(ImmutableList.of(psScript));
+ }
+
+ public WinRmToolResponse executePsScript(List<String> psScript) {
+ int execTries = getRequiredConfig(EXEC_TRIES);
+ Collection<Throwable> exceptions = Lists.newArrayList();
+ for (int i = 0; i < execTries; i++) {
+ try {
+ return executePsScriptNoRetry(psScript);
+ } catch (Exception e) {
+ Exceptions.propagateIfFatal(e);
+ if (i == (execTries+1)) {
+ LOG.info("Propagating WinRM exception (attempt "+(i+1)+" of "+execTries+")", e);
+ } else if (i == 0) {
+ LOG.warn("Ignoring WinRM exception and retrying after 5 seconds (attempt "+(i+1)+" of "+execTries+")", e);
+ Time.sleep(Duration.FIVE_SECONDS);
+ } else {
+ LOG.debug("Ignoring WinRM exception and retrying after 5 seconds (attempt "+(i+1)+" of "+execTries+")", e);
+ Time.sleep(Duration.FIVE_SECONDS);
+ }
+ exceptions.add(e);
+ }
+ }
+ throw Exceptions.propagate("failed to execute powershell script", exceptions);
+ }
+
+ public WinRmToolResponse executePsScriptNoRetry(List<String> psScript) {
+ WinRmTool winRmTool = WinRmTool.connect(getHostAndPort(), getUser(), getPassword());
+ WinRmToolResponse response = winRmTool.executePs(psScript);
+ return response;
+ }
+
+ public int copyTo(File source, String destination) {
+ FileInputStream sourceStream = null;
+ try {
+ sourceStream = new FileInputStream(source);
+ return copyTo(sourceStream, destination);
+ } catch (FileNotFoundException e) {
+ throw Exceptions.propagate(e);
+ } finally {
+ if (sourceStream != null) {
+ Streams.closeQuietly(sourceStream);
+ }
+ }
+ }
+
+ public int copyTo(InputStream source, String destination) {
+ executePsScript(ImmutableList.of("rm -ErrorAction SilentlyContinue " + destination));
+ try {
+ int chunkSize = getConfig(COPY_FILE_CHUNK_SIZE_BYTES);
+ byte[] inputData = new byte[chunkSize];
+ int bytesRead;
+ int expectedFileSize = 0;
+ while ((bytesRead = source.read(inputData)) > 0) {
+ byte[] chunk;
+ if (bytesRead == chunkSize) {
+ chunk = inputData;
+ } else {
+ chunk = Arrays.copyOf(inputData, bytesRead);
+ }
+ executePsScript(ImmutableList.of("If ((!(Test-Path " + destination + ")) -or ((Get-Item '" + destination + "').length -eq " +
+ expectedFileSize + ")) {Add-Content -Encoding Byte -path " + destination +
+ " -value ([System.Convert]::FromBase64String(\"" + new String(Base64.encodeBase64(chunk)) + "\"))}"));
+ expectedFileSize += bytesRead;
+ }
+
+ return 0;
+ } catch (java.io.IOException e) {
+ throw Exceptions.propagate(e);
+ }
+ }
+
+ @Override
+ public void init() {
+ super.init();
+
+ // Register any pre-existing port-mappings with the PortForwardManager
+ Map<Integer, String> tcpPortMappings = getConfig(TCP_PORT_MAPPINGS);
+ if (tcpPortMappings != null) {
+ PortForwardManager pfm = (PortForwardManager) getManagementContext().getLocationRegistry().resolve("portForwardManager(scope=global)");
+ for (Map.Entry<Integer, String> entry : tcpPortMappings.entrySet()) {
+ int targetPort = entry.getKey();
+ HostAndPort publicEndpoint = HostAndPort.fromString(entry.getValue());
+ if (!publicEndpoint.hasPort()) {
+ throw new IllegalArgumentException("Invalid portMapping ('"+entry.getValue()+"') for port "+targetPort+" in machine "+this);
+ }
+ pfm.associate(publicEndpoint.getHostText(), publicEndpoint, this, targetPort);
+ }
+ }
+ }
+ public String getUser() {
+ return config().get(USER);
+ }
+
+ private String getPassword() {
+ return config().get(PASSWORD);
+ }
+
+ private <T> T getRequiredConfig(ConfigKey<T> key) {
+ return checkNotNull(getConfig(key), "key %s must be set", key);
+ }
+
+ public static String getDefaultUserMetadataString() {
+ // Using an encoded command obviates the need to escape
+ String unencodePowershell = Joiner.on("\r\n").join(ImmutableList.of(
+ // Allow TS connections
+ "$RDP = Get-WmiObject -Class Win32_TerminalServiceSetting -ComputerName $env:computername -Namespace root\\CIMV2\\TerminalServices -Authentication PacketPrivacy",
+ "$RDP.SetAllowTSConnections(1,1)",
+ "Set-ExecutionPolicy Unrestricted -Force",
+ // Set unlimited values for remote execution limits
+ "Set-Item WSMan:\\localhost\\Shell\\MaxConcurrentUsers 100",
+ "Set-Item WSMan:\\localhost\\Shell\\MaxMemoryPerShellMB 0",
+ "Set-Item WSMan:\\localhost\\Shell\\MaxProcessesPerShell 0",
+ "Set-Item WSMan:\\localhost\\Shell\\MaxShellsPerUser 0",
+ "New-ItemProperty \"HKLM:\\System\\CurrentControlSet\\Control\\LSA\" -Name \"SuppressExtendedProtection\" -Value 1 -PropertyType \"DWord\"",
+ // The following allows scripts to re-authenticate with local credential - this is required
+ // as certain operations cannot be performed with remote credentials
+ "$allowed = @('WSMAN/*')",
+ "$key = 'hklm:\\SOFTWARE\\Policies\\Microsoft\\Windows\\CredentialsDelegation'",
+ "if (!(Test-Path $key)) {",
+ " md $key",
+ "}",
+ "New-ItemProperty -Path $key -Name AllowFreshCredentials -Value 1 -PropertyType Dword -Force",
+ "New-ItemProperty -Path $key -Name AllowFreshCredentialsWhenNTLMOnly -Value 1 -PropertyType Dword -Force",
+ "$credKey = Join-Path $key 'AllowFreshCredentials'",
+ "if (!(Test-Path $credKey)) {",
+ " md $credkey",
+ "}",
+ "$ntlmKey = Join-Path $key 'AllowFreshCredentialsWhenNTLMOnly'",
+ "if (!(Test-Path $ntlmKey)) {",
+ " md $ntlmKey",
+ "}",
+ "$i = 1",
+ "$allowed |% {",
+ " # Script does not take into account existing entries in this key",
+ " New-ItemProperty -Path $credKey -Name $i -Value $_ -PropertyType String -Force",
+ " New-ItemProperty -Path $ntlmKey -Name $i -Value $_ -PropertyType String -Force",
+ " $i++",
+ "}"
+ ));
+
+ String encoded = new String(Base64.encodeBase64(unencodePowershell.getBytes(Charsets.UTF_16LE)));
+ return "winrm quickconfig -q & " +
+ "winrm set winrm/config/service/auth @{Basic=\"true\"} & " +
+ "winrm set winrm/config/service/auth @{CredSSP=\"true\"} & " +
+ "winrm set winrm/config/client/auth @{CredSSP=\"true\"} & " +
+ "winrm set winrm/config/client @{AllowUnencrypted=\"true\"} & " +
+ "winrm set winrm/config/service @{AllowUnencrypted=\"true\"} & " +
+ "winrm set winrm/config/winrs @{MaxConcurrentUsers=\"100\"} & " +
+ "winrm set winrm/config/winrs @{MaxMemoryPerShellMB=\"0\"} & " +
+ "winrm set winrm/config/winrs @{MaxProcessesPerShell=\"0\"} & " +
+ "winrm set winrm/config/winrs @{MaxShellsPerUser=\"0\"} & " +
+ "netsh advfirewall firewall add rule name=RDP dir=in protocol=tcp localport=3389 action=allow profile=any & " +
+ "netsh advfirewall firewall add rule name=WinRM dir=in protocol=tcp localport=5985 action=allow profile=any & " +
+ "powershell -EncodedCommand " + encoded;
+ /* TODO: Find out why scripts with new line characters aren't working on AWS. The following appears as if it *should*
+ work but doesn't - the script simply isn't run. By connecting to the machine via RDP, you can get the script
+ from 'http://169.254.169.254/latest/user-data', and running it at the command prompt works, but for some
+ reason the script isn't run when the VM is provisioned
+ */
+// return Joiner.on("\r\n").join(ImmutableList.of(
+// "winrm quickconfig -q",
+// "winrm set winrm/config/service/auth @{Basic=\"true\"}",
+// "winrm set winrm/config/client @{AllowUnencrypted=\"true\"}",
+// "winrm set winrm/config/service @{AllowUnencrypted=\"true\"}",
+// "netsh advfirewall firewall add rule name=RDP dir=in protocol=tcp localport=3389 action=allow profile=any",
+// "netsh advfirewall firewall add rule name=WinRM dir=in protocol=tcp localport=5985 action=allow profile=any",
+// // Using an encoded command necessitates the need to escape. The unencoded command is as follows:
+// // $RDP = Get-WmiObject -Class Win32_TerminalServiceSetting -ComputerName $env:computername -Namespace root\CIMV2\TerminalServices -Authentication PacketPrivacy
+// // $Result = $RDP.SetAllowTSConnections(1,1)
+// "powershell -EncodedCommand JABSAEQAUAAgAD0AIABHAGUAdAAtAFcAbQBpAE8AYgBqAGUAYwB0ACAALQBDAGwAYQBzAHMAI" +
+// "ABXAGkAbgAzADIAXwBUAGUAcgBtAGkAbgBhAGwAUwBlAHIAdgBpAGMAZQBTAGUAdAB0AGkAbgBnACAALQBDAG8AbQBwA" +
+// "HUAdABlAHIATgBhAG0AZQAgACQAZQBuAHYAOgBjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQAgAC0ATgBhAG0AZQBzAHAAY" +
+// "QBjAGUAIAByAG8AbwB0AFwAQwBJAE0AVgAyAFwAVABlAHIAbQBpAG4AYQBsAFMAZQByAHYAaQBjAGUAcwAgAC0AQQB1A" +
+// "HQAaABlAG4AdABpAGMAYQB0AGkAbwBuACAAUABhAGMAawBlAHQAUAByAGkAdgBhAGMAeQANAAoAJABSAGUAcwB1AGwAd" +
+// "AAgAD0AIAAkAFIARABQAC4AUwBlAHQAQQBsAGwAbwB3AFQAUwBDAG8AbgBuAGUAYwB0AGkAbwBuAHMAKAAxACwAMQApAA=="
+// ));
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/sensor/core/HttpRequestSensor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/sensor/core/HttpRequestSensor.java b/core/src/main/java/org/apache/brooklyn/sensor/core/HttpRequestSensor.java
index 2277d49..b786a3e 100644
--- a/core/src/main/java/org/apache/brooklyn/sensor/core/HttpRequestSensor.java
+++ b/core/src/main/java/org/apache/brooklyn/sensor/core/HttpRequestSensor.java
@@ -26,9 +26,6 @@ import org.apache.brooklyn.api.internal.EntityLocal;
import org.apache.brooklyn.config.ConfigKey;
import org.apache.brooklyn.core.config.ConfigKeys;
import org.apache.brooklyn.effector.core.AddSensor;
-import org.apache.brooklyn.entity.java.JmxAttributeSensor;
-import org.apache.brooklyn.entity.software.ssh.SshCommandSensor;
-import org.apache.brooklyn.sensor.core.HttpRequestSensor;
import org.apache.brooklyn.sensor.feed.http.HttpFeed;
import org.apache.brooklyn.sensor.feed.http.HttpPollConfig;
import org.apache.brooklyn.sensor.feed.http.HttpValueFunctions;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/sensor/core/PortAttributeSensorAndConfigKey.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/sensor/core/PortAttributeSensorAndConfigKey.java b/core/src/main/java/org/apache/brooklyn/sensor/core/PortAttributeSensorAndConfigKey.java
index 58704bd..8102cb7 100644
--- a/core/src/main/java/org/apache/brooklyn/sensor/core/PortAttributeSensorAndConfigKey.java
+++ b/core/src/main/java/org/apache/brooklyn/sensor/core/PortAttributeSensorAndConfigKey.java
@@ -31,7 +31,7 @@ import org.apache.brooklyn.api.sensor.Sensor;
import org.apache.brooklyn.config.ConfigKey;
import org.apache.brooklyn.core.internal.BrooklynInitialization;
import org.apache.brooklyn.entity.core.BrooklynConfigKeys;
-import org.apache.brooklyn.location.basic.Locations;
+import org.apache.brooklyn.location.core.Locations;
import org.apache.brooklyn.util.core.flags.TypeCoercions;
import org.apache.brooklyn.util.guava.Maybe;
import org.slf4j.Logger;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/sensor/feed/ssh/SshFeed.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/sensor/feed/ssh/SshFeed.java b/core/src/main/java/org/apache/brooklyn/sensor/feed/ssh/SshFeed.java
index 880e56c..4730db7 100644
--- a/core/src/main/java/org/apache/brooklyn/sensor/feed/ssh/SshFeed.java
+++ b/core/src/main/java/org/apache/brooklyn/sensor/feed/ssh/SshFeed.java
@@ -34,9 +34,9 @@ import org.apache.brooklyn.config.ConfigKey;
import org.apache.brooklyn.core.config.ConfigKeys;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.location.basic.Locations;
-import org.apache.brooklyn.location.basic.Machines;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
+import org.apache.brooklyn.location.core.Locations;
+import org.apache.brooklyn.location.core.Machines;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.sensor.feed.AbstractFeed;
import org.apache.brooklyn.sensor.feed.AttributePollHandler;
import org.apache.brooklyn.sensor.feed.DelegatingPollHandler;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/sensor/feed/ssh/SshPollValue.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/sensor/feed/ssh/SshPollValue.java b/core/src/main/java/org/apache/brooklyn/sensor/feed/ssh/SshPollValue.java
index a2d5178..8f1885d 100644
--- a/core/src/main/java/org/apache/brooklyn/sensor/feed/ssh/SshPollValue.java
+++ b/core/src/main/java/org/apache/brooklyn/sensor/feed/ssh/SshPollValue.java
@@ -20,7 +20,7 @@ package org.apache.brooklyn.sensor.feed.ssh;
import javax.annotation.Nullable;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
public class SshPollValue {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/sensor/feed/windows/WindowsPerformanceCounterFeed.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/sensor/feed/windows/WindowsPerformanceCounterFeed.java b/core/src/main/java/org/apache/brooklyn/sensor/feed/windows/WindowsPerformanceCounterFeed.java
index c0ae91c..7c485b8 100644
--- a/core/src/main/java/org/apache/brooklyn/sensor/feed/windows/WindowsPerformanceCounterFeed.java
+++ b/core/src/main/java/org/apache/brooklyn/sensor/feed/windows/WindowsPerformanceCounterFeed.java
@@ -44,7 +44,7 @@ import org.apache.brooklyn.effector.core.EffectorTasks;
import org.apache.brooklyn.entity.core.EntityInternal;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.location.basic.WinRmMachineLocation;
+import org.apache.brooklyn.location.winrm.WinRmMachineLocation;
import org.apache.brooklyn.sensor.core.Sensors;
import org.apache.brooklyn.sensor.feed.AbstractFeed;
import org.apache.brooklyn.sensor.feed.PollHandler;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/util/core/ResourceUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/ResourceUtils.java b/core/src/main/java/org/apache/brooklyn/util/core/ResourceUtils.java
index 031198c..d568cc3 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/ResourceUtils.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/ResourceUtils.java
@@ -53,7 +53,7 @@ import org.apache.http.client.methods.HttpGet;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.core.http.HttpTool;
import org.apache.brooklyn.util.core.http.HttpTool.HttpClientBuilder;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/util/core/file/ArchiveTasks.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/file/ArchiveTasks.java b/core/src/main/java/org/apache/brooklyn/util/core/file/ArchiveTasks.java
index ad79d9e..d73526e 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/file/ArchiveTasks.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/file/ArchiveTasks.java
@@ -22,7 +22,7 @@ import java.util.Map;
import org.apache.brooklyn.api.mgmt.TaskAdaptable;
import org.apache.brooklyn.api.mgmt.TaskFactory;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.util.core.ResourceUtils;
import org.apache.brooklyn.util.core.task.Tasks;
import org.apache.brooklyn.util.net.Urls;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/util/core/file/ArchiveUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/file/ArchiveUtils.java b/core/src/main/java/org/apache/brooklyn/util/core/file/ArchiveUtils.java
index 74a95cb..b10d7ae 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/file/ArchiveUtils.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/file/ArchiveUtils.java
@@ -30,7 +30,7 @@ import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.util.collections.MutableList;
import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.core.ResourceUtils;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshFetchTaskFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshFetchTaskFactory.java b/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshFetchTaskFactory.java
index 5e180bd..707dd58 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshFetchTaskFactory.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshFetchTaskFactory.java
@@ -21,7 +21,7 @@ package org.apache.brooklyn.util.core.task.ssh;
import org.apache.brooklyn.api.mgmt.TaskFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.util.core.config.ConfigBag;
// cannot be (cleanly) instantiated due to nested generic self-referential type; however trivial subclasses do allow it
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshFetchTaskWrapper.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshFetchTaskWrapper.java b/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshFetchTaskWrapper.java
index 6dcfc4d..c667d03 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshFetchTaskWrapper.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshFetchTaskWrapper.java
@@ -26,7 +26,7 @@ import org.apache.brooklyn.api.mgmt.Task;
import org.apache.brooklyn.api.mgmt.TaskWrapper;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.util.core.config.ConfigBag;
import org.apache.brooklyn.util.core.task.TaskBuilder;
import org.apache.brooklyn.util.core.task.Tasks;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshPutTaskFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshPutTaskFactory.java b/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshPutTaskFactory.java
index 9a93778..7909df5 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshPutTaskFactory.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshPutTaskFactory.java
@@ -24,7 +24,7 @@ import java.io.Reader;
import org.apache.brooklyn.api.mgmt.TaskFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.util.stream.KnownSizeInputStream;
import org.apache.brooklyn.util.stream.ReaderInputStream;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshPutTaskStub.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshPutTaskStub.java b/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshPutTaskStub.java
index e838ad1..63ee96d 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshPutTaskStub.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshPutTaskStub.java
@@ -20,7 +20,7 @@ package org.apache.brooklyn.util.core.task.ssh;
import java.io.InputStream;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.util.core.config.ConfigBag;
import com.google.common.base.Supplier;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshTasks.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshTasks.java b/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshTasks.java
index 49cab10..53d5e71 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshTasks.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshTasks.java
@@ -35,9 +35,9 @@ import org.apache.brooklyn.core.config.ConfigUtils;
import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.location.basic.AbstractLocation;
-import org.apache.brooklyn.location.basic.LocationInternal;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
+import org.apache.brooklyn.location.core.AbstractLocation;
+import org.apache.brooklyn.location.core.internal.LocationInternal;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.util.core.ResourceUtils;
import org.apache.brooklyn.util.core.config.ConfigBag;
import org.apache.brooklyn.util.core.internal.ssh.SshTool;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/internal/AbstractSshExecTaskFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/internal/AbstractSshExecTaskFactory.java b/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/internal/AbstractSshExecTaskFactory.java
index 62556f3..444f9f4 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/internal/AbstractSshExecTaskFactory.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/internal/AbstractSshExecTaskFactory.java
@@ -20,7 +20,7 @@ package org.apache.brooklyn.util.core.task.ssh.internal;
import com.google.common.base.Preconditions;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.util.core.config.ConfigBag;
import org.apache.brooklyn.util.core.task.system.ProcessTaskFactory;
import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/internal/PlainSshExecTaskFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/internal/PlainSshExecTaskFactory.java b/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/internal/PlainSshExecTaskFactory.java
index a6810a3..92def17 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/internal/PlainSshExecTaskFactory.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/internal/PlainSshExecTaskFactory.java
@@ -20,7 +20,7 @@ package org.apache.brooklyn.util.core.task.ssh.internal;
import java.util.List;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
import com.google.common.base.Function;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/util/core/task/system/ProcessTaskFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/system/ProcessTaskFactory.java b/core/src/main/java/org/apache/brooklyn/util/core/task/system/ProcessTaskFactory.java
index 0fd89cc..8042cc2 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/system/ProcessTaskFactory.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/system/ProcessTaskFactory.java
@@ -22,7 +22,7 @@ import java.util.Map;
import org.apache.brooklyn.api.mgmt.TaskFactory;
import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.util.core.internal.ssh.SshTool;
import org.apache.brooklyn.util.core.task.system.ProcessTaskStub.ScriptReturnType;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/util/core/task/system/ProcessTaskStub.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/system/ProcessTaskStub.java b/core/src/main/java/org/apache/brooklyn/util/core/task/system/ProcessTaskStub.java
index 5dd1f1b..5514ccf 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/system/ProcessTaskStub.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/system/ProcessTaskStub.java
@@ -22,7 +22,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.core.config.ConfigBag;
import org.apache.brooklyn.util.text.Strings;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/util/core/task/system/internal/AbstractProcessTaskFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/system/internal/AbstractProcessTaskFactory.java b/core/src/main/java/org/apache/brooklyn/util/core/task/system/internal/AbstractProcessTaskFactory.java
index 153dc59..6a98c4b 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/system/internal/AbstractProcessTaskFactory.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/system/internal/AbstractProcessTaskFactory.java
@@ -25,7 +25,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.brooklyn.config.ConfigKey;
import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.util.core.task.TaskBuilder;
import org.apache.brooklyn.util.core.task.system.ProcessTaskFactory;
import org.apache.brooklyn.util.core.task.system.ProcessTaskStub;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/util/core/task/system/internal/ExecWithLoggingHelpers.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/system/internal/ExecWithLoggingHelpers.java b/core/src/main/java/org/apache/brooklyn/util/core/task/system/internal/ExecWithLoggingHelpers.java
index 064c740..e96dce9 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/system/internal/ExecWithLoggingHelpers.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/system/internal/ExecWithLoggingHelpers.java
@@ -27,7 +27,7 @@ import java.util.Map;
import org.slf4j.Logger;
import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.core.config.ConfigBag;
import org.apache.brooklyn.util.core.flags.TypeCoercions;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/util/core/task/system/internal/SystemProcessTaskFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/system/internal/SystemProcessTaskFactory.java b/core/src/main/java/org/apache/brooklyn/util/core/task/system/internal/SystemProcessTaskFactory.java
index 2dd6fa9..ab87480 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/system/internal/SystemProcessTaskFactory.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/system/internal/SystemProcessTaskFactory.java
@@ -22,7 +22,7 @@ import java.io.File;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.core.config.ConfigBag;
import org.apache.brooklyn.util.core.internal.ssh.ShellTool;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/resources/META-INF/services/org.apache.brooklyn.api.location.LocationResolver
----------------------------------------------------------------------
diff --git a/core/src/main/resources/META-INF/services/org.apache.brooklyn.api.location.LocationResolver b/core/src/main/resources/META-INF/services/org.apache.brooklyn.api.location.LocationResolver
index ec34011..ec64955 100644
--- a/core/src/main/resources/META-INF/services/org.apache.brooklyn.api.location.LocationResolver
+++ b/core/src/main/resources/META-INF/services/org.apache.brooklyn.api.location.LocationResolver
@@ -16,12 +16,12 @@
# specific language governing permissions and limitations
# under the License.
#
-org.apache.brooklyn.location.basic.DefinedLocationByIdResolver
-org.apache.brooklyn.location.basic.NamedLocationResolver
-org.apache.brooklyn.location.basic.CatalogLocationResolver
-org.apache.brooklyn.location.basic.LocalhostLocationResolver
-org.apache.brooklyn.location.basic.ByonLocationResolver
-org.apache.brooklyn.location.basic.SingleMachineLocationResolver
-org.apache.brooklyn.location.basic.HostLocationResolver
-org.apache.brooklyn.location.basic.MultiLocationResolver
+org.apache.brooklyn.location.core.DefinedLocationByIdResolver
+org.apache.brooklyn.location.core.NamedLocationResolver
+org.apache.brooklyn.location.core.CatalogLocationResolver
+org.apache.brooklyn.location.localhost.LocalhostLocationResolver
+org.apache.brooklyn.location.byon.ByonLocationResolver
+org.apache.brooklyn.location.byon.SingleMachineLocationResolver
+org.apache.brooklyn.location.byon.HostLocationResolver
+org.apache.brooklyn.location.core.MultiLocationResolver
org.apache.brooklyn.location.access.PortForwardManagerLocationResolver
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/core/config/MapListAndOtherStructuredConfigKeyTest.groovy
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/config/MapListAndOtherStructuredConfigKeyTest.groovy b/core/src/test/java/org/apache/brooklyn/core/config/MapListAndOtherStructuredConfigKeyTest.groovy
index df2167b..d3dc84b 100644
--- a/core/src/test/java/org/apache/brooklyn/core/config/MapListAndOtherStructuredConfigKeyTest.groovy
+++ b/core/src/test/java/org/apache/brooklyn/core/config/MapListAndOtherStructuredConfigKeyTest.groovy
@@ -32,7 +32,7 @@ import org.apache.brooklyn.core.config.SetConfigKey.SetModifications
import org.apache.brooklyn.core.test.entity.TestApplication
import org.apache.brooklyn.core.test.entity.TestEntity
import org.apache.brooklyn.entity.core.Entities
-import org.apache.brooklyn.location.basic.SimulatedLocation
+import org.apache.brooklyn.location.core.SimulatedLocation
import org.apache.brooklyn.sensor.core.DependentConfiguration
import org.apache.brooklyn.util.collections.MutableMap
import org.apache.brooklyn.util.core.task.DeferredSupplier
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerFileBasedTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerFileBasedTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerFileBasedTest.java
index 98f429d..85e0e29 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerFileBasedTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerFileBasedTest.java
@@ -20,7 +20,7 @@ package org.apache.brooklyn.core.mgmt.ha;
import java.io.File;
-import org.apache.brooklyn.core.mgmt.rebind.persister.FileBasedObjectStore;
+import org.apache.brooklyn.core.mgmt.persist.FileBasedObjectStore;
import org.apache.brooklyn.util.os.Os;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.Test;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerInMemoryIntegrationTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerInMemoryIntegrationTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerInMemoryIntegrationTest.java
index 6eea03b..a8c532a 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerInMemoryIntegrationTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerInMemoryIntegrationTest.java
@@ -18,8 +18,8 @@
*/
package org.apache.brooklyn.core.mgmt.ha;
-import org.apache.brooklyn.core.mgmt.rebind.persister.InMemoryObjectStore;
-import org.apache.brooklyn.core.mgmt.rebind.persister.PersistenceObjectStore;
+import org.apache.brooklyn.core.mgmt.persist.InMemoryObjectStore;
+import org.apache.brooklyn.core.mgmt.persist.PersistenceObjectStore;
import org.apache.brooklyn.util.time.Duration;
import org.apache.brooklyn.util.time.Time;
import org.slf4j.Logger;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerInMemoryTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerInMemoryTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerInMemoryTest.java
index c82f9cf..6970c2e 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerInMemoryTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerInMemoryTest.java
@@ -28,8 +28,8 @@ import org.apache.brooklyn.api.location.NoMachinesAvailableException;
import org.apache.brooklyn.api.mgmt.ha.HighAvailabilityMode;
import org.apache.brooklyn.core.mgmt.ha.HighAvailabilityManagerImpl;
import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
-import org.apache.brooklyn.core.mgmt.rebind.persister.InMemoryObjectStore;
-import org.apache.brooklyn.core.mgmt.rebind.persister.PersistenceObjectStore;
+import org.apache.brooklyn.core.mgmt.persist.InMemoryObjectStore;
+import org.apache.brooklyn.core.mgmt.persist.PersistenceObjectStore;
import org.apache.brooklyn.core.test.entity.TestApplication;
import org.apache.brooklyn.core.test.entity.TestEntity;
import org.apache.brooklyn.entity.core.EntityInternal;
@@ -38,8 +38,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.Assert;
import org.testng.annotations.Test;
-import org.apache.brooklyn.location.basic.LocalhostMachineProvisioningLocation;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
+import org.apache.brooklyn.location.localhost.LocalhostMachineProvisioningLocation;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
import com.google.common.collect.Iterables;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerSplitBrainTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerSplitBrainTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerSplitBrainTest.java
index 71c7f94..fa90cbd 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerSplitBrainTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerSplitBrainTest.java
@@ -39,12 +39,12 @@ import org.apache.brooklyn.core.mgmt.ha.HighAvailabilityManagerImpl;
import org.apache.brooklyn.core.mgmt.ha.ManagementPlaneSyncRecordPersisterToObjectStore;
import org.apache.brooklyn.core.mgmt.ha.TestEntityFailingRebind.RebindException;
import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
+import org.apache.brooklyn.core.mgmt.persist.BrooklynMementoPersisterToObjectStore;
+import org.apache.brooklyn.core.mgmt.persist.InMemoryObjectStore;
+import org.apache.brooklyn.core.mgmt.persist.ListeningObjectStore;
+import org.apache.brooklyn.core.mgmt.persist.PersistMode;
+import org.apache.brooklyn.core.mgmt.persist.PersistenceObjectStore;
import org.apache.brooklyn.core.mgmt.rebind.PersistenceExceptionHandlerImpl;
-import org.apache.brooklyn.core.mgmt.rebind.persister.BrooklynMementoPersisterToObjectStore;
-import org.apache.brooklyn.core.mgmt.rebind.persister.InMemoryObjectStore;
-import org.apache.brooklyn.core.mgmt.rebind.persister.ListeningObjectStore;
-import org.apache.brooklyn.core.mgmt.rebind.persister.PersistMode;
-import org.apache.brooklyn.core.mgmt.rebind.persister.PersistenceObjectStore;
import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
import org.apache.brooklyn.core.test.entity.TestApplication;
import org.apache.brooklyn.entity.core.Entities;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerTestFixture.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerTestFixture.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerTestFixture.java
index 1fb71ed..5130a58 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerTestFixture.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerTestFixture.java
@@ -37,13 +37,13 @@ import org.apache.brooklyn.core.mgmt.ha.HighAvailabilityManagerImpl;
import org.apache.brooklyn.core.mgmt.ha.ManagementPlaneSyncRecordDeltaImpl;
import org.apache.brooklyn.core.mgmt.ha.ManagementPlaneSyncRecordPersisterToObjectStore;
import org.apache.brooklyn.core.mgmt.ha.HighAvailabilityManagerImpl.PromotionListener;
+import org.apache.brooklyn.core.mgmt.ha.dto.BasicManagementNodeSyncRecord;
+import org.apache.brooklyn.core.mgmt.ha.dto.BasicManagementNodeSyncRecord.Builder;
import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
+import org.apache.brooklyn.core.mgmt.persist.BrooklynMementoPersisterToObjectStore;
+import org.apache.brooklyn.core.mgmt.persist.PersistMode;
+import org.apache.brooklyn.core.mgmt.persist.PersistenceObjectStore;
import org.apache.brooklyn.core.mgmt.rebind.PersistenceExceptionHandlerImpl;
-import org.apache.brooklyn.core.mgmt.rebind.persister.BrooklynMementoPersisterToObjectStore;
-import org.apache.brooklyn.core.mgmt.rebind.persister.PersistMode;
-import org.apache.brooklyn.core.mgmt.rebind.persister.PersistenceObjectStore;
-import org.apache.brooklyn.core.mgmt.rebind.plane.dto.BasicManagementNodeSyncRecord;
-import org.apache.brooklyn.core.mgmt.rebind.plane.dto.BasicManagementNodeSyncRecord.Builder;
import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
import org.apache.brooklyn.entity.core.Entities;
import org.apache.brooklyn.test.Asserts;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HotStandbyTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HotStandbyTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HotStandbyTest.java
index 2d5b3d2..89a0889 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HotStandbyTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/HotStandbyTest.java
@@ -42,16 +42,16 @@ import org.apache.brooklyn.core.mgmt.ha.HighAvailabilityManagerImpl;
import org.apache.brooklyn.core.mgmt.ha.ManagementPlaneSyncRecordPersisterToObjectStore;
import org.apache.brooklyn.core.mgmt.internal.AbstractManagementContext;
import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
+import org.apache.brooklyn.core.mgmt.persist.BrooklynMementoPersisterToObjectStore;
+import org.apache.brooklyn.core.mgmt.persist.InMemoryObjectStore;
+import org.apache.brooklyn.core.mgmt.persist.ListeningObjectStore;
+import org.apache.brooklyn.core.mgmt.persist.PersistMode;
+import org.apache.brooklyn.core.mgmt.persist.PersistenceObjectStore;
import org.apache.brooklyn.core.mgmt.rebind.PersistenceExceptionHandlerImpl;
import org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl;
import org.apache.brooklyn.core.mgmt.rebind.RebindTestFixture;
import org.apache.brooklyn.core.mgmt.rebind.RebindFeedTest.MyEntityWithFunctionFeedImpl;
import org.apache.brooklyn.core.mgmt.rebind.RebindFeedTest.MyEntityWithNewFeedsEachTimeImpl;
-import org.apache.brooklyn.core.mgmt.rebind.persister.BrooklynMementoPersisterToObjectStore;
-import org.apache.brooklyn.core.mgmt.rebind.persister.InMemoryObjectStore;
-import org.apache.brooklyn.core.mgmt.rebind.persister.ListeningObjectStore;
-import org.apache.brooklyn.core.mgmt.rebind.persister.PersistMode;
-import org.apache.brooklyn.core.mgmt.rebind.persister.PersistenceObjectStore;
import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
import org.apache.brooklyn.core.test.entity.TestApplication;
import org.apache.brooklyn.core.test.entity.TestEntity;
@@ -70,7 +70,7 @@ import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
-import org.apache.brooklyn.location.basic.LocalhostMachineProvisioningLocation.LocalhostMachine;
+import org.apache.brooklyn.location.localhost.LocalhostMachineProvisioningLocation.LocalhostMachine;
import com.google.common.collect.Iterables;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/ManagementPlaneSyncRecordPersisterInMemory.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/ManagementPlaneSyncRecordPersisterInMemory.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/ManagementPlaneSyncRecordPersisterInMemory.java
index 4696ce9..208a3d0 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/ManagementPlaneSyncRecordPersisterInMemory.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/ManagementPlaneSyncRecordPersisterInMemory.java
@@ -27,7 +27,7 @@ import org.apache.brooklyn.api.mgmt.ha.ManagementNodeSyncRecord;
import org.apache.brooklyn.api.mgmt.ha.ManagementPlaneSyncRecord;
import org.apache.brooklyn.api.mgmt.ha.ManagementPlaneSyncRecordPersister;
import org.apache.brooklyn.core.mgmt.ha.ManagementPlaneSyncRecordPersisterToObjectStore;
-import org.apache.brooklyn.core.mgmt.rebind.persister.InMemoryObjectStore;
+import org.apache.brooklyn.core.mgmt.persist.InMemoryObjectStore;
import org.apache.brooklyn.util.time.Duration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/MasterChooserTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/MasterChooserTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/MasterChooserTest.java
index da3f826..1ffbe1b 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/MasterChooserTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/MasterChooserTest.java
@@ -28,7 +28,7 @@ import org.apache.brooklyn.api.mgmt.ha.ManagementNodeSyncRecord;
import org.apache.brooklyn.core.BrooklynVersion;
import org.apache.brooklyn.core.mgmt.ha.BasicMasterChooser.AlphabeticMasterChooser;
import org.apache.brooklyn.core.mgmt.ha.BasicMasterChooser.ScoredRecord;
-import org.apache.brooklyn.core.mgmt.rebind.plane.dto.BasicManagementNodeSyncRecord;
+import org.apache.brooklyn.core.mgmt.ha.dto.BasicManagementNodeSyncRecord;
import org.apache.brooklyn.entity.core.EntityFunctions;
import org.apache.brooklyn.util.time.Duration;
import org.testng.annotations.BeforeMethod;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/WarmStandbyTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/WarmStandbyTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/WarmStandbyTest.java
index d1c99d6..ab76e19 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/WarmStandbyTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/WarmStandbyTest.java
@@ -31,12 +31,12 @@ import org.apache.brooklyn.api.mgmt.ha.ManagementPlaneSyncRecordPersister;
import org.apache.brooklyn.core.mgmt.ha.HighAvailabilityManagerImpl;
import org.apache.brooklyn.core.mgmt.ha.ManagementPlaneSyncRecordPersisterToObjectStore;
import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
+import org.apache.brooklyn.core.mgmt.persist.BrooklynMementoPersisterToObjectStore;
+import org.apache.brooklyn.core.mgmt.persist.InMemoryObjectStore;
+import org.apache.brooklyn.core.mgmt.persist.ListeningObjectStore;
+import org.apache.brooklyn.core.mgmt.persist.PersistMode;
+import org.apache.brooklyn.core.mgmt.persist.PersistenceObjectStore;
import org.apache.brooklyn.core.mgmt.rebind.PersistenceExceptionHandlerImpl;
-import org.apache.brooklyn.core.mgmt.rebind.persister.BrooklynMementoPersisterToObjectStore;
-import org.apache.brooklyn.core.mgmt.rebind.persister.InMemoryObjectStore;
-import org.apache.brooklyn.core.mgmt.rebind.persister.ListeningObjectStore;
-import org.apache.brooklyn.core.mgmt.rebind.persister.PersistMode;
-import org.apache.brooklyn.core.mgmt.rebind.persister.PersistenceObjectStore;
import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
import org.apache.brooklyn.core.test.entity.TestApplication;
import org.apache.brooklyn.entity.core.Entities;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/AccessManagerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/AccessManagerTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/AccessManagerTest.java
index 3fd4e24..74dbe56 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/AccessManagerTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/AccessManagerTest.java
@@ -36,7 +36,7 @@ import org.apache.brooklyn.util.exceptions.Exceptions;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
-import org.apache.brooklyn.location.basic.SimulatedLocation;
+import org.apache.brooklyn.location.core.SimulatedLocation;
import com.google.common.collect.ImmutableSet;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterFileBasedTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterFileBasedTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterFileBasedTest.java
new file mode 100644
index 0000000..e663f05
--- /dev/null
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterFileBasedTest.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.core.mgmt.persist;
+
+import java.io.File;
+
+import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.core.mgmt.persist.FileBasedObjectStore;
+import org.apache.brooklyn.core.mgmt.rebind.RebindTestUtils;
+import org.apache.brooklyn.util.javalang.JavaClassNames;
+import org.apache.brooklyn.util.os.Os;
+import org.apache.brooklyn.util.time.Duration;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.Test;
+
+/**
+ * @author Andrea Turli
+ */
+@Test
+public class BrooklynMementoPersisterFileBasedTest extends BrooklynMementoPersisterTestFixture {
+
+ protected File mementoDir;
+
+ @Override
+ protected ManagementContext newPersistingManagementContext() {
+ mementoDir = Os.newTempDir(JavaClassNames.cleanSimpleClassName(this));
+ Os.deleteOnExitRecursively(mementoDir);
+ return RebindTestUtils.managementContextBuilder(classLoader, new FileBasedObjectStore(mementoDir))
+ .persistPeriod(Duration.millis(10)).buildStarted();
+ }
+
+ @Override
+ @AfterMethod(alwaysRun=true)
+ public void tearDown() throws Exception {
+ super.tearDown();
+ mementoDir = Os.deleteRecursively(mementoDir).asNullOrThrowing();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterInMemorySizeIntegrationTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterInMemorySizeIntegrationTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterInMemorySizeIntegrationTest.java
new file mode 100644
index 0000000..0c49d12
--- /dev/null
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterInMemorySizeIntegrationTest.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.core.mgmt.persist;
+
+import java.io.IOException;
+import java.util.concurrent.TimeoutException;
+
+import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.core.mgmt.persist.ListeningObjectStore.RecordingTransactionListener;
+import org.apache.brooklyn.core.mgmt.rebind.RebindTestUtils;
+import org.apache.brooklyn.core.test.entity.TestEntity;
+import org.apache.brooklyn.entity.core.EntityInternal;
+import org.apache.brooklyn.util.text.Identifiers;
+import org.apache.brooklyn.util.time.Duration;
+import org.apache.brooklyn.util.time.Time;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/** uses recorder to ensure not too much data is written */
+@Test
+public class BrooklynMementoPersisterInMemorySizeIntegrationTest extends BrooklynMementoPersisterTestFixture {
+
+ protected RecordingTransactionListener recorder;
+
+ protected ManagementContext newPersistingManagementContext() {
+ recorder = new RecordingTransactionListener("in-mem-test-"+Identifiers.makeRandomId(4));
+ return RebindTestUtils.managementContextBuilder(classLoader,
+ new ListeningObjectStore(new InMemoryObjectStore(), recorder))
+ .persistPeriod(Duration.millis(100)).buildStarted();
+ }
+
+ public void testPersistenceVolumeFast() throws IOException, TimeoutException, InterruptedException {
+ doTestPersistenceVolume(50*1000, false, true);
+ }
+ @Test(groups="Integration",invocationCount=20)
+ public void testPersistenceVolumeFastManyTimes() throws IOException, TimeoutException, InterruptedException {
+ doTestPersistenceVolume(50*1000, false, true);
+ }
+ @Test(groups="Integration")
+ public void testPersistenceVolumeWaiting() throws IOException, TimeoutException, InterruptedException {
+ // by waiting we ensure there aren't extra writes going on
+ doTestPersistenceVolume(50*1000, true, true);
+ }
+ public void testPersistenceVolumeFastNoTrigger() throws IOException, TimeoutException, InterruptedException {
+ doTestPersistenceVolume(50*1000, false, false);
+ }
+ @Test(groups="Integration",invocationCount=20)
+ public void testPersistenceVolumeFastNoTriggerManyTimes() throws IOException, TimeoutException, InterruptedException {
+ doTestPersistenceVolume(50*1000, false, false);
+ }
+
+ protected void doTestPersistenceVolume(int bigBlockSize, boolean forceDelay, boolean canTrigger) throws IOException, TimeoutException, InterruptedException {
+ if (forceDelay) Time.sleep(Duration.FIVE_SECONDS);
+ else recorder.blockUntilDataWrittenExceeds(512, Duration.FIVE_SECONDS);
+ localManagementContext.getRebindManager().waitForPendingComplete(Duration.FIVE_SECONDS, canTrigger);
+
+ long out1 = recorder.getBytesOut();
+ int filesOut1 = recorder.getCountDataOut();
+ Assert.assertTrue(out1>512, "should have written at least 0.5k, only wrote "+out1);
+ Assert.assertTrue(out1<30*1000, "should have written less than 30k, wrote "+out1);
+ Assert.assertTrue(filesOut1<30, "should have written fewer than 30 files, wrote "+out1);
+
+ ((EntityInternal)app).setAttribute(TestEntity.NAME, "hello world");
+ if (forceDelay) Time.sleep(Duration.FIVE_SECONDS);
+ else recorder.blockUntilDataWrittenExceeds(out1+10, Duration.FIVE_SECONDS);
+ localManagementContext.getRebindManager().waitForPendingComplete(Duration.FIVE_SECONDS, canTrigger);
+
+ long out2 = recorder.getBytesOut();
+ Assert.assertTrue(out2-out1>10, "should have written more data");
+ int filesOut2 = recorder.getCountDataOut();
+ Assert.assertTrue(filesOut2>filesOut1, "should have written more files");
+
+ Assert.assertTrue(out2<50*1000, "should have written less than 50k, wrote "+out1);
+ Assert.assertTrue(filesOut2<40, "should have written fewer than 40 files, wrote "+out1);
+
+ ((EntityInternal)entity).setAttribute(TestEntity.NAME, Identifiers.makeRandomId(bigBlockSize));
+ if (forceDelay) Time.sleep(Duration.FIVE_SECONDS);
+ else recorder.blockUntilDataWrittenExceeds(out2+bigBlockSize, Duration.FIVE_SECONDS);
+ localManagementContext.getRebindManager().waitForPendingComplete(Duration.FIVE_SECONDS, canTrigger);
+
+ long out3 = recorder.getBytesOut();
+ Assert.assertTrue(out3-out2 > bigBlockSize, "should have written 50k more data, only wrote "+out3+" compared with "+out2);
+ int filesOut3 = recorder.getCountDataOut();
+ Assert.assertTrue(filesOut3>filesOut2, "should have written more files");
+
+ Assert.assertTrue(out2<100*1000+bigBlockSize, "should have written less than 100k+block, wrote "+out1);
+ Assert.assertTrue(filesOut2<60, "should have written fewer than 60 files, wrote "+out1);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterInMemoryTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterInMemoryTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterInMemoryTest.java
new file mode 100644
index 0000000..461ec99
--- /dev/null
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterInMemoryTest.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.core.mgmt.persist;
+
+import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.core.mgmt.rebind.RebindTestUtils;
+import org.apache.brooklyn.util.time.Duration;
+import org.testng.annotations.Test;
+
+@Test
+public class BrooklynMementoPersisterInMemoryTest extends BrooklynMementoPersisterTestFixture {
+
+ protected ManagementContext newPersistingManagementContext() {
+ return RebindTestUtils.managementContextBuilder(classLoader, new InMemoryObjectStore())
+ .persistPeriod(Duration.millis(10)).buildStarted();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterTestFixture.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterTestFixture.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterTestFixture.java
new file mode 100644
index 0000000..a715d2e
--- /dev/null
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterTestFixture.java
@@ -0,0 +1,165 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.core.mgmt.persist;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.entity.EntitySpec;
+import org.apache.brooklyn.api.location.Location;
+import org.apache.brooklyn.api.location.LocationSpec;
+import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.mgmt.rebind.PersistenceExceptionHandler;
+import org.apache.brooklyn.api.mgmt.rebind.RebindManager.RebindFailureMode;
+import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMemento;
+import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoPersister;
+import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoRawData;
+import org.apache.brooklyn.api.policy.Policy;
+import org.apache.brooklyn.api.sensor.Enricher;
+import org.apache.brooklyn.core.mgmt.persist.BrooklynMementoPersisterToObjectStore;
+import org.apache.brooklyn.core.mgmt.persist.PersistenceObjectStore;
+import org.apache.brooklyn.core.mgmt.rebind.PersistenceExceptionHandlerImpl;
+import org.apache.brooklyn.core.mgmt.rebind.RebindContextImpl;
+import org.apache.brooklyn.core.mgmt.rebind.RebindTestUtils;
+import org.apache.brooklyn.core.mgmt.rebind.RecordingRebindExceptionHandler;
+import org.apache.brooklyn.core.test.entity.TestApplication;
+import org.apache.brooklyn.core.test.entity.TestEntity;
+import org.apache.brooklyn.core.test.policy.TestPolicy;
+import org.apache.brooklyn.entity.core.Entities;
+import org.apache.brooklyn.entity.factory.ApplicationBuilder;
+import org.apache.brooklyn.sensor.enricher.Enrichers;
+import org.testng.SkipException;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
+
+import com.google.common.collect.Iterables;
+
+/**
+ * @author Andrea Turli
+ */
+public abstract class BrooklynMementoPersisterTestFixture {
+
+ protected ClassLoader classLoader = getClass().getClassLoader();
+ protected BrooklynMementoPersister persister;
+ protected TestApplication app;
+ protected Entity entity;
+ protected Location location;
+ protected ManagementContext localManagementContext;
+ protected Enricher enricher;
+ protected Policy policy;
+
+ protected PersistenceObjectStore objectStore;
+
+ @BeforeMethod(alwaysRun=true)
+ public void setUp() throws Exception {
+ localManagementContext = newPersistingManagementContext();
+ if (persister==null) {
+ persister = localManagementContext.getRebindManager().getPersister();
+ }
+ if (objectStore==null && persister instanceof BrooklynMementoPersisterToObjectStore) {
+ objectStore = ((BrooklynMementoPersisterToObjectStore)persister).getObjectStore();
+ }
+ app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class), localManagementContext);
+ location = localManagementContext.getLocationManager()
+ .createLocation(LocationSpec.create(SshMachineLocation.class)
+ .configure("address", "localhost"));
+ entity = app.createAndManageChild(EntitySpec.create(TestEntity.class).location(location));
+ enricher = app.addEnricher(Enrichers.builder().propagatingAll().from(entity).build());
+ app.addPolicy(policy = new TestPolicy());
+ }
+
+ protected abstract ManagementContext newPersistingManagementContext();
+
+ @AfterMethod(alwaysRun=true)
+ public void tearDown() throws Exception {
+ if (localManagementContext != null) Entities.destroyAll(localManagementContext);
+ if (app != null) Entities.destroyAll(app.getManagementContext());
+ if (persister != null) persister.stop(false);
+ if (objectStore!=null) objectStore.deleteCompletely();
+ persister = null;
+ }
+
+ protected BrooklynMemento loadMemento() throws Exception {
+ RebindTestUtils.waitForPersisted(localManagementContext);
+
+ RecordingRebindExceptionHandler failFast = new RecordingRebindExceptionHandler(RebindFailureMode.FAIL_FAST, RebindFailureMode.FAIL_FAST);
+ RebindContextImpl rebindContext = new RebindContextImpl(localManagementContext, failFast, classLoader);
+ // here we force these two to be reegistered in order to resolve the enricher and policy
+ // (normally rebind will do that after loading the manifests, but in this test we are just looking at persistence/manifest)
+ rebindContext.registerEntity(app.getId(), app);
+ rebindContext.registerEntity(entity.getId(), entity);
+
+ BrooklynMemento reloadedMemento = persister.loadMemento(null, rebindContext.lookup(), failFast);
+ return reloadedMemento;
+ }
+
+ protected BrooklynMementoRawData loadRawMemento(BrooklynMementoPersisterToObjectStore persister) throws Exception {
+ RebindTestUtils.waitForPersisted(localManagementContext);
+
+ RecordingRebindExceptionHandler failFast = new RecordingRebindExceptionHandler(RebindFailureMode.FAIL_FAST, RebindFailureMode.FAIL_FAST);
+ BrooklynMementoRawData rawMemento = persister.loadMementoRawData(failFast);
+ return rawMemento;
+ }
+
+ @Test
+ public void testCheckPointAndLoadMemento() throws Exception {
+ BrooklynMemento reloadedMemento = loadMemento();
+
+ assertNotNull(reloadedMemento);
+ assertTrue(Iterables.contains(reloadedMemento.getEntityIds(), entity.getId()));
+ assertEquals(Iterables.getOnlyElement(reloadedMemento.getLocationIds()), location.getId());
+ assertEquals(Iterables.getOnlyElement(reloadedMemento.getPolicyIds()), policy.getId());
+ assertTrue(reloadedMemento.getEnricherIds().contains(enricher.getId()));
+ }
+
+ @Test
+ public void testDeleteAndLoadMemento() throws Exception {
+ Entities.destroy(entity);
+
+ BrooklynMemento reloadedMemento = loadMemento();
+
+ assertNotNull(reloadedMemento);
+ assertFalse(Iterables.contains(reloadedMemento.getEntityIds(), entity.getId()));
+ assertEquals(Iterables.getOnlyElement(reloadedMemento.getLocationIds()), location.getId());
+ }
+
+ @Test
+ public void testLoadAndCheckpointRawMemento() throws Exception {
+ if (persister instanceof BrooklynMementoPersisterToObjectStore) {
+ // Test loading
+ BrooklynMementoRawData rawMemento = loadRawMemento((BrooklynMementoPersisterToObjectStore)persister);
+ assertNotNull(rawMemento);
+ assertTrue(Iterables.contains(rawMemento.getEntities().keySet(), entity.getId()));
+ assertEquals(Iterables.getOnlyElement(rawMemento.getLocations().keySet()), location.getId());
+ assertEquals(Iterables.getOnlyElement(rawMemento.getPolicies().keySet()), policy.getId());
+ assertTrue(rawMemento.getEnrichers().keySet().contains(enricher.getId()));
+
+ // And test persisting
+ PersistenceExceptionHandler exceptionHandler = PersistenceExceptionHandlerImpl.builder().build();
+ ((BrooklynMementoPersisterToObjectStore) persister).checkpoint(rawMemento, exceptionHandler);
+ } else {
+ throw new SkipException("Persister "+persister+" not a "+BrooklynMementoPersisterToObjectStore.class.getSimpleName());
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/FileBasedObjectStoreTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/FileBasedObjectStoreTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/FileBasedObjectStoreTest.java
new file mode 100644
index 0000000..05ac078
--- /dev/null
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/FileBasedObjectStoreTest.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.core.mgmt.persist;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+
+import org.apache.brooklyn.api.mgmt.ha.HighAvailabilityMode;
+import org.apache.brooklyn.core.mgmt.persist.FileBasedObjectStore;
+import org.apache.brooklyn.core.mgmt.persist.PersistMode;
+import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
+import org.apache.brooklyn.entity.core.Entities;
+import org.apache.brooklyn.util.io.FileUtil;
+import org.apache.brooklyn.util.os.Os;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import com.google.common.io.Files;
+
+public class FileBasedObjectStoreTest {
+
+ private LocalManagementContextForTests mgmt;
+ private File parentdir;
+ private File basedir;
+ private FileBasedObjectStore store;
+
+ @BeforeMethod(alwaysRun=true)
+ public void setUp() throws Exception {
+ mgmt = new LocalManagementContextForTests();
+ parentdir = Files.createTempDir();
+ basedir = new File(parentdir, "mystore");
+ store = new FileBasedObjectStore(basedir);
+ store.injectManagementContext(mgmt);
+ store.prepareForSharedUse(PersistMode.AUTO, HighAvailabilityMode.DISABLED);
+ }
+
+ @AfterMethod(alwaysRun=true)
+ public void tearDown() throws Exception {
+ if (store != null) store.close();
+ if (parentdir != null) Os.deleteRecursively(basedir);
+ if (mgmt != null) Entities.destroyAll(mgmt);
+ }
+
+ @Test(groups="Integration")
+ public void testSubPathCreatedWithPermission700() throws Exception {
+ store.createSubPath("mysubdir");
+ File subdir = new File(basedir, "mysubdir");
+
+ assertFilePermission700(basedir);
+ assertFilePermission700(subdir);
+ }
+
+ @Test
+ public void testIsMementoDirExistsButEmpty() throws Exception {
+ basedir = new File(parentdir, "testIsMementoDirExistsButEmpty");
+ assertFalse(FileBasedObjectStore.isMementoDirExistButEmpty(basedir));
+ assertFalse(FileBasedObjectStore.isMementoDirExistButEmpty(basedir.getAbsolutePath()));
+
+ basedir.mkdir();
+ assertTrue(FileBasedObjectStore.isMementoDirExistButEmpty(basedir));
+ assertTrue(FileBasedObjectStore.isMementoDirExistButEmpty(basedir.getAbsolutePath()));
+
+ new File(basedir, "entities").mkdir();
+ new File(basedir, "locations").mkdir();
+ assertTrue(FileBasedObjectStore.isMementoDirExistButEmpty(basedir));
+ assertTrue(FileBasedObjectStore.isMementoDirExistButEmpty(basedir.getAbsolutePath()));
+
+ new File(new File(basedir, "locations"), "afile").createNewFile();
+ assertFalse(FileBasedObjectStore.isMementoDirExistButEmpty(basedir));
+ assertFalse(FileBasedObjectStore.isMementoDirExistButEmpty(basedir.getAbsolutePath()));
+ }
+
+ static void assertFilePermission700(File file) throws FileNotFoundException {
+ assertEquals(FileUtil.getFilePermissions(file).get().substring(1), "rwx------");
+ }
+
+ static void assertFilePermission600(File file) throws Exception {
+ assertEquals(FileUtil.getFilePermissions(file).get().substring(1), "rw-------");
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/FileBasedStoreObjectAccessorWriterTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/FileBasedStoreObjectAccessorWriterTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/FileBasedStoreObjectAccessorWriterTest.java
new file mode 100644
index 0000000..3ee71df
--- /dev/null
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/FileBasedStoreObjectAccessorWriterTest.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.core.mgmt.persist;
+
+import static org.testng.Assert.assertEquals;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.brooklyn.core.mgmt.persist.FileBasedStoreObjectAccessor;
+import org.apache.brooklyn.core.mgmt.persist.StoreObjectAccessorLocking;
+import org.apache.brooklyn.core.mgmt.persist.PersistenceObjectStore.StoreObjectAccessorWithLock;
+import org.apache.brooklyn.util.os.Os;
+import org.apache.brooklyn.util.time.Duration;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Charsets;
+import com.google.common.collect.ImmutableList;
+import com.google.common.io.Files;
+
+@Test
+public class FileBasedStoreObjectAccessorWriterTest extends PersistenceStoreObjectAccessorWriterTestFixture {
+
+ private File file;
+
+ protected StoreObjectAccessorWithLock newPersistenceStoreObjectAccessor() throws IOException {
+ file = Os.newTempFile(getClass(), "txt");
+ return new StoreObjectAccessorLocking(new FileBasedStoreObjectAccessor(file, ".tmp"));
+ }
+
+ @Override
+ protected Duration getLastModifiedResolution() {
+ // OSX is 1s, Windows FAT is 2s !
+ return Duration.seconds(2);
+ }
+
+ @Test(groups="Integration")
+ public void testLastModifiedTime() throws Exception {
+ super.testLastModifiedTime();
+ }
+
+ @Test(groups="Integration")
+ public void testFilePermissions600() throws Exception {
+ accessor.put("abc");
+ assertEquals(Files.readLines(file, Charsets.UTF_8), ImmutableList.of("abc"));
+
+ FileBasedObjectStoreTest.assertFilePermission600(file);
+ }
+}