You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@geronimo.apache.org by Jeremy Boynes <jb...@apache.org> on 2005/07/27 19:22:34 UTC

Bundle metadata, was: GBeans: Saving Changes

Aaron Mulder wrote:
> 
> 	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".
> 

<snip>Because I think this is a key issue and drives the rest</snip>

First a chunk of background to establish context, skip to "+++" for the 
proposal.

One of the problems we have is that the configuration management system 
is very naive - I kept the first version real simple to see how needs 
would drive it and, of course, its limitations are now coming back to 
bite us.

It works on the assumption that all the information about a bundle can 
be captured in its unique id. So no matter how many services a bundle 
offers, all a user of those services needs to know is the bundle's id 
and if it references that those services will be there.

This allows us to have a very basic system where dependencies get 
resolved based on ids alone. It got us this far but I think we're 
starting to hit the limitations.

One thing we talked about from the start was a "capability model" where 
bundles advertised distinct services (versioned) and dependencies 
between bundles were resolved using those rather than just the basic id.

So, for example, a web container could advertise "jetty", "jetty 5", 
"jetty 5.1.4", "servlet", "servlet 2.4" etc. An application that needed 
a web container could require "servlet 2.4" which would mean it could 
run in any instance no matter what implementation of "servlet 2.4" was 
present (e.g. either Jetty or Tomcat) or it could require "jetty 5.1.4" 
because perhaps it had specific classes that it was using. For example, 
a generic webapp may just need the "servlet" bits but one with a custom 
Valve would require a Tomcat based version.

The intention was to build up an ever richer set of services that could 
be provided and consumed. In the end you would end up with very rich 
bundle descriptions such as "I am a bundle that provides Acme Inc. Order 
Entry System V7.5.2 tuned for 100 concurrent users at 500ms reponse time 
and 40 operations per second on an Acme-4000 Linux system with a Harmony 
JVM, 4 4.2Ghz CPUs and 2GB RAM. I provide these web services (...) and 
EJBs (...). I need access to a Acme Inc. Order Entry Schema V7 via a 
JDBC 3.0 driver on a database tuned for 80 transactions per second and 
to the following JMS queues (...) capable of handling 20 messages per 
second." This captures not only the physical and logical requirements 
needed to run the application but also the environment characteristics 
that drive response time and throughput.

With this in place, there starts to be sufficient information for the 
configuration manager to start to make intelligent decisions about 
where/when to run application bundles in order to meet business level 
service agreement targets.

+++

The key to this whole thing is having sufficient metadata in place about 
the bundles, which ties back to your point at the start. I think it has 
become clear that we have progressed to the point where a simple unique 
id is insufficient and we need to start adding metadata. The first bits 
relate to temporal stability: adding in a version identifier and adding 
in an indicator that a bundle is temporally unstable (i.e. its a SNAPSHOT).

We should add to that metadata about the services that a bundle provides 
and consumes. I think that at a minimum that comprises a service id, 
version and stablilty flag the same as for bundles themselves.

If we do that first for codebase services (i.e. the classes that a 
bundle uses and provides) then we not only get a start on the metadata 
description side, we also fix the classloader issues that lead to 
monolithic bundles like o/a/g/Server.

--
Jeremy