| /* |
| * 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); |
| } |
| } |
| } |