This is an automated email from the ASF dual-hosted git repository.
heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git
The following commit(s) were added to refs/heads/master by this push:
new f018049b3f allow user in byon to be dynamic
f018049b3f is described below
commit f018049b3f425240af9bcde14a4e26244f61aef4
Author: Alex Heneveld <[email protected]>
AuthorDate: Mon Jul 15 15:10:47 2024 +0100
allow user in byon to be dynamic
---
.../camp/brooklyn/ByonLocationsYamlTest.java | 23 +++++++++++++++++++++
.../location/byon/ByonLocationResolver.java | 24 ++++++++++++++--------
2 files changed, 39 insertions(+), 8 deletions(-)
diff --git
a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ByonLocationsYamlTest.java
b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ByonLocationsYamlTest.java
index a57670015e..6cab0ebb06 100644
---
a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ByonLocationsYamlTest.java
+++
b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ByonLocationsYamlTest.java
@@ -165,6 +165,29 @@ public class ByonLocationsYamlTest extends
AbstractYamlTest {
assertMachine(machine, UserAndHostAndPort.fromParts("Beth", "1.2.3.4",
22), Collections.emptyMap());
}
+ @Test
+ @SuppressWarnings("unchecked")
+ public void testByonMachineResolvesDependentConfigForHostWithUser() throws
Exception {
+ String yaml = Joiner.on("\n").join(
+ "location:",
+ " byon:",
+ " hosts:",
+ " - ssh: 1.2.3.4",
+ " user: $brooklyn:config(\"uzer\")",
+ "services:",
+ "- type: org.apache.brooklyn.entity.stock.BasicApplication",
+ " brooklyn.config:",
+ " uzer: Beth"
+ );
+
+ Entity app = createStartWaitAndLogApplication(yaml);
+ FixedListMachineProvisioningLocation<SshMachineLocation> loc =
(FixedListMachineProvisioningLocation<SshMachineLocation>)
Iterables.get(app.getLocations(), 0);
+
+ Set<SshMachineLocation> machines = loc.getAvailable();
+ SshMachineLocation machine = Iterables.getOnlyElement(machines);
+ assertMachine(machine, UserAndHostAndPort.fromParts("Beth", "1.2.3.4",
22), Collections.emptyMap());
+ }
+
@Test
@SuppressWarnings("unchecked")
public void testByonWindowsMachine() throws Exception {
diff --git
a/core/src/main/java/org/apache/brooklyn/location/byon/ByonLocationResolver.java
b/core/src/main/java/org/apache/brooklyn/location/byon/ByonLocationResolver.java
index ba361e38b6..26d42fd0a6 100644
---
a/core/src/main/java/org/apache/brooklyn/location/byon/ByonLocationResolver.java
+++
b/core/src/main/java/org/apache/brooklyn/location/byon/ByonLocationResolver.java
@@ -24,7 +24,6 @@ import java.net.InetAddress;
import java.util.List;
import java.util.Locale;
import java.util.Map;
-import java.util.function.Supplier;
import org.apache.brooklyn.api.entity.Entity;
import org.apache.brooklyn.api.location.Location;
@@ -45,11 +44,9 @@ import org.apache.brooklyn.util.core.config.ConfigBag;
import org.apache.brooklyn.util.core.flags.TypeCoercions;
import org.apache.brooklyn.util.core.task.DeferredSupplier;
import org.apache.brooklyn.util.core.task.Tasks;
-import org.apache.brooklyn.util.exceptions.Exceptions;
import org.apache.brooklyn.util.net.UserAndHostAndPort;
import org.apache.brooklyn.util.text.WildcardGlobs;
import org.apache.brooklyn.util.text.WildcardGlobs.PhraseTreatment;
-import org.apache.commons.lang3.tuple.Pair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -154,6 +151,11 @@ public class ByonLocationResolver extends
AbstractLocationResolver {
v = resolveOrThrow(dynamicAllowed, v);
return TypeCoercions.coerce(v, type);
}
+ protected <T> T resolveRemoveOrThrow(boolean dynamicAllowed,
Map<String, Object> map, String key, Class<T> type) {
+ Object v = map.remove(key);
+ v = resolveOrThrow(dynamicAllowed, v);
+ return TypeCoercions.coerce(v, type);
+ }
protected Object resolveOrThrow(boolean dynamicAllowed, Object v) {
if (v instanceof DeferredSupplier) {
if (dynamicAllowed) throw new UsesDeferredSupplier();
@@ -204,7 +206,7 @@ public class ByonLocationResolver extends
AbstractLocationResolver {
if (host instanceof String) {
machineSpec = parseMachine((String) host, locationClass,
defaultProps, spec);
} else if (host instanceof Map) {
- machineSpec = parseMachine(mgmt, context, (Map<String, ?>)
host, locationClass, defaultProps, spec);
+ machineSpec = parseMachine(mgmt, context, (Map<String, ?>)
host, locationClass, defaultProps, spec, dynamicAllowed);
} else {
throw new IllegalArgumentException("Expected machine to be
String or Map, but was " + host.getClass().getName() + " (" + host + ")");
}
@@ -214,13 +216,19 @@ public class ByonLocationResolver extends
AbstractLocationResolver {
return machineSpecs;
}
- private LocationSpec<? extends MachineLocation>
parseMachine(ManagementContext mgmt, Object context, Map<String, ?> vals,
Class<? extends MachineLocation> locationClass, Map<String, ?> defaults, String
specForErrMsg) {
+ private LocationSpec<? extends MachineLocation>
parseMachine(ManagementContext mgmt, Object context, Map<String, ?> vals,
Class<? extends MachineLocation> locationClass, Map<String, ?> defaults, String
specForErrMsg, boolean dynamicAllowed) {
Map<String, Object> valSanitized = Sanitizer.sanitize(vals);
Map<String, Object> machineConfig = MutableMap.copyOf(vals);
- String osFamily = (String)
machineConfig.remove(OS_FAMILY.getName());
- String ssh = (String) machineConfig.remove("ssh");
- String winrm = (String) machineConfig.remove("winrm");
+ String osFamily = resolveRemoveOrThrow(dynamicAllowed,
machineConfig, OS_FAMILY.getName(), String.class);
+ String ssh = resolveRemoveOrThrow(dynamicAllowed, machineConfig,
"ssh", String.class);
+ String winrm = resolveRemoveOrThrow(dynamicAllowed, machineConfig,
"winrm", String.class);
+
+ // ensure other items are resolved when creating the machine spec
+ MutableMap.copyOf(machineConfig).forEach((k,v)->{
+ if (v instanceof DeferredSupplier)
machineConfig.put(k, resolveOrThrow(dynamicAllowed, v));
+ });
+
Map<Integer, String> tcpPortMappings = (Map<Integer, String>)
machineConfig.get("tcpPortMappings");
checkArgument(ssh != null ^ winrm != null, "Must specify exactly
one of 'ssh' or 'winrm' for machine: %s", valSanitized);