/*
* 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.brooklynnode;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import java.util.List;
import org.apache.brooklyn.api.entity.EntityLocal;
import org.apache.brooklyn.api.entity.EntitySpec;
import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolver;
import org.apache.brooklyn.api.location.Location;
import org.apache.brooklyn.core.entity.Attributes;
import org.apache.brooklyn.core.entity.Entities;
import org.apache.brooklyn.core.entity.trait.Startable;
import org.apache.brooklyn.core.feed.ConfigToAttributes;
import org.apache.brooklyn.core.test.entity.TestApplication;
import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.test.Asserts;
import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.collections.MutableSet;
import org.apache.brooklyn.util.time.Duration;
import org.apache.brooklyn.util.time.Time;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
public class BrooklynNodeTest {
// TODO Need test for copying/setting classpath
private TestApplication app;
private SshMachineLocation loc;
public static class SlowStopBrooklynNode extends BrooklynNodeImpl {
public SlowStopBrooklynNode() {}
@Override
protected void postStop() {
super.postStop();
//Make sure UnmanageTask will wait for the STOP effector to complete.
Time.sleep(Duration.FIVE_SECONDS);
}
}
@BeforeMethod(alwaysRun=true)
public void setUp() throws Exception {
app = TestApplication.Factory.newManagedInstanceForTests();
loc = new SshMachineLocation(MutableMap.of("address", "localhost"));
}
@AfterMethod(alwaysRun=true)
public void tearDown() throws Exception {
if (app != null) Entities.destroyAll(app.getManagementContext());
}
@Test
public void testGeneratesCorrectSnapshotDownload() throws Exception {
String version = "0.0.1-SNAPSHOT";
String expectedUrl = "https://repository.apache.org/service/local/artifact/maven/redirect?r=snapshots&g=org.apache.brooklyn&v="+version+"&a=brooklyn-dist&c=dist&e=tar.gz";
runTestGeneratesCorrectDownloadUrl(version, expectedUrl);
}
@Test
public void testGeneratesCorrectReleaseDownload() throws Exception {
String version = "0.0.1";
String expectedUrl = "http://search.maven.org/remotecontent?filepath=org/apache/brooklyn/brooklyn-dist/"+version+"/brooklyn-dist-"+version+"-dist.tar.gz";
runTestGeneratesCorrectDownloadUrl(version, expectedUrl);
}
private void runTestGeneratesCorrectDownloadUrl(String version, String expectedUrl) throws Exception {
// TODO Using BrooklynNodeImpl directly, because want to instantiate a BroolynNodeSshDriver.
// Really want to make that easier to test, without going through "wrong" code path for creating entity.
BrooklynNode entity = app.addChild(EntitySpec.create(BrooklynNode.class)
.configure(BrooklynNode.SUGGESTED_VERSION, version));
BrooklynNodeImpl entityImpl = (BrooklynNodeImpl) Entities.deproxy(entity);
ConfigToAttributes.apply((EntityLocal)entity);
BrooklynNodeSshDriver driver = new BrooklynNodeSshDriver(entityImpl, loc);
DownloadResolver resolver = Entities.newDownloader(driver);
List<String> urls = resolver.getTargets();
System.out.println("urls="+urls);
assertTrue(urls.contains(expectedUrl), "urls="+urls);
}
@Test(groups = "Integration")
public void testUnmanageOnStop() throws Exception {
final BrooklynNode node = app.addChild(EntitySpec.create(BrooklynNode.class).impl(SlowStopBrooklynNode.class));
assertTrue(Entities.isManaged(node), "Entity " + node + " must be managed.");
node.invoke(Startable.STOP, ImmutableMap.<String,Object>of()).asTask().getUnchecked();
//The UnmanageTask will unblock after the STOP effector completes, so we are competing with it here.
Asserts.succeedsEventually(new Runnable() {
@Override
public void run() {
assertFalse(Entities.isManaged(node));
}
});
}
@Test
public void testCanStartSameNode() throws Exception {
// not very interesting as do not have REST when run in this project
// but test BrooklynNodeRestTest in downstream project does
BrooklynNode bn = app.createAndManageChild(EntitySpec.create(BrooklynNode.class, SameBrooklynNodeImpl.class));
bn.start(MutableSet.<Location>of());
Assert.assertEquals(bn.getAttribute(Attributes.SERVICE_UP), (Boolean)true);
// no URI
Assert.assertNull(bn.getAttribute(BrooklynNode.WEB_CONSOLE_URI));
}
}