Hey John,

I think this is some great stuff. Thanks for the write up.

It looks like you have ideas around what might go into a first release of
this plug-in framework. Were you thinking we'd have enough time to squeeze
that first rev into 4.3. I'm just wondering (it's not a huge deal to hit
that release for this) because we would only have about five weeks.

Thanks


On Tue, Aug 20, 2013 at 3:43 PM, John Burwell <jburw...@basho.com> wrote:

> All,
>
> In capturing my thoughts on storage, my thinking backed into the driver
> model.  While we have the beginnings of such a model today, I see the
> following deficiencies:
>
>
>    1. *Multiple Models*: The Storage, Hypervisor, and Security layers
>    each have a slightly different model for allowing system functionality to
>    be extended/substituted.  These differences increase the barrier of entry
>    for vendors seeking to extend CloudStack and accrete code paths to be
>    maintained and verified.
>    2. *Leaky Abstraction*:  Plugins are registered through a Spring
>    configuration file.  In addition to being operator unfriendly (most
>    sysadmins are not Spring experts nor do they want to be), we expose the
>    core bootstrapping mechanism to operators.  Therefore, a misconfiguration
>    could negatively impact the injection/configuration of internal management
>    server components.  Essentially handing them a loaded shotgun pointed at
>    our right foot.
>    3. *Nondeterministic Load/Unload Model*:  Because the core loading
>    mechanism is Spring, the management has little control over the timing and
>    order of component loading/unloading.  Changes to the Management Server's
>    component dependency graph could break a driver by causing it to be started
>    at an unexpected time.
>    4. *Lack of Execution Isolation*: As a Spring component, plugins are
>    loaded into the same execution context as core management server
>    components.  Therefore, an errant plugin can corrupt the entire management
>    server.
>
>
> For next revision of the plugin/driver mechanism, I would like see us
> migrate towards a standard pluggable driver model that supports all of the
> management server's extension points (e.g. network devices, storage
> devices, hypervisors, etc) with the following capabilities:
>
>
>    - *Consolidated Lifecycle and Startup Procedure*:  Drivers share a
>    common state machine and categorization (e.g. network, storage, hypervisor,
>    etc) that permits the deterministic calculation of initialization and
>    destruction order (i.e. network layer drivers -> storage layer drivers ->
>    hypervisor drivers).  Plugin inter-dependencies would be supported between
>    plugins sharing the same category.
>    - *In-process Installation and Upgrade*: Adding or upgrading a driver
>    does not require the management server to be restarted.  This capability
>    implies a system that supports the simultaneous execution of multiple
>    driver versions and the ability to suspend continued execution work on a
>    resource while the underlying driver instance is replaced.
>    - *Execution Isolation*: The deployment packaging and execution
>    environment supports different (and potentially conflicting) versions of
>    dependencies to be simultaneously used.  Additionally, plugins would be
>    sufficiently sandboxed to protect the management server against driver
>    instability.
>    - *Extension Data Model*: Drivers provide a property bag with a
>    metadata descriptor to validate and render vendor specific data.  The
>    contents of this property bag will provided to every driver operation
>    invocation at runtime.  The metadata descriptor would be a lightweight
>    description that provides a label resource key, a description resource key,
>    data type (string, date, number, boolean), required flag, and optional
>    length limit.
>    - *Introspection: Administrative APIs/UIs allow operators to
>    understand the configuration of the drivers in the system, their
>    configuration, and their current state.*
>    - *Discoverability*: Optionally, drivers can be discovered via a
>    project repository definition (similar to Yum) allowing drivers to be
>    remotely acquired and operators to be notified regarding update
>    availability.  The project would also provide, free of charge, certificates
>    to sign plugins.  This mechanism would support local mirroring to support
>    air gapped management networks.
>
>
> Fundamentally, I do not want to turn CloudStack into an erector set with
> more screws than nuts which is a risk with highly pluggable architectures.
>  As such, I think we would need to tightly bound the scope of drivers and
> their behaviors to prevent the loss system usability and stability.  My
> thinking is that drivers would be packaged into a custom JAR, CAR
> (CloudStack ARchive), that would be structured as followed:
>
>
>    - META-INF
>       - MANIFEST.MF
>       - driver.yaml (driver metadata(e.g. version, name, description,
>       etc) serialized in YAML format)
>       - LICENSE (a text file containing the driver's license)
>    - lib (driver dependencies)
>    - classes (driver implementation)
>    - resources (driver message files and potentially JS resources)
>
>
> The management server would acquire drivers through a simple scan of a URL
> (e.g. file directory, S3 bucket, etc).  For every CAR object found, the
> management server would create an execution environment (likely a dedicated
> ExecutorService and Classloader), and transition the state of the driver to
> Running (the exact state model would need to be worked out).  To be really
> nice, we could develop a custom Ant task/Maven plugin/Gradle plugin to
> create CARs.   I can also imagine an opportunities to add hooks to this
> model to register instrumentation information with JMX and authorization.
>
> To keep the scope of this email confined, we would introduce the general
> notion of a Resource, and (hand wave hand wave) eventually compartmentalize
> the execution of work around a resource [1].  This (hand waved)
> compartmentalization would allow us the controls necessary to safely and
> reliably perform in-place driver upgrades.  For an initial release, I would
> recommend implementing the abstractions, loading mechanism, extension data
> model, and discovery features.  With these capabilities in place, we could
> attack the in-place upgrade model.
>
> If we were to adopt such a pluggable capability, we would have the
> opportunity to decouple the vendor and CloudStack release schedules.  For
> example, if a vendor were introducing a new product that required a new or
> updated driver, they would no longer need to wait for a CloudStack release
> to support it.  They would also gain the ability to fix high priority
> defects in the same manner.
>
> I have hand waved a number of issues that would need to be resolved before
> such an approach could be implemented.  However, I think we need to decide,
> as a community, that it worth devoting energy and effort to enhancing the
> plugin/driver model and the goals of that effort before driving head first
> into the deep rabbit hole of design/implementation.
>
> Thoughts? (/me ducks)
> -John
>
> [1]: My opinions on the matter from CloudStack Collab 2013 ->
> http://www.slideshare.net/JohnBurwell1/how-to-run-from-a-zombie-cloud-stack-distributed-process-management
>



-- 
*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