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 35ce88f195 support entity search path even without a catalog item id
defined
35ce88f195 is described below
commit 35ce88f195cb9af1c1c457d70d7ac6119779d045
Author: Alex Heneveld <[email protected]>
AuthorDate: Wed Mar 29 10:20:17 2023 +0100
support entity search path even without a catalog item id defined
---
.../core/catalog/internal/CatalogUtils.java | 2 +-
.../mgmt/internal/AbstractManagementContext.java | 33 ++++++++++++----------
.../workflow/steps/external/SshWorkflowStep.java | 1 +
.../brooklyn/util/core/ClassLoaderUtilsTest.java | 11 ++++++++
4 files changed, 31 insertions(+), 16 deletions(-)
diff --git
a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java
b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java
index 026c3c04c1..c4aaa9185e 100644
---
a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java
+++
b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java
@@ -151,7 +151,7 @@ public class CatalogUtils {
BrooklynClassLoadingContextSequential seqLoader = new
BrooklynClassLoadingContextSequential(managementContext);
Set<String> path = MutableSet.copyOf(searchPath);
- if (!omitPrimaryIfContainedInSearchPath ||
!searchPath.contains(primaryItemId)) {
+ if (primaryItemId!=null && (!omitPrimaryIfContainedInSearchPath ||
!searchPath.contains(primaryItemId))) {
addSearchItem(managementContext, seqLoader, primaryItemId, false
/* primary ID may be temporary */);
path.remove(primaryItemId);
}
diff --git
a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java
b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java
index be1f97c767..b212589556 100644
---
a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java
+++
b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java
@@ -105,25 +105,28 @@ public abstract class AbstractManagementContext
implements ManagementContextInte
if (input instanceof EntityInternal) {
EntityInternal internal = (EntityInternal)input;
String inputCatalogItemId = internal.getCatalogItemId();
- if(inputCatalogItemId != null) {
- RegisteredType item =
internal.getManagementContext().getTypeRegistry().get(internal.getCatalogItemId());
-
- if (item != null) {
- final List<String> searchPath =
internal.getCatalogItemIdSearchPath();
- final ManagementContext managementContext =
internal.getManagementContext();
- BrooklynClassLoadingContextSequential seqLoader =
- new
BrooklynClassLoadingContextSequential(managementContext);
-
seqLoader.add(newClassLoadingContextForCatalogItems(managementContext,
inputCatalogItemId, searchPath));
- JavaBrooklynClassLoadingContext entityLoader =
-
JavaBrooklynClassLoadingContext.create(input.getClass().getClassLoader());
- seqLoader.add(entityLoader);
- return seqLoader;
- } else {
+ RegisteredType item = null;
+ if (inputCatalogItemId != null) {
+ item =
internal.getManagementContext().getTypeRegistry().get(internal.getCatalogItemId());
+ if (item==null) {
log.error("Can't find catalog item " +
internal.getCatalogItemId() +
" used for instantiating entity " +
internal +
- ". Falling back to application
classpath.");
+ ". Falling back to search items and/or
application classpath.");
}
}
+
+ final List<String> searchPath =
internal.getCatalogItemIdSearchPath();
+ if (item != null || (searchPath!=null &&
!searchPath.isEmpty())) {
+ final ManagementContext managementContext =
internal.getManagementContext();
+ BrooklynClassLoadingContextSequential seqLoader =
+ new
BrooklynClassLoadingContextSequential(managementContext);
+
seqLoader.add(newClassLoadingContextForCatalogItems(managementContext,
inputCatalogItemId, searchPath));
+ JavaBrooklynClassLoadingContext entityLoader =
+
JavaBrooklynClassLoadingContext.create(input.getClass().getClassLoader());
+ seqLoader.add(entityLoader);
+ return seqLoader;
+ }
+
return apply(internal.getManagementSupport());
}
diff --git
a/core/src/main/java/org/apache/brooklyn/core/workflow/steps/external/SshWorkflowStep.java
b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/external/SshWorkflowStep.java
index 1e08d59e6e..7192e76d3b 100644
---
a/core/src/main/java/org/apache/brooklyn/core/workflow/steps/external/SshWorkflowStep.java
+++
b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/external/SshWorkflowStep.java
@@ -74,6 +74,7 @@ public class SshWorkflowStep extends WorkflowStepDefinition {
// TODO
throw new IllegalStateException("Explicit endpoint not currently
supported for ssh step");
} else {
+ // TODO better errors if multiple
machine =
Locations.findUniqueSshMachineLocation(context.getEntity().getLocations()).orThrow("No
SSH location available for workflow at "+context.getEntity()+" and no endpoint
specified");
}
diff --git
a/core/src/test/java/org/apache/brooklyn/util/core/ClassLoaderUtilsTest.java
b/core/src/test/java/org/apache/brooklyn/util/core/ClassLoaderUtilsTest.java
index b868c46764..6863fdf20a 100644
--- a/core/src/test/java/org/apache/brooklyn/util/core/ClassLoaderUtilsTest.java
+++ b/core/src/test/java/org/apache/brooklyn/util/core/ClassLoaderUtilsTest.java
@@ -52,6 +52,7 @@ import
org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
import org.apache.brooklyn.entity.stock.BasicEntity;
import org.apache.brooklyn.test.Asserts;
import org.apache.brooklyn.test.support.TestResourceUnavailableException;
+import org.apache.brooklyn.util.collections.MutableList;
import org.apache.brooklyn.util.core.osgi.Osgis;
import org.apache.brooklyn.util.exceptions.Exceptions;
import org.apache.brooklyn.util.guava.Maybe;
@@ -122,6 +123,16 @@ public class ClassLoaderUtilsTest {
assertLoadFails(classname, cluMgmt);
assertLoadSucceeds(bundle.getSymbolicName() + ":" + classname, clazz,
cluMgmt, cluClass, cluEntity);
assertLoadSucceeds(bundle.getSymbolicName() + ":" +
bundle.getVersion()+":" + classname, clazz, cluMgmt, cluClass, cluEntity);
+
+ // we can also load classpath url in the scope of the entity
+
ResourceUtils.create(entity).getResourceAsString("classpath://"+classname.replaceAll("\\.",
"/")+".class");
+ // (but not in global scope)
+ Asserts.assertFailsWith(() ->
ResourceUtils.create(null).getResourceAsString("classpath://"+classname.replaceAll("\\.",
"/")+".class"),
+ e -> Asserts.expectedFailureContainsIgnoreCase(e, "not found on
classpath", "SimpleEntity"));
+
+ // test load still works when we have the item in the search path only
but not a catalog item id on the entity
+ ((EntityInternal)entity).setCatalogItemIdAndSearchPath(null,
MutableList.of(entity.getCatalogItemId()));
+
ResourceUtils.create(entity).getResourceAsString("classpath://"+classname.replaceAll("\\.",
"/")+".class");
}
@Test