/*
* 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.entity.machine.pool;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import java.util.Collection;
import java.util.Iterator;
import org.apache.brooklyn.api.entity.Entity;
import org.apache.brooklyn.api.location.LocationSpec;
import org.apache.brooklyn.core.entity.Attributes;
import org.apache.brooklyn.core.entity.lifecycle.Lifecycle;
import org.apache.brooklyn.core.test.entity.TestApplication;
import org.apache.brooklyn.entity.machine.pool.ServerPoolImpl;
import org.apache.brooklyn.test.EntityTestUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.annotations.Test;
import org.apache.brooklyn.location.localhost.LocalhostMachineProvisioningLocation.LocalhostMachine;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
public class ServerPoolTest extends AbstractServerPoolTest {
private static final Logger LOG = LoggerFactory.getLogger(ServerPoolTest.class);
@Test
public void testAppCanBeDeployedToServerPool() {
TestApplication app = createAppWithChildren(1);
app.start(ImmutableList.of(pool.getDynamicLocation()));
assertTrue(app.getAttribute(Attributes.SERVICE_UP));
for (Entity child : app.getChildren()) {
assertTrue(child.getAttribute(Attributes.SERVICE_UP));
}
}
@Test
public void testFailureWhenNotEnoughServersAvailable() {
TestApplication app = createAppWithChildren(getInitialPoolSize() + 1);
assertNoMachinesAvailableForApp(app);
EntityTestUtils.assertAttributeEqualsEventually(app, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.ON_FIRE);
}
@Test
public void testDeployReleaseDeploy() {
TestApplication app = createAppWithChildren(getInitialPoolSize());
TestApplication app2 = createAppWithChildren(1);
app.start(ImmutableList.of(pool.getDynamicLocation()));
EntityTestUtils.assertAttributeEqualsEventually(app, Attributes.SERVICE_UP, true);
assertAvailableCountEventuallyEquals(0);
assertNoMachinesAvailableForApp(app2);
app.stop();
assertFalse(app.getAttribute(Attributes.SERVICE_UP));
assertAvailableCountEventuallyEquals(getInitialPoolSize());
app2.start(ImmutableList.of(pool.getDynamicLocation()));
EntityTestUtils.assertAttributeEqualsEventually(app2, Attributes.SERVICE_UP, true);
assertAvailableCountEventuallyEquals(getInitialPoolSize() - 1);
assertClaimedCountEventuallyEquals(1);
}
@Test
public void testResizingPoolUp() {
TestApplication app = createAppWithChildren(getInitialPoolSize());
app.start(ImmutableList.of(pool.getDynamicLocation()));
assertTrue(app.getAttribute(Attributes.SERVICE_UP));
TestApplication app2 = createAppWithChildren(1);
assertNoMachinesAvailableForApp(app2);
pool.resizeByDelta(1);
assertAvailableCountEventuallyEquals(1);
assertEquals((int) pool.getCurrentSize(), getInitialPoolSize() + 1);
app2.start(ImmutableList.of(pool.getDynamicLocation()));
assertTrue(app2.getAttribute(Attributes.SERVICE_UP));
}
@Test
public void testResizePoolDownSucceedsWhenEnoughMachinesAreFree() {
TestApplication app = createAppWithChildren(1);
app.start(ImmutableList.of(pool.getDynamicLocation()));
assertAvailableCountEventuallyEquals(getInitialPoolSize() - 1);
pool.resize(1);
assertAvailableCountEventuallyEquals(0);
}
@Test
public void testResizeDownDoesNotReleaseClaimedMachines() {
TestApplication app = createAppWithChildren(getInitialPoolSize() - 1);
app.start(ImmutableList.of(pool.getDynamicLocation()));
assertAvailableCountEventuallyEquals(1);
assertClaimedCountEventuallyEquals(getInitialPoolSize() - 1);
LOG.info("Test attempting to resize to 0 members. Should only drop the one available machine.");
pool.resize(0);
assertAvailableCountEventuallyEquals(0);
assertEquals(Iterables.size(pool.getMembers()), getInitialPoolSize() - 1);
assertAvailableCountEventuallyEquals(0);
assertClaimedCountEventuallyEquals(getInitialPoolSize() - 1);
}
@Test
public void testCanAddExistingMachinesToPool() {
TestApplication app = createAppWithChildren(getInitialPoolSize());
app.start(ImmutableList.of(pool.getDynamicLocation()));
assertAvailableCountEventuallyEquals(0);
LocalhostMachine loc = mgmt.getLocationManager().createLocation(LocationSpec.create(LocalhostMachine.class));
Entity added = pool.addExistingMachine(loc);
assertFalse(added.getConfig(ServerPoolImpl.REMOVABLE));
assertAvailableCountEventuallyEquals(1);
TestApplication app2 = createAppWithChildren(1);
app2.start(ImmutableList.of(pool.getDynamicLocation()));
assertAvailableCountEventuallyEquals(0);
}
@Test
public void testExistingMachinesAreNotRemovedFromThePoolOnShrinkButAreOnStop() {
LocalhostMachine loc = mgmt.getLocationManager().createLocation(LocationSpec.create(LocalhostMachine.class));
pool.addExistingMachine(loc);
assertAvailableCountEventuallyEquals(getInitialPoolSize() + 1);
pool.resize(0);
assertAvailableCountEventuallyEquals(1);
pool.stop();
assertAvailableCountEventuallyEquals(0);
}
@Test
public void testAddExistingMachineFromSpec() {
TestApplication app = createAppWithChildren(getInitialPoolSize());
app.start(ImmutableList.of(pool.getDynamicLocation()));
assertAvailableCountEventuallyEquals(0);
Collection<Entity> added = pool.addExistingMachinesFromSpec("byon:(hosts=\"localhost,localhost\")");
assertEquals(added.size(), 2, "Added: " + Joiner.on(", ").join(added));
Iterator<Entity> it = added.iterator();
assertFalse(it.next().getConfig(ServerPoolImpl.REMOVABLE));
assertFalse(it.next().getConfig(ServerPoolImpl.REMOVABLE));
assertAvailableCountEventuallyEquals(2);
TestApplication app2 = createAppWithChildren(2);
app2.start(ImmutableList.of(pool.getDynamicLocation()));
assertAvailableCountEventuallyEquals(0);
}
}