[openstack-dev] [Heat] On how to handle multiple template formats

Angus Salkeld asalkeld at redhat.com
Mon May 27 12:35:11 UTC 2013


On 27/05/13 13:10 +0200, Zane Bitter wrote:
>Or, more specifically, _where_ to handle multiple template formats. 
>Two options have been proposed (with patches, even!):
>
>In the API:
>    https://review.openstack.org/#/c/30405/
>In the Engine:
>    https://review.openstack.org/#/c/30439/
>
>As Steve H correctly points out in the reviews, the question of which 
>is preferred comes down to whether we should translate to some 
>internal format immediately on reception of the template, or if we 
>should delay until it is received by the engine. Originally it was 
>thought by everyone that translation would need to happen 
>immediately, and this assumption is captured in 
>https://wiki.openstack.org/wiki/Heat/Vision.
>
>However, to my mind this comes with a major disadvantage: the plan, 
>as I understand it, is to initially translate HOT documents to the 
>currently-native CloudFormation format to allow experimentation with 
>HOT. However this has a very short horizon of usefulness - the entire 
>purpose of HOT is to express things that cannot be expressed in the 
>CloudFormation format (indeed, to the extent that it represents only 
>a less-documented version of the same thing with different names, it 
>would be worse than useless). So this would be followed quickly by an 
>inversion of the translation and a switch to HOT as the native format 
>of the engine - a switch that afaict would need to be pulled off in 
>one massive hit.
>
>By contrast, putting the code in the engine offers the prospect of a 
>more incremental way of changing over: by gradually replacing code 
>that directly manipulates the structure of the template data with 
>programmatic interfaces to to it (e.g. instead of doing 
>template['Parameters'] and getting a JSON tree back, call 
>template.parameters() and get a Parameters object back). No doubt 
>this will present difficulties with maintaining two parallel template 
>formats, although it's hard to say how much worse that would be than 
>maintaining the translation code.
>

I think we need to seperate out the short term and long term.

Long term:
convert cfn to hot in the api and have a "pure" hot based engine.

The problem is we currently have this the other way.


>I believe that one of the reasons for our original instinct that 
>translation would need to happen on input was the uncertainty around 
>how we will deal with templates that are composed of multiple files. 

I think there are multiple problems, this been one.

- migrating all the database data (state/instance names, data
   structure).
- translating cfn concepts to new ones in hot

I think we simply need to start pushing the new concepts into
the engine and at the same time putting a covertion from cfn to
the partially implmented hot into the heat-cfn-api.


>(This is already a pain point, with AWS::CloudFormation::Stack 
>resources having to obtain their templates from a URL.) TOSCA solves 
>this with zip files, and if we were to follow suit then the need for 
>some translation on the front end would be basically a given.
>
>One concern I have with the HOT discussion as I have understood it so 
>far is that it seems to propose the template format as a bit of a 
>"file soup" - you throw a bunch of files at Heat, which figures out 
>how they relate to each other and forms them into a stack. This is, 
>of course, fairly trivial to do in code, but for the person reading 
>or writing a template it is not so easy. I would prefer something 
>more akin to the current system (including the proposed Provider 
>blueprints), which is essentially hierarchical. You start with one 
>thing that is The Template and can dig down into subsystems (nested 
>stack templates) or implementations (provider templates) - and, in 
>HOT, other resources like scripts or configuration management data. 
>This gives the user a mental foothold[1] from which to begin 
>interpreting the template.
>
>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 

Yea, I worry about that too, but at the same time declartive templates
are a bit like libraries in that bugs can be fixed and if you
re-create the stack later it won't have the same bugs (maybe some new
ones;).

>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