blob: 39b444db0df0cddb239e45541e6b9d8d086b0145 [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.camp.brooklyn;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import org.apache.brooklyn.api.mgmt.ExecutionContext;
import org.apache.brooklyn.camp.brooklyn.ExternalConfigYamlTest.MyExternalConfigSupplier;
import org.apache.brooklyn.camp.brooklyn.ExternalConfigYamlTest.MyExternalConfigSupplierWithoutMapArg;
import org.apache.brooklyn.core.config.ConfigKeys;
import org.apache.brooklyn.core.config.ConfigPredicates;
import org.apache.brooklyn.core.internal.BrooklynProperties;
import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
import org.apache.brooklyn.location.jclouds.JcloudsLocation;
import org.apache.brooklyn.test.Asserts;
import org.apache.brooklyn.util.core.task.DeferredSupplier;
import org.apache.brooklyn.util.core.task.Tasks;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
@Test
public class ExternalConfigBrooklynPropertiesTest extends AbstractYamlTest {
@Override
protected LocalManagementContext newTestManagementContext() {
BrooklynProperties props = BrooklynProperties.Factory.newEmpty();
props.put("brooklyn.external.myprovider", MyExternalConfigSupplier.class.getName());
props.put("brooklyn.external.myprovider.mykey", "myval");
props.put("brooklyn.external.myprovider.mykey2", "myval2");
props.put("brooklyn.external.myproviderWithoutMapArg", MyExternalConfigSupplierWithoutMapArg.class.getName());
props.put("myproperty", "$brooklyn:external(\"myprovider\", \"mykey\")");
return LocalManagementContextForTests.builder(true)
.useProperties(props)
.build();
}
// Yaml parsing support is more generic than just external-config.
// Test other parsing here, even though it's not directly related to external-config.
@Test
public void testYamlLiteralFromPropertiesInLocation() throws Exception {
((ManagementContextInternal)mgmt()).getBrooklynProperties().put(
ConfigKeys.newStringConfigKey("myDynamicProperty"), "$brooklyn:literal(\"myliteral\")");
String val = mgmt().getConfig().getConfig(ConfigKeys.newStringConfigKey("myDynamicProperty"));
assertEquals(val, "myliteral");
}
@Test
public void testInvalidYamlExpression() throws Exception {
((ManagementContextInternal)mgmt()).getBrooklynProperties().put(
ConfigKeys.newStringConfigKey("myInvalidExternal"), "$brooklyn:external");
try {
String val = mgmt().getConfig().getConfig(ConfigKeys.newStringConfigKey("myInvalidExternal"));
Asserts.shouldHaveFailedPreviously("val="+val);
} catch (IllegalArgumentException e) {
Asserts.expectedFailureContains(e, "Error evaluating node");
}
}
@Test
public void testExternalisedConfigFromPropertiesInLocation() throws Exception {
BrooklynProperties props = ((ManagementContextInternal)mgmt()).getBrooklynProperties();
props.put("brooklyn.location.jclouds.aws-ec2.identity", "$brooklyn:external(\"myprovider\", \"mykey\")");
props.put("brooklyn.location.jclouds.aws-ec2.credential", "$brooklyn:external(\"myprovider\", \"mykey2\")");
JcloudsLocation loc = (JcloudsLocation) mgmt().getLocationRegistry().resolve("jclouds:aws-ec2:us-east-1");
assertEquals(loc.getIdentity(), "myval");
assertEquals(loc.getCredential(), "myval2");
}
@Test
public void testExternalisedConfigInProperties() throws Exception {
runExternalisedConfigGetters("myproperty", "myval");
}
@Test
public void testExternalisedConfigInAddedStringProperty() throws Exception {
((ManagementContextInternal)mgmt()).getBrooklynProperties().put(
"myDynamicProperty", "$brooklyn:external(\"myprovider\", \"mykey\")");
runExternalisedConfigGetters("myDynamicProperty", "myval");
}
@Test
public void testExternalisedConfigInAddedKeyProperty() throws Exception {
((ManagementContextInternal)mgmt()).getBrooklynProperties().put(
ConfigKeys.newStringConfigKey("myDynamicProperty"), "$brooklyn:external(\"myprovider\", \"mykey\")");
runExternalisedConfigGetters("myDynamicProperty", "myval");
}
@Test
public void testExternalisedConfigInAddedMapProperty() throws Exception {
((ManagementContextInternal)mgmt()).getBrooklynProperties().addFromMap(
ImmutableMap.of("myDynamicProperty", "$brooklyn:external(\"myprovider\", \"mykey\")"));
runExternalisedConfigGetters("myDynamicProperty", "myval");
}
protected void runExternalisedConfigGetters(String property, String expectedVal) throws Exception {
runExternalisedConfigGetters(((ManagementContextInternal)mgmt()).getBrooklynProperties(), property, expectedVal, true);
}
protected void runExternalisedConfigGetters(BrooklynProperties props, String property, String expectedVal, boolean testSubMap) throws Exception {
ExecutionContext exec = mgmt().getServerExecutionContext();
String val1 = props.getConfig(ConfigKeys.newStringConfigKey(property));
assertEquals(val1, expectedVal);
DeferredSupplier<?> val2 = (DeferredSupplier<?>) props.getRawConfig(ConfigKeys.newStringConfigKey(property));
assertEquals(Tasks.resolveValue(val2, String.class, exec), expectedVal);
DeferredSupplier<?> val3 = (DeferredSupplier<?>) props.getConfigRaw(ConfigKeys.newStringConfigKey(property), false).get();
assertEquals(Tasks.resolveValue(val3, String.class, exec), expectedVal);
DeferredSupplier<?> val4 = (DeferredSupplier<?>) props.getAllConfig().get(ConfigKeys.newStringConfigKey(property));
assertEquals(Tasks.resolveValue(val4, String.class, exec), expectedVal);
String val5 = props.getFirst(property);
assertTrue(val5.startsWith("$brooklyn:external"), "val="+val5);
if (testSubMap) {
BrooklynProperties submap = props.submap(ConfigPredicates.nameEqualTo(property));
runExternalisedConfigGetters(submap, property, expectedVal, false);
}
}
}