Yes this is one of the many things this is trying to address. Adding a plugin should be plopping your jar in a directory and restarting. You pointed out two things I didn't think about though, command.properties and log4j xml. Let me think about those twos as they should be address also. Basically you should never have to edit a file that is packaged as part of ACS. Only add your artifacts to some directory, ideally just a jar.
Darren On Wed, Sep 18, 2013 at 5: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 > >>>>>>>> > >>>>>> > >>>> > >> > >