8
8
# Cloud Posse's standard configuration inputs suitable for passing
9
9
# to Cloud Posse modules.
10
10
#
11
+ # curl -sL https://raw.githubusercontent.com/cloudposse/terraform-null-label/master/exports/context.tf -o context.tf
12
+ #
11
13
# Modules should access the whole context as `module.this.context`
12
14
# to get the input variables with nulls for defaults,
13
15
# for example `context = module.this.context`,
19
21
#
20
22
21
23
module "this" {
22
- source = " git::https://github.com/cloudposse/terraform-null-label.git?ref=tags/0.19.2"
24
+ source = " cloudposse/label/null"
25
+ version = " 0.25.0" # requires Terraform >= 0.13.0
23
26
24
27
enabled = var. enabled
25
28
namespace = var. namespace
29
+ tenant = var. tenant
26
30
environment = var. environment
27
31
stage = var. stage
28
32
name = var. name
@@ -33,30 +37,22 @@ module "this" {
33
37
label_order = var. label_order
34
38
regex_replace_chars = var. regex_replace_chars
35
39
id_length_limit = var. id_length_limit
40
+ label_key_case = var. label_key_case
41
+ label_value_case = var. label_value_case
42
+ descriptor_formats = var. descriptor_formats
43
+ labels_as_tags = var. labels_as_tags
36
44
37
45
context = var. context
38
46
}
39
47
40
48
# Copy contents of cloudposse/terraform-null-label/variables.tf here
41
49
42
50
variable "context" {
43
- type = object ({
44
- enabled = bool
45
- namespace = string
46
- environment = string
47
- stage = string
48
- name = string
49
- delimiter = string
50
- attributes = list (string )
51
- tags = map (string )
52
- additional_tag_map = map (string )
53
- regex_replace_chars = string
54
- label_order = list (string )
55
- id_length_limit = number
56
- })
51
+ type = any
57
52
default = {
58
53
enabled = true
59
54
namespace = null
55
+ tenant = null
60
56
environment = null
61
57
stage = null
62
58
name = null
@@ -67,6 +63,17 @@ variable "context" {
67
63
regex_replace_chars = null
68
64
label_order = []
69
65
id_length_limit = null
66
+ label_key_case = null
67
+ label_value_case = null
68
+ descriptor_formats = {}
69
+ # Note: we have to use [] instead of null for unset lists due to
70
+ # https://github.com/hashicorp/terraform/issues/28137
71
+ # which was not fixed until Terraform 1.0.0,
72
+ # but we want the default to be all the labels in `label_order`
73
+ # and we want users to be able to prevent all tag generation
74
+ # by setting `labels_as_tags` to `[]`, so we need
75
+ # a different sentinel to indicate "default"
76
+ labels_as_tags = [" unset" ]
70
77
}
71
78
description = <<- EOT
72
79
Single object for setting entire context at once.
@@ -75,6 +82,16 @@ variable "context" {
75
82
Individual variable settings (non-null) override settings in context object,
76
83
except for attributes, tags, and additional_tag_map, which are merged.
77
84
EOT
85
+
86
+ validation {
87
+ condition = lookup (var. context , " label_key_case" , null ) == null ? true : contains ([" lower" , " title" , " upper" ], var. context [" label_key_case" ])
88
+ error_message = " Allowed values: `lower`, `title`, `upper`."
89
+ }
90
+
91
+ validation {
92
+ condition = lookup (var. context , " label_value_case" , null ) == null ? true : contains ([" lower" , " title" , " upper" , " none" ], var. context [" label_value_case" ])
93
+ error_message = " Allowed values: `lower`, `title`, `upper`, `none`."
94
+ }
78
95
}
79
96
80
97
variable "enabled" {
@@ -86,69 +103,107 @@ variable "enabled" {
86
103
variable "namespace" {
87
104
type = string
88
105
default = null
89
- description = " Namespace, which could be your organization name or abbreviation, e.g. 'eg' or 'cp'"
106
+ description = " ID element. Usually an abbreviation of your organization name, e.g. 'eg' or 'cp', to help ensure generated IDs are globally unique"
107
+ }
108
+
109
+ variable "tenant" {
110
+ type = string
111
+ default = null
112
+ description = " ID element _(Rarely used, not included by default)_. A customer identifier, indicating who this instance of a resource is for"
90
113
}
91
114
92
115
variable "environment" {
93
116
type = string
94
117
default = null
95
- description = " Environment, e.g. 'uw2', 'us-west-2', OR 'prod', 'staging', 'dev', 'UAT'"
118
+ description = " ID element. Usually used for region e.g. 'uw2', 'us-west-2', OR role 'prod', 'staging', 'dev', 'UAT'"
96
119
}
97
120
98
121
variable "stage" {
99
122
type = string
100
123
default = null
101
- description = " Stage , e.g. 'prod', 'staging', 'dev', OR 'source', 'build', 'test', 'deploy', 'release'"
124
+ description = " ID element. Usually used to indicate role , e.g. 'prod', 'staging', 'source', 'build', 'test', 'deploy', 'release'"
102
125
}
103
126
104
127
variable "name" {
105
128
type = string
106
129
default = null
107
- description = " Solution name, e.g. 'app' or 'jenkins'"
130
+ description = <<- EOT
131
+ ID element. Usually the component or solution name, e.g. 'app' or 'jenkins'.
132
+ This is the only ID element not also included as a `tag`.
133
+ The "name" tag is set to the full `id` string. There is no tag with the value of the `name` input.
134
+ EOT
108
135
}
109
136
110
137
variable "delimiter" {
111
138
type = string
112
139
default = null
113
140
description = <<- EOT
114
- Delimiter to be used between `namespace`, `environment`, `stage`, `name` and `attributes` .
141
+ Delimiter to be used between ID elements .
115
142
Defaults to `-` (hyphen). Set to `""` to use no delimiter at all.
116
143
EOT
117
144
}
118
145
119
146
variable "attributes" {
120
147
type = list (string )
121
148
default = []
122
- description = " Additional attributes (e.g. `1`)"
149
+ description = <<- EOT
150
+ ID element. Additional attributes (e.g. `workers` or `cluster`) to add to `id`,
151
+ in the order they appear in the list. New attributes are appended to the
152
+ end of the list. The elements of the list are joined by the `delimiter`
153
+ and treated as a single ID element.
154
+ EOT
155
+ }
156
+
157
+ variable "labels_as_tags" {
158
+ type = set (string )
159
+ default = [" default" ]
160
+ description = <<- EOT
161
+ Set of labels (ID elements) to include as tags in the `tags` output.
162
+ Default is to include all labels.
163
+ Tags with empty values will not be included in the `tags` output.
164
+ Set to `[]` to suppress all generated tags.
165
+ **Notes:**
166
+ The value of the `name` tag, if included, will be the `id`, not the `name`.
167
+ Unlike other `null-label` inputs, the initial setting of `labels_as_tags` cannot be
168
+ changed in later chained modules. Attempts to change it will be silently ignored.
169
+ EOT
123
170
}
124
171
125
172
variable "tags" {
126
173
type = map (string )
127
174
default = {}
128
- description = " Additional tags (e.g. `map('BusinessUnit','XYZ')`"
175
+ description = <<- EOT
176
+ Additional tags (e.g. `{'BusinessUnit': 'XYZ'}`).
177
+ Neither the tag keys nor the tag values will be modified by this module.
178
+ EOT
129
179
}
130
180
131
181
variable "additional_tag_map" {
132
182
type = map (string )
133
183
default = {}
134
- description = " Additional tags for appending to tags_as_list_of_maps. Not added to `tags`."
184
+ description = <<- EOT
185
+ Additional key-value pairs to add to each map in `tags_as_list_of_maps`. Not added to `tags` or `id`.
186
+ This is for some rare cases where resources want additional configuration of tags
187
+ and therefore take a list of maps with tag key, value, and additional configuration.
188
+ EOT
135
189
}
136
190
137
191
variable "label_order" {
138
192
type = list (string )
139
193
default = null
140
194
description = <<- EOT
141
- The naming order of the id output and Name tag .
195
+ The order in which the labels (ID elements) appear in the `id` .
142
196
Defaults to ["namespace", "environment", "stage", "name", "attributes"].
143
- You can omit any of the 5 elements , but at least one must be present.
144
- EOT
197
+ You can omit any of the 6 labels ("tenant" is the 6th) , but at least one must be present.
198
+ EOT
145
199
}
146
200
147
201
variable "regex_replace_chars" {
148
202
type = string
149
203
default = null
150
204
description = <<- EOT
151
- Regex to replace chars with empty string in `namespace`, `environment`, `stage` and `name`.
205
+ Terraform regular expression (regex) string.
206
+ Characters matching the regex will be removed from the ID elements.
152
207
If not set, `"/[^a-zA-Z0-9-]/"` is used to remove all characters other than hyphens, letters and digits.
153
208
EOT
154
209
}
@@ -157,11 +212,68 @@ variable "id_length_limit" {
157
212
type = number
158
213
default = null
159
214
description = <<- EOT
160
- Limit `id` to this many characters.
215
+ Limit `id` to this many characters (minimum 6) .
161
216
Set to `0` for unlimited length.
162
- Set to `null` for default , which is `0`.
217
+ Set to `null` for keep the existing setting , which defaults to `0`.
163
218
Does not affect `id_full`.
164
219
EOT
220
+ validation {
221
+ condition = var. id_length_limit == null ? true : var. id_length_limit >= 6 || var. id_length_limit == 0
222
+ error_message = " The id_length_limit must be >= 6 if supplied (not null), or 0 for unlimited length."
223
+ }
224
+ }
225
+
226
+ variable "label_key_case" {
227
+ type = string
228
+ default = null
229
+ description = <<- EOT
230
+ Controls the letter case of the `tags` keys (label names) for tags generated by this module.
231
+ Does not affect keys of tags passed in via the `tags` input.
232
+ Possible values: `lower`, `title`, `upper`.
233
+ Default value: `title`.
234
+ EOT
235
+
236
+ validation {
237
+ condition = var. label_key_case == null ? true : contains ([" lower" , " title" , " upper" ], var. label_key_case )
238
+ error_message = " Allowed values: `lower`, `title`, `upper`."
239
+ }
240
+ }
241
+
242
+ variable "label_value_case" {
243
+ type = string
244
+ default = null
245
+ description = <<- EOT
246
+ Controls the letter case of ID elements (labels) as included in `id`,
247
+ set as tag values, and output by this module individually.
248
+ Does not affect values of tags passed in via the `tags` input.
249
+ Possible values: `lower`, `title`, `upper` and `none` (no transformation).
250
+ Set this to `title` and set `delimiter` to `""` to yield Pascal Case IDs.
251
+ Default value: `lower`.
252
+ EOT
253
+
254
+ validation {
255
+ condition = var. label_value_case == null ? true : contains ([" lower" , " title" , " upper" , " none" ], var. label_value_case )
256
+ error_message = " Allowed values: `lower`, `title`, `upper`, `none`."
257
+ }
258
+ }
259
+
260
+ variable "descriptor_formats" {
261
+ type = any
262
+ default = {}
263
+ description = <<- EOT
264
+ Describe additional descriptors to be output in the `descriptors` output map.
265
+ Map of maps. Keys are names of descriptors. Values are maps of the form
266
+ `{
267
+ format = string
268
+ labels = list(string)
269
+ }`
270
+ (Type is `any` so the map values can later be enhanced to provide additional options.)
271
+ `format` is a Terraform format string to be passed to the `format()` function.
272
+ `labels` is a list of labels, in order, to pass to `format()` function.
273
+ Label values will be normalized before being passed to `format()` so they will be
274
+ identical to how they appear in `id`.
275
+ Default is `{}` (`descriptors` output will be empty).
276
+ EOT
165
277
}
166
278
167
279
# ### End of copy of cloudposse/terraform-null-label/variables.tf
0 commit comments