s/PluginManagerImpl/PluggableService/ Along with a storage provider plug in, we are also creating a generic API plugin to support the UI plugin we are developing (too many plugins….). -- Chris Suich chris.su...@netapp.com NetApp Software Engineer Data Center Platforms – Cloud Solutions Citrix, Cisco & Red Hat
On Sep 18, 2013, at 8:46 PM, "SuichII, Christopher" <chris.su...@netapp.com> wrote: > I've been following this conversation somewhat and would like to throw in > some background as a plugin writer. > > One thing that concerns me in the current plugin model is the number of > XML/text files that need to be edited to deploy my plugin. > -applicationContext must be edited to add our PluginMangerImpl. > -commands.properties file must be edited to included the permissions for the > APIs we contributed. > -componentContext.xml & nonossComponentContext.xml must be edited to add our > Storage Subsystem Provider API. > -log4j-cloud.xml must be edited to ensure that our logger is enabled and > logging to our necessary default level. > > I know our situation is a bit different than the current plug in model, but I > think it is something we, as a community, are going to begin seeing more of. > For a variety of reasons that I won't get in to right now, our plugin will be > closed source and kept separate from the ACS source tree. We want our users > to be able to simply drop in our jar file to the CS directory or run and > installer and have it picked up by the MS upon a restart. > > It sounds like what you are proposing here would be very beneficial to > plugins that are targeting a deployment model like this. > > Is this something you're looking/hoping/would like to solve, Darren? > > -Chris > -- > Chris Suich > chris.su...@netapp.com > NetApp Software Engineer > Data Center Platforms – Cloud Solutions > Citrix, Cisco & Red Hat > > On Sep 18, 2013, at 6:44 PM, Darren Shepherd <darren.s.sheph...@gmail.com> > wrote: > >> 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 >>>>>>>>> >>>>>>> >>>>> >>> >