TL;DR: I've hit a problem with rebinding to historic persisted state,
when wrap:mvn has been used for OSGi bundles - the symbolic name
changed, so classloading didn't work on rebind. Which of the solutions
should we go for?
The persisted state refers to a class in aws-java-sdk 1.11.245, but in
my newer brooklyn I've upgraded this bundle to 1.11.411 (the old bundle
is not there). Because this jar was added using wrap-mvn, the two
versions of the bundle have different symbolic names! Brooklyn therefore
doesn't know to look in the newer aws-java-sdk bundle.
The bundle was added via a feature.xml containing:
When built locally, this produced a bundle with the very strange
Brooklyn currently supports a couple of related features:
1. The persisted state will by default not include bundle versions. We
are therefore willing to use newer versions of a given bundle.
2. When adding your own bundle, you can include metadata in it's
MANIFST.mf to say what bundle/version it replaces.
See brooklyn-docs guide/ops/upgrades/_blueprints.md
However, I don't want to use (2) because that would involve fiddling
with the wrap:mvn to add more metadata.
There are no doubt many ways to solve this problem. I describe a few of
I think I favour the class-renames approach because of its simplicity.
*_Add support to class-renames_*
Our deserializingClassRenames.properties allows rebind to handle class
renames, or a specific class moving from one bundle to another. This is
useful for historic persisted state.
We could add support for bundle wildcards, to say that all classes in
one bundle can be loaded from another bundle.
*_Support a bundle-upgrade configuration file_*
We could add support for a config file that gives explicit named bundle
replacements. This would augment the existing functionality (2 above),
but instead of the replacement bundle being defined in the new bundle's
metadata, it could also be defined in this configuration file.
For example, $BROOKLYN_HOME/etc/org.apache.brooklyn.bundleupgrade.cfg
could contain something like:
(would need to figure out the cfg versus yaml format here, obviously!)
*_Recognise 'wrap' bundles, and allow newer versions_*
When loading the class, we could recognise the "wrap_" prefix. We could
figure out from the symbolic name what it was built from, and be willing
to use bundles that are newer versions.
However, playing with wrap:mvn, the bundle naming is not as obvious as
one would expect. The symbolic name below is a very different structure
from that above:
This example was created in karaf client by running:
*_Require users to set the symbolic name, when using wrap:mvn_*
We could require users to *not* use the simple "wrap:mvn", and instead
force them to ensure a more predictable symbolic name + version is used.
However, that sounds harder for users. It also doesn't solve the problem
for anyone with such historic persisted state.
_*LONG TERM / DOCS
*_We should warn people about this in our docs, including a description
of how to work around it.
We should discourage the use of complex types in config keys and
sensors, where we (or the user) don't explicitly control the versioning
and schema of those types.