Add labels and annotations support#
Note: This page covers best practices guidance for the Terraform provider for Google Cloud, which is used to ensure a consistent UX for Terraform users across providers or GCP users across the Google provider. Generally, this guidance should be followed and exceptions should be clearly demarcated / discussed.
The new labels model and the new annotations model are introduced in Terraform provider for Google Cloud 5.0.0.
There are now three label-related fields with the new labels model:
- The
labelsfield is now non-authoritative and only manages the label keys defined in your configuration for the resource. - The
terraform_labelscannot be specified directly by the user. It merges the labels defined in the resource’s configuration and the default labels configured in the provider block. If the same label key exists on both the resource level and provider level, the value on the resource will override the provider-level default. - The output-only
effective_labelswill list all the labels present on the resource in GCP, including the labels configured through Terraform, the system, and other clients.
There are now two annotation-related fields with the new annotations model:
- The
annotationsfield is now non-authoritative and only manages the annotation keys defined in your configuration for the resource. - The output-only
effective_annotationswill list all the annotations present on the resource in GCP, including the annotations configured through Terraform, the system, and other clients.
This document describes how to add labels and annotations field to resources to support the new models.
Labels support#
When adding a new labels field, please make the changes below to support the new labels model. Otherwise, it has to wait for the next major release to make the changes.
MMv1 resources#
Use the type
KeyValueLabelsfor the standard resourcelabelsfield. The standard resourcelabelsfield could be the top levellabelsfield or the nestedlabelsfield inside the top levelmetadatafield. Don’t adddefault_from_api: trueto this field or don’t use this type for otherlabelsfields in the resource.KeyValueLabelswill add all of changes required for the new model automatically.- name: 'labels' type: KeyValueLabels description: | The labels associated with this dataset. You can use these to organize and group your datasets.In the handwritten acceptance tests, add
labelsandterraform_labelstoImportStateVerifyIgnoreiflabelsfield is in the configuration.ImportStateVerifyIgnore: []string{"labels", "terraform_labels"},In the corresponding data source, after the resource read method, call the function
tpgresource.SetDataSourceLabels(d)to makelabelsandterraform_labelshave all of the labels on the resource.err = resourceArtifactRegistryRepositoryRead(d, meta) if err != nil { return err } if err := tpgresource.SetDataSourceLabels(d); err != nil { return err }
Handwritten resources#
- Add
tpgresource.SetLabelsDifftoCustomizeDiffof the resource.CustomizeDiff: customdiff.All( tpgresource.SetLabelsDiff, ), - Add
labelsfield and add more attributes (such asForceNew: true,,Set: schema.HashString,) to this field if necessary."labels": { Type: schema.TypeMap, Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, Description: `A set of key/value label pairs to assign to the project. **Note**: This field is non-authoritative, and will only manage the labels present in your configuration. Please refer to the field 'effective_labels' for all of the labels present on the resource.`, }, - Add output only field
terraform_labelsand add more attributes (such asSet: schema.HashString,) to this field if necessary. Don’t addForceNew:true,to this field."terraform_labels": { Type: schema.TypeMap, Computed: true, Description: `The combination of labels configured directly on the resource and default labels configured on the provider.`, Elem: &schema.Schema{Type: schema.TypeString}, }, - Add output only field
effective_labelsand add more attributes (such asForceNew: true,,Set: schema.HashString,) to this field if necessary."effective_labels": { Type: schema.TypeMap, Computed: true, Description: `All of labels (key/value pairs) present on the resource in GCP, including the labels configured through Terraform, other clients and services.`, Elem: &schema.Schema{Type: schema.TypeString}, }, - In the create method, use the value of
effective_labelsin API request. - In the update method, use the value of
effective_labelsin API request. - In the read mehtod, set
labels,terraform_labelsandeffective_labelsto state.if err := tpgresource.SetLabels(res.Labels, d, "labels"); err != nil { return fmt.Errorf("Error setting labels: %s", err) } if err := tpgresource.SetLabels(res.Labels, d, "terraform_labels"); err != nil { return fmt.Errorf("Error setting terraform_labels: %s", err) } if err := d.Set("effective_labels", res.Labels); err != nil { return fmt.Errorf("Error setting effective_labels: %s", err) } - In the handwritten acceptance tests, add
labelsandterraform_labelstoImportStateVerifyIgnore. - In the corresponding data source, after the resource read method, call the function
tpgresource.SetDataSourceLabels(d)to makelabelsandterraform_labelshave all of the labels on the resource. - Add the documentation for these label-related fields.
Annotations support#
When adding a new annotations field, please make the changes below below to support the new annotations model. Otherwise, it has to wait for the next major release to make the breaking changes.
MMv1 resources#
Use the type
KeyValueAnnotationsfor the standard resourceannotationsfield. The standard resourceannotationsfield could be the top levelannotationsfield or the nestedannotationsfield inside the top levelmetadatafield. Don’t adddefault_from_api: trueto this field or don’t use this type for otherannotationsfields in the resource.KeyValueAnnotationswill add all of changes required for the new model automatically.- name: 'annotations' type: KeyValueAnnotations description: | Client-specified annotations. This is distinct from labels.In the handwritten acceptance tests, add
annotationstoImportStateVerifyIgnoreifannotationsfield is in the configuration.ImportStateVerifyIgnore: []string{"annotations"},In the corresponding data source, after the resource read method, call the function
tpgresource.SetDataSourceAnnotations(d)to makeannotationshave all of the annotations on the resource.err = resourceSecretManagerSecretRead(d, meta) if err != nil { return err } if err := tpgresource.SetDataSourceLabels(d); err != nil { return err } if err := tpgresource.SetDataSourceAnnotations(d); err != nil { return err }
Handwritten resources#
- Add
tpgresource.SetAnnotationsDifftoCustomizeDiffof the resource. - Add
annotationsfield and add more attributes (such asForceNew: true,,Set: schema.HashString,) to this field if necessary. - Add output only field
effective_annotationsand add more attributes (such asForceNew: true,,Set: schema.HashString,) to this field if necessary. - In the create method, use the value of
effective_annotationsin API request. - In the update method, use the value of
effective_annotationsin API request. - In the read mehtod, set
annotations, andeffective_annotationsto state. - In the handwritten acceptance tests, add
annotationstoImportStateVerifyIgnore. - In the corresponding data source, after the resource read method, call the function
tpgresource.SetDataSourceAnnotations(d)to makeannotationshave all of the labels on the resource. - Add the documentation for these annotation-related fields.