Could it be just as simple as the canhandle() returns an int and not Boolean.  
So the ancient would return 1 but if the netapp matches it returns 100.  If it 
does not handle at all you return -1.  This effectively gives you 
prioritization.  So the calling code would still loop through all strategies 
each time looking for the best match.  I don't want the priority to be 
determined at load time as that is less flexible. 

Darren

> On Oct 3, 2013, at 5:42 PM, "SuichII, Christopher" <chris.su...@netapp.com> 
> wrote:
> 
> Thanks for the quick reply.
> 
> After talking with Edison, I think what we could do is allow the strategies 
> to either specify a priority or 'type' and then order them by that when they 
> are loaded. For example, we could have an enum of types like 'PLUGIN, 
> HYPERVISOR and DEFAULT' so that we can make sure plugins are asked 
> canHandle() first, then hypervisor implementations, then finally resort to 
> the default/ancient implementation. This 'type' or 'category' could be 
> specified as a bean parameter or as part of the strategy/provider interface. 
> Any thoughts on which are better?
> 
> The problem with just making canHandle() more intelligent is that we do need 
> some kind of ordering. Ideally, the non-default implementations should be 
> asked first, then fall back onto the stock implementations. You saw the 
> problem yourself - the XenServerSnapshotStrategy just says it will handle all 
> requests, so if a non-standard strategy wants to be given a chance, it must 
> be asked before the hypervisor or ancient implementation.
> 
> Alternatively if this matches the same usage of the global configuration 
> ordering system, we could add in the storage subsystem strategies and 
> providers.
> 
> The reason for log4j changes is that we may want to enable a different level 
> of verbosity by default. Our support organization likes to have very verbose 
> logs to assist them in triaging support issues. The lowest level log4j 
> categories are 'com.cloud', 'org' and 'net' and those are set to DEBUG and 
> INFO. Even if we add a line for 'com', the default value should not be 
> 'TRACE' like we would like ours to be. I'm not all that great with log4j, 
> though, so maybe I'm missing a simpler solution.
> 
> I'll try to keep an eye on the commands.properties/rbac stuff - that is good 
> to know.
> 
> Thanks,
> Chris
> -- 
> Chris Suich
> chris.su...@netapp.com
> NetApp Software Engineer
> Data Center Platforms – Cloud Solutions
> Citrix, Cisco & Red Hat
> 
>> On Oct 3, 2013, at 4:30 PM, Darren Shepherd <darren.s.sheph...@gmail.com> 
>> wrote:
>> 
>> I forgot to mention about canHandle() ordering.  For extensions, it
>> should be preferred that we do not rely on loaded or configured order.
>> The canHandle() implementation should assume that they're may be any
>> order.  So having said that, I looked at XenServerSnapshotStrategy and
>> its canHandle() is brilliantly implemented as "return true;"
>> 
>> Can we look at making the strategies order independent and not having
>> another order configuration parameter?
>> 
>> Darren
>> 
>> On Thu, Oct 3, 2013 at 4:26 PM, Darren Shepherd
>> <darren.s.sheph...@gmail.com> wrote:
>>> Chris,
>>> 
>>> I've updated the wiki [1].  Copying from the wiki
>>> 
>>> "Extensions are automatically discovered based on the interfaces they
>>> implement and which module is their parent. For example, if you place
>>> a storage extension in a child module of the network module, it will
>>> not be discovered. Additionally, depending on the extension, the
>>> ordering may be important in how they extension is used. For the
>>> extensions that ordering is important there is also a "Global
>>> Configuration" setting for the ordering. The value of the setting is a
>>> comma seperated list like SHA256SALT,MD5,LDAP,PLAINTEXT. The values
>>> are the names of the extension. The name will be the result of
>>> getName(), if the bean implements the Named interface, or the sort
>>> class name (ie getClass().getSimpleName())."
>>> 
>>> I setup all the extensible types based on what was in
>>> componentContext.xml and also trial an error.  The types you have
>>> mentioned were not in componetContext.xml so I missed them.  It works
>>> today, but is not properly extensible.  I will update the
>>> configuration and wiki today.
>>> 
>>> I've haven't made progress on the commands.properties as I realized it
>>> will overlap with the rbac work being done.  I will start a thread
>>> regarding that so maybe it will be address in the rbac work.
>>> 
>>> Regarding log4j.  First, why do you have to change that?  Regardless,
>>> at the end of the day you are limited to whatever log4j can provide.
>>> So log4j AFAIK does not support multiple log4j config files so the
>>> best we can do is allow somebody to supply a different log4j config
>>> file and configure cloudstack to use that.  One of the things I don't
>>> particularily like is that ACS forces log4j to its own configuration
>>> file and will not allow the regular log4j config discovery.  So what I
>>> could do is add a JVM property like -Dcloudstack.log4jstandardconfig
>>> that will disable the ACS behavior of configuring log4j and then you
>>> can use the log4j standard approach [2].
>>> 
>>> Darren
>>> 
>>> [1] https://cwiki.apache.org/confluence/display/CLOUDSTACK/Extensions
>>> [2] http://logging.apache.org/log4j/1.2/manual.html
>>> 
>>> On Thu, Oct 3, 2013 at 3:29 PM, SuichII, Christopher
>>> <chris.su...@netapp.com> wrote:
>>>> Darren,
>>>> 
>>>> I read through this thread and your docs on the wiki, but I'd appreciate 
>>>> it if you could answer a couple questions for me:
>>>> 
>>>> -When creating an extension, such as a DataStoreProvider, those items are 
>>>> currently added into the list of providers for the appropriate bean, such 
>>>> as:
>>>> <bean id="dataStoreProviderManager"
>>>>       
>>>> class="org.apache.cloudstack.storage.datastore.provider.DataStoreProviderManagerImpl">
>>>>   <property name="providers">
>>>>     <list merge="true">
>>>>       <ref bean="cloudStackPrimaryDataStoreProviderImpl"/>
>>>>       <ref local="cloudStackImageStoreProviderImpl"/>
>>>>       <ref local="s3ImageStoreProviderImpl"/>
>>>>       <ref local="swiftImageStoreProviderImpl"/>
>>>>       <ref local="solidFireDataStoreProvider"/>
>>>>     </list>
>>>>   </property>
>>>> </bean>
>>>> 
>>>> So, how do we add our bean to that list?
>>>> 
>>>> -There are a number of extensions that are not currently listed, such as 
>>>> DataMotionStrategy, SnapshotStrategy, etc. Is it a problem that those are 
>>>> omitted from 
>>>> https://cwiki.apache.org/confluence/display/CLOUDSTACK/Extensions?
>>>> 
>>>> -I know somewhere in this thread you talked about the order of beans, but 
>>>> can you document how the ordering or precedence works in the wiki? For 
>>>> example, if I create a DataMotionStrategy, how do I ensure that my 
>>>> strategy's canHandle() method is invoked before the 
>>>> AncientDataStoreStrategy?
>>>> 
>>>> -Is there any progress on modularizing commands.properties and the log4j 
>>>> configuration?
>>>> 
>>>> Thanks,
>>>> Chris
>>>> --
>>>> Chris Suich
>>>> chris.su...@netapp.com<mailto:chris.su...@netapp.com>
>>>> NetApp Software Engineer
>>>> Data Center Platforms – Cloud Solutions
>>>> Citrix, Cisco & Red Hat
> 

Reply via email to