[openstack-dev] [Murano] Versioning of Murano packages and MuranoPL classes

Alexander Tivelkov ativelkov at mirantis.com
Tue Jul 14 08:23:10 UTC 2015


Gosha,

Could you please elaborate what do you mean by extra blocks? Glance V3
comes with Glance out-of-the box, no extra deployment is needed. The only
thing one will have to install is Murano Package Type plugin - but it will
be installed at the same time with Murano.

--
Regards,
Alexander Tivelkov

On Mon, Jul 13, 2015 at 5:54 PM, Georgy Okrokvertskhov <
gokrokvertskhov at mirantis.com> wrote:

>
>
> On Mon, Jul 13, 2015 at 2:19 AM, Alexander Tivelkov <
> ativelkov at mirantis.com> wrote:
>
>> Hi Gosha,
>>
>> Supporting versioning in existing backend will require us to re-implement
>> the significant part of Artifact Repository in Murano API: we'll need to
>> add versions and dependencies concepts into our model (which is already
>> complicated and dirty enough), extend appropriate API calls etc. And all
>> the efforts will be a waste of time once we finally migrate to Artifacts.
>>
>> Also, what do you mean by "set by default"? V3 API is experimental, but
>> it is already merged into upstream Glance, so there is no problem with
>> using it in Murano right away.
>>
>> This is exactly why I have these concerns. I wonder how much customers
> will use experimental API in production. I just don't want to add extra
> block on Murano adoption way.
>
>
>
>> --
>> Regards,
>> Alexander Tivelkov
>>
>> On Fri, Jul 10, 2015 at 5:56 PM, Georgy Okrokvertskhov <
>> gokrokvertskhov at mirantis.com> wrote:
>>
>>> Hi Alex,
>>>
>>> Thank you for the great summary.
>>>
>>> I have a concern about item #8. Can we add an option to Murano to use
>>> previous storage engine rather then Glance v3? We need to make sure that v3
>>> API in Glance is set by default before we do a hard dependency on it in
>>> Murano.
>>>
>>> Thanks
>>> Gosha
>>>
>>> On Fri, Jul 10, 2015 at 4:53 AM, Alexander Tivelkov <
>>> ativelkov at mirantis.com> wrote:
>>>
>>>> Hi folks,
>>>>
>>>> Ability to manage multiple versions of application packages and their
>>>> dependencies was always an important item in Murano roadmap, however we
>>>> still don't have a clear spec for this feature.
>>>> Yesterday we hosted a small design session to come up with a plan on
>>>> what can be done in Liberty timeframe to have proper versioning for
>>>> MuranoPL classes and packages. Stan Lagun, Kirill Zaitsev and myself
>>>> participated offline, some other muranoers joined remotely. Thanks to
>>>> everybody who joined us.
>>>>
>>>> TL;DR: it turns out that now we have a clear plan which will allow us
>>>> to achieve proper versioning of the packages and classes, and we'll try to
>>>> implement the most important parts of it in Liberty.
>>>>
>>>> Here is the detailed outcome of the session:
>>>>
>>>>
>>>>    1. We'll use the standard Semantic Versioning format
>>>>    ('Major.Minor.Patch[-dev-build.label[+metadata.label]]') to version our
>>>>    packages: changes which break backwards-compatibility should increment the
>>>>    major segment, non-breaking new features increment the minor segment and
>>>>    all non-breaking bugfixes increment the patch segment. The developers
>>>>    should be carefull with the "new features" part: if you add a new method to
>>>>    a class, it may be considered a breaking change if the existing subclasses
>>>>    of this class have the same method already declared. We still assume that
>>>>    such changes should lead to increment of 'minor' segment, however it is up
>>>>    to best judgement of developers in particular case: if the risk of such
>>>>    method override is really high it may worth to increment the 'major'
>>>>    segment. Proper guideline on the versioning rules will be published closer
>>>>    to L release.
>>>>
>>>>    2. A new field 'Version' is introduced into package manifest file
>>>>    which should define package version in complete semver format. The field
>>>>    itself is optional (so existing apps are not broken), if it is not
>>>>    specified the package is assumed to have version '0.0.0'
>>>>
>>>>    3. The existing 'Require' block of Application manifest will be
>>>>    used to specify the package dependencies. Currently it is a yaml-based
>>>>    dictionary, with the keys set to fully-qualified names of the dependency
>>>>    packages and the values set to the version of those dependencies. Currently
>>>>    this block is used only for integration with apps stored at
>>>>    apps.openstack.org. It is suggested to use this block in the
>>>>    deployment process as well, and extend its semantics.
>>>>    The version of the dependency specified there should also follow
>>>>    the semver notation, however it may be specified in the shortened format,
>>>>    i.e. without specifying the 'patch' or 'patch' and 'minior' components. In
>>>>    this case the dependency will be specified as a range of allowed versions.
>>>>    For example, a dependency version 1.2 will mean a (1.2.0 >= version < 1.3)
>>>>    range.
>>>>    If the version of a dependency is not specified (like in this
>>>>    existing app - [1]) then we assume the version "0" - i.e. the last
>>>>    available pre-release version of a package.
>>>>
>>>>    4. Murano core library is also a package which has its own version.
>>>>    The current one is assumed to have a version 0.1.0, the one which is going
>>>>    to be released in L will be probably called 0.2.0. The lib is still quickly
>>>>    evolving, so we are not releasing a 1.0.0 until we are sure that we are not
>>>>    going to have any breaking changes anytime soon.
>>>>    As with any other package it will be possible to have several
>>>>    versions of the Core Library installed in Murano at the same moment of time.
>>>>
>>>>    5. There is no mandatory need to add the the dependency on the core
>>>>    library to the "Requires" block of each application, as it is added there
>>>>    implicitly. However, this implicit dependency will have a version "0" -
>>>>    i.e. will reference the latest pre-release version of the Core Library
>>>>    available. So it is still better to pin the core library requirement to a
>>>>    particular version to make sure that your app does not break if we
>>>>    introduce any breaking change into the core lib.
>>>>
>>>>    6. All classes defined in a package are assumed to have a version
>>>>    identical to the version of the package.
>>>>
>>>>    7. Murano Extension Plugins (i.e python packages which declare
>>>>    setuptools-entrypoints in 'io.murano.extensions' namespace) also will have
>>>>    similar versioning semantics: they will have a fully qualified name
>>>>    (defined by the setuptools' package name) and a version (also defined by
>>>>    setuptools), an will get an ability to specify their own dependencies if
>>>>    needed. From the class-loader perspective the MuranoPL classes defined in
>>>>    the plugins are no difference from the classes defined in a regular package.
>>>>
>>>>    8. We are going to store murano packages as Glance V3 Artifacts
>>>>    Repository, naturally mapping package's FQN and version to artifact's name
>>>>    and version.
>>>>    The package dependencies will be stored in Glance as cross-artifact
>>>>    dynamic dependencies (i.e. dependencies not on a particular artifact but on
>>>>    the last artifact matching the given name and the version range query) as
>>>>    soon as that feature is implemented in Glance (currently only static
>>>>    dependencies are implemented there). Until that, the dependencies will be
>>>>    stored as a regular list of strings, and the Murano engine will process it
>>>>    and query Glance to fetch the packages.
>>>>
>>>>    9. In L cycle we are not going to show multiple versions of the
>>>>    same app in Murano dashboard: only the last one will be shown if the
>>>>    multiple versions are present. This is to minimize the changes at Dashboard
>>>>    side: in future releases we'll add the ability to select the proper version.
>>>>    The generation of the object model by dynamic UI also remains
>>>>    intact.
>>>>
>>>>    10. However, the structure of the object model isself gets changed:
>>>>    in the "?" block of each object two new fields appear: "package" and
>>>>    "version", which correspond to the FQN and the version of the package which
>>>>    contain the class of the given object. UI leaves these fields as Nones when
>>>>    it generates the OM, and the engine computes them in a regular way: queries
>>>>    the package repository for the most recent version of a package which
>>>>    contains the class with a given name, and saves information about its name
>>>>    and version. This values get persisted in an Object Model when it gets
>>>>    serialized after the deployment. As a result, the versions of the
>>>>    components are fixed once the environment is deployed, so if some packages
>>>>    get updated afterwards, the existing components remain pinned to their
>>>>    initial version. As a result, the environment may get several components of
>>>>    the same type but different versions.
>>>>
>>>>    11. When the Object Model is validated after the deserialization,
>>>>    the behavior of "$.class()" contract is changed. During its validation the
>>>>    value passed to the appropriate property or argument should be of a type
>>>>    which is declared either in a current package (or in the another version of
>>>>    the current package, given that the major component of the versions is the
>>>>    same) or in one of the packages satisfying the requirements of the current
>>>>    one. I.e. it becomes impossible to reference any class from the
>>>>    unreferenced package.
>>>>
>>>>    12. When inheriting some other class using the 'Extends' attribute,
>>>>    the ancestor class should be defined either in the current package or in
>>>>    one of the packages satisfying the requirements of the current one.
>>>>
>>>>    13. (creepy advanced stuff) It may turn out that in case of the
>>>>    multiple inheritance a single class will attempt to inherit from two
>>>>    different versions of a same class. An exception should be thrown in this
>>>>    case, unless there is a possibility to find a version of this class which
>>>>    satisfies all parties.
>>>>
>>>> *For example: classA inherits classB from packageX and classC from
>>>> packageY. Both classB and classC inherit from classD from packageZ, however
>>>> packageX depends on the version 1.2.0 of packageZ, while packageY depends
>>>> on the version 1.3.0. This leads to a situation when classA transitively
>>>> inherits classD of both versions 1.2 and 1.3. So, an exception will be
>>>> thrown. However, if packageY's dependency would be just "1" (which means
>>>> any of the 1.x.x family) the conflict would be resolved and a 1.2 would be
>>>> used as it satisfies both inheritance chains.*
>>>>
>>>>
>>>>
>>>> So, all the above cover most of our present needs for MuranoPL package
>>>> and class versioning.
>>>> Also, we already have a way which allows us to properly version the
>>>> format of MuranoPL language (a "Format" key in application manifests) and
>>>> UI-definition files ("Version" key in that files). This basically allows us
>>>> to target the packages for a minimum version of Murano / Murano Dashboard.
>>>>
>>>>
>>>> I hope this rather lengthly email is useful. Stan Lagun has taken an
>>>> action item to frame all the above into a more formal spec.
>>>>
>>>>
>>>>
>>>> [1]
>>>> https://github.com/openstack/murano-apps/blob/master/MySQL/package/manifest.yaml#L26
>>>>
>>>>
>>>> --
>>>> Regards,
>>>> Alexander Tivelkov
>>>>
>>>>
>>>> __________________________________________________________________________
>>>> OpenStack Development Mailing List (not for usage questions)
>>>> Unsubscribe:
>>>> OpenStack-dev-request at lists.openstack.org?subject:unsubscribe
>>>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>>>>
>>>>
>>>
>>>
>>> --
>>> Georgy Okrokvertskhov
>>> Architect,
>>> OpenStack Platform Products,
>>> Mirantis
>>> http://www.mirantis.com
>>> Tel. +1 650 963 9828
>>> Mob. +1 650 996 3284
>>>
>>>
>>> __________________________________________________________________________
>>> OpenStack Development Mailing List (not for usage questions)
>>> Unsubscribe:
>>> OpenStack-dev-request at lists.openstack.org?subject:unsubscribe
>>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>>>
>>>
>>
>> __________________________________________________________________________
>> OpenStack Development Mailing List (not for usage questions)
>> Unsubscribe:
>> OpenStack-dev-request at lists.openstack.org?subject:unsubscribe
>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>>
>>
>
>
> --
> Georgy Okrokvertskhov
> Architect,
> OpenStack Platform Products,
> Mirantis
> http://www.mirantis.com
> Tel. +1 650 963 9828
> Mob. +1 650 996 3284
>
> __________________________________________________________________________
> OpenStack Development Mailing List (not for usage questions)
> Unsubscribe: OpenStack-dev-request at lists.openstack.org?subject:unsubscribe
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstack.org/pipermail/openstack-dev/attachments/20150714/73eb9743/attachment.html>


More information about the OpenStack-dev mailing list