blob: 51f00a123215bf7b377188f7ee9ca8e2b97e059d [file] [log] [blame]
/*
* 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.policy.PolicySpec;
import org.apache.brooklyn.api.sensor.Enricher;
import org.apache.brooklyn.core.entity.Entities;
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.enricher.stock.Enrichers;
import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.testng.SkipException;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
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();
}
EntitySpec<TestApplication> appSpec = EntitySpec.create(TestApplication.class)
.location(LocationSpec.create(SshMachineLocation.class).configure("address", "localhost"));
app = localManagementContext.getEntityManager().createEntity(appSpec);
location = Iterables.getOnlyElement( app.getLocations() );
entity = app.createAndManageChild(EntitySpec.create(TestEntity.class));
enricher = app.enrichers().add(Enrichers.builder().propagatingAll().from(entity).build());
policy = app.policies().add(PolicySpec.create(TestPolicy.class));
}
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, true);
BrooklynMemento reloadedMemento = loadMemento();
assertNotNull(reloadedMemento);
assertFalse(Iterables.contains(reloadedMemento.getEntityIds(), entity.getId()));
assertEquals(Iterables.getOnlyElement(reloadedMemento.getLocationIds()), location.getId());
// Destroying the app should also unmanage its owned location, and adjuncts
Entities.destroy(app, true);
reloadedMemento = loadMemento();
assertFalse(Iterables.contains(reloadedMemento.getEntityIds(), entity.getId()));
assertFalse(Iterables.contains(reloadedMemento.getPolicyIds(), policy.getId()));
assertFalse(Iterables.contains(reloadedMemento.getEnricherIds(), enricher.getId()));
assertFalse(Iterables.contains(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, "test", null);
} else {
throw new SkipException("Persister "+persister+" not a "+BrooklynMementoPersisterToObjectStore.class.getSimpleName());
}
}
}