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™

Reply via email to