/*
* 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.location.cloud;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import org.apache.brooklyn.api.entity.EntitySpec;
import org.apache.brooklyn.core.entity.Entities;
import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
import org.apache.brooklyn.core.location.cloud.CloudLocationConfig;
import org.apache.brooklyn.core.location.cloud.names.AbstractCloudMachineNamer;
import org.apache.brooklyn.core.location.cloud.names.BasicCloudMachineNamer;
import org.apache.brooklyn.core.location.cloud.names.CloudMachineNamer;
import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
import org.apache.brooklyn.core.test.entity.TestApplication;
import org.apache.brooklyn.core.test.entity.TestEntity;
import org.apache.brooklyn.util.core.config.ConfigBag;
import org.apache.brooklyn.util.text.Strings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.Test;
public class CloudMachineNamerTest {
private static final Logger log = LoggerFactory.getLogger(CloudMachineNamerTest.class);
private TestApplication app;
@AfterMethod(alwaysRun=true)
public void tearDown() throws Exception {
if (app != null) Entities.destroyAll(app.getManagementContext());
}
@Test
public void testGenerateGroupIdWithEntity() {
app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("TistApp"), LocalManagementContextForTests.newInstance());
TestEntity child = app.createAndManageChild(EntitySpec.create(TestEntity.class).displayName("TestEnt"));
ConfigBag cfg = new ConfigBag()
.configure(CloudLocationConfig.CALLER_CONTEXT, child);
String result = new BasicCloudMachineNamer().generateNewGroupId(cfg);
log.info("test entity child group id gives: "+result);
// e.g. brooklyn-alex-tistapp-uube-testent-xisg-rwad
Assert.assertTrue(result.length() <= 60);
String user = Strings.maxlen(System.getProperty("user.name"), 4).toLowerCase();
Assert.assertTrue(result.indexOf(user) >= 0);
Assert.assertTrue(result.indexOf("-tistapp-") >= 0);
Assert.assertTrue(result.indexOf("-testent-") >= 0);
Assert.assertTrue(result.indexOf("-"+Strings.maxlen(app.getId(), 4).toLowerCase()) >= 0);
Assert.assertTrue(result.indexOf("-"+Strings.maxlen(child.getId(), 4).toLowerCase()) >= 0);
}
@Test
public void testGenerateNewMachineName() {
app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("TistApp"), LocalManagementContextForTests.newInstance());
TestEntity child = app.createAndManageChild(EntitySpec.create(TestEntity.class).displayName("TestEnt"));
ConfigBag cfg = new ConfigBag()
.configure(CloudLocationConfig.CALLER_CONTEXT, child);
BasicCloudMachineNamer namer = new BasicCloudMachineNamer();
String result = namer.generateNewMachineUniqueName(cfg);
Assert.assertTrue(result.length() <= namer.getMaxNameLength(cfg));
String user = Strings.maxlen(System.getProperty("user.name"), 4).toLowerCase();
Assert.assertTrue(result.indexOf(user) >= 0);
Assert.assertTrue(result.indexOf("-tistapp-") >= 0);
Assert.assertTrue(result.indexOf("-testent-") >= 0);
Assert.assertTrue(result.indexOf("-"+Strings.maxlen(app.getId(), 4).toLowerCase()) >= 0);
Assert.assertTrue(result.indexOf("-"+Strings.maxlen(child.getId(), 4).toLowerCase()) >= 0);
}
@Test
public void testGenerateNewMachineUniqueNameFromGroupId() {
app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("TistApp"), LocalManagementContextForTests.newInstance());
TestEntity child = app.createAndManageChild(EntitySpec.create(TestEntity.class).displayName("TestEnt"));
ConfigBag cfg = new ConfigBag()
.configure(CloudLocationConfig.CALLER_CONTEXT, child);
CloudMachineNamer namer = new BasicCloudMachineNamer();
String groupId = namer.generateNewGroupId(cfg);
String result = namer.generateNewMachineUniqueNameFromGroupId(cfg, groupId);
Assert.assertTrue(result.startsWith(groupId));
Assert.assertTrue(result.length() == groupId.length() + 5);
}
@Test
public void testLengthMaxPermittedForMachineName() {
app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("TistApp"), LocalManagementContextForTests.newInstance());
TestEntity child = app.createAndManageChild(EntitySpec.create(TestEntity.class).displayName("TestEnt"));
ConfigBag cfg = new ConfigBag()
.configure(CloudLocationConfig.CALLER_CONTEXT, child);
BasicCloudMachineNamer namer = new BasicCloudMachineNamer();
// name max length is set to 9, because the constructed name will look like "br-ntsb50"
// br - 2 chars
// dash (-) - 1 char
// timeStamp - 6 chars
namer.setDefaultMachineNameMaxLength(2 + 1 + 6);
String result = namer.generateNewMachineUniqueName(cfg);
Assert.assertEquals(result.length(), 2 + 1 + 6);
}
@Test
public void testLengthReservedForNameInGroup() {
app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("TistApp"), LocalManagementContextForTests.newInstance());
TestEntity child = app.createAndManageChild(EntitySpec.create(TestEntity.class).displayName("TestEnt"));
ConfigBag cfg = new ConfigBag()
.configure(CloudLocationConfig.CALLER_CONTEXT, child);
BasicCloudMachineNamer namer = new BasicCloudMachineNamer();
namer.setDefaultMachineNameMaxLength(20);
namer.setDefaultMachineNameSeparatorAndSaltLength(":I", 5);
String groupId = namer.generateNewGroupId(cfg);
Assert.assertEquals(13, groupId.length(), "groupId="+groupId);
String machineId = namer.generateNewMachineUniqueNameFromGroupId(cfg, groupId);
Assert.assertEquals(20, machineId.length(), "machineId="+machineId);
// separator is not sanitized -- caller should know what they are doing there!
Assert.assertTrue(machineId.startsWith(groupId+"-i"), "machineId="+machineId);
}
@Test
public void testSanitizesNewMachineName() {
app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("T_%$()\r\n\t[]*.!App"), LocalManagementContextForTests.newInstance());
TestEntity child = app.createAndManageChild(EntitySpec.create(TestEntity.class).displayName("ent"));
ConfigBag cfg = new ConfigBag()
.configure(CloudLocationConfig.CALLER_CONTEXT, child);
CloudMachineNamer namer = new BasicCloudMachineNamer();
String result = namer.generateNewMachineUniqueName(cfg);
assertTrue(result.indexOf("t-ap") >= 0, "result="+result);
for (int c : "_%$()\r\n\t[]*.!".getBytes()) {
assertFalse(result.contains(new String(new char [] {(char)c})), "result="+result);
}
}
@Test
public void testSanitize() {
Assert.assertEquals(AbstractCloudMachineNamer.sanitize(
"me & you like alphanumeric but not _ or !!! or dots...dots...dots %$()\r\n\t[]*etc"),
"me-you-like-alphanumeric-but-not-or-or-dots-dots-dots-etc");
}
}