Skip to content

Commit

Permalink
Support provider default labels for DCL resources
Browse files Browse the repository at this point in the history
  • Loading branch information
zli82016 committed Sep 7, 2023
1 parent 186acac commit 1e8b6a5
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 5 deletions.
33 changes: 32 additions & 1 deletion tpgtools/property.go
Original file line number Diff line number Diff line change
Expand Up @@ -897,7 +897,14 @@ func createPropertiesFromSchema(schema *openapi.Schema, typeFetcher *TypeFetcher
note := "**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."
p.Description = fmt.Sprintf("%s\n\n%s", p.Description, note)
p.Settable = false
p.StateGetter = nil

props = append(props, build_effective_labels_field(p, resource, parent))

if p.IsResourceLabels() {
props = append(props, build_terraform_labels_field(p, resource, parent))
}
}

props = append(props, p)
Expand Down Expand Up @@ -929,14 +936,38 @@ func build_effective_labels_field(p Property, resource *Resource, parent *Proper
description := fmt.Sprintf("All of %s (key/value pairs) present on the resource in GCP, including the %s configured through Terraform, other clients and services.", p.title, p.title)
stateSetter := fmt.Sprintf("d.Set(%q, res.%s)", title, p.PackageName)

return Property{
effectiveLabels := Property{
title: title,
Type: p.Type,
Description: description,
resource: resource,
parent: parent,
Optional: false,
Computed: true,
PackageName: p.PackageName,
Settable: true,
StateSetter: &stateSetter,
}

stateGetter := effectiveLabels.DefaultStateGetter()
effectiveLabels.StateGetter = &stateGetter
return effectiveLabels
}

func build_terraform_labels_field(p Property, resource *Resource, parent *Property) Property {
title := fmt.Sprintf("terraform_%s", p.title)
description := fmt.Sprintf("The combination of %s configured directly on the resource and default %s configured on the provider.", p.title, p.title)
stateSetter := fmt.Sprintf("d.Set(%q, flatten%sTerraform%s(res.%s, d))", title, p.resource.PathType(), p.PackagePath(), p.PackageName)

terraformLabels := Property{
title: title,
Type: p.Type,
Description: description,
resource: resource,
parent: parent,
Computed: true,
PackageName: p.PackageName,
StateSetter: &stateSetter,
}
return terraformLabels
}
10 changes: 8 additions & 2 deletions tpgtools/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -586,6 +586,12 @@ func createResource(schema *openapi.Schema, info *openapi.Info, typeFetcher *Typ
res.CustomizeDiff = cdiff.Functions
}

if res.HasLabels() {
res.CustomizeDiff = append(res.CustomizeDiff, "tpgresource.SetLabelsDiff")
} else if res.HasAnnotations() {
res.CustomizeDiff = append(res.CustomizeDiff, "tpgresource.SetAnnotationsDiff")
}

// ListFields
if parameters, ok := typeFetcher.doc.Paths["list"]; ok {
for _, param := range parameters.Parameters {
Expand Down Expand Up @@ -835,7 +841,7 @@ func (r *Resource) loadHandWrittenSamples() []Sample {
// During importing, as the configuration is unavailableafter, the "labels" and "annotations" fields in the state will be empty.
// So add the "labels" and the "annotations" fields to the ImportStateVerifyIgnore list.
if r.HasLabels() {
sample.IgnoreRead = append(sample.IgnoreRead, "labels")
sample.IgnoreRead = append(sample.IgnoreRead, "labels", "terraform_labels")
}

if r.HasAnnotations() {
Expand Down Expand Up @@ -930,7 +936,7 @@ func (r *Resource) loadDCLSamples() []Sample {
sample.TestSlug = RenderedString(sampleNameToTitleCase(*sample.Name).titlecase())

// The "labels" and "annotations" fields in the state are decided by the configuration.
// During importing, as the configuration is unavailableafter, the "labels" and "annotations" fields in the state will be empty.
// During importing, as the configuration is unavailable, the "labels" and "annotations" fields in the state will be empty.
// So add the "labels" and the "annotations" fields to the ImportStateVerifyIgnore list.
if r.HasLabels() {
sample.IgnoreRead = append(sample.IgnoreRead, "labels")
Expand Down
19 changes: 17 additions & 2 deletions tpgtools/templates/resource.go.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -723,7 +723,22 @@ func flatten{{$.PathType}}Labels(v map[string]string, d *schema.ResourceData) in
transformed := make(map[string]interface{})
if l, ok := d.Get("labels").(map[string]interface{}); ok {
for k, _ := range l {
transformed[k] = l[k]
transformed[k] = v[k]
}
}

return transformed
}

func flatten{{$.PathType}}TerraformLabels(v map[string]string, d *schema.ResourceData) interface{} {
if v == nil {
return nil
}

transformed := make(map[string]interface{})
if l, ok := d.Get("terraform_labels").(map[string]interface{}); ok {
for k, _ := range l {
transformed[k] = v[k]
}
}

Expand All @@ -740,7 +755,7 @@ func flatten{{$.PathType}}Annotations(v map[string]string, d *schema.ResourceDat
transformed := make(map[string]interface{})
if l, ok := d.Get("annotations").(map[string]interface{}); ok {
for k, _ := range l {
transformed[k] = l[k]
transformed[k] = v[k]
}
}

Expand Down

0 comments on commit 1e8b6a5

Please sign in to comment.