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`,
20
22
21
23
module "this" {
22
24
source = " cloudposse/label/null"
23
- version = " 0.24.1 " # requires Terraform >= 0.13.0
25
+ version = " 0.25.0 " # requires Terraform >= 0.13.0
24
26
25
27
enabled = var. enabled
26
28
namespace = var. namespace
29
+ tenant = var. tenant
27
30
environment = var. environment
28
31
stage = var. stage
29
32
name = var. name
@@ -34,30 +37,22 @@ module "this" {
34
37
label_order = var. label_order
35
38
regex_replace_chars = var. regex_replace_chars
36
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
37
44
38
45
context = var. context
39
46
}
40
47
41
48
# Copy contents of cloudposse/terraform-null-label/variables.tf here
42
49
43
50
variable "context" {
44
- type = object ({
45
- enabled = bool
46
- namespace = string
47
- environment = string
48
- stage = string
49
- name = string
50
- delimiter = string
51
- attributes = list (string )
52
- tags = map (string )
53
- additional_tag_map = map (string )
54
- regex_replace_chars = string
55
- label_order = list (string )
56
- id_length_limit = number
57
- })
51
+ type = any
58
52
default = {
59
53
enabled = true
60
54
namespace = null
55
+ tenant = null
61
56
environment = null
62
57
stage = null
63
58
name = null
@@ -68,6 +63,17 @@ variable "context" {
68
63
regex_replace_chars = null
69
64
label_order = []
70
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" ]
71
77
}
72
78
description = <<- EOT
73
79
Single object for setting entire context at once.
@@ -76,6 +82,16 @@ variable "context" {
76
82
Individual variable settings (non-null) override settings in context object,
77
83
except for attributes, tags, and additional_tag_map, which are merged.
78
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
+ }
79
95
}
80
96
81
97
variable "enabled" {
@@ -87,69 +103,107 @@ variable "enabled" {
87
103
variable "namespace" {
88
104
type = string
89
105
default = null
90
- 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"
91
113
}
92
114
93
115
variable "environment" {
94
116
type = string
95
117
default = null
96
- 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'"
97
119
}
98
120
99
121
variable "stage" {
100
122
type = string
101
123
default = null
102
- 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'"
103
125
}
104
126
105
127
variable "name" {
106
128
type = string
107
129
default = null
108
- 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
109
135
}
110
136
111
137
variable "delimiter" {
112
138
type = string
113
139
default = null
114
140
description = <<- EOT
115
- Delimiter to be used between `namespace`, `environment`, `stage`, `name` and `attributes` .
141
+ Delimiter to be used between ID elements .
116
142
Defaults to `-` (hyphen). Set to `""` to use no delimiter at all.
117
143
EOT
118
144
}
119
145
120
146
variable "attributes" {
121
147
type = list (string )
122
148
default = []
123
- 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
124
170
}
125
171
126
172
variable "tags" {
127
173
type = map (string )
128
174
default = {}
129
- 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
130
179
}
131
180
132
181
variable "additional_tag_map" {
133
182
type = map (string )
134
183
default = {}
135
- 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
136
189
}
137
190
138
191
variable "label_order" {
139
192
type = list (string )
140
193
default = null
141
194
description = <<- EOT
142
- The naming order of the id output and Name tag .
195
+ The order in which the labels (ID elements) appear in the `id` .
143
196
Defaults to ["namespace", "environment", "stage", "name", "attributes"].
144
- You can omit any of the 5 elements , but at least one must be present.
145
- EOT
197
+ You can omit any of the 6 labels ("tenant" is the 6th) , but at least one must be present.
198
+ EOT
146
199
}
147
200
148
201
variable "regex_replace_chars" {
149
202
type = string
150
203
default = null
151
204
description = <<- EOT
152
- 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.
153
207
If not set, `"/[^a-zA-Z0-9-]/"` is used to remove all characters other than hyphens, letters and digits.
154
208
EOT
155
209
}
@@ -158,11 +212,68 @@ variable "id_length_limit" {
158
212
type = number
159
213
default = null
160
214
description = <<- EOT
161
- Limit `id` to this many characters.
215
+ Limit `id` to this many characters (minimum 6) .
162
216
Set to `0` for unlimited length.
163
- Set to `null` for default , which is `0`.
217
+ Set to `null` for keep the existing setting , which defaults to `0`.
164
218
Does not affect `id_full`.
165
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
166
277
}
167
278
168
279
# ### End of copy of cloudposse/terraform-null-label/variables.tf
0 commit comments