Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 1 | package stacks |
| 2 | |
| 3 | import ( |
Pratik Mallya | 827c03e | 2015-09-17 00:10:47 -0500 | [diff] [blame] | 4 | "strings" |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 5 | |
Krzysztof Szukiełojć | 3f41d08 | 2017-05-07 14:43:06 +0200 | [diff] [blame] | 6 | "gerrit.mcp.mirantis.net/debian/gophercloud.git" |
Krzysztof Szukiełojć | 24a29ce | 2017-05-07 14:24:02 +0200 | [diff] [blame] | 7 | "gerrit.mcp.mirantis.net/debian/gophercloud.git/pagination" |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 8 | ) |
| 9 | |
| 10 | // CreateOptsBuilder is the interface options structs have to satisfy in order |
| 11 | // to be used in the main Create operation in this package. Since many |
| 12 | // extensions decorate or modify the common logic, it is useful for them to |
| 13 | // satisfy a basic interface in order for them to be used. |
| 14 | type CreateOptsBuilder interface { |
| 15 | ToStackCreateMap() (map[string]interface{}, error) |
| 16 | } |
| 17 | |
| 18 | // CreateOpts is the common options struct used in this package's Create |
| 19 | // operation. |
| 20 | type CreateOpts struct { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 21 | // The name of the stack. It must start with an alphabetic character. |
| 22 | Name string `json:"stack_name" required:"true"` |
| 23 | // A structure that contains either the template file or url. Call the |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 24 | // associated methods to extract the information relevant to send in a create request. |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 25 | TemplateOpts *Template `json:"-" required:"true"` |
| 26 | // Enables or disables deletion of all stack resources when a stack |
Jon Perritt | 952f3e1 | 2015-02-03 12:13:24 -0700 | [diff] [blame] | 27 | // creation fails. Default is true, meaning all resources are not deleted when |
| 28 | // stack creation fails. |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 29 | DisableRollback *bool `json:"disable_rollback,omitempty"` |
| 30 | // A structure that contains details for the environment of the stack. |
| 31 | EnvironmentOpts *Environment `json:"-"` |
| 32 | // User-defined parameters to pass to the template. |
Ildar Svetlov | d213969 | 2020-11-10 15:16:16 +0400 | [diff] [blame^] | 33 | Parameters map[string]interface{} `json:"parameters,omitempty"` |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 34 | // The timeout for stack creation in minutes. |
| 35 | Timeout int `json:"timeout_mins,omitempty"` |
| 36 | // A list of tags to assosciate with the Stack |
| 37 | Tags []string `json:"-"` |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 38 | } |
| 39 | |
| 40 | // ToStackCreateMap casts a CreateOpts struct to a map. |
| 41 | func (opts CreateOpts) ToStackCreateMap() (map[string]interface{}, error) { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 42 | b, err := gophercloud.BuildRequestBody(opts, "") |
| 43 | if err != nil { |
Jon Perritt | 58611da | 2016-03-09 00:49:57 -0600 | [diff] [blame] | 44 | return nil, err |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 45 | } |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 46 | |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 47 | if err := opts.TemplateOpts.Parse(); err != nil { |
| 48 | return nil, err |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 49 | } |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 50 | |
| 51 | if err := opts.TemplateOpts.getFileContents(opts.TemplateOpts.Parsed, ignoreIfTemplate, true); err != nil { |
| 52 | return nil, err |
| 53 | } |
| 54 | opts.TemplateOpts.fixFileRefs() |
| 55 | b["template"] = string(opts.TemplateOpts.Bin) |
| 56 | |
| 57 | files := make(map[string]string) |
| 58 | for k, v := range opts.TemplateOpts.Files { |
| 59 | files[k] = v |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 60 | } |
| 61 | |
| 62 | if opts.EnvironmentOpts != nil { |
| 63 | if err := opts.EnvironmentOpts.Parse(); err != nil { |
| 64 | return nil, err |
| 65 | } |
Pratik Mallya | a979f5b | 2015-09-22 03:10:55 -0500 | [diff] [blame] | 66 | if err := opts.EnvironmentOpts.getRRFileContents(ignoreIfEnvironment); err != nil { |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 67 | return nil, err |
| 68 | } |
Pratik Mallya | a979f5b | 2015-09-22 03:10:55 -0500 | [diff] [blame] | 69 | opts.EnvironmentOpts.fixFileRefs() |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 70 | for k, v := range opts.EnvironmentOpts.Files { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 71 | files[k] = v |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 72 | } |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 73 | b["environment"] = string(opts.EnvironmentOpts.Bin) |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 74 | } |
| 75 | |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 76 | if len(files) > 0 { |
| 77 | b["files"] = files |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 78 | } |
| 79 | |
Pratik Mallya | 827c03e | 2015-09-17 00:10:47 -0500 | [diff] [blame] | 80 | if opts.Tags != nil { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 81 | b["tags"] = strings.Join(opts.Tags, ",") |
Pratik Mallya | 827c03e | 2015-09-17 00:10:47 -0500 | [diff] [blame] | 82 | } |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 83 | |
| 84 | return b, nil |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 85 | } |
| 86 | |
| 87 | // Create accepts a CreateOpts struct and creates a new stack using the values |
| 88 | // provided. |
Jon Perritt | 3860b51 | 2016-03-29 12:01:48 -0500 | [diff] [blame] | 89 | func Create(c *gophercloud.ServiceClient, opts CreateOptsBuilder) (r CreateResult) { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 90 | b, err := opts.ToStackCreateMap() |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 91 | if err != nil { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 92 | r.Err = err |
Jon Perritt | 3860b51 | 2016-03-29 12:01:48 -0500 | [diff] [blame] | 93 | return |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 94 | } |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 95 | _, r.Err = c.Post(createURL(c), b, &r.Body, nil) |
jrperritt | 29ae6b3 | 2016-04-13 12:59:37 -0500 | [diff] [blame] | 96 | return |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 97 | } |
| 98 | |
| 99 | // AdoptOptsBuilder is the interface options structs have to satisfy in order |
| 100 | // to be used in the Adopt function in this package. Since many |
| 101 | // extensions decorate or modify the common logic, it is useful for them to |
| 102 | // satisfy a basic interface in order for them to be used. |
| 103 | type AdoptOptsBuilder interface { |
| 104 | ToStackAdoptMap() (map[string]interface{}, error) |
| 105 | } |
| 106 | |
| 107 | // AdoptOpts is the common options struct used in this package's Adopt |
| 108 | // operation. |
| 109 | type AdoptOpts struct { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 110 | // Existing resources data represented as a string to add to the |
Jon Perritt | 9741dd9 | 2015-02-04 12:05:47 -0700 | [diff] [blame] | 111 | // new stack. Data returned by Abandon could be provided as AdoptsStackData. |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 112 | AdoptStackData string `json:"adopt_stack_data" required:"true"` |
| 113 | // The name of the stack. It must start with an alphabetic character. |
| 114 | Name string `json:"stack_name" required:"true"` |
Jon Perritt | 397ade6 | 2016-03-15 06:55:02 -0500 | [diff] [blame] | 115 | // A structure that contains either the template file or url. Call the |
| 116 | // associated methods to extract the information relevant to send in a create request. |
| 117 | TemplateOpts *Template `json:"-" required:"true"` |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 118 | // The timeout for stack creation in minutes. |
| 119 | Timeout int `json:"timeout_mins,omitempty"` |
| 120 | // A structure that contains either the template file or url. Call the |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 121 | // associated methods to extract the information relevant to send in a create request. |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 122 | //TemplateOpts *Template `json:"-" required:"true"` |
| 123 | // Enables or disables deletion of all stack resources when a stack |
Jon Perritt | 9741dd9 | 2015-02-04 12:05:47 -0700 | [diff] [blame] | 124 | // creation fails. Default is true, meaning all resources are not deleted when |
| 125 | // stack creation fails. |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 126 | DisableRollback *bool `json:"disable_rollback,omitempty"` |
| 127 | // A structure that contains details for the environment of the stack. |
| 128 | EnvironmentOpts *Environment `json:"-"` |
| 129 | // User-defined parameters to pass to the template. |
Ildar Svetlov | d213969 | 2020-11-10 15:16:16 +0400 | [diff] [blame^] | 130 | Parameters map[string]interface{} `json:"parameters,omitempty"` |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 131 | } |
| 132 | |
| 133 | // ToStackAdoptMap casts a CreateOpts struct to a map. |
| 134 | func (opts AdoptOpts) ToStackAdoptMap() (map[string]interface{}, error) { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 135 | b, err := gophercloud.BuildRequestBody(opts, "") |
| 136 | if err != nil { |
Jon Perritt | 58611da | 2016-03-09 00:49:57 -0600 | [diff] [blame] | 137 | return nil, err |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 138 | } |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 139 | |
Jon Perritt | 397ade6 | 2016-03-15 06:55:02 -0500 | [diff] [blame] | 140 | if err := opts.TemplateOpts.Parse(); err != nil { |
| 141 | return nil, err |
| 142 | } |
| 143 | |
| 144 | if err := opts.TemplateOpts.getFileContents(opts.TemplateOpts.Parsed, ignoreIfTemplate, true); err != nil { |
| 145 | return nil, err |
| 146 | } |
| 147 | opts.TemplateOpts.fixFileRefs() |
| 148 | b["template"] = string(opts.TemplateOpts.Bin) |
| 149 | |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 150 | files := make(map[string]string) |
Jon Perritt | 397ade6 | 2016-03-15 06:55:02 -0500 | [diff] [blame] | 151 | for k, v := range opts.TemplateOpts.Files { |
| 152 | files[k] = v |
| 153 | } |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 154 | |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 155 | if opts.EnvironmentOpts != nil { |
| 156 | if err := opts.EnvironmentOpts.Parse(); err != nil { |
| 157 | return nil, err |
| 158 | } |
Pratik Mallya | a979f5b | 2015-09-22 03:10:55 -0500 | [diff] [blame] | 159 | if err := opts.EnvironmentOpts.getRRFileContents(ignoreIfEnvironment); err != nil { |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 160 | return nil, err |
| 161 | } |
Pratik Mallya | a979f5b | 2015-09-22 03:10:55 -0500 | [diff] [blame] | 162 | opts.EnvironmentOpts.fixFileRefs() |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 163 | for k, v := range opts.EnvironmentOpts.Files { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 164 | files[k] = v |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 165 | } |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 166 | b["environment"] = string(opts.EnvironmentOpts.Bin) |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 167 | } |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 168 | |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 169 | if len(files) > 0 { |
| 170 | b["files"] = files |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 171 | } |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 172 | |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 173 | return b, nil |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 174 | } |
| 175 | |
| 176 | // Adopt accepts an AdoptOpts struct and creates a new stack using the resources |
| 177 | // from another stack. |
Jon Perritt | 3860b51 | 2016-03-29 12:01:48 -0500 | [diff] [blame] | 178 | func Adopt(c *gophercloud.ServiceClient, opts AdoptOptsBuilder) (r AdoptResult) { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 179 | b, err := opts.ToStackAdoptMap() |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 180 | if err != nil { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 181 | r.Err = err |
Jon Perritt | 3860b51 | 2016-03-29 12:01:48 -0500 | [diff] [blame] | 182 | return |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 183 | } |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 184 | _, r.Err = c.Post(adoptURL(c), b, &r.Body, nil) |
jrperritt | 29ae6b3 | 2016-04-13 12:59:37 -0500 | [diff] [blame] | 185 | return |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 186 | } |
| 187 | |
| 188 | // SortDir is a type for specifying in which direction to sort a list of stacks. |
| 189 | type SortDir string |
| 190 | |
| 191 | // SortKey is a type for specifying by which key to sort a list of stacks. |
| 192 | type SortKey string |
| 193 | |
| 194 | var ( |
| 195 | // SortAsc is used to sort a list of stacks in ascending order. |
| 196 | SortAsc SortDir = "asc" |
| 197 | // SortDesc is used to sort a list of stacks in descending order. |
| 198 | SortDesc SortDir = "desc" |
| 199 | // SortName is used to sort a list of stacks by name. |
| 200 | SortName SortKey = "name" |
| 201 | // SortStatus is used to sort a list of stacks by status. |
| 202 | SortStatus SortKey = "status" |
| 203 | // SortCreatedAt is used to sort a list of stacks by date created. |
| 204 | SortCreatedAt SortKey = "created_at" |
| 205 | // SortUpdatedAt is used to sort a list of stacks by date updated. |
| 206 | SortUpdatedAt SortKey = "updated_at" |
| 207 | ) |
| 208 | |
| 209 | // ListOptsBuilder allows extensions to add additional parameters to the |
| 210 | // List request. |
| 211 | type ListOptsBuilder interface { |
| 212 | ToStackListQuery() (string, error) |
| 213 | } |
| 214 | |
| 215 | // ListOpts allows the filtering and sorting of paginated collections through |
| 216 | // the API. Filtering is achieved by passing in struct field values that map to |
| 217 | // the network attributes you want to see returned. SortKey allows you to sort |
| 218 | // by a particular network attribute. SortDir sets the direction, and is either |
| 219 | // `asc' or `desc'. Marker and Limit are used for pagination. |
| 220 | type ListOpts struct { |
| 221 | Status string `q:"status"` |
| 222 | Name string `q:"name"` |
| 223 | Marker string `q:"marker"` |
| 224 | Limit int `q:"limit"` |
| 225 | SortKey SortKey `q:"sort_keys"` |
| 226 | SortDir SortDir `q:"sort_dir"` |
| 227 | } |
| 228 | |
| 229 | // ToStackListQuery formats a ListOpts into a query string. |
| 230 | func (opts ListOpts) ToStackListQuery() (string, error) { |
| 231 | q, err := gophercloud.BuildQueryString(opts) |
| 232 | if err != nil { |
| 233 | return "", err |
| 234 | } |
| 235 | return q.String(), nil |
| 236 | } |
| 237 | |
| 238 | // List returns a Pager which allows you to iterate over a collection of |
| 239 | // stacks. It accepts a ListOpts struct, which allows you to filter and sort |
| 240 | // the returned collection for greater efficiency. |
| 241 | func List(c *gophercloud.ServiceClient, opts ListOptsBuilder) pagination.Pager { |
| 242 | url := listURL(c) |
| 243 | if opts != nil { |
| 244 | query, err := opts.ToStackListQuery() |
| 245 | if err != nil { |
| 246 | return pagination.Pager{Err: err} |
| 247 | } |
| 248 | url += query |
| 249 | } |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 250 | createPage := func(r pagination.PageResult) pagination.Page { |
| 251 | return StackPage{pagination.SinglePageBase(r)} |
| 252 | } |
| 253 | return pagination.NewPager(c, url, createPage) |
| 254 | } |
| 255 | |
| 256 | // Get retreives a stack based on the stack name and stack ID. |
jrperritt | 29ae6b3 | 2016-04-13 12:59:37 -0500 | [diff] [blame] | 257 | func Get(c *gophercloud.ServiceClient, stackName, stackID string) (r GetResult) { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 258 | _, r.Err = c.Get(getURL(c, stackName, stackID), &r.Body, nil) |
jrperritt | 29ae6b3 | 2016-04-13 12:59:37 -0500 | [diff] [blame] | 259 | return |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 260 | } |
| 261 | |
| 262 | // UpdateOptsBuilder is the interface options structs have to satisfy in order |
| 263 | // to be used in the Update operation in this package. |
| 264 | type UpdateOptsBuilder interface { |
| 265 | ToStackUpdateMap() (map[string]interface{}, error) |
| 266 | } |
| 267 | |
Ildar Svetlov | d213969 | 2020-11-10 15:16:16 +0400 | [diff] [blame^] | 268 | // UpdatePatchOptsBuilder is the interface options structs have to satisfy in order |
| 269 | // to be used in the UpdatePatch operation in this package |
| 270 | type UpdatePatchOptsBuilder interface { |
| 271 | ToStackUpdatePatchMap() (map[string]interface{}, error) |
| 272 | } |
| 273 | |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 274 | // UpdateOpts contains the common options struct used in this package's Update |
Ildar Svetlov | d213969 | 2020-11-10 15:16:16 +0400 | [diff] [blame^] | 275 | // and UpdatePatch operations. |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 276 | type UpdateOpts struct { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 277 | // A structure that contains either the template file or url. Call the |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 278 | // associated methods to extract the information relevant to send in a create request. |
Ildar Svetlov | d213969 | 2020-11-10 15:16:16 +0400 | [diff] [blame^] | 279 | TemplateOpts *Template `json:"-"` |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 280 | // A structure that contains details for the environment of the stack. |
| 281 | EnvironmentOpts *Environment `json:"-"` |
| 282 | // User-defined parameters to pass to the template. |
Ildar Svetlov | d213969 | 2020-11-10 15:16:16 +0400 | [diff] [blame^] | 283 | Parameters map[string]interface{} `json:"parameters,omitempty"` |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 284 | // The timeout for stack creation in minutes. |
| 285 | Timeout int `json:"timeout_mins,omitempty"` |
Ildar Svetlov | d213969 | 2020-11-10 15:16:16 +0400 | [diff] [blame^] | 286 | // A list of tags to associate with the Stack |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 287 | Tags []string `json:"-"` |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 288 | } |
| 289 | |
Ildar Svetlov | d213969 | 2020-11-10 15:16:16 +0400 | [diff] [blame^] | 290 | // ToStackUpdateMap validates that a template was supplied and calls |
| 291 | // the toStackUpdateMap private function. |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 292 | func (opts UpdateOpts) ToStackUpdateMap() (map[string]interface{}, error) { |
Ildar Svetlov | d213969 | 2020-11-10 15:16:16 +0400 | [diff] [blame^] | 293 | if opts.TemplateOpts == nil { |
| 294 | return nil, ErrTemplateRequired{} |
| 295 | } |
| 296 | return toStackUpdateMap(opts) |
| 297 | } |
| 298 | |
| 299 | // ToStackUpdatePatchMap calls the private function toStackUpdateMap |
| 300 | // directly. |
| 301 | func (opts UpdateOpts) ToStackUpdatePatchMap() (map[string]interface{}, error) { |
| 302 | return toStackUpdateMap(opts) |
| 303 | } |
| 304 | |
| 305 | // ToStackUpdateMap casts a CreateOpts struct to a map. |
| 306 | func toStackUpdateMap(opts UpdateOpts) (map[string]interface{}, error) { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 307 | b, err := gophercloud.BuildRequestBody(opts, "") |
| 308 | if err != nil { |
| 309 | return nil, err |
| 310 | } |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 311 | |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 312 | files := make(map[string]string) |
Ildar Svetlov | d213969 | 2020-11-10 15:16:16 +0400 | [diff] [blame^] | 313 | |
| 314 | if opts.TemplateOpts != nil { |
| 315 | if err := opts.TemplateOpts.Parse(); err != nil { |
| 316 | return nil, err |
| 317 | } |
| 318 | |
| 319 | if err := opts.TemplateOpts.getFileContents(opts.TemplateOpts.Parsed, ignoreIfTemplate, true); err != nil { |
| 320 | return nil, err |
| 321 | } |
| 322 | opts.TemplateOpts.fixFileRefs() |
| 323 | b["template"] = string(opts.TemplateOpts.Bin) |
| 324 | |
| 325 | for k, v := range opts.TemplateOpts.Files { |
| 326 | files[k] = v |
| 327 | } |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 328 | } |
| 329 | |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 330 | if opts.EnvironmentOpts != nil { |
| 331 | if err := opts.EnvironmentOpts.Parse(); err != nil { |
| 332 | return nil, err |
| 333 | } |
Pratik Mallya | a979f5b | 2015-09-22 03:10:55 -0500 | [diff] [blame] | 334 | if err := opts.EnvironmentOpts.getRRFileContents(ignoreIfEnvironment); err != nil { |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 335 | return nil, err |
| 336 | } |
Pratik Mallya | a979f5b | 2015-09-22 03:10:55 -0500 | [diff] [blame] | 337 | opts.EnvironmentOpts.fixFileRefs() |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 338 | for k, v := range opts.EnvironmentOpts.Files { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 339 | files[k] = v |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 340 | } |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 341 | b["environment"] = string(opts.EnvironmentOpts.Bin) |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 342 | } |
| 343 | |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 344 | if len(files) > 0 { |
| 345 | b["files"] = files |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 346 | } |
| 347 | |
Pratik Mallya | 827c03e | 2015-09-17 00:10:47 -0500 | [diff] [blame] | 348 | if opts.Tags != nil { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 349 | b["tags"] = strings.Join(opts.Tags, ",") |
Pratik Mallya | 827c03e | 2015-09-17 00:10:47 -0500 | [diff] [blame] | 350 | } |
| 351 | |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 352 | return b, nil |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 353 | } |
| 354 | |
Ildar Svetlov | d213969 | 2020-11-10 15:16:16 +0400 | [diff] [blame^] | 355 | // Update accepts an UpdateOpts struct and updates an existing stack using the |
| 356 | // http PUT verb with the values provided. opts.TemplateOpts is required. |
Jon Perritt | 3860b51 | 2016-03-29 12:01:48 -0500 | [diff] [blame] | 357 | func Update(c *gophercloud.ServiceClient, stackName, stackID string, opts UpdateOptsBuilder) (r UpdateResult) { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 358 | b, err := opts.ToStackUpdateMap() |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 359 | if err != nil { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 360 | r.Err = err |
Jon Perritt | 3860b51 | 2016-03-29 12:01:48 -0500 | [diff] [blame] | 361 | return |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 362 | } |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 363 | _, r.Err = c.Put(updateURL(c, stackName, stackID), b, nil, nil) |
jrperritt | 29ae6b3 | 2016-04-13 12:59:37 -0500 | [diff] [blame] | 364 | return |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 365 | } |
| 366 | |
Ildar Svetlov | d213969 | 2020-11-10 15:16:16 +0400 | [diff] [blame^] | 367 | // Update accepts an UpdateOpts struct and updates an existing stack using the |
| 368 | // http PATCH verb with the values provided. opts.TemplateOpts is not required. |
| 369 | func UpdatePatch(c *gophercloud.ServiceClient, stackName, stackID string, opts UpdatePatchOptsBuilder) (r UpdateResult) { |
| 370 | b, err := opts.ToStackUpdatePatchMap() |
| 371 | if err != nil { |
| 372 | r.Err = err |
| 373 | return |
| 374 | } |
| 375 | _, r.Err = c.Patch(updateURL(c, stackName, stackID), b, nil, nil) |
| 376 | return |
| 377 | } |
| 378 | |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 379 | // Delete deletes a stack based on the stack name and stack ID. |
Jon Perritt | 3860b51 | 2016-03-29 12:01:48 -0500 | [diff] [blame] | 380 | func Delete(c *gophercloud.ServiceClient, stackName, stackID string) (r DeleteResult) { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 381 | _, r.Err = c.Delete(deleteURL(c, stackName, stackID), nil) |
jrperritt | 29ae6b3 | 2016-04-13 12:59:37 -0500 | [diff] [blame] | 382 | return |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 383 | } |
| 384 | |
| 385 | // PreviewOptsBuilder is the interface options structs have to satisfy in order |
| 386 | // to be used in the Preview operation in this package. |
| 387 | type PreviewOptsBuilder interface { |
| 388 | ToStackPreviewMap() (map[string]interface{}, error) |
| 389 | } |
| 390 | |
| 391 | // PreviewOpts contains the common options struct used in this package's Preview |
| 392 | // operation. |
| 393 | type PreviewOpts struct { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 394 | // The name of the stack. It must start with an alphabetic character. |
| 395 | Name string `json:"stack_name" required:"true"` |
| 396 | // The timeout for stack creation in minutes. |
| 397 | Timeout int `json:"timeout_mins" required:"true"` |
| 398 | // A structure that contains either the template file or url. Call the |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 399 | // associated methods to extract the information relevant to send in a create request. |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 400 | TemplateOpts *Template `json:"-" required:"true"` |
| 401 | // Enables or disables deletion of all stack resources when a stack |
Jon Perritt | 37f9774 | 2015-02-04 18:55:05 -0700 | [diff] [blame] | 402 | // creation fails. Default is true, meaning all resources are not deleted when |
| 403 | // stack creation fails. |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 404 | DisableRollback *bool `json:"disable_rollback,omitempty"` |
| 405 | // A structure that contains details for the environment of the stack. |
| 406 | EnvironmentOpts *Environment `json:"-"` |
| 407 | // User-defined parameters to pass to the template. |
Ildar Svetlov | d213969 | 2020-11-10 15:16:16 +0400 | [diff] [blame^] | 408 | Parameters map[string]interface{} `json:"parameters,omitempty"` |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 409 | } |
| 410 | |
| 411 | // ToStackPreviewMap casts a PreviewOpts struct to a map. |
| 412 | func (opts PreviewOpts) ToStackPreviewMap() (map[string]interface{}, error) { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 413 | b, err := gophercloud.BuildRequestBody(opts, "") |
| 414 | if err != nil { |
Jon Perritt | 58611da | 2016-03-09 00:49:57 -0600 | [diff] [blame] | 415 | return nil, err |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 416 | } |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 417 | |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 418 | if err := opts.TemplateOpts.Parse(); err != nil { |
| 419 | return nil, err |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 420 | } |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 421 | |
| 422 | if err := opts.TemplateOpts.getFileContents(opts.TemplateOpts.Parsed, ignoreIfTemplate, true); err != nil { |
| 423 | return nil, err |
| 424 | } |
| 425 | opts.TemplateOpts.fixFileRefs() |
| 426 | b["template"] = string(opts.TemplateOpts.Bin) |
| 427 | |
| 428 | files := make(map[string]string) |
| 429 | for k, v := range opts.TemplateOpts.Files { |
| 430 | files[k] = v |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 431 | } |
| 432 | |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 433 | if opts.EnvironmentOpts != nil { |
| 434 | if err := opts.EnvironmentOpts.Parse(); err != nil { |
| 435 | return nil, err |
| 436 | } |
Pratik Mallya | a979f5b | 2015-09-22 03:10:55 -0500 | [diff] [blame] | 437 | if err := opts.EnvironmentOpts.getRRFileContents(ignoreIfEnvironment); err != nil { |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 438 | return nil, err |
| 439 | } |
Pratik Mallya | a979f5b | 2015-09-22 03:10:55 -0500 | [diff] [blame] | 440 | opts.EnvironmentOpts.fixFileRefs() |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 441 | for k, v := range opts.EnvironmentOpts.Files { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 442 | files[k] = v |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 443 | } |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 444 | b["environment"] = string(opts.EnvironmentOpts.Bin) |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 445 | } |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 446 | |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 447 | if len(files) > 0 { |
| 448 | b["files"] = files |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 449 | } |
Pratik Mallya | 5fddb2a | 2015-09-14 14:04:49 -0500 | [diff] [blame] | 450 | |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 451 | return b, nil |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 452 | } |
| 453 | |
| 454 | // Preview accepts a PreviewOptsBuilder interface and creates a preview of a stack using the values |
| 455 | // provided. |
Jon Perritt | 3860b51 | 2016-03-29 12:01:48 -0500 | [diff] [blame] | 456 | func Preview(c *gophercloud.ServiceClient, opts PreviewOptsBuilder) (r PreviewResult) { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 457 | b, err := opts.ToStackPreviewMap() |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 458 | if err != nil { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 459 | r.Err = err |
Jon Perritt | 3860b51 | 2016-03-29 12:01:48 -0500 | [diff] [blame] | 460 | return |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 461 | } |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 462 | _, r.Err = c.Post(previewURL(c), b, &r.Body, &gophercloud.RequestOpts{ |
Jamie Hannaford | 1d27afa | 2015-03-24 16:20:45 +0100 | [diff] [blame] | 463 | OkCodes: []int{200}, |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 464 | }) |
jrperritt | 29ae6b3 | 2016-04-13 12:59:37 -0500 | [diff] [blame] | 465 | return |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 466 | } |
| 467 | |
| 468 | // Abandon deletes the stack with the provided stackName and stackID, but leaves its |
| 469 | // resources intact, and returns data describing the stack and its resources. |
Jon Perritt | 3860b51 | 2016-03-29 12:01:48 -0500 | [diff] [blame] | 470 | func Abandon(c *gophercloud.ServiceClient, stackName, stackID string) (r AbandonResult) { |
Jon Perritt | fea9073 | 2016-03-15 02:57:05 -0500 | [diff] [blame] | 471 | _, r.Err = c.Delete(abandonURL(c, stackName, stackID), &gophercloud.RequestOpts{ |
| 472 | JSONResponse: &r.Body, |
Ash Wilson | decfed7 | 2015-02-13 09:14:55 -0500 | [diff] [blame] | 473 | OkCodes: []int{200}, |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 474 | }) |
jrperritt | 29ae6b3 | 2016-04-13 12:59:37 -0500 | [diff] [blame] | 475 | return |
Jon Perritt | 35e27e4 | 2014-12-05 11:10:46 -0700 | [diff] [blame] | 476 | } |