You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2021/10/04 11:21:36 UTC
[brooklyn-server] branch master updated (90844d2 -> e5da763)
This is an automated email from the ASF dual-hosted git repository.
heneveld pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git.
from 90844d2 allow REST endpoints to be extended by tests and/or statics
new 8af7f6c Improve log test and add explicid default LogStore value
new fb67f76 Addressing comments
new 662fe5b Merge pull request #6 from cloudsoft/fix/logbook/empty-line-log
new b7f138d when we create placeholder tasks for forgotten submitters, keep the original ID
new 21cbd22 better common ancestor tree logic
new 672841e Merge pull request #5 from cloudsoft/fix-placeholder-tasks-different-id
new 3c5ba36 REST calls which delete types should scan and delete empty bundles
new f689b81 record that user-installed bundles are deleteable
new 155cb03 Merge pull request #8 from cloudsoft/fix-catalog-deletion-bundles-and-transient
new 3d9b332 add support for blocking selected DSL expressions
new 4af1d98 Merge pull request #11 from cloudsoft/configurable-blacklist
new f344d9b add who installs a bundle
new 5dfe203 Merge pull request #12 from cloudsoft/logging-user-installing-bundle
new e5da763 Merge branch 'misc-updates'
The 14 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../mgmt/rebind/mementos/ManagedBundleMemento.java | 4 +++
.../brooklyn/api/typereg/OsgiBundleWithUrl.java | 4 +++
.../brooklyn/camp/brooklyn/AbstractYamlTest.java | 2 +-
.../brooklyn/camp/brooklyn/ConfigYamlTest.java | 33 ++++++++++++++++++++++
.../camp/brooklyn/test/lite/CampYamlLiteTest.java | 2 +-
.../core/catalog/internal/CatalogBundleDto.java | 14 ++++++++-
.../catalog/internal/CatalogItemDtoAbstract.java | 3 +-
.../org/apache/brooklyn/core/config/Sanitizer.java | 26 +++++++++++++++++
.../apache/brooklyn/core/mgmt/ha/OsgiManager.java | 5 ++++
.../core/mgmt/internal/LocalEntityManager.java | 19 +++++++------
.../brooklyn/core/mgmt/rebind/RebindIteration.java | 2 +-
.../core/mgmt/rebind/RebindManagerImpl.java | 33 ++++++++++------------
.../mgmt/rebind/dto/BasicManagedBundleMemento.java | 19 +++++++++++--
.../core/mgmt/rebind/dto/MementosGenerators.java | 2 ++
.../brooklyn/core/server/BrooklynServerConfig.java | 2 ++
.../core/typereg/AbstractTypePlanTransformer.java | 31 ++++++++++++++++----
.../core/typereg/BasicBrooklynTypeRegistry.java | 2 +-
.../brooklyn/core/typereg/BasicManagedBundle.java | 27 +++++++++++++-----
.../core/typereg/BasicOsgiBundleWithUrl.java | 16 +++++++++--
.../BrooklynBomYamlCatalogBundleResolver.java | 4 +--
.../typereg/BrooklynCatalogBundleResolver.java | 7 +++++
.../typereg/BrooklynCatalogBundleResolvers.java | 5 ++--
.../util/core/logbook/DelegatingLogStore.java | 4 +--
.../brooklyn/util/core/logbook/LogbookConfig.java | 2 +-
.../util/core/logbook/file/FileLogStore.java | 6 ++++
.../util/core/task/BasicExecutionManager.java | 11 ++------
.../apache/brooklyn/util/core/task/BasicTask.java | 30 +++++++++++++++++++-
.../apache/brooklyn/rest/domain/BundleSummary.java | 11 ++++++--
.../brooklyn/rest/resources/BundleResource.java | 2 +-
.../brooklyn/rest/resources/CatalogResource.java | 7 ++++-
.../brooklyn/rest/resources/LocationResource.java | 3 ++
.../brooklyn/rest/resources/ServerResource.java | 25 +++++++++++-----
32 files changed, 284 insertions(+), 79 deletions(-)
[brooklyn-server] 07/14: REST calls which delete types should scan
and delete empty bundles
Posted by he...@apache.org.
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
commit 3c5ba362f9243291c3de6b8d934746655f6693a7
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Fri Oct 1 09:48:09 2021 +0100
REST calls which delete types should scan and delete empty bundles
---
.../java/org/apache/brooklyn/rest/resources/CatalogResource.java | 5 +++++
.../java/org/apache/brooklyn/rest/resources/LocationResource.java | 3 +++
2 files changed, 8 insertions(+)
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java
index f4e3019..7fc43d7 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java
@@ -34,6 +34,7 @@ import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.UriInfo;
import org.apache.brooklyn.api.typereg.RegisteredType;
+import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
import org.apache.brooklyn.core.mgmt.entitlement.Entitlements;
import org.apache.brooklyn.core.mgmt.entitlement.Entitlements.StringAndArgument;
@@ -208,6 +209,7 @@ public class CatalogResource extends AbstractBrooklynRestResource implements Cat
throw WebResourceUtils.preconditionFailed("Item with id '%s:%s' not an entity", symbolicName, version);
} else {
brooklyn().getCatalog().deleteCatalogItem(item.getSymbolicName(), item.getVersion());
+ ((BasicBrooklynCatalog)brooklyn().getCatalog()).uninstallEmptyWrapperBundles();
}
}
@@ -228,6 +230,7 @@ public class CatalogResource extends AbstractBrooklynRestResource implements Cat
throw WebResourceUtils.preconditionFailed("Item with id '%s:%s' not a policy", policyId, version);
} else {
brooklyn().getCatalog().deleteCatalogItem(item.getSymbolicName(), item.getVersion());
+ ((BasicBrooklynCatalog)brooklyn().getCatalog()).uninstallEmptyWrapperBundles();
}
}
@@ -248,6 +251,7 @@ public class CatalogResource extends AbstractBrooklynRestResource implements Cat
throw WebResourceUtils.preconditionFailed("Item with id '%s:%s' not a location", locationId, version);
} else {
brooklyn().getCatalog().deleteCatalogItem(item.getSymbolicName(), item.getVersion());
+ ((BasicBrooklynCatalog)brooklyn().getCatalog()).uninstallEmptyWrapperBundles();
}
}
@@ -449,6 +453,7 @@ public class CatalogResource extends AbstractBrooklynRestResource implements Cat
throw WebResourceUtils.preconditionFailed("Item with id '%s:%s' not an enricher", enricherId, version);
} else {
brooklyn().getCatalog().deleteCatalogItem(item.getSymbolicName(), item.getVersion());
+ ((BasicBrooklynCatalog)brooklyn().getCatalog()).uninstallEmptyWrapperBundles();
}
}
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/LocationResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/LocationResource.java
index 7adc8f8..b06e05e 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/LocationResource.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/LocationResource.java
@@ -18,6 +18,7 @@
*/
package org.apache.brooklyn.rest.resources;
+import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
import static org.apache.brooklyn.rest.util.WebResourceUtils.serviceAbsoluteUriBuilder;
import java.net.URI;
@@ -192,6 +193,8 @@ public class LocationResource extends AbstractBrooklynRestResource implements Lo
// TODO make all locations be part of the catalog, then flip the JS GUI to use catalog api
if (deleteAllVersions(locationId)>0) return;
+ ((BasicBrooklynCatalog)brooklyn().getCatalog()).uninstallEmptyWrapperBundles();
+
throw WebResourceUtils.notFound("No catalog item location matching %s; only catalog item locations can be deleted", locationId);
}
[brooklyn-server] 03/14: better common ancestor tree logic
Posted by he...@apache.org.
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
commit 21cbd22b94af01c6939b7e21f60f088febb26efb
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Thu Sep 30 12:04:19 2021 +0100
better common ancestor tree logic
---
.../core/mgmt/internal/LocalEntityManager.java | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalEntityManager.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalEntityManager.java
index a62d402..7a7eb90 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalEntityManager.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalEntityManager.java
@@ -629,17 +629,17 @@ public class LocalEntityManager implements EntityManagerInternal {
Collection<Exception> exceptions = MutableSet.of();
try {
boolean inTaskForThisEntity = entity.equals(BrooklynTaskTags.getContextEntity(Tasks.current()));
- Task rootTask = null;
+ Set<String> currentAncestorIds = null;
Set<Task<?>> tasksCancelled = MutableSet.of();
for (Task<?> t: managementContext.getExecutionContext(entity).getTasks()) {
if (inTaskForThisEntity) {
- if (rootTask==null) {
- rootTask = getRootTask(Tasks.current());
+ if (currentAncestorIds==null) {
+ currentAncestorIds = getAncestorTaskIds(Tasks.current());
}
- if (Objects.equals(rootTask, getRootTask(t))) {
+ if (getAncestorTaskIds(t).stream().anyMatch(currentAncestorIds::contains)) {
// don't cancel the task if:
// - the current task is against this entity, and
- // - the current task and target task are part of the same root true
+ // - the current task and target task are part of the same root tree
// e.g. on "stop" don't cancel ourselves, don't cancel things our ancestors have submitted
// (direct ancestry check is not good enough, because we might be in a subtask of a deletion which has a DST manager,
// and cancelling the DST manager is almost as bad as cancelling ourselves);
@@ -696,13 +696,14 @@ public class LocalEntityManager implements EntityManagerInternal {
return hasTaskAsAncestor(t.getSubmittedByTask(), potentialAncestor);
}
- private Task<?> getRootTask(Task<?> t) {
- Task<?> result = t;
+ private Set<String> getAncestorTaskIds(Task<?> t) {
+ List<String> ancestorIds = MutableList.of();
while (t!=null) {
- result = t;
+ ancestorIds.add(t.getId());
t = t.getSubmittedByTask();
}
- return result;
+ Collections.reverse(ancestorIds);
+ return MutableSet.copyOf(ancestorIds);
}
/**
[brooklyn-server] 13/14: Merge pull request #12 from
cloudsoft/logging-user-installing-bundle
Posted by he...@apache.org.
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
commit 5dfe203d0a28087ecab7309a2d7b5a5498bd0cd4
Merge: 4af1d98 f344d9b
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Mon Oct 4 12:20:09 2021 +0100
Merge pull request #12 from cloudsoft/logging-user-installing-bundle
add who installs a bundle
.../apache/brooklyn/core/typereg/BrooklynCatalogBundleResolvers.java | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
[brooklyn-server] 05/14: Merge pull request #6 from
cloudsoft/fix/logbook/empty-line-log
Posted by he...@apache.org.
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
commit 662fe5b8f5e3f8451ffd762dc1de32f4e20ad34e
Merge: 1b8427d fb67f76
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Thu Sep 30 14:26:07 2021 +0100
Merge pull request #6 from cloudsoft/fix/logbook/empty-line-log
Improve log test and add explicit default LogStore value
.../org/apache/brooklyn/util/core/logbook/DelegatingLogStore.java | 4 ++--
.../java/org/apache/brooklyn/util/core/logbook/LogbookConfig.java | 2 +-
.../org/apache/brooklyn/util/core/logbook/file/FileLogStore.java | 6 ++++++
3 files changed, 9 insertions(+), 3 deletions(-)
[brooklyn-server] 06/14: Merge pull request #5 from
cloudsoft/fix-placeholder-tasks-different-id
Posted by he...@apache.org.
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
commit 672841e69a5289cf36dfd2c85a2635bd4f82ea16
Merge: 662fe5b 21cbd22
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Thu Sep 30 14:26:26 2021 +0100
Merge pull request #5 from cloudsoft/fix-placeholder-tasks-different-id
Fix bug where placeholder tasks have a different ID
.../core/mgmt/internal/LocalEntityManager.java | 19 +++++++-------
.../util/core/task/BasicExecutionManager.java | 11 ++------
.../apache/brooklyn/util/core/task/BasicTask.java | 30 +++++++++++++++++++++-
3 files changed, 41 insertions(+), 19 deletions(-)
[brooklyn-server] 09/14: add who installs a bundle
Posted by he...@apache.org.
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
commit f344d9b2a529cae68d82637cad370e1b31ec7e8f
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Fri Oct 1 19:26:48 2021 +0100
add who installs a bundle
---
.../apache/brooklyn/core/typereg/BrooklynCatalogBundleResolvers.java | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynCatalogBundleResolvers.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynCatalogBundleResolvers.java
index cee224c..5632bca 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynCatalogBundleResolvers.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynCatalogBundleResolvers.java
@@ -31,6 +31,7 @@ import org.apache.brooklyn.api.framework.FrameworkLookup;
import org.apache.brooklyn.api.mgmt.ManagementContext;
import org.apache.brooklyn.api.typereg.RegisteredType;
import org.apache.brooklyn.api.typereg.RegisteredTypeLoadingContext;
+import org.apache.brooklyn.core.mgmt.entitlement.Entitlements;
import org.apache.brooklyn.core.mgmt.ha.BrooklynBomOsgiArchiveInstaller;
import org.apache.brooklyn.core.mgmt.ha.BrooklynBomOsgiArchiveInstaller.PrepareInstallResult;
import org.apache.brooklyn.core.mgmt.ha.OsgiBundleInstallationResult;
@@ -109,7 +110,7 @@ public class BrooklynCatalogBundleResolvers {
public static ReferenceWithError<OsgiBundleInstallationResult> install(ManagementContext mgmt, Supplier<InputStream> input,
BundleInstallationOptions options) {
- LOG.debug("Installing bundle {} / {}", input, (options==null ? null : options.knownBundleMetadata));
+ LOG.debug("Installing bundle {} / {} for {}", input, (options==null ? null : options.knownBundleMetadata), Entitlements.getEntitlementContextUser());
File fileToDelete = null;
if (input==null && options.knownBundleMetadata==null) {
return ReferenceWithError.newInstanceThrowingError(null, new IllegalArgumentException("Bundle contents or reference must be supplied"));
@@ -152,7 +153,7 @@ public class BrooklynCatalogBundleResolvers {
firstResult = result.getWithoutError();
}
result.get(); // assert there is no error
- LOG.debug("Installed bundle {} / {}: {}: {}", input, (options==null ? null : options.knownBundleMetadata), result.get().getCode(), result.get().getMessage());
+ LOG.debug("Installed bundle {} / {} for {}: {}: {}", input, (options==null ? null : options.knownBundleMetadata), Entitlements.getEntitlementContextUser(), result.get().getCode(), result.get().getMessage());
return result;
} catch (@SuppressWarnings("deprecation") UnsupportedCatalogBundleException e) {
resolversWhoDontSupport.add(t.getFormatCode() +
[brooklyn-server] 01/14: when we create placeholder tasks for
forgotten submitters, keep the original ID
Posted by he...@apache.org.
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
commit b7f138d3b95a557dfd413edb6045e851e3b910a0
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Thu Sep 30 11:49:23 2021 +0100
when we create placeholder tasks for forgotten submitters, keep the original ID
this allows equals checks to pass
---
.../util/core/task/BasicExecutionManager.java | 11 ++------
.../apache/brooklyn/util/core/task/BasicTask.java | 30 +++++++++++++++++++++-
2 files changed, 31 insertions(+), 10 deletions(-)
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionManager.java b/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionManager.java
index 5f94d40..8afb111 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionManager.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionManager.java
@@ -70,6 +70,7 @@ import org.apache.brooklyn.util.collections.MutableList;
import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.collections.MutableSet;
import org.apache.brooklyn.util.core.task.BasicExecutionManager.BrooklynTaskLoggingMdc;
+import org.apache.brooklyn.util.core.task.BasicTask.PlaceholderTask;
import org.apache.brooklyn.util.core.task.TaskInternal.TaskCancellationMode;
import org.apache.brooklyn.util.exceptions.Exceptions;
import org.apache.brooklyn.util.exceptions.RuntimeInterruptedException;
@@ -1083,15 +1084,7 @@ public class BasicExecutionManager implements ExecutionManager {
}
private <T> Task<T> gone() {
- Task<T> t = Tasks.<T>builder().dynamic(false).displayName(displayName + " (placeholder for " + id + ")")
- .description("Details of the original task have been forgotten.")
- .body(Callables.returning((T) null)).build();
- // don't really want anyone executing the "gone" task...
- // also if we are GC'ing tasks then cancelled may help with cleanup
- // of sub-tasks that have lost their submitted-by-task reference ?
- // also don't want warnings when it's finalized, this means we don't need ignoreIfNotRun()
- ((BasicTask<T>) t).cancelled = true;
- return t;
+ return PlaceholderTask.newPlaceholderForForgottenTask(id, displayName);
}
}
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/BasicTask.java b/core/src/main/java/org/apache/brooklyn/util/core/task/BasicTask.java
index a6fe8d0..3a00082 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/BasicTask.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/BasicTask.java
@@ -18,6 +18,7 @@
*/
package org.apache.brooklyn.util.core.task;
+import com.google.common.util.concurrent.Callables;
import static org.apache.brooklyn.util.JavaGroovyEquivalents.asString;
import static org.apache.brooklyn.util.JavaGroovyEquivalents.elvisString;
@@ -45,6 +46,7 @@ import org.apache.brooklyn.api.mgmt.HasTaskChildren;
import org.apache.brooklyn.api.mgmt.Task;
import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
import org.apache.brooklyn.util.JavaGroovyEquivalents;
+import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.exceptions.Exceptions;
import org.apache.brooklyn.util.guava.Maybe;
import org.apache.brooklyn.util.text.Identifiers;
@@ -111,7 +113,7 @@ public class BasicTask<T> implements TaskInternal<T> {
*/
@Deprecated
protected BasicTask() { this(Collections.emptyMap()); }
-
+
protected BasicTask(Map<?,?> flags) { this(flags, (Callable<T>) null); }
public BasicTask(Callable<T> job) { this(Collections.emptyMap(), job); }
@@ -940,4 +942,30 @@ public class BasicTask<T> implements TaskInternal<T> {
public Task<?> getProxyTarget() {
return proxyTargetTask;
}
+
+ public static class PlaceholderTask extends BasicTask {
+ private PlaceholderTask(Map flags) {
+ super(flags);
+ }
+
+ public static PlaceholderTask newPlaceholderForForgottenTask(String id, String displayName) {
+ PlaceholderTask result = new PlaceholderTask(MutableMap.of(
+ "displayName", displayName + " (placeholder)",
+ "description", "Details of the original task have been forgotten."
+ ));
+
+ // since 2021-10 claim the ID of the thing we are placeholding so we get treated as an equal
+ ((BasicTask)result).id = id;
+
+ result.job = Callables.returning(null);
+
+ // don't really want anyone executing the "gone" task...
+ // also if we are GC'ing tasks then cancelled may help with cleanup
+ // of sub-tasks that have lost their submitted-by-task reference ?
+ // also don't want warnings when it's finalized, this means we don't need ignoreIfNotRun()
+ result.cancelled = true;
+
+ return result;
+ }
+ }
}
[brooklyn-server] 08/14: record that user-installed bundles are
deleteable
Posted by he...@apache.org.
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
commit f689b8196f8fa90e90d347e322d4aee470456dad
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Fri Oct 1 17:24:52 2021 +0100
record that user-installed bundles are deleteable
this saves it in persisted state and returns it via the rest api
---
.../mgmt/rebind/mementos/ManagedBundleMemento.java | 4 +++
.../brooklyn/api/typereg/OsgiBundleWithUrl.java | 4 +++
.../brooklyn/camp/brooklyn/AbstractYamlTest.java | 2 +-
.../camp/brooklyn/test/lite/CampYamlLiteTest.java | 2 +-
.../core/catalog/internal/CatalogBundleDto.java | 14 ++++++++-
.../catalog/internal/CatalogItemDtoAbstract.java | 3 +-
.../apache/brooklyn/core/mgmt/ha/OsgiManager.java | 5 ++++
.../brooklyn/core/mgmt/rebind/RebindIteration.java | 2 +-
.../core/mgmt/rebind/RebindManagerImpl.java | 33 ++++++++++------------
.../mgmt/rebind/dto/BasicManagedBundleMemento.java | 19 +++++++++++--
.../core/mgmt/rebind/dto/MementosGenerators.java | 2 ++
.../core/typereg/BasicBrooklynTypeRegistry.java | 2 +-
.../brooklyn/core/typereg/BasicManagedBundle.java | 27 +++++++++++++-----
.../core/typereg/BasicOsgiBundleWithUrl.java | 16 +++++++++--
.../BrooklynBomYamlCatalogBundleResolver.java | 4 +--
.../typereg/BrooklynCatalogBundleResolver.java | 7 +++++
.../apache/brooklyn/rest/domain/BundleSummary.java | 11 ++++++--
.../brooklyn/rest/resources/BundleResource.java | 2 +-
.../brooklyn/rest/resources/CatalogResource.java | 2 +-
.../brooklyn/rest/resources/ServerResource.java | 25 +++++++++++-----
20 files changed, 136 insertions(+), 50 deletions(-)
diff --git a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/ManagedBundleMemento.java b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/ManagedBundleMemento.java
index dba3c1c..e608608 100644
--- a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/ManagedBundleMemento.java
+++ b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/ManagedBundleMemento.java
@@ -37,4 +37,8 @@ public interface ManagedBundleMemento extends Memento {
ByteSource getJarContent();
void setJarContent(ByteSource byteSource);
+ @Nullable
+ /** whether the bundle is known to be able to be permanently deleteable (eg it was installed by a user) */
+ Boolean getDeleteable();
+
}
diff --git a/api/src/main/java/org/apache/brooklyn/api/typereg/OsgiBundleWithUrl.java b/api/src/main/java/org/apache/brooklyn/api/typereg/OsgiBundleWithUrl.java
index 8e245c1..9080c74 100644
--- a/api/src/main/java/org/apache/brooklyn/api/typereg/OsgiBundleWithUrl.java
+++ b/api/src/main/java/org/apache/brooklyn/api/typereg/OsgiBundleWithUrl.java
@@ -44,6 +44,10 @@ public interface OsgiBundleWithUrl {
/** @return true if we have a name and version for this bundle;
* false if not, e.g. if we only know the URL and we haven't loaded it yet */
public boolean isNameResolved();
+
+ /** @return whether this is known to be deleteable (eg installed by user) or known not to be (eg installed at boot and will be reinstalled)
+ * or unknown (null, probably installed at boot or before this info was kept) */
+ public Boolean getDeleteable();
/** @return the {@link VersionedName} for this bundle, or null if not available */
public VersionedName getVersionedName();
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractYamlTest.java
index 34e18d1..9f4d7f5 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractYamlTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractYamlTest.java
@@ -269,7 +269,7 @@ public abstract class AbstractYamlTest {
File bf = bundleMaker.createTempZip("test", MutableMap.of(
new ZipEntry(BasicBrooklynCatalog.CATALOG_BOM), new ByteArrayInputStream(catalogYaml.getBytes())));
ReferenceWithError<OsgiBundleInstallationResult> b = ((ManagementContextInternal)mgmt).getOsgiManager().get().installDeferredStart(
- new BasicManagedBundle(bundleName.getSymbolicName(), bundleName.getVersionString(), null, null, null, null),
+ new BasicManagedBundle(bundleName.getSymbolicName(), bundleName.getVersionString(), null, null, null, null, true),
InputStreamSource.of("tests:"+bundleName+":"+bf, bf),
false);
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/test/lite/CampYamlLiteTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/test/lite/CampYamlLiteTest.java
index 299b200..32114eb 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/test/lite/CampYamlLiteTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/test/lite/CampYamlLiteTest.java
@@ -213,7 +213,7 @@ public class CampYamlLiteTest {
// install bundle for class access but without loading its catalog.bom,
// since we only have mock matchers here
// (if we don't do this, the default routines install it and try to process the catalog.bom, failing)
- ((ManagementContextInternal)mgmt).getOsgiManager().get().installDeferredStart(new BasicManagedBundle(null, null, bundleUrl, null, null, null), null, false).get();
+ ((ManagementContextInternal)mgmt).getOsgiManager().get().installDeferredStart(new BasicManagedBundle(null, null, bundleUrl, null, null, null, true), null, false).get();
}
private void assertMgmtHasSampleMyCatalogApp(String symbolicName, String bundleUrl) {
diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleDto.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleDto.java
index 654a3f0..296a367 100644
--- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleDto.java
+++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleDto.java
@@ -39,14 +39,20 @@ public class CatalogBundleDto implements CatalogBundle {
private String version;
private String url;
private Credentials credential;
+ private Boolean deleteable;
public CatalogBundleDto() {}
+ @Deprecated /** @deprecated since 1.1 use larger constructor */
public CatalogBundleDto(String name, String version, String url) {
this(name, version, url, null);
}
+ @Deprecated /** @deprecated since 1.1 use larger constructor */
public CatalogBundleDto(String name, String version, String url, @Nullable Credentials credential) {
+ this(name, version, url, credential, null);
+ }
+ public CatalogBundleDto(String name, String version, String url, @Nullable Credentials credential, @Nullable Boolean deleteable) {
if (name == null && version == null) {
Preconditions.checkNotNull(url, "url to an OSGi bundle is required");
} else {
@@ -58,6 +64,7 @@ public class CatalogBundleDto implements CatalogBundle {
this.version = version==null ? null : BrooklynVersionSyntax.toValidOsgiVersion(version);
this.url = url;
this.credential = credential;
+ this.deleteable = deleteable;
}
@Override
@@ -97,6 +104,11 @@ public class CatalogBundleDto implements CatalogBundle {
}
@Override
+ public Boolean getDeleteable() {
+ return deleteable;
+ }
+
+ @Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("symbolicName", symbolicName)
@@ -128,7 +140,7 @@ public class CatalogBundleDto implements CatalogBundle {
if (osgi==null) return Maybe.absent("No OSGi manager");
Maybe<Bundle> b2 = osgi.findBundle(b);
if (b2.isAbsent()) return Maybe.absent("Nothing installed for "+b);
- return Maybe.of(new CatalogBundleDto(b2.get().getSymbolicName(), b2.get().getVersion().toString(), b.getUrl()));
+ return Maybe.of(new CatalogBundleDto(b2.get().getSymbolicName(), b2.get().getVersion().toString(), b.getUrl(), b.getUrlCredential(), b.getDeleteable()));
}
}
diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDtoAbstract.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDtoAbstract.java
index 99c43a5..7292bc4 100644
--- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDtoAbstract.java
+++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDtoAbstract.java
@@ -441,7 +441,8 @@ public abstract class CatalogItemDtoAbstract<T, SpecT> extends AbstractBrooklynO
bwu.getSymbolicName(),
bwu.getSuppliedVersionString(),
bwu.getUrl(),
- bwu.getUrlCredential()));
+ bwu.getUrlCredential(),
+ bwu.getDeleteable()));
} else if (object instanceof VersionedName) {
dto.add(new CatalogBundleDto(((VersionedName) object).getSymbolicName(), ((VersionedName) object).getVersionString(), null));
} else {
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java
index 5fe3eec..273cdb0 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java
@@ -443,10 +443,15 @@ public class OsgiManager {
return BrooklynCatalogBundleResolvers.install(getManagementContext(), zipIn, options);
}
+ @Deprecated /** @deprecated since 1.1 use larger variant of method */
public ReferenceWithError<OsgiBundleInstallationResult> install(Supplier<InputStream> input, String format, boolean force) {
+ return install(input, format, force, null);
+ }
+ public ReferenceWithError<OsgiBundleInstallationResult> install(Supplier<InputStream> input, String format, boolean force, Boolean deleteable) {
BundleInstallationOptions options = new BundleInstallationOptions();
options.setFormat(format);
options.setForceUpdateOfNonSnapshots(force);
+ options.setDeleteable(deleteable);
return BrooklynCatalogBundleResolvers.install(getManagementContext(), input, options);
}
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java
index cf96700..367e5ff 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java
@@ -1379,7 +1379,7 @@ public abstract class RebindIteration {
protected ManagedBundle newManagedBundle(ManagedBundleMemento memento) {
ManagedBundle result = new BasicManagedBundle(memento.getSymbolicName(), memento.getVersion(), memento.getUrl(),
- memento.getFormat(), null, memento.getChecksum());
+ memento.getFormat(), null, memento.getChecksum(), memento.getDeleteable());
FlagUtils.setFieldsFromFlags(ImmutableMap.of("id", memento.getId()), result);
return result;
}
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java
index c45c96f..81c254e 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java
@@ -504,15 +504,7 @@ public class RebindManagerImpl implements RebindManager {
// failure at various points should leave proxies in a sensible state,
// either pointing at old or at new, though this is relatively untested,
// and some things e.g. policies might not be properly started
- final RebindExceptionHandler exceptionHandler =
- RebindExceptionHandlerImpl.builder()
- .danglingRefFailureMode(danglingRefFailureMode)
- .danglingRefQuorumRequiredHealthy(danglingRefsQuorumRequiredHealthy)
- .rebindFailureMode(rebindFailureMode)
- .addConfigFailureMode(addConfigFailureMode)
- .addPolicyFailureMode(addPolicyFailureMode)
- .loadPolicyFailureMode(loadPolicyFailureMode)
- .build();
+ final RebindExceptionHandler exceptionHandler = newExceptionHandler();
final ManagementNodeState mode = getRebindMode();
ActivePartialRebindIteration iteration = new ActivePartialRebindIteration(this, mode, classLoader, exceptionHandler,
@@ -597,14 +589,7 @@ public class RebindManagerImpl implements RebindManager {
final ClassLoader classLoader = classLoaderO!=null ? classLoaderO :
managementContext.getCatalogClassLoader();
final RebindExceptionHandler exceptionHandler = exceptionHandlerO!=null ? exceptionHandlerO :
- RebindExceptionHandlerImpl.builder()
- .danglingRefFailureMode(danglingRefFailureMode)
- .danglingRefQuorumRequiredHealthy(danglingRefsQuorumRequiredHealthy)
- .rebindFailureMode(rebindFailureMode)
- .addConfigFailureMode(addConfigFailureMode)
- .addPolicyFailureMode(addPolicyFailureMode)
- .loadPolicyFailureMode(loadPolicyFailureMode)
- .build();
+ newExceptionHandler();
final ManagementNodeState mode = modeO!=null ? modeO : getRebindMode();
if (mode!=ManagementNodeState.MASTER && mode!=ManagementNodeState.HOT_STANDBY && mode!=ManagementNodeState.HOT_BACKUP)
@@ -619,7 +604,19 @@ public class RebindManagerImpl implements RebindManager {
return rebindImpl(classLoader, exceptionHandler, mode);
}
}
-
+
+ @Beta
+ public RebindExceptionHandler newExceptionHandler() {
+ return RebindExceptionHandlerImpl.builder()
+ .danglingRefFailureMode(danglingRefFailureMode)
+ .danglingRefQuorumRequiredHealthy(danglingRefsQuorumRequiredHealthy)
+ .rebindFailureMode(rebindFailureMode)
+ .addConfigFailureMode(addConfigFailureMode)
+ .addPolicyFailureMode(addPolicyFailureMode)
+ .loadPolicyFailureMode(loadPolicyFailureMode)
+ .build();
+ }
+
@Override
public BrooklynMementoRawData retrieveMementoRawData() {
RebindExceptionHandler exceptionHandler = RebindExceptionHandlerImpl.builder()
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BasicManagedBundleMemento.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BasicManagedBundleMemento.java
index 6d74587..a1d7d7f 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BasicManagedBundleMemento.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BasicManagedBundleMemento.java
@@ -44,7 +44,8 @@ public class BasicManagedBundleMemento extends AbstractMemento implements Manage
protected String format;
protected String url;
protected String checksum;
-
+ protected Boolean deleteable;
+
public Builder symbolicName(String symbolicName) {
this.symbolicName = symbolicName;
return self();
@@ -70,6 +71,11 @@ public class BasicManagedBundleMemento extends AbstractMemento implements Manage
return self();
}
+ public Builder deleteable(Boolean deleteable) {
+ this.deleteable = deleteable;
+ return self();
+ }
+
public Builder from(ManagedBundleMemento other) {
super.from(other);
symbolicName = other.getSymbolicName();
@@ -77,6 +83,7 @@ public class BasicManagedBundleMemento extends AbstractMemento implements Manage
format = other.getFormat();
url = other.getUrl();
checksum = other.getChecksum();
+ deleteable = other.getDeleteable();
return self();
}
@@ -90,6 +97,7 @@ public class BasicManagedBundleMemento extends AbstractMemento implements Manage
private String format;
private String url;
private String checksum;
+ private Boolean deleteable;
transient private ByteSource jarContent;
@SuppressWarnings("unused") // For deserialisation
@@ -102,6 +110,7 @@ public class BasicManagedBundleMemento extends AbstractMemento implements Manage
this.format = builder.format;
this.url = builder.url;
this.checksum = builder.checksum;
+ this.deleteable = builder.deleteable;
}
@Override
@@ -130,10 +139,13 @@ public class BasicManagedBundleMemento extends AbstractMemento implements Manage
}
@Override
+ public Boolean getDeleteable() { return deleteable; }
+
+ @Override
public ByteSource getJarContent() {
return jarContent;
}
-
+
@Override
public void setJarContent(ByteSource byteSource) {
this.jarContent = byteSource;
@@ -159,7 +171,8 @@ public class BasicManagedBundleMemento extends AbstractMemento implements Manage
.add("version", getVersion())
.add("format", getFormat())
.add("url", getUrl())
- .add("checksum", getChecksum());
+ .add("checksum", getChecksum())
+ .add("deleteable", getDeleteable());
}
@Override
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java
index 51e3e6f..187c1ac 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java
@@ -355,6 +355,8 @@ public class MementosGenerators {
builder.url(bundle.getUrl())
.symbolicName(bundle.getSymbolicName())
.version(bundle.getSuppliedVersionString())
+ .checksum(bundle.getChecksum())
+ .deleteable(bundle.getDeleteable())
.format(bundle.getFormat());
return builder.build();
}
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
index c47f808..0e8431a 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
@@ -515,7 +515,7 @@ public class BasicBrooklynTypeRegistry implements BrooklynTypeRegistry {
// if not osgi, everything is treated as a wrapper bundle
if (osgi.isAbsent()) return true;
VersionedName vn = VersionedName.fromString(bundleNameVersion);
- Maybe<Bundle> b = osgi.get().findBundle(new BasicOsgiBundleWithUrl(vn.getSymbolicName(), vn.getOsgiVersionString(), null));
+ Maybe<Bundle> b = osgi.get().findBundle(new BasicOsgiBundleWithUrl(vn.getSymbolicName(), vn.getOsgiVersionString(), null, null, null));
// if bundle not found it is an error or a race; we don't fail, but we shouldn't treat it as a wrapper
if (b.isAbsent()) return false;
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicManagedBundle.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicManagedBundle.java
index c921a31..826db9a 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicManagedBundle.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicManagedBundle.java
@@ -42,6 +42,7 @@ public class BasicManagedBundle extends AbstractBrooklynObject implements Manage
private String symbolicName;
private String version;
private String checksum;
+ private Boolean deleteable;
private String osgiUniqueUrl;
private String format;
private String url;
@@ -60,11 +61,16 @@ public class BasicManagedBundle extends AbstractBrooklynObject implements Manage
this(name, version, url, null, credentials, checksum);
}
+ /** @deprecated since 1.1 use larger constructor */ @Deprecated
public BasicManagedBundle(String name, String version, String url, String format, Credentials credentials, @Nullable String checksum) {
- init(name, version, url, format, credentials, checksum);
+ init(name, version, url, format, credentials, checksum, null);
+ }
+
+ public BasicManagedBundle(String name, String version, String url, String format, Credentials credentials, @Nullable String checksum, @Nullable Boolean deleteable) {
+ init(name, version, url, format, credentials, checksum, deleteable);
}
- private void init(String name, String version, String url, String format, Credentials credentials, @Nullable String checksum) {
+ private void init(String name, String version, String url, String format, Credentials credentials, @Nullable String checksum, @Nullable Boolean deleteable) {
if (name == null && version == null) {
Preconditions.checkNotNull(url, "Either a URL or both name and version are required");
} else {
@@ -77,18 +83,19 @@ public class BasicManagedBundle extends AbstractBrooklynObject implements Manage
this.format = format;
this.credentials = credentials;
this.checksum = checksum;
+ this.deleteable = deleteable;
}
- private BasicManagedBundle(String id, String name, String version, String url, String format, Credentials credentials, @Nullable String checksum) {
+ private BasicManagedBundle(String id, String name, String version, String url, String format, Credentials credentials, @Nullable String checksum, @Nullable Boolean deleteable) {
super(id);
- init(name, version, url, format, credentials, checksum);
+ init(name, version, url, format, credentials, checksum, deleteable);
}
/** used when updating a persisted bundle, we want to use the coords (ID and OSGI unique URL) of the second with the checksum of the former;
* the other fields should be the same between the two but if in doubt use the first argument
*/
public static BasicManagedBundle copyFirstWithCoordsOfSecond(ManagedBundle update, ManagedBundle oldOneForCoordinates) {
- BasicManagedBundle result = new BasicManagedBundle(oldOneForCoordinates.getId(), update.getSymbolicName(), update.getSuppliedVersionString(), update.getUrl(), update.getFormat(), update.getUrlCredential(), update.getChecksum());
+ BasicManagedBundle result = new BasicManagedBundle(oldOneForCoordinates.getId(), update.getSymbolicName(), update.getSuppliedVersionString(), update.getUrl(), update.getFormat(), update.getUrlCredential(), update.getChecksum(), update.getDeleteable());
// we have secondary logic which should accept a change in the OSGi unique URL,
// but more efficient if we use the original URL
result.osgiUniqueUrl = oldOneForCoordinates.getOsgiUniqueUrl();
@@ -99,7 +106,12 @@ public class BasicManagedBundle extends AbstractBrooklynObject implements Manage
public boolean isNameResolved() {
return symbolicName != null && version != null;
}
-
+
+ @Override
+ public Boolean getDeleteable() {
+ return deleteable;
+ }
+
@Override
public String getSymbolicName() {
return symbolicName;
@@ -264,7 +276,8 @@ public class BasicManagedBundle extends AbstractBrooklynObject implements Manage
bundle.getUrl(),
null,
bundle.getUrlCredential(),
- checksum);
+ checksum,
+ bundle instanceof ManagedBundle ? ((ManagedBundle)bundle).getDeleteable() : null);
}
public void setPersistenceNeeded(boolean val) {
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java
index a644224..e218fdd 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java
@@ -34,17 +34,23 @@ public class BasicOsgiBundleWithUrl implements CatalogBundle, OsgiBundleWithUrl
private String symbolicName;
private String version;
private String url;
+ private Boolean deleteable;
private Credentials credential;
// for deserializing (not sure if needed?)
@SuppressWarnings("unused")
private BasicOsgiBundleWithUrl() {}
+ @Deprecated /** @deprecated since 1.1 use larger constructor */
public BasicOsgiBundleWithUrl(String name, String version, String url) {
this(name, version, url, null);
}
-
+ @Deprecated /** @deprecated since 1.1 use larger constructor */
public BasicOsgiBundleWithUrl(String name, String version, String url, @Nullable Credentials cred) {
+ this(name, version, url, cred, null);
+ }
+
+ public BasicOsgiBundleWithUrl(String name, String version, String url, @Nullable Credentials cred, @Nullable Boolean deleteable) {
if (name == null && version == null) {
Preconditions.checkNotNull(url, "Either a URL or both name and version are required");
} else {
@@ -56,10 +62,11 @@ public class BasicOsgiBundleWithUrl implements CatalogBundle, OsgiBundleWithUrl
this.version = version;
this.url = url;
this.credential = cred;
+ this.deleteable = deleteable;
}
public BasicOsgiBundleWithUrl(OsgiBundleWithUrl b) {
- this(b.getSymbolicName(), b.getSuppliedVersionString(), b.getUrl());
+ this(b.getSymbolicName(), b.getSuppliedVersionString(), b.getUrl(), b.getUrlCredential(), b.getDeleteable());
}
@Override
@@ -99,6 +106,11 @@ public class BasicOsgiBundleWithUrl implements CatalogBundle, OsgiBundleWithUrl
}
@Override
+ public Boolean getDeleteable() {
+ return deleteable;
+ }
+
+ @Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("symbolicName", symbolicName)
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynBomYamlCatalogBundleResolver.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynBomYamlCatalogBundleResolver.java
index f7203d2..110533c 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynBomYamlCatalogBundleResolver.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynBomYamlCatalogBundleResolver.java
@@ -31,9 +31,7 @@ import org.apache.brooklyn.core.mgmt.ha.OsgiBundleInstallationResult;
import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.core.osgi.BundleMaker;
-import org.apache.brooklyn.util.exceptions.Exceptions;
import org.apache.brooklyn.util.exceptions.ReferenceWithError;
-import org.apache.brooklyn.util.guava.Maybe;
import org.apache.brooklyn.util.osgi.VersionedName;
import org.apache.brooklyn.util.stream.InputStreamSource;
import org.apache.brooklyn.util.stream.Streams;
@@ -118,7 +116,7 @@ public class BrooklynBomYamlCatalogBundleResolver extends AbstractCatalogBundleR
BasicManagedBundle basicManagedBundle = new BasicManagedBundle(vn.getSymbolicName(), vn.getVersionString(),
null, BrooklynBomBundleCatalogBundleResolver.FORMAT,
- null, null);
+ null, null, options.getDeleteable());
// if the submitted blueprint contains tags, we set them on the bundle, so they can be picked up and used to tag the plan.
if( cm.containsKey("tags") && cm.get("tags") instanceof Iterable) {
basicManagedBundle.tags().addTags((Iterable<?>)cm.get("tags"));
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynCatalogBundleResolver.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynCatalogBundleResolver.java
index 685037b..5ee5286 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynCatalogBundleResolver.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynCatalogBundleResolver.java
@@ -99,6 +99,7 @@ public interface BrooklynCatalogBundleResolver extends ManagementContextInjectab
protected boolean deferredStart = false;
protected boolean start = true;
protected boolean loadCatalogBom = true;
+ protected Boolean deleteable = null;
protected ManagedBundle knownBundleMetadata = null;
public void setFormat(String format) {
@@ -156,6 +157,12 @@ public interface BrooklynCatalogBundleResolver extends ManagementContextInjectab
public boolean isValidateTypes() {
return validateTypes;
}
+
+ public Boolean getDeleteable() { return deleteable; }
+
+ public void setDeleteable(Boolean deleteable) {
+ this.deleteable = deleteable;
+ }
}
}
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/BundleSummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/BundleSummary.java
index c8f442b..bb93fb0 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/BundleSummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/BundleSummary.java
@@ -49,7 +49,10 @@ public class BundleSummary implements Comparable<BundleSummary> {
@JsonInclude(value=Include.ALWAYS)
private final List<TypeSummary> types = MutableList.of();
-
+
+ @JsonInclude(value=Include.NON_NULL)
+ private final Boolean deleteable;
+
// not exported directly, but used to provide other top-level json fields
// for specific types
@JsonIgnore
@@ -59,11 +62,13 @@ public class BundleSummary implements Comparable<BundleSummary> {
BundleSummary() {
symbolicName = null;
version = null;
+ deleteable = null;
}
public BundleSummary(OsgiBundleWithUrl bundle) {
symbolicName = bundle.getSymbolicName();
version = bundle.getSuppliedVersionString();
+ deleteable = bundle.getDeleteable();
}
/** Mutable map of other top-level metadata included on this DTO (eg listing config keys or effectors) */
@@ -98,7 +103,9 @@ public class BundleSummary implements Comparable<BundleSummary> {
public List<TypeSummary> getTypes() {
return types;
}
-
+
+ public Boolean getDeleteable() { return deleteable; }
+
@Override
public String toString() {
return JavaClassNames.cleanSimpleClassName(this)+"["+symbolicName+":"+version+"]";
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/BundleResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/BundleResource.java
index 04bfbca..1b8cd13 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/BundleResource.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/BundleResource.java
@@ -222,7 +222,7 @@ public class BundleResource extends AbstractBrooklynRestResource implements Bund
if (force==null) force = false;
ReferenceWithError<OsgiBundleInstallationResult> result = ((ManagementContextInternal)mgmt()).getOsgiManager().get()
- .install(source, format, force);
+ .install(source, format, force, true);
if (result.hasError()) {
// (rollback already done as part of install, if necessary)
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java
index 7fc43d7..f3187c1 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java
@@ -153,7 +153,7 @@ public class CatalogResource extends AbstractBrooklynRestResource implements Cat
}
ReferenceWithError<OsgiBundleInstallationResult> result = ((ManagementContextInternal)mgmt()).getOsgiManager().get()
- .install(source, format, forceUpdate);
+ .install(source, format, forceUpdate, true);
if (result.hasError()) {
// (rollback already done as part of install, if necessary)
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java
index 1706b80..33f4ef3 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java
@@ -44,7 +44,9 @@ import org.apache.brooklyn.api.mgmt.ha.ManagementPlaneSyncRecord;
import org.apache.brooklyn.api.mgmt.ha.MementoCopyMode;
import org.apache.brooklyn.api.mgmt.rebind.PersistenceExceptionHandler;
import org.apache.brooklyn.api.mgmt.rebind.RebindManager;
+import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoManifest;
import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoRawData;
+import org.apache.brooklyn.api.mgmt.rebind.mementos.ManagedBundleMemento;
import org.apache.brooklyn.config.ConfigKey;
import org.apache.brooklyn.core.BrooklynVersion;
import org.apache.brooklyn.core.config.ConfigKeys;
@@ -61,6 +63,7 @@ import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
import org.apache.brooklyn.core.mgmt.persist.*;
import org.apache.brooklyn.core.mgmt.rebind.PersistenceExceptionHandlerImpl;
+import org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl;
import org.apache.brooklyn.core.server.BrooklynServerPaths;
import org.apache.brooklyn.rest.api.ServerApi;
import org.apache.brooklyn.rest.domain.*;
@@ -588,16 +591,18 @@ public class ServerResource extends AbstractBrooklynRestResource implements Serv
// create raw memento of persisted state to be imported
BrooklynMementoRawData newMementoRawData = tempMgmt.getRebindManager().retrieveMementoRawData();
+ BrooklynMementoManifest mementoManifest = persister.loadMementoManifest(newMementoRawData,
+ ((RebindManagerImpl)rebindManager).newExceptionHandler());
// install bundles to active management context
for (Map.Entry<String, ByteSource> bundleJar : newMementoRawData.getBundleJars().entrySet()){
+ ManagedBundleMemento memento = mementoManifest.getBundle(bundleJar.getKey());
+ log.debug("Installing "+memento+" as part of persisted state import");
ReferenceWithError<OsgiBundleInstallationResult> bundleInstallResult = ((ManagementContextInternal)mgmt()).getOsgiManager().get()
- .install(InputStreamSource.of("Persistence import - bundle install", bundleJar.getValue().read()), "", false);
+ .install(InputStreamSource.of("Persistence import - bundle install - "+memento, bundleJar.getValue().read()), "", false, memento.getDeleteable());
if (bundleInstallResult.hasError()) {
- if (log.isTraceEnabled()) {
- log.trace("Unable to create, format '', returning 400: "+bundleInstallResult.getError().getMessage(), bundleInstallResult.getError());
- }
+ log.debug("Unable to create "+memento+", format '', throwing: "+bundleInstallResult.getError().getMessage(), bundleInstallResult.getError());
String errorMsg = "";
if (bundleInstallResult.getWithoutError()!=null) {
errorMsg = bundleInstallResult.getWithoutError().getMessage();
@@ -607,20 +612,26 @@ public class ServerResource extends AbstractBrooklynRestResource implements Serv
throw new Exception(errorMsg);
}
if (!OsgiBundleInstallationResult.ResultCode.IGNORING_BUNDLE_AREADY_INSTALLED.equals(bundleInstallResult.get().getCode()) && !OsgiBundleInstallationResult.ResultCode.UPDATED_EXISTING_BUNDLE.equals(bundleInstallResult.get().getCode())) {
- TypeTransformer.bundleInstallationResult(bundleInstallResult.get(), mgmt(), brooklyn(), ui);
+ BundleInstallationRestResult result = TypeTransformer.bundleInstallationResult(bundleInstallResult.get(), mgmt(), brooklyn(), ui);
+ log.debug("Installed "+memento+" as part of persisted state import: "+result);
+ } else {
+ log.debug("Installation of " + memento + " reported: " + bundleInstallResult.get());
}
}
- // write persisted items and rebind to load applications
+ // store persisted items and rebind to load applications
BrooklynMementoRawData.Builder result = BrooklynMementoRawData.builder();
+
+ // bundles already initialized
+// result.bundles(newMementoRawData.getBundles());
+
result.planeId(mgmt().getManagementPlaneIdMaybe().orNull());
result.entities(newMementoRawData.getEntities());
result.locations(newMementoRawData.getLocations());
result.policies(newMementoRawData.getPolicies());
result.enrichers(newMementoRawData.getEnrichers());
result.feeds(newMementoRawData.getFeeds());
- result.feeds(newMementoRawData.getFeeds());
result.catalogItems(newMementoRawData.getCatalogItems());
PersistenceObjectStore currentPersistenceStore = ((BrooklynMementoPersisterToObjectStore) mgmt().getRebindManager().getPersister()).getObjectStore();
[brooklyn-server] 10/14: add support for blocking selected DSL
expressions
Posted by he...@apache.org.
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
commit 3d9b3324ab5724962d800ca58bb51a60d34a9f2d
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Fri Oct 1 21:44:04 2021 +0100
add support for blocking selected DSL expressions
---
.../brooklyn/camp/brooklyn/ConfigYamlTest.java | 33 ++++++++++++++++++++++
.../org/apache/brooklyn/core/config/Sanitizer.java | 26 +++++++++++++++++
.../brooklyn/core/server/BrooklynServerConfig.java | 2 ++
.../core/typereg/AbstractTypePlanTransformer.java | 31 ++++++++++++++++----
4 files changed, 87 insertions(+), 5 deletions(-)
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigYamlTest.java
index 90d2feb..9ede4a1 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigYamlTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigYamlTest.java
@@ -576,6 +576,39 @@ public class ConfigYamlTest extends AbstractYamlTest {
});
}
+ @Test
+ public void testSensitiveConfigDslWorksOrFailsDependingHowConfigured() throws Exception {
+ String yaml = Joiner.on("\n").join(
+ "services:",
+ "- type: org.apache.brooklyn.core.test.entity.TestEntity",
+ " brooklyn.config:",
+ " secret1: $brooklyn:literal(\"myval\")");
+
+ // allowed
+ withSensitiveFieldsBlocked(() -> {
+ return createStartWaitAndLogApplication(yaml);
+ });
+
+ Asserts.assertFailsWith(() -> {
+ return withSensitiveFieldsBlocked(() -> {
+ String oldValue =
+ //((BrooklynProperties) mgmt().getConfig()).put(BrooklynServerConfig.SENSITIVE_FIELDS_PLAINTEXT_BLOCKED, true);
+ System.setProperty(BrooklynServerConfig.SENSITIVE_FIELDS_EXT_BLOCKED_PHRASES.getName(), "[ \"$brooklyn:literal\" ]");
+ Sanitizer.getSensitiveFieldsTokens(true);
+ try {
+ return createStartWaitAndLogApplication(yaml);
+ } finally {
+ System.setProperty(BrooklynServerConfig.SENSITIVE_FIELDS_EXT_BLOCKED_PHRASES.getName(), oldValue!=null ? oldValue : "");
+ Sanitizer.getSensitiveFieldsTokens(true);
+ }
+ });
+ }, e -> {
+ Asserts.expectedFailureContainsIgnoreCase(e, "literal");
+ Asserts.expectedFailureDoesNotContain(e, "myval");
+ return true;
+ });
+ }
+
@Beta
public static <T> T withSensitiveFieldsBlocked(Callable<T> r) throws Exception {
String oldValue =
diff --git a/core/src/main/java/org/apache/brooklyn/core/config/Sanitizer.java b/core/src/main/java/org/apache/brooklyn/core/config/Sanitizer.java
index 418fc5b..a4b4669 100644
--- a/core/src/main/java/org/apache/brooklyn/core/config/Sanitizer.java
+++ b/core/src/main/java/org/apache/brooklyn/core/config/Sanitizer.java
@@ -32,6 +32,7 @@ import java.util.stream.Collectors;
import org.apache.brooklyn.api.mgmt.ManagementContext;
import org.apache.brooklyn.config.ConfigKey;
import org.apache.brooklyn.core.server.BrooklynServerConfig;
+import org.apache.brooklyn.util.collections.MutableList;
import org.apache.brooklyn.util.collections.MutableSet;
import org.apache.brooklyn.util.core.config.ConfigBag;
import org.apache.brooklyn.util.core.flags.TypeCoercions;
@@ -45,6 +46,7 @@ public final class Sanitizer {
public static final ConfigKey<List<String>> SENSITIVE_FIELDS_TOKENS = BrooklynServerConfig.SENSITIVE_FIELDS_TOKENS;
public static final ConfigKey<Boolean> SENSITIVE_FIELDS_PLAINTEXT_BLOCKED = BrooklynServerConfig.SENSITIVE_FIELDS_PLAINTEXT_BLOCKED;
+ public static final ConfigKey<List<String>> SENSITIVE_FIELDS_EXT_BLOCKED_PHRASES = BrooklynServerConfig.SENSITIVE_FIELDS_EXT_BLOCKED_PHRASES;
/**
* Names that, if they appear anywhere in an attribute/config/field
@@ -64,6 +66,8 @@ public final class Sanitizer {
private static List<String> LAST_SENSITIVE_FIELDS_TOKENS = null;
private static Boolean LAST_SENSITIVE_FIELDS_PLAINTEXT_BLOCKED = null;
+ private static List<String> LAST_SENSITIVE_FIELDS_EXT_BLOCKED_PHRASES = null;
+
private static long LAST_SENSITIVE_FIELDS_LOAD_TIME = -1;
private static long LAST_SENSITIVE_FIELDS_CACHE_MILLIS = 60*1000;
@@ -83,9 +87,11 @@ public final class Sanitizer {
ManagementContext mgmt = Osgis.getManagementContext();
List<String> tokens = null;
Boolean plaintextBlocked = null;
+ List<String> extPhrases = null;
if (mgmt != null) {
tokens = mgmt.getConfig().getConfig(SENSITIVE_FIELDS_TOKENS);
plaintextBlocked = mgmt.getConfig().getConfig(SENSITIVE_FIELDS_PLAINTEXT_BLOCKED);
+ extPhrases = mgmt.getConfig().getConfig(SENSITIVE_FIELDS_EXT_BLOCKED_PHRASES);
}
if (tokens==null) {
@@ -108,8 +114,19 @@ public final class Sanitizer {
plaintextBlocked = Boolean.FALSE;
}
+ if (extPhrases==null) {
+ StringSystemProperty extPhrasesSP = new StringSystemProperty(SENSITIVE_FIELDS_EXT_BLOCKED_PHRASES.getName());
+ if (extPhrasesSP.isNonEmpty()) {
+ extPhrases = TypeCoercions.coerce(extPhrasesSP.getValue(), SENSITIVE_FIELDS_EXT_BLOCKED_PHRASES.getTypeToken());
+ }
+ }
+ if (extPhrases==null) {
+ extPhrases = MutableList.of();
+ }
+
LAST_SENSITIVE_FIELDS_TOKENS = tokens.stream().map(String::toLowerCase).collect(Collectors.toList());
LAST_SENSITIVE_FIELDS_PLAINTEXT_BLOCKED = plaintextBlocked;
+ LAST_SENSITIVE_FIELDS_EXT_BLOCKED_PHRASES = extPhrases;
LAST_SENSITIVE_FIELDS_LOAD_TIME = System.currentTimeMillis();
}
}
@@ -131,6 +148,15 @@ public final class Sanitizer {
return LAST_SENSITIVE_FIELDS_PLAINTEXT_BLOCKED;
}
+ public static List<String> getSensitiveFieldsExtBlockedPhrases() {
+ return getSensitiveFieldsExtBlockedPhrases(null);
+ }
+ public static List<String> getSensitiveFieldsExtBlockedPhrases(Boolean refresh) {
+ refreshProperties(refresh);
+ return LAST_SENSITIVE_FIELDS_EXT_BLOCKED_PHRASES;
+ }
+
+
public static final Predicate<Object> IS_SECRET_PREDICATE = new IsSecretPredicate();
public static Object suppressIfSecret(Object key, Object value) {
diff --git a/core/src/main/java/org/apache/brooklyn/core/server/BrooklynServerConfig.java b/core/src/main/java/org/apache/brooklyn/core/server/BrooklynServerConfig.java
index 058ab78..fc6979e 100644
--- a/core/src/main/java/org/apache/brooklyn/core/server/BrooklynServerConfig.java
+++ b/core/src/main/java/org/apache/brooklyn/core/server/BrooklynServerConfig.java
@@ -175,5 +175,7 @@ public class BrooklynServerConfig {
"List of tokens which get treated as sensitive-named fields and suppressed in many places");
public static final ConfigKey<Boolean> SENSITIVE_FIELDS_PLAINTEXT_BLOCKED = ConfigKeys.newBooleanConfigKey("brooklyn.security.sensitive.fields.plaintext.blocked",
"Whether plaintext values for sensitive-named fields are blocked");
+ public static final ConfigKey<List<String>> SENSITIVE_FIELDS_EXT_BLOCKED_PHRASES = ConfigKeys.newConfigKey(new TypeToken<List<String>>() {}, "brooklyn.security.sensitive.fields.ext.blocked.phrases",
+ "Extended blocking settings when plaintext values are blocked, allowing also to block DSL and complex values which contain any of the phrases supplied in this config key (comma-separated list)");
}
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java b/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
index 6f14c2f..92dce59 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
@@ -249,29 +249,50 @@ public abstract class AbstractTypePlanTransformer implements BrooklynTypePlanTra
}
public static void failOnInsecureValueForSensitiveNamedField(Predicate<Object> tokens, String key, Object val) {
- if (val instanceof DeferredSupplier || val==null) {
- // value allowed; key is irrelevant
+ if (val==null) {
+ // not set; key is irrelevant
return;
}
+
if (!tokens.apply(key)) {
// not a sensitive named key
return;
}
+ if (val instanceof DeferredSupplier || val==null) {
+ // allows unless phrase blocked
+ failOnExtBlockedPhraseInValueForSensitiveNamedField(key, val);
+ return;
+ }
+
// sensitive named key
if (val instanceof String) {
if (((String) val).startsWith("$brooklyn:")) {
- // DSL expression, allow
+ // DSL expression, allow unless phrase blocked
+ failOnExtBlockedPhraseInValueForSensitiveNamedField(key, val);
return;
}
}
if (val instanceof String || Boxing.isPrimitiveOrBoxedClass(val.getClass()) || val instanceof Number) {
// non-DSL plaintext value
- throw new IllegalStateException("Insecure value supplied for '"+key+"'; external suppliers must be used here");
+ throw new IllegalStateException("Insecure value supplied for '"+key+"'; external suppliers should be used here");
+ }
+
+ // complex values allowed unless phrase blocked
+ failOnExtBlockedPhraseInValueForSensitiveNamedField(key, val);
+ }
+
+ private static void failOnExtBlockedPhraseInValueForSensitiveNamedField(String key, Object value) {
+ List<String> blockedPhrases = Sanitizer.getSensitiveFieldsExtBlockedPhrases();
+ if (blockedPhrases==null || blockedPhrases.isEmpty()) return;
+ String valS = ""+value;
+ for (String blockedPhrase: blockedPhrases) {
+ if (valS.contains(blockedPhrase)) {
+ throw new IllegalStateException("Improperly secured value supplied for '"+key+"'; value must not contain '"+blockedPhrase+"'");
+ }
}
- // complex values allowed
}
}
[brooklyn-server] 12/14: Merge pull request #11 from
cloudsoft/configurable-blacklist
Posted by he...@apache.org.
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
commit 4af1d9842a066dd7d6abbb3a9f66f3ee0e9c8262
Merge: 155cb03 3d9b332
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Mon Oct 4 12:18:35 2021 +0100
Merge pull request #11 from cloudsoft/configurable-blacklist
Configurable exclude-list of tokens for DSL values of sensitive field
.../brooklyn/camp/brooklyn/ConfigYamlTest.java | 33 ++++++++++++++++++++++
.../org/apache/brooklyn/core/config/Sanitizer.java | 26 +++++++++++++++++
.../brooklyn/core/server/BrooklynServerConfig.java | 2 ++
.../core/typereg/AbstractTypePlanTransformer.java | 31 ++++++++++++++++----
4 files changed, 87 insertions(+), 5 deletions(-)
[brooklyn-server] 02/14: Improve log test and add explicid default
LogStore value
Posted by he...@apache.org.
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
commit 8af7f6c678aed942b408ecf14a79186e990122f1
Author: Juan Cabrerizo <ju...@cloudsoft.io>
AuthorDate: Thu Sep 30 11:57:17 2021 +0100
Improve log test and add explicid default LogStore value
---
.../org/apache/brooklyn/util/core/logbook/DelegatingLogStore.java | 4 ++--
.../java/org/apache/brooklyn/util/core/logbook/LogbookConfig.java | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/logbook/DelegatingLogStore.java b/core/src/main/java/org/apache/brooklyn/util/core/logbook/DelegatingLogStore.java
index dc21341..c5d8909 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/logbook/DelegatingLogStore.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/logbook/DelegatingLogStore.java
@@ -61,13 +61,13 @@ public class DelegatingLogStore implements LogStore {
String className = brooklynProperties.getConfig(LogbookConfig.LOGBOOK_LOG_STORE_CLASSNAME);
try {
// TODO implement logic to allow to inject the implementation from other bundle.
- log.info("Brooklyn Logbook: using log store " + className);
ClassLoaderUtils clu = new ClassLoaderUtils(this, mgmt);
Class<? extends LogStore> clazz = (Class<? extends LogStore>) clu.loadClass(className);
delegate = createLogStoreProviderInstance(mgmt, clazz);
+ log.info("Brooklyn Logbook: using log store " + className);
} catch (Exception e) {
log.warn("Brooklyn Logbook: unable to instantiate Log Store '" + className + "'. Fall back on FileLogStore", e.getMessage());
- log.debug("", e);
+ log.debug("Exception thrown trying to instantiate {} as LogStore:", className, e);
delegate = new FileLogStore(mgmt);
}
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/logbook/LogbookConfig.java b/core/src/main/java/org/apache/brooklyn/util/core/logbook/LogbookConfig.java
index d93dfd3..5c8ea14 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/logbook/LogbookConfig.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/logbook/LogbookConfig.java
@@ -25,7 +25,7 @@ public class LogbookConfig {
public final static String BASE_NAME_LOGBOOK = "brooklyn.logbook";
public final static ConfigKey<String> LOGBOOK_LOG_STORE_CLASSNAME = ConfigKeys.newStringConfigKey(
- BASE_NAME_LOGBOOK + ".logStore", "Log store implementation class name");
+ BASE_NAME_LOGBOOK + ".logStore", "Log store implementation class name","org.apache.brooklyn.util.core.logbook.file.FileLogStore");
public final static ConfigKey<LogStore> LOGBOOK_LOG_STORE_INSTANCE = ConfigKeys.newConfigKey(LogStore.class,
LOGBOOK_LOG_STORE_CLASSNAME.getName() + ".internal.instance", "instance of a pre-configured log store");
[brooklyn-server] 11/14: Merge pull request #8 from
cloudsoft/fix-catalog-deletion-bundles-and-transient
Posted by he...@apache.org.
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
commit 155cb0325481200fefbda6bd77f19ef5b3f25b7b
Merge: 672841e f689b81
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Mon Oct 4 12:17:10 2021 +0100
Merge pull request #8 from cloudsoft/fix-catalog-deletion-bundles-and-transient
Fix catalog deletion bundles and transient
.../mgmt/rebind/mementos/ManagedBundleMemento.java | 4 +++
.../brooklyn/api/typereg/OsgiBundleWithUrl.java | 4 +++
.../brooklyn/camp/brooklyn/AbstractYamlTest.java | 2 +-
.../camp/brooklyn/test/lite/CampYamlLiteTest.java | 2 +-
.../core/catalog/internal/CatalogBundleDto.java | 14 ++++++++-
.../catalog/internal/CatalogItemDtoAbstract.java | 3 +-
.../apache/brooklyn/core/mgmt/ha/OsgiManager.java | 5 ++++
.../brooklyn/core/mgmt/rebind/RebindIteration.java | 2 +-
.../core/mgmt/rebind/RebindManagerImpl.java | 33 ++++++++++------------
.../mgmt/rebind/dto/BasicManagedBundleMemento.java | 19 +++++++++++--
.../core/mgmt/rebind/dto/MementosGenerators.java | 2 ++
.../core/typereg/BasicBrooklynTypeRegistry.java | 2 +-
.../brooklyn/core/typereg/BasicManagedBundle.java | 27 +++++++++++++-----
.../core/typereg/BasicOsgiBundleWithUrl.java | 16 +++++++++--
.../BrooklynBomYamlCatalogBundleResolver.java | 4 +--
.../typereg/BrooklynCatalogBundleResolver.java | 7 +++++
.../apache/brooklyn/rest/domain/BundleSummary.java | 11 ++++++--
.../brooklyn/rest/resources/BundleResource.java | 2 +-
.../brooklyn/rest/resources/CatalogResource.java | 7 ++++-
.../brooklyn/rest/resources/LocationResource.java | 3 ++
.../brooklyn/rest/resources/ServerResource.java | 25 +++++++++++-----
21 files changed, 144 insertions(+), 50 deletions(-)
[brooklyn-server] 14/14: Merge branch 'misc-updates'
Posted by he...@apache.org.
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
commit e5da7634ea02926396fe9bc4902c9cde2c8778c2
Merge: 90844d2 5dfe203
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Mon Oct 4 12:21:24 2021 +0100
Merge branch 'misc-updates'
.../mgmt/rebind/mementos/ManagedBundleMemento.java | 4 +++
.../brooklyn/api/typereg/OsgiBundleWithUrl.java | 4 +++
.../brooklyn/camp/brooklyn/AbstractYamlTest.java | 2 +-
.../brooklyn/camp/brooklyn/ConfigYamlTest.java | 33 ++++++++++++++++++++++
.../camp/brooklyn/test/lite/CampYamlLiteTest.java | 2 +-
.../core/catalog/internal/CatalogBundleDto.java | 14 ++++++++-
.../catalog/internal/CatalogItemDtoAbstract.java | 3 +-
.../org/apache/brooklyn/core/config/Sanitizer.java | 26 +++++++++++++++++
.../apache/brooklyn/core/mgmt/ha/OsgiManager.java | 5 ++++
.../core/mgmt/internal/LocalEntityManager.java | 19 +++++++------
.../brooklyn/core/mgmt/rebind/RebindIteration.java | 2 +-
.../core/mgmt/rebind/RebindManagerImpl.java | 33 ++++++++++------------
.../mgmt/rebind/dto/BasicManagedBundleMemento.java | 19 +++++++++++--
.../core/mgmt/rebind/dto/MementosGenerators.java | 2 ++
.../brooklyn/core/server/BrooklynServerConfig.java | 2 ++
.../core/typereg/AbstractTypePlanTransformer.java | 31 ++++++++++++++++----
.../core/typereg/BasicBrooklynTypeRegistry.java | 2 +-
.../brooklyn/core/typereg/BasicManagedBundle.java | 27 +++++++++++++-----
.../core/typereg/BasicOsgiBundleWithUrl.java | 16 +++++++++--
.../BrooklynBomYamlCatalogBundleResolver.java | 4 +--
.../typereg/BrooklynCatalogBundleResolver.java | 7 +++++
.../typereg/BrooklynCatalogBundleResolvers.java | 5 ++--
.../util/core/logbook/DelegatingLogStore.java | 4 +--
.../brooklyn/util/core/logbook/LogbookConfig.java | 2 +-
.../util/core/logbook/file/FileLogStore.java | 6 ++++
.../util/core/task/BasicExecutionManager.java | 11 ++------
.../apache/brooklyn/util/core/task/BasicTask.java | 30 +++++++++++++++++++-
.../apache/brooklyn/rest/domain/BundleSummary.java | 11 ++++++--
.../brooklyn/rest/resources/BundleResource.java | 2 +-
.../brooklyn/rest/resources/CatalogResource.java | 7 ++++-
.../brooklyn/rest/resources/LocationResource.java | 3 ++
.../brooklyn/rest/resources/ServerResource.java | 25 +++++++++++-----
32 files changed, 284 insertions(+), 79 deletions(-)
[brooklyn-server] 04/14: Addressing comments
Posted by he...@apache.org.
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
commit fb67f765c03475e99ed8ab1270a5e0d03d0da4f2
Author: Juan Cabrerizo <ju...@cloudsoft.io>
AuthorDate: Thu Sep 30 14:04:44 2021 +0100
Addressing comments
---
.../org/apache/brooklyn/util/core/logbook/file/FileLogStore.java | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/logbook/file/FileLogStore.java b/core/src/main/java/org/apache/brooklyn/util/core/logbook/file/FileLogStore.java
index 17304b7..c281c59 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/logbook/file/FileLogStore.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/logbook/file/FileLogStore.java
@@ -47,12 +47,18 @@ import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.apache.brooklyn.util.core.logbook.LogbookConfig.BASE_NAME_LOGBOOK;
+import static org.apache.brooklyn.util.core.logbook.LogbookConfig.LOGBOOK_LOG_STORE_CLASSNAME;
/**
* Implementation for expose log from an existing file to the logbook API
*/
public class FileLogStore implements LogStore {
+ // Added for having an early warning in case the default configuration is changed and also to detect changes in future refactors
+ static {
+ assert FileLogStore.class.getName().equals(LOGBOOK_LOG_STORE_CLASSNAME.getDefaultValue());
+ }
+
/*
# Example config for local default implementation
brooklyn.logbook.logStore = org.apache.brooklyn.util.core.logbook.file.FileLogStore