<div dir="ltr"><div><div><div><div><div><div><div><div><div>Hi Steve, Thomas<br><br></div>I'm glad the discussion is so constructive!<br><br></div>If we add type interfaces to HOT this may do the job. <br></div>Applications in AppCatalog need to be portable across OpenStack clouds. Thus if we use some globally-unique type naming system applications could identify their dependencies in unambiguous way.<br>

</div><br>We also would need to establish relations between between interfaces. <br></div>Suppose there is My::Something::Database interface and 7 compatible materializations:<br></div>My::Something::TroveMySQL<br></div>
My::Something::GaleraMySQL<br>
My::Something::PostgreSQL<br>My::Something::OracleDB<br>My::Something::MariaDB<br>My::Something::MongoDB<br>My::Something::HBase<br><br></div>There are apps that (say SQLAlchemy-based apps) are fine with any relational DB. In that case all templates except for MongoDB and HBase should be matched. There are apps that design to work with MySQL only. In that case only TroveMySQL, GaleraMySQL and MariaDB should be matched. There are application who uses PL/SQL and thus require OracleDB (there can be several Oracle implementations as well). There are also applications (Marconi and Ceilometer are good example) that can use both some SQL and NoSQL databases. So conformance to Database interface is not enough and some sort of interface hierarchy required.<br>

<br></div>Another thing that we need to consider is that even compatible implementations may have different set of parameters. For example clustered-HA PostgreSQL implementation may require additional parameters besides those needed for plain single instance variant. Template that consumes *any* PostgreSQL will not be aware of those additional parameters. Thus they need to be dynamically added to environment's input parameters and resource consumer to be patched to pass those parameters to actual implementation<br>

<div><div><div><div><div><div><div><div><div><div><div><div><br></div></div></div></div></div></div></div></div></div></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Apr 4, 2014 at 9:53 AM, Thomas Spatzier <span dir="ltr"><<a href="mailto:thomas.spatzier@de.ibm.com" target="_blank">thomas.spatzier@de.ibm.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Steve,<br>
<br>
your indexing idea sounds interesting, but I am not sure it would work<br>
reliably. The kind of matching based on names of parameters and outputs and<br>
internal get_attr uses has very strong assumptions and I think there is a<br>
not so low risk of false positives. What if the templates includes some<br>
internal details that would not affect the matching but still change the<br>
behavior in a way that would break the composition. Or what if a user by<br>
chance built a template that by pure coincidence uses the same parameter<br>
and output names as one of those abstract types that was mention, but the<br>
template is simply not built for composition?<br>
<br>
I think it would be much cleaner to have an explicit attribute in the<br>
template that says "this template can be uses as realization of type<br>
My::SomeType" and use that for presenting the user choice and building the<br>
environment.<br>
<br>
Regards,<br>
Thomas<br>
<br>
Steve Baker <<a href="mailto:sbaker@redhat.com">sbaker@redhat.com</a>> wrote on 04/04/2014 06:12:38:<br>
> From: Steve Baker <<a href="mailto:sbaker@redhat.com">sbaker@redhat.com</a>><br>
> To: <a href="mailto:openstack-dev@lists.openstack.org">openstack-dev@lists.openstack.org</a><br>
> Date: 04/04/2014 06:14<br>
> Subject: Re: [openstack-dev] [Heat] [Murano] [Solum] applications inthe<br>
cloud<br>
<div class="HOEnZb"><div class="h5">><br>
> On 03/04/14 13:04, Georgy Okrokvertskhov wrote:<br>
> Hi Steve,<br>
><br>
> I think this is exactly the place where we have a boundary between<br>
> Murano catalog and HOT.<br>
><br>
> In your example one can use abstract resource type and specify a<br>
> correct implementation via environment file. This is how it will be<br>
> done on the final stage in Murano too.<br>
><br>
> Murano will solve another issue. In your example user should know<br>
> what template to use as a provider template. In Murano this will be<br>
> done in the following way:<br>
> 1) User selects an app which requires a DB<br>
> 2) Murano sees this requirement for DB and do a search in the app<br>
> catalog to find all apps which expose this functionality. Murano<br>
> uses app package definitions for that.<br>
> 3) User select in UI specific DB implementation he wants to use.<br>
><br>
> As you see, in Murano case user has no preliminary knowledge of<br>
> available apps\templates and it uses catalog to find it. A search<br>
> criteria can be quite complex with using different application<br>
> attribute. If we think about moving application definition to HOT<br>
> format it should provide all necessary information for catalog.<br>
><br>
> In order to search apps in catalog which uses HOT format we need<br>
> something like that:<br>
><br>
> One needs to define abstract resource like<br>
> OS:HOT:DataBase<br>
><br>
> Than in each DB implementation of DB resource one has to somehow<br>
> refer this abstract resource as a parent like<br>
><br>
> Resource OS:HOT:MySQLDB<br>
>   Parent: OS:HOT:DataBase<br>
><br>
> Then catalog part can use this information and build a list of all<br>
> apps\HOTs with resources with parents OS:HOT:DataBase<br>
><br>
> That is what we are looking for. As you see, in this example I am<br>
> not talking about version and other attributes which might be<br>
> required for catalog.<br>
><br>
><br>
> This sounds like a vision for Murano that I could get behind. It<br>
> would be a tool which allows fully running applications to be<br>
> assembled and launched from a catalog of Heat templates (plus some<br>
> app lifecycle workflow beyond the scope of this email).<br>
><br>
> We could add type interfaces to HOT but I still think duck typing<br>
> would be worth considering. To demonstrate, lets assume that when a<br>
> template gets cataloged, metadata is also indexed about what<br>
> parameters and outputs the template has. So for the case above:<br>
> 1) User selects an app to launch from the catalog<br>
> 2) Murano performs a heat resource-type-list and compares that with<br>
> the types in the template. The resource-type list is missing<br>
> My::App::Database for a resource named my_db<br>
> 3) Murano analyses the template and finds that My::App::Database is<br>
> assigned 2 properties (db_username, db_password) and elsewhere in<br>
> the template is a {get_attr: [my_db, db_url]} attribute access.<br>
> 4) Murano queries glance for templates, filtering by templates which<br>
> have parameters [db_username, db_password] and outputs [db_url]<br>
> (plus whatever appropriate metadata filters)<br>
> 5) Glance returns 2 matches. Murano prompts the user for a choice<br>
> 6) Murano constructs an environment based on the chosen template,<br>
> mapping My::App::Database to the chosen template<br>
> 7) Murano launches the stack<br>
><br>
> Sure, there could be a type interface called My::App::Database which<br>
> declares db_username, db_password and db_url, but since a heat<br>
> template is in a readily parsable declarative format, all required<br>
> information is available to analyze, both during glance indexing and<br>
> app launching.<br>
><br>
<br>
><br>
<br>
> On Wed, Apr 2, 2014 at 3:30 PM, Steve Baker <<a href="mailto:sbaker@redhat.com">sbaker@redhat.com</a>> wrote:<br>
> On 03/04/14 10:39, Ruslan Kamaldinov wrote:<br>
> > This is a continuation of the "MuranoPL questions" thread.<br>
> ><br>
> > As a result of ongoing discussions, we figured out that definitionof<br>
layers<br>
> > which each project operates on and has responsibility for is not yet<br>
agreed<br>
> > and discussed between projects and teams (Heat, Murano, Solum (in<br>
> > alphabetical order)).<br>
> ><br>
> > Our suggestion and expectation from this working group is to have such<br>
> > a definition of layers, agreement on it and an approach of reaching it.<br>
> ><br>
> > As a starting point, we suggest the following:<br>
> ><br>
> > There are three layers of responsibility:<br>
> > 1. Resources of the cloud<br>
> > 2. Applications of the cloud<br>
> > 3. Layers specific for Murano and Solum (to be further discussed and<br>
> >    clarified, for this discussion it's out of scope)<br>
> ><br>
> > Layer 1 is obviously covered by Heat.<br>
> ><br>
> > Most of the disagreement is around layer 2. Our suggestion is to figure<br>
out<br>
> > the way where we can have common engine, DSL and approach to apps<br>
> description.<br>
> > For this we'll take HOT and TOSCA as a basis and will work on addition<br>
of<br>
> > functionality missing from Murano and Solum point of view.<br>
> ><br>
> > We'll be happy if existing Heat team continue working on it, having the<br>
full<br>
> > control of the project, provided that we agree on functionality<br>
> missing there<br>
> > from Murano and Solum point of view and addition of this functionality<br>
in a<br>
> > systematic way.<br>
> ><br>
> > Let me outline the main concern in regards to HOT from Murano<br>
perspective.<br>
> > Others concerns could be figured out later. The typical use case<br>
> for Murano is<br>
> > the following:<br>
> > Application writer sets a requirement for her application to use RDBMS<br>
> > assuming that it can be MySQL, PostgreSQL or MSSQL. HOT engine<br>
> should be able<br>
> > to understand such requirements and be able to satisfy them by<br>
instantiating<br>
> > instances with DB. End user should be able to control which<br>
> particular type of<br>
> > DB should be used. This is quite similar to abstract requirements<br>
> described in<br>
> > TOSCA. As Heat wants to cover TOSCA format too this Murano requirement<br>
is<br>
> > pretty well aligned with what HOT\TOSCA can provide.<br>
> ><br>
> ><br>
> > Hopefully this functionality can be introduced into HOT. Solum and<br>
> Murano will<br>
> > leverage it by using some common API, and implementing layer 3 as thin<br>
as<br>
> > possible.<br>
> ><br>
> > Again, this is only suggested starting point, something to begin with.<br>
> ><br>
> Thanks for bring this discussion back to solving specific problems. The<br>
> above database abstraction can be nicely represented using HOT<br>
> environments and provider resources [1].<br>
><br>
> Take the following template snippet:<br>
><br>
> resources:<br>
>   my_db:<br>
>     type: My::Database<br>
>     properties:<br>
>       # ...<br>
><br>
>   my_server<br>
>     type: OS::Nova::Server<br>
>     properties:<br>
>       # ... including a {get_attr: [my_db, connection_url]}<br>
><br>
> My::Database is a type defined in the environment which is included in<br>
> the stack-create call. Different environments can provide different<br>
> database implementations, for example:<br>
><br>
> resource_registry:<br>
>   "My::Database": path/to/trove_wrapper.yaml<br>
><br>
> resource_registry:<br>
>   "My::Database": path/to/nova_galera_ubercluster.yaml<br>
><br>
> resource_registry:<br>
>   "My::Database": path/to/postgresql.yaml<br>
><br>
> Each of these templates could be implemented to have the same parameters<br>
> and outputs so the template will work with any of these resource<br>
> provider templates.<br>
><br>
> One thing we could consider adding to HOT is allow the defining of a<br>
> type interface, and validating that a given template/resource implements<br>
> its declared interfaces. However the above example works just fine<br>
> without interfaces, and this duck-typing approach may provide a better<br>
> user experience anyway.<br>
><br>
> [1]<br>
<a href="http://docs.openstack.org/developer/heat/template_guide/environment.html" target="_blank">http://docs.openstack.org/developer/heat/template_guide/environment.html</a><br>
</div></div><div class="HOEnZb"><div class="h5">> _______________________________________________<br>
> OpenStack-dev mailing list<br>
> <a href="mailto:OpenStack-dev@lists.openstack.org">OpenStack-dev@lists.openstack.org</a><br>
> <a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
<br>
<br>
_______________________________________________<br>
OpenStack-dev mailing list<br>
<a href="mailto:OpenStack-dev@lists.openstack.org">OpenStack-dev@lists.openstack.org</a><br>
<a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br><div dir="ltr"><span style="border-collapse:separate;color:rgb(0,0,0);font-family:'Times New Roman';font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;font-size:medium"><span style="font-family:arial;font-size:small">Sincerely yours<br>

Stanislav (Stan) Lagun<br>Principal Developer<br>Mirantis</span></span><br><span style="border-collapse:separate;color:rgb(0,0,0);font-family:'Times New Roman';font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;font-size:medium"><span style="font-family:arial;font-size:small"><span style="font-size:10.0pt;font-family:"Arial","sans-serif"" lang="EN-US">35b/3, Vorontsovskaya
St.</span><br>Moscow, Russia<br>Skype: stanlagun<br><a href="http://www.mirantis.com/" target="_blank">www.mirantis.com</a><br><a href="mailto:slagun@mirantis.com" target="_blank">slagun@mirantis.com</a></span></span></div>


</div></div>