This repository has been archived by the owner on Jan 3, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 28
/
cloudformation.go
63 lines (63 loc) · 2.53 KB
/
cloudformation.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// Package cloudformation provides a schema and related functions that allow
// you to reason about cloudformation template documents.
//
// Parsing example:
//
// t := Template{}
// json.NewDecoder(os.Stdin).Decode(&t)
//
// Producing Example:
//
// t := NewTemplate()
// t.Parameters["DnsName"] = &Parameter{
// Type: "string",
// Default: "example.com",
// Description: "the top level DNS name for the service"
// }
// t.AddResource("DataBucket", &S3Bucket{
// BucketName: Join("-", *String("data"), *Ref("DnsName").String())
// })
// json.NewEncoder(os.Stdout).Encoder(t)
//
// See the examples directory for a more complete example of producing a
// cloudformation template from code.
//
// Producing the Schema
//
// As far as I can tell, AWS do not produce a structured document that
// describes the Cloudformation schema. The names and types for the
// various resources and objects are derived from scraping their HTML
// documentation (see scraper/). It is mostly, but not entirely,
// complete. I've noticed several inconsistencies in the documentation
// which suggests that it is constructed by hand. If you run into
// problems, please submit a bug (or better yet, a pull request).
//
// Object Types
//
// Top level objects in Cloudformation are called resources. They have
// names like AWS::S3::Bucket and appear as values in the "Resources"
// mapping. We remove the punctuation from the name to derive a golang
// structure name like S3Bucket.
//
// There other non-resource structures that are refered to either by
// resources or by other structures. These objects have names with
// spaces like "Amazon S3 Versioning Configuration". To derive a golang
// type name the non-letter characters are removed to get
// S3VersioningConfiguration.
//
// Type System
//
// Cloudformation uses three scalar types: string, int and bool. When
// they appear as properties we represent them as *StringExpr, *IntegerExpr,
// and *BoolExpr respectively. These types reflect that fact that a
// scalar type could be a literal string, int or bool, or could be a
// JSON dictionary representing a function call. (The *Expr structs have
// custom MarshalJSON and UnmarshalJSON that account for this)
//
// Another vagary of the cloudformation language is that in cases where
// a list of objects is expects, a single object can provided. To account
// for this, whenever a list of objects appears, a custom type *WhateverList
// is used. This allows us to add a custom UnmarshalJSON which transforms
// an object into a list containing an object.
//
package cloudformation