/*
* 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.rebind.mementos.BrooklynMementoRawData;
import org.apache.brooklyn.core.internal.BrooklynProperties;
import org.apache.brooklyn.core.mgmt.persist.BrooklynMementoPersisterToObjectStore;
import org.apache.brooklyn.core.mgmt.persist.PersistMode;
import org.apache.brooklyn.core.mgmt.persist.jclouds.BlobStoreTest;
import org.apache.brooklyn.core.mgmt.persist.jclouds.JcloudsBlobStoreBasedObjectStore;
import org.apache.brooklyn.core.server.BrooklynServerPaths;
import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
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 org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
@Test(groups="Live")
public class BrooklynLauncherRebindToCloudObjectStoreTest extends BrooklynLauncherRebindTestFixture {
// FIXME BrooklynLauncherRebindToCloudObjectStoreTest.testCleanDoesNotRebindToExistingApp failed:
// apps=[Application[mDNfOA7w]] expected [true] but found [false]
// Should it really delete everything in the bucket?! Only if we can back up first!
// FIXME FatalRuntimeException: Error rebinding to persisted state: Writes not allowed in brooklyn.entity.rebind.persister.BrooklynMementoPersisterToObjectStore@7d2f7563
// at BrooklynLauncher.persistState(BrooklynLauncher.java:502)
// at BrooklynLauncherRebindToCloudObjectStoreTest.testCopyPersistedState(BrooklynLauncherRebindToCloudObjectStoreTest.java:144)
// Presumably a previous run wasn't tearing down properly, so it joined as a standby rather than being master?!
{ persistenceLocationSpec = BlobStoreTest.PERSIST_TO_OBJECT_STORE_FOR_TEST_SPEC; }
@BeforeMethod(alwaysRun=true)
public void setUp() throws Exception {
persistenceDir = newTempPersistenceContainerName();
}
@Override
protected BrooklynLauncher newLauncherBase() {
return super.newLauncherBase().persistenceLocation(persistenceLocationSpec);
}
protected LocalManagementContextForTests newManagementContextForTests(BrooklynProperties props) {
BrooklynProperties p2 = BrooklynProperties.Factory.newDefault();
if (props!=null) p2.putAll(props);
return new LocalManagementContextForTests(p2);
}
@Override
protected String newTempPersistenceContainerName() {
return "test-"+JavaClassNames.callerStackElement(0).getClassName()+"-"+Identifiers.makeRandomId(4);
}
protected String badContainerName() {
return "container-does-not-exist-"+Identifiers.makeRandomId(4);
}
protected void checkPersistenceContainerNameIs(String expected) {
assertEquals(getPersistenceContainerName(lastMgmt()), expected);
}
static String getPersistenceContainerName(ManagementContext managementContext) {
BrooklynMementoPersisterToObjectStore persister = (BrooklynMementoPersisterToObjectStore)managementContext.getRebindManager().getPersister();
JcloudsBlobStoreBasedObjectStore store = (JcloudsBlobStoreBasedObjectStore)persister.getObjectStore();
return store.getContainerName();
}
protected void checkPersistenceContainerNameIsDefault() {
checkPersistenceContainerNameIs(BrooklynServerPaths.DEFAULT_PERSISTENCE_CONTAINER_NAME);
}
@Override @Test(groups="Live")
public void testRebindsToExistingApp() throws Exception {
super.testRebindsToExistingApp();
}
@Override @Test(groups="Live")
public void testRebindCanAddNewApps() throws Exception {
super.testRebindCanAddNewApps();
}
@Override @Test(groups="Live")
public void testAutoRebindsToExistingApp() throws Exception {
super.testAutoRebindsToExistingApp();
}
// TODO Marked as work-in-progress because "clean" does not backup and then clean out the existing
// object store's bucket. Unclear what best behaviour there should be: should we really delete
// the data?! We better be confident about our backup!
@Override @Test(groups={"Live", "WIP"})
public void testCleanDoesNotRebindToExistingApp() throws Exception {
super.testCleanDoesNotRebindToExistingApp();
}
@Override @Test(groups="Live")
public void testAutoRebindCreatesNewIfEmptyDir() throws Exception {
super.testAutoRebindCreatesNewIfEmptyDir();
}
@Override @Test(groups="Live")
public void testRebindRespectsPersistenceDirSetInProperties() throws Exception {
super.testRebindRespectsPersistenceDirSetInProperties();
}
@Override @Test(groups="Live")
public void testRebindRespectsDefaultPersistenceDir() throws Exception {
super.testRebindRespectsDefaultPersistenceDir();
}
@Override @Test(groups="Live")
public void testPersistenceFailsIfNoDir() throws Exception {
super.testPersistenceFailsIfNoDir();
}
@Override @Test(groups="Live")
public void testExplicitRebindFailsIfEmpty() throws Exception {
super.testExplicitRebindFailsIfEmpty();
}
// TODO Remove duplication from BrooklynLauncherRebindTestToFiles.testCopyPersistedState()
@Test(groups="Live")
public void testCopyPersistedState() throws Exception {
EntitySpec<TestApplication> appSpec = EntitySpec.create(TestApplication.class);
populatePersistenceDir(persistenceDir, appSpec);
String destinationDir = newTempPersistenceContainerName();
String destinationLocation = persistenceLocationSpec;
try {
// Auto will rebind if the dir exists
BrooklynLauncher launcher = newLauncherDefault(PersistMode.AUTO)
.webconsole(false)
.persistenceLocation(persistenceLocationSpec);
BrooklynMementoRawData memento = launcher.retrieveState();
launcher.persistState(memento, destinationDir, destinationLocation);
launcher.terminate();
assertEquals(memento.getEntities().size(), 1, "entityMementos="+memento.getEntities().keySet());
// Should now have a usable copy in the destionationDir
// Auto will rebind if the dir exists
newLauncherDefault(PersistMode.AUTO)
.webconsole(false)
.persistenceDir(destinationDir)
.persistenceLocation(destinationLocation)
.start();
assertOnlyApp(lastMgmt(), TestApplication.class);
} finally {
Os.deleteRecursively(destinationDir);
}
}
}