/*
* 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.launcher;
import org.apache.brooklyn.api.entity.EntitySpec;
import org.apache.brooklyn.api.mgmt.ManagementContext;
import org.apache.brooklyn.api.mgmt.ha.HighAvailabilityMode;
import org.apache.brooklyn.core.internal.BrooklynProperties;
import org.apache.brooklyn.core.mgmt.persist.BrooklynMementoPersisterToObjectStore;
import org.apache.brooklyn.core.mgmt.persist.FileBasedObjectStore;
import org.apache.brooklyn.core.mgmt.persist.PersistMode;
import org.apache.brooklyn.core.server.BrooklynServerPaths;
import org.apache.brooklyn.core.test.entity.TestApplication;
import org.apache.brooklyn.launcher.BrooklynLauncher;
import org.apache.brooklyn.util.javalang.JavaClassNames;
import org.apache.brooklyn.util.os.Os;
import org.apache.brooklyn.util.text.Identifiers;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotEquals;
import static org.testng.Assert.assertTrue;
import java.io.File;
import org.testng.annotations.Test;
import com.google.common.base.Joiner;
import com.google.common.io.Files;
public class BrooklynLauncherRebindTestToFiles extends BrooklynLauncherRebindTestFixture {
protected String newTempPersistenceContainerName() {
File persistenceDirF = Files.createTempDir();
Os.deleteOnExitRecursively(persistenceDirF);
return persistenceDirF.getAbsolutePath();
}
protected String badContainerName() {
return "/path/does/not/exist/"+Identifiers.makeRandomId(4);
}
protected void checkPersistenceContainerNameIs(String expected) {
String expectedFqp = new File(Os.tidyPath(expected)).getAbsolutePath();
assertEquals(getPersistenceDir(lastMgmt()).getAbsolutePath(), expectedFqp);
}
static File getPersistenceDir(ManagementContext managementContext) {
BrooklynMementoPersisterToObjectStore persister = (BrooklynMementoPersisterToObjectStore)managementContext.getRebindManager().getPersister();
FileBasedObjectStore store = (FileBasedObjectStore)persister.getObjectStore();
return store.getBaseDir();
}
protected void checkPersistenceContainerNameIsDefault() {
String expected = BrooklynServerPaths.newMainPersistencePathResolver(BrooklynProperties.Factory.newEmpty()).location(null).dir(null).resolve();
checkPersistenceContainerNameIs(expected);
}
@Test
public void testPersistenceFailsIfIsFile() throws Exception {
File tempF = File.createTempFile("test-"+JavaClassNames.niceClassAndMethod(), ".not_dir");
tempF.deleteOnExit();
String tempFileName = tempF.getAbsolutePath();
try {
runRebindFails(PersistMode.AUTO, tempFileName, "must not be a file");
runRebindFails(PersistMode.REBIND, tempFileName, "must not be a file");
runRebindFails(PersistMode.CLEAN, tempFileName, "must not be a file");
} finally {
new File(tempFileName).delete();
}
}
@Test
public void testPersistenceFailsIfNotWritable() throws Exception {
EntitySpec<TestApplication> appSpec = EntitySpec.create(TestApplication.class);
populatePersistenceDir(persistenceDir, appSpec);
new File(persistenceDir).setWritable(false);
try {
runRebindFails(PersistMode.AUTO, persistenceDir, "not writable");
runRebindFails(PersistMode.REBIND, persistenceDir, "not writable");
runRebindFails(PersistMode.CLEAN, persistenceDir, "not writable");
} finally {
new File(persistenceDir).setWritable(true);
}
}
@Test
public void testPersistenceFailsIfNotReadable() throws Exception {
EntitySpec<TestApplication> appSpec = EntitySpec.create(TestApplication.class);
populatePersistenceDir(persistenceDir, appSpec);
new File(persistenceDir).setReadable(false);
try {
runRebindFails(PersistMode.AUTO, persistenceDir, "not readable");
runRebindFails(PersistMode.REBIND, persistenceDir, "not readable");
runRebindFails(PersistMode.CLEAN, persistenceDir, "not readable");
} finally {
new File(persistenceDir).setReadable(true);
}
}
@Test(groups="Integration")
public void testCopyPersistedState() throws Exception {
EntitySpec<TestApplication> appSpec = EntitySpec.create(TestApplication.class);
populatePersistenceDir(persistenceDir, appSpec);
File destinationDir = Files.createTempDir();
String destination = destinationDir.getAbsolutePath();
String destinationLocation = null; // i.e. file system, rather than object store
try {
// Auto will rebind if the dir exists
BrooklynLauncher launcher = newLauncherDefault(PersistMode.AUTO)
.highAvailabilityMode(HighAvailabilityMode.MASTER)
.webconsole(false);
launcher.copyPersistedState(destination, destinationLocation);
launcher.terminate();
File entities = new File(Os.mergePaths(destination), "entities");
assertTrue(entities.isDirectory(), "entities directory should exist");
assertEquals(entities.listFiles().length, 1, "entities directory should contain one file (contained: "+
Joiner.on(", ").join(entities.listFiles()) +")");
File nodes = new File(Os.mergePaths(destination, "nodes"));
assertTrue(nodes.isDirectory(), "nodes directory should exist");
assertNotEquals(nodes.listFiles().length, 0, "nodes directory should not be empty");
// Should now have a usable copy in the destinationDir
// Auto will rebind if the dir exists
newLauncherDefault(PersistMode.AUTO)
.webconsole(false)
.persistenceDir(destinationDir)
.start();
assertOnlyApp(lastMgmt(), TestApplication.class);
} finally {
Os.deleteRecursively(destinationDir);
}
}
}