I'm listening to this discussion and trying to make sense of it so that
I can understand how it will affect our users. Keep in mind that I'm
still grasping at the fundamentals of Geronimo and G-beans so this may
be off in the weeds (and for which I will apologize for right now).
As I think David Jencks mentioned earlier, are think there are
different types of configuration data? Can we list some of the
specific types of configuration items that we are talking about and
group them? Perhaps that can simplify the problem.
Here's my attempt:
First, there is "configuration" which affects the structure of the
solution itself (let's call it "solution configuration") ... such as
changing the access protocol, changing the J2EE container, changing the
security service, the persistent store, etc.... These are all changes
that have substantial impact on the nature and behavior of the server.
These are things that I would expect of somebody that is building a
complete solution to be concerned with and I don't think it would be a
problem if the changes were "maven-like" and required creating a new
bundle (ie. not hosted in the admin console for runtime changes).
Second, there is "configuration" which affects the behavior of the
solution but not the nature of it (let's call this "server
configuration"). These are more minor changes such as changing ports,
hostnames, thread pool sizes, etc... This is standard end user
configuration and items that I would expect an end user that is running
a solution to have to "tweak" on a regular basis. These are types of
configuration changes where I think it would be useful to be able to
export and then later import the configuration for another server and
that should be persisted apart from the Gbeans. This configuration may
even include the set of deployed applications for the server.
If we consider these items as being fundamentally different types of
configuration with different users then I think it might simplify the
problem. The "server configuration" changes should be available via
the admin console and should not impact any G-Bean configuration as I
understand it. The "solution configuration" would potentially affect
the creation of and dependencies between Gbeans and would not
necessarily require a WYSIWYG mechanism for change such as an admin
console. Of course there will always be items in the "gray" area that
are somewhere between these or may need to be changed by both types of
users. Items in the "gray" area could be addressed on an individual
basis such that it would not necessarily require mutable bundles (such
as by defining both HTTP and HTTPS connectors and enabling or disabling
as appropriate for the configuration).
One final question I'll toss out (and possibly show my ignorance ...
but at least I'll learn the answer :-) ) ... Aren't the applications
that are deployed themselves represented by Gbeans in the bundle and
therefore the bundle is already mutable in that sense? I read an
article in JAX that indicated this was the case (
http://jaxmag.com/itr/online_artikel/psecom,id,690,nodeid,147.html ).
Is that correct or was the author mistaken?
Aaron Mulder wrote:
We're making progress! :)
On Tue, 26 Jul 2005, Jeremy Boynes wrote:
First caveat - o/a/g/Server is too monolithic which is contributing
factor to these discussions. The reasons why this is a problem and how
to start to fix it have been discussed elsewhere.
True, though there are certain advantages too (like the ability to
start and stop all that stuff with one command). Anyway, that's another
topic.
Second caveat, change through the web console is one use case. It
applies to small installations (desktop, single server) but is less
applicable to larger installations, say with > 10 servers. It also does
not apply to "headless" servers which may not be running a web container
at all.
Agreed.
I have two I've given some thought to although they're not fully thought
out - but hey, we're brainstorming right?
Yes.
Of the two, I like option 5 more -- and more than all the
UUID-based options. I'm not sure the mutability needs to be reflected in
the configuration name, though -- couldn't we have non-name properties for
the version and mutability? That way the start/stop command would be the
same and so on. You would refer to a prerequisite by providing the name
and version range separately, and perhaps even indicating explicitly
whether you're willing to depend on a mutable version. If you provide
nothing but the name, that implies "any version will do".
I'd propose we add a tool that can export one or more
configurations named on the command line (or all current configs) and
optionally:
- mark them immutable
- assign them a specific version or UUID
- update any references between exported modules to use the new version
number or UUID
- include an explicit list of all their repository references if that's
at all possible (as even locking the configuration contents does not
prevent them from failing due to missing repository contents).
- sign the exported file(s)
Then we likewise need an import tool that can do whatever
name-based validation we want (perhaps prompt or automatically disable any
other configs with the same name and different version), make sure the
repository contains all the referenced libs, and load the configurations
into the config store.
Then the installer could offer a bit more flexibility, and let you
literally install with nothing but o/a/g/System (for a "slave" node), so
that you could then use the configuration import tool to get all the
(immutable or otherwise) content into that server.
We also need the kernel to be aware of Configurations to the level
that it can ensure a configuration is marked mutable when a change is made
to any GBean in the configuration.
Finally, I don't have a satisfactory answer to "what if you just
redeploy from a plan with different contents but the same name". It
doesn't seem all that different than making changes through the console,
except the kernel has no way to intercept that if the configuration was
marked immutable.
Aaron
Option 5: We have two different bundle types, mutable and immutable.
Mutable ones have a special ID, e.g. containing the word SNAPSHOT so
they can be clearly identified; immutable ones have a specific version
number e.g. o/a/g/Server/1.0-M5. Any structural modification of the
bundle, e.g. adding a GBean, changing a reference pattern etc. makes the
bundle mutable. We enhance the configuration manager so that it can
handle bundle version ranges so that bundle-to-bundle dependencies are
squishier than they are now.
So, when the deployer builds the application it could say "this
application expects a Jetty bundle with version between 1.0.1 and 1.0.5
or a SNAPSHOT." Modifications through the web console that require
strucutural change convert the config say o/a/g/Jetty-1.0.2 to
o/a/g/Jetty-1.0.2-SNAPSHOT; bundles built with a tolerance for
mutability will still run but ones that assume a release version won't.
For desktop and small installations we do a default assembly using
SNAPSHOT bundles; larger installations will probably build their own
assemblies using released versions only.
---
Option 6: We add a "local" bundle to the runtime that is used to hold
"stuff associated with this instance." This would be mutable and contain
GBeans associated with this instance e.g. edge components like network
listeners.
With this model, a second HTTP connector would be added to the "local"
bundle rather than o/a/g/Server or o/a/g/Jetty. Deployment does not
break for portable applications which only use components from named
bundles.
For this to work we will need to fix the classloader to provide the
import/export mechanism add will need to be able to add imports to the
"local" configuration at runtime. We need to be careful about adding
multiple GBeans that require classes from conflicting imports.
---
There may be the possibility of a combination of multiple options e.g.
mixing "local" bundles with SNAPSHOTs or UUIDs.
--
Jeremy
--
Joe Bohn
[EMAIL PROTECTED]
"He is no fool who gives what he cannot keep, to gain what he cannot lose." -- Jim Elliot
|