I'm not a committer
On Wed, Sep 18, 2013 at 3:24 PM, Frank Zhang <frank.zh...@citrix.com> wrote: > Well. The codes explain more than words. > It seems the only extra work is adding a property file that specifies > parent context and current context name, it's not much complex. > BTW: any reason for working on repo outside ACS? > > > -----Original Message----- > > From: Darren Shepherd [mailto:darren.s.sheph...@gmail.com] > > Sent: Wednesday, September 18, 2013 2:43 PM > > To: dev@cloudstack.apache.org > > Subject: Re: [PROPOSAL] Modularize Spring > > > > If you want to see this all working you can just fetch the "no-at-db4" > > branch at https://github.com/ibuildthecloud/cloudstack.git > > > > Plugin composes multiple modules. If modules are siblings they can't > inject > > from each other. But a plugin can augment another module if it chooses > to. > > The reality is that the core cloudstack is a tangled mess of > dependencies such > > that most of the core code can't be modularized as it stands. So there > exists a > > context towards the top of the hierarchy called "core" that a lot of jars > > contribute to it. Here is the full hierarchy right now. I'll probably > rename a > > bunch of things, but this gives you an idea. > > > > bootstrap > > system > > core > > allocator > > allocator-server > > planner > > api-planner > > baremetal-planner > > explicit-dedication > > host-anti-affinity > > implicit-dedication-planner > > server-planner > > user-concentrated-pod-planner > > random-allocator > > api > > acl-static-role-based > > rate-limit > > server-api > > user-authenticator-ldap > > user-authenticator-md5 > > user-authenticator-plaintext > > user-authenticator-sha256salted > > backend > > alert-adapter-server-backend > > compute > > alert-adapter-server-compute > > baremetal-compute > > fencer-server > > investigator-server > > kvm-compute > > ovm-compute > > server-compute > > xenserver-compute > > network > > baremetal-network > > elb > > midonet > > nvp > > ovs > > server-network > > ssp > > storage > > alert-adapter-server-storage > > allocator-storage > > baremetal-storage > > secondary-storage > > server-storage > > storage-image-default > > storage-image-s3 > > storage-image-swift > > storage-volume-default > > storage-volume-solidfire > > template-adapter-server > > discoverer > > baremetal-discoverer > > discoverer-server > > ovm-discoverer > > xenserver-discoverer > > > > > > > > If you look at the baremetal hypervisor plugin that is pretty cross > cutting to > > most of ACS. So the modules it contributes to are as follows > > > > resources/META-INF/cloudstack/baremetal-storage/spring-context.xml > > resources/META-INF/cloudstack/baremetal-compute/spring-context.xml > > resources/META-INF/cloudstack/baremetal-discoverer/spring-context.xml > > resources/META-INF/cloudstack/core/spring-baremetal-core-context.xml > > resources/META-INF/cloudstack/baremetal-planner/spring-context.xml > > resources/META-INF/cloudstack/baremetal-network/spring-context.xml > > > > So it creates child contextes of storage, compute, network, planner, and > > discoverer to add its extensions where it needs to be. Additionally, > you'll notice, > > it adds some beans to the core context from the file resources/META- > > INF/cloudstack/core/spring-baremetal-core-context.xml. This is because > it has > > some manager class that is used by multiple contexts. > > > > Frank, I understand the scare that we are going too complex, but do you > have > > some other suggestion? I don't like the idea of one gigantic spring > context. So I > > feel I am making it as simple as I can while maintaining some order. > People > > just need to create one or more spring xml files and a properties files > that says > > where to put it in the hierarchy. > > > > Additionally, by putting forcing people to put beans in certains modules > it > > forces them to think about what is the role of the code. For example, > today in > > ACS the *ManagerImpl classes are a huge mess. They implement too many > > interfaces and the code crosses to many architectural boundaries. Its > about > > time we start splitting things up to be more maintainable. > > > > If you have some time, please check out what I have on github. > > > > Darren > > > > > > On Wed, Sep 18, 2013 at 1:56 PM, Frank Zhang <frank.zh...@citrix.com> > > wrote: > > > > > I am not against boundary, I am just against making things unnecessary > > > complex to enable boundary. > > > If we are going this way, I hope we can make it as much as transparent > > > to developers. That means, as a developer, all a plugin I need to do > > > is 1) provide my separate spring xml 2) inject beans I want (valid > > > beans) in my bean and code business logic 3) compile to a jar and put > > > to some place designated by CloudStack. That's it. > > > > > > I raise this topic because I have seen some projects to create > > > boundary making things horrible complex. And sometimes developers are > > > hurt by wrong boundaries, as a result, to overcome these limitations > > > people write lots of ugly code which makes thing even worse. > > > > > > However, I am still worry about if we can make things so simpler. > > > For example, we may have an orchestration context that contains major > > > beans needed by almost every plugin, this context can be easily set > > > as parent context for all plugin contexts when bootstrap. However, if > > > a plugin A needs to access some bean defined in plugin B, given they > > > are sibling, how plugin framework resolves the dependency ? > > > > > > > -----Original Message----- > > > > From: Darren Shepherd [mailto:darren.s.sheph...@gmail.com] > > > > Sent: Wednesday, September 18, 2013 11:53 AM > > > > To: dev@cloudstack.apache.org > > > > Subject: Re: [PROPOSAL] Modularize Spring > > > > > > > > I'm not for OSGi either, but contexts are quite useful and will lead > > > > to > > > better > > > > things. First off, we don't want one gigantic spring XML config > > > > file > > > like we have > > > > today. I think we can all agree on that. So each plugin will have > > > > to > > > supply its > > > > own XML. So the obstacles you mention, will largely be just that > > > > for > > > people. > > > > > > > > With Spring it is really simple to just inject dependencies and > > > > cross architectural boundaries. Its currently everywhere in ACS. > > > > You can't > > > just say > > > > we should review code and make sure nobody doesn't do bad things. A > > > little bit > > > > of framework to enforce separation is a good thing. But I'm > > > > guessing > > > you will > > > > disagree with me there. > > > > > > > > Here are some random points on why contexts are good. Say I want to > > > > use Spring AOP or Spring TX in my plugin. With your own context you > > > > can > > > ensure > > > > that you won't screw with anybody else code by accidentally having > > > > you pointcut match their bean. You don't have to worry about bean > > > > name > > > conflicts. > > > > If two config files specify bean X, Spring will gladly just use the > > > > last > > > one. I've > > > > already found multiply defined beans in ACS, but things still just > > > happen to work. > > > > Having multiple contexts also defines initialization order. We can > > > ensure that > > > > the framework is loaded and ready before child context are loaded > > > > and > > > started. > > > > (we kind of do this today with ComponentLifeCycle, but its a hack in > > > > my > > > mind). > > > > Additionally, when things start you will know, loading context > > > > "crapping > > > plug X". > > > > If spring fails to initialize, the issue it there. Today, if spring > > > fails to start, it > > > > could be one of over 500 beans causing the weird problem. The list > > > > goes > > > on > > > > and on. > > > > > > > > Finally, this is the big one and why I really want contexts. I have > > > some notes on > > > > the wiki [1] that you might want to read through. Basically I want > > > > to > > > get to a > > > > more flexible deployment model that allows both a single monolithic > > > > JVM > > > as > > > > today and also a fully distributed system. Having contexts in > > > > hierarchy > > > will > > > > enable me to accomplish this. By selecting which contexts are > > > > loaded at runtime will determine what role the JVM takes on. The > > > > contexts help > > > people > > > > better understand how the distributed architecture will work too, > > > > when > > > we get > > > > there. > > > > > > > > Frank, trust me, I hate complex things. I don't want OSGi, > > > > classloader > > > magic, > > > > etc. But I do like organization and a little bit of framework so > > > > that > > > people don't > > > > accidentally shoot themselves in the foot. I personally like > > > > knowing > > > that I > > > > couldn't have screwed something up, because the framework won't even > > > allow > > > > it. If we separate everything as I want today, and then tomorrow we > > > > say > > > this is > > > > way too much overhead, moving to a flat context is simple. Don't > > > > think > > > we are > > > > on some slippery slope to classloaders and dependency hell. > > > > > > > > Darren > > > > > > > > [1] > > > > > > > https://cwiki.apache.org/confluence/display/CLOUDSTACK/Nothing+to+see+ > > > her > > > > e...#Nothingtoseehere...-DeploymentModels > > > > > > > > > > > > > > > > On Wed, Sep 18, 2013 at 11:22 AM, Frank Zhang > > > > <frank.zh...@citrix.com>wrote: > > > > > > > > > What's the point in using separate spring context per plugin? > > > > > Separate class loader is the thing I hate most in OSGI, I am > > > > > afraid we are on the same way. > > > > > Frankly speaking, I never see benefits of this *separate* model, > > > > > our project(or most projects) is not like Chrome which has to > > > > > create sandbox for extensions in order to avoid bad plugin screws > > > > > up the whole browser(however, I still see bad plugins screw up my > > > > > Chrome well). > > > > > Projects like CloudStack using plugin to decouple architecture > > > > > should not introduce many isolations to plugin writer, the point > > > > > preventing wrong use of some components is not making much sense > > > > > to me. If a plugin not following guide(if we have > > > > > it) we should kick it out, instead of making obstacles for 99% > > > > > good > > > people. > > > > > > > > > > > > > > > > > > > > > -----Original Message----- > > > > > > From: Darren Shepherd [mailto:darren.s.sheph...@gmail.com] > > > > > > Sent: Wednesday, September 18, 2013 10:33 AM > > > > > > To: dev@cloudstack.apache.org > > > > > > Subject: Re: [PROPOSAL] Modularize Spring > > > > > > > > > > > > Right, component isn't a thing. I probably shouldn't use that > term. > > > > > > I > > > > > want to > > > > > > standarize on the naming convention of plugin, module, and > extension. > > > > > It is > > > > > > explained a bit on the wiki [1] but I'll try to do a little > > > > > > better job > > > > > here. So a > > > > > > plugin is basically a jar. A jar contains multiple modules. A > > > > > > modules > > > > > ends up > > > > > > being a spring application context that composes multiple > > > > > > configuration > > > > > files. > > > > > > Modules are assembled into a hierarchy at runtime. Extensions > > > > > > are implementations of interfaces that exist in a module. A > > > > > > maven project produces a jar, so a plugin ends up being a maven > > > > > > project > > > also. > > > > > > > > > > > > So currently today we don't have a strong definition of Plugin > > > > > > and I > > > > > hope to > > > > > > address that. > > > > > > > > > > > > Darren > > > > > > > > > > > > [1] > > > > > > https://cwiki.apache.org/confluence/display/CLOUDSTACK/Plug- > > > > > > ins%2C+Modules%2C+and+Extensions > > > > > > > > > > > > > > > > > > On Wed, Sep 18, 2013 at 4:25 AM, Daan Hoogland > > > > > > <daan.hoogl...@gmail.com>wrote: > > > > > > > > > > > > > sounds great Darren, > > > > > > > > > > > > > > By component, you mean maven project or some larger chunk like > > > > > > > distribution package? (did i miss this definition somewhere or > > > > > > > do we define the components now?) > > > > > > > > > > > > > > regards, > > > > > > > Daan > > > > > > > > > > > > > > On Wed, Sep 18, 2013 at 12:10 AM, Darren Shepherd > > > > > > > <darren.s.sheph...@gmail.com> wrote: > > > > > > > > Currently ACS code is fairly modular in that you can add > > > > > > > > plug-ins to ACS > > > > > > > to > > > > > > > > extend most functionality. Unfortunately ACS is not > > > > > > > > packaged in a > > > > > > > modular > > > > > > > > way. It is still delivered essentially as one large unit. > > > > > > > > There are > > > > > > > many > > > > > > > > reason for this but one large barrier to modularizing ACS is > > > > > > > > that the Spring configuration is managed as one large unit. > > > > > > > > > > > > > > > > I propose that we break apart the Spring XML configuration > > > > > > > > such that each component contributes its own configuration. > > > > > > > > Additionally each component will be loaded into its own > > > > > > > > Spring ApplicationContext such that its beans will not > > > > > > > > conflict with the wiring of other beans in ACS. This change > > > > > > > will > > > > > > > > lay the foundation for a richer plugin model and > > > > > > > > additionally a more distributed architecture. > > > > > > > > > > > > > > > > The technical details for this proposal can be found on the > > > > > > > > wiki > > > [1]. > > > > > > > > > > > > > > > > Darren > > > > > > > > > > > > > > > > [1] > > > > > > > https://cwiki.apache.org/confluence/display/CLOUDSTACK/Modular > > > > > > > ize+ > > > > > > > Spri > > > > > > > ng > > > > > > > > > > > > > > > >