Thanks for the detailed response, John!

When Chris Suich (formerly from NetApp) and I talked about this several
months ago, we were thinking that this would replace the need for storage
tagging. However, as you point out, I now think it does not.

We were originally figuring that by specifically selecting a vendor (by
picking the applicable storage plug-in) that this removed the need for
storage tagging, but I see now that you might still want to further refine
within a given storage provider which primary storage CloudStack selects.

That being the case, if the user selects a specific storage plug-in, that
will be the first step in filtering and storage tagging will be the next.

Once I update the design, maybe you can take a look at it again. I can
include the new data types you listed.

Thanks!


On Fri, Jun 13, 2014 at 8:38 AM, John Burwell <jburw...@basho.com> wrote:

> Mike,
>
> I completely agree with the need to attach driver-specified key-value
> pairs to a storage driver (we have been batting this around for nearly a
> year).  However, I think this facility should be generalized to support all
> drivers (e.g. network, compute, etc) where storage maybe the first layer to
> implement it.  For example, we have a raft of places where vendor specific
> data/concepts leak into the object model and schema.  For example, in
> networking, we have vendor specific API calls. One of the main value
> propositions of a cloud platform is to provide a unified abstraction for
> underlying infrastructure components.  Furthermore, requiring vendor
> implements to add API calls further increases the complexity and effort
> required to support CloudStack — discouraging their participation.
>
> In terms of the design of itself, I don’t feel that the Map<String,
> String> getPropertiesAndTypes is a rich enough semantic for such an
> extension facility.  First, it does not provide a mechanism to validate
> that the form and content of the values being set.  Second, it is
> incredible lose contract that does not exploit the Java compiler to ensure
> drivers are providing well-formed metadata to the CloudStack orchestration
> components.  Finally, it does not support notions such as hinting which
> fields are required (very useful for creating useful UIs) and constrained
> values (rendered as drop downs).  My thoughts are as follows:
>
>
>    - Define an ExtenstionPropertyType enumeration with the following
>    types permitted:
>       - STRING
>       - DATE
>       - NUMBER
>       - BOOLEAN
>       - The following methods as well:
>          - Class getType(): The underlying Java type used to represent
>          the type
>          - Object convertFromString(String aValue): Converts a value from
>          a string to the underlying Java type
>          - String convertToString(Object aValue): Converts a value to a
>          string from the underlying Java type
>       - Define a ExtensionPropertyDefinition interface that describes the
>    following attributes about a extension property:
>       - String getName(): The name of the property conforming to JavaBean
>       standards (while we don’t support reflection, it’s a well known 
> standard by
>       Java developers …)
>       - ExtensionPropertyType getType():  The type of the property
>       - boolean isRequired(): Whether or not a value for the property is
>       required
>       - boolean isCollected(): Whether or not the property’s value is a
>       single value or collected (default to a list)
>       - Set<String> getConstraints: A list of the values that constrain
>       the values of this extension property.
>       - List<String> validate(Object aValue): A callback to validate a
>       value for this property definition — returning a list of strings 
> describing
>       the validation errors.  An empty list implies a valid value.  An 
> additional
>       nicety for this interface would be to define a type which the definition
>       would expect of the underlying value to be at runtime.
>    - Introduce an Extendable interface that indicates that a type can
>    have its data extended with a set of key-value pairs.  I would define the
>    following methods:
>       - Set<ExtenstionPropertyDefinition>
>       getExtenstionPropertyDefinitions(): The set of extension property
>       descriptions
>       - Object getExtensionPropertyValue(String aPropertyName): Get a
>       value for an extension property
>       - List<String> validateExtensionProperties(): Validates the values
>       of the extension properties
>
>
> There are likely pieces I missed and refinements to improve this design —
> I jotted it down off the top of my head.  However, we have to ensue that
> the semantic is rich enough to render friendly UIs, as well as, protect
> against GIGO (garbage in, garbage out).
>
> Finally, I would like to see the design expanded to explain when and where
> this information will pass into drivers for use.  As the design stands now,
> it does not explain how the data would actually be used during operation.
>  The scope of these changes is important to understand for both impact
> analysis and driver developers and implementors.  Also, I don’t understand
> how the addition of generic key-values to drivers would eliminate tags.  As
> I understand them, tags are used to establish valid combinations of drivers
> (e.g. mutual exclusion) to avoid defining an unimplementable infrastructure
> configuration.  While I agree with the desire to eliminate them, I don’t
> understand how such a facility would contribute to that goal.
>
> Great work putting together an initial design, and getting this important
> conversation started.
>
> Thanks,
> -John
>
> On Jun 10, 2014, at 6:26 PM, Mike Tutkowski <mike.tutkow...@solidfire.com>
> wrote:
>
> Hi,
>
> Please feel free to review the following proposal for 4.5:
>
> https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=42566111
>
> Here is the summary:
>
> Today the way you associate a Compute Offering (CO) or a Disk Offering
> (DO) with a Primary Storage (PS) is via storage tagging.
>
> This has some benefits and drawbacks.
>
> One benefit is being able to have some level of vendor independence from
> the point of view of the CO or DO. For example, if the storage tag of a DO
> is "Fast", then this can be satisfied by PS that describes itself as
> "Fast", regardless of vendor.
>
> A major drawback with the storage-tagging approach, however, is that you
> are not easily able to leverage vendor-specific features, which is often
> why you bought storage from the vendor in question to begin with.
>
> Ideally we do not want to add each vendor's features into the system as
> properties that can be seen by the admin regardless of whether or not the
> underlying storage he's actually using supports the feature in question.
> Traditionally, however, this has been business as usual in the CloudStack
> codebase.
>
> Going forward, we want to implement a more fine-grain and generic approach.
>
> For example, in the GUI we would like to have a storage provider field for
> the CO and DO windows (this equates to the name of one and only one storage
> provider). If the admin inputs a specific storage provider, he can enter in
> an arbitrary number of key/value pairs in another text field (perhaps we
> would provide a nice entry dialog to make this easier in the GUI). These
> key value pairs can be passed into the storage driver when it's asked to
> create (or update) a volume and the storage driver can decide what each and
> every key/value pair means, if anything.
>
> Thanks!
>
> --
> *Mike Tutkowski*
> *Senior CloudStack Developer, SolidFire Inc.*
> e: mike.tutkow...@solidfire.com
> o: 303.746.7302
> Advancing the way the world uses the cloud
> <http://solidfire.com/solution/overview/?video=play>*™*
>
>
>


-- 
*Mike Tutkowski*
*Senior CloudStack Developer, SolidFire Inc.*
e: mike.tutkow...@solidfire.com
o: 303.746.7302
Advancing the way the world uses the cloud
<http://solidfire.com/solution/overview/?video=play>*™*

Reply via email to