[openstack-dev] [Heat] On how to handle multiple template formats
Angus Salkeld
asalkeld at redhat.com
Fri Jun 7 03:57:15 UTC 2013
On 27/05/13 13:10 +0200, Zane Bitter wrote:
>Or, more specifically, _where_ to handle multiple template formats.
[snip]
So I just want to show how this and the environment stuff I busy
with can work together:
https://review.openstack.org/#/q/status:open+project:openstack/heat+branch:master+topic:bp/environments,n,z
(after some rework, from the feedback)
I'll change the environment format to look like this (based on
Randall's idea):
#Use case 1: I want to use all the resource types from provider X
resource-registry:
"OS::*": "Dreamhost::*"
# could also use a url like this (assuming they could all be
# expressed in nested stacks)
"OS::*": http://dreamhost.com/bla/resources-types/*"
#Use case 2: I want to use mostly the default resources except my
custom one for a particular resource in the template.
resource-registry:
resources:
my_db_server:
"OS::DBInstance": file://~/all_my_cool_templates/db.yaml
#Use case 3: I always want to always map resource type X to Y
resource-registry:
"OS::Networking::FloatingIP": "OS::Nova::FloatingIP"
"OS::Loadbalancer": file://~/all_my_cool_templates/lb.yaml
#Use case 4: I use custom resources a lot and want to shorten the
url/path
resource-registry:
base_url: http://bla.foo/long/url/
resources:
my_db_server:
"OS::DBInstance": dbaas.yaml
#Use case 5: I need to override a resource property in the template
properties:
global:
resources:
my_db_server:
ImageId: thisone_works_better
InstanceType: x1.large
#Use case 6: I need to override a resource property in the template
(for all resources)
properties:
global:
username: foo
pass: thewiggles
resources:
Some notes on the above:
- there is no external concept of a provider, we only map resource types
and templates to official resource types (OS::bla..). This way your
template always uses "OS::.." and we map cloud specific or custom
resource types to those.
- the heat client gets the file:// templates and adds them to the
files section in Zane's proposal.
- the api or engine gets the url based templates
- there is no need to upload the templates ahead of time (but we
_could_ still support that) - refering to:
https://wiki.openstack.org/wiki/Heat/Providers#How_might_it_work_in_practice.3F
- before creating a resource the engine asks the enviroment what
is the requested implementation if a resource type.
env.resource_realization_get('OS::whatever') that will give the
engine what it actually needs.
-Angus
>
>I'd like to propose in more concrete form an idea that I started
>kicking around on the mailing list a few weeks back[2], but which
>didn't engender any discussion at the time.
>
>* Templates could reference external files using a function similar
>to "Ref", but for files. I'm leaning toward it being called "Url" and
>it accepting both relative and absolute URLs. (Other options might be
>"File" or "Include".)
>* Clients (i.e. python-heatclient) could recursively parse templates
>for {"Url": "..."} references, and ensure all of the necessary files,
>including e.g. relative file paths, are included in the request.
>(This is the reason for the function - the client need not know
>anything else about the template format.)
>* We would take advantage of our APIs being JSON/YAML-only to simply
>include all of the files inline in a request (either as JSON or as
>strings). This gives us the advantages of zip files, without the
>disadvantages (opaqueness to diffs being the major one).
>* Files other than the top-level template would be passed as a
>dictionary/map keyed by the URL in the "Url" function. The engine,
>when interpreting a "Url" function would first look in the files map,
>before attempting to fetch from the URL if necessary and appropriate.
>
>A trivial example of what a ReST API POST request might look like:
>
>{
> "stack_name": "{stack_name}",
> "parameters": {
> "param_name-1": "param_value-1",
> "param_name-2": "param_value-2"
> },
> "timeout_mins": {timeout_mins},
> "template": {
> "parameters": {
> <elided> ...
> },
> "resources": {
> "nested-stack-1": {
> type: "os::orchestration::stack",
> template: {"Url": "./substack-1.template"},
> parameters: {"param_name": {"Ref": "param_name-1"}}
> },
> "nested-stack-2": {
> type: "os::orchestration::stack",
> template: {"Url": "./substack-2.template"},
> parameters: {"param_name": {"Ref": "param_name-2"}}
> }
> }
> },
> "files": {
> "./substack-1.template": {
> <elided> ...
> },
> "./substack-2.template": {
> <elided> ...
> }
> }
>}
>
>(only the "files" section is new from the API's point of view).
>
>I would really like this to be able to replace the blueprint that I
>proposed earlier for uploading provider templates and storing them in
>the engine[3]. I have always feared that that proposal will result in
>the sort of statefulness that reduces the chances of anybody ever
>being able to launch the same stack twice to near zero. Whether this
>can replace that, however, depends very much on what the
>"Environments" feature ends up looking like, and figuring that out is
>another discussion[4]. (One thing that would help: an option to
>specify a different URL Base in the environment for providers.)
>
>Getting back to the topic at hand (remember that?), I believe that
>handling multiple input files in roughly this fashion, or something
>equivalent, would obviate the need to do translation of templates at
>the API level and tilt the calculus in favour of doing it in the
>engine.
>
>cheers,
>Zane.
>
>
>[1] Sorry.
>[2] http://lists.openstack.org/pipermail/openstack-dev/2013-May/008703.html
>[3] https://blueprints.launchpad.net/heat/+spec/provider-upload
>[4] Angus has suggested an interesting starting point here:
>https://wiki.openstack.org/wiki/Heat/Environments
>
>_______________________________________________
>OpenStack-dev mailing list
>OpenStack-dev at lists.openstack.org
>http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
More information about the OpenStack-dev
mailing list