github.com/crossplane/upjet@v1.3.0/pkg/pipeline/templates/terraformed.go.tmpl (about)

     1  {{ .Header }}
     2  
     3  {{ .GenStatement }}
     4  
     5  package {{ .APIVersion }}
     6  
     7  import (
     8  	"dario.cat/mergo"
     9  	"github.com/pkg/errors"
    10  
    11  	"github.com/crossplane/upjet/pkg/resource"
    12  	"github.com/crossplane/upjet/pkg/resource/json"
    13  	{{ .Imports }}
    14  )
    15  
    16  // GetTerraformResourceType returns Terraform resource type for this {{ .CRD.Kind }}
    17  func (mg *{{ .CRD.Kind }}) GetTerraformResourceType() string {
    18      return "{{ .Terraform.ResourceType }}"
    19  }
    20  
    21  // GetConnectionDetailsMapping for this {{ .CRD.Kind }}
    22  func (tr *{{ .CRD.Kind }}) GetConnectionDetailsMapping() map[string]string {
    23    {{- if .Sensitive.Fields }}
    24    return map[string]string{ {{range $k, $v := .Sensitive.Fields}}"{{ $k }}": "{{ $v}}", {{end}} }
    25    {{- else }}
    26    return nil
    27    {{- end }}
    28  }
    29  
    30  // GetObservation of this {{ .CRD.Kind }}
    31  func (tr *{{ .CRD.Kind }}) GetObservation() (map[string]any, error) {
    32      o, err := json.TFParser.Marshal(tr.Status.AtProvider)
    33      if err != nil {
    34          return nil, err
    35      }
    36      base := map[string]any{}
    37      return base, json.TFParser.Unmarshal(o, &base)
    38  }
    39  
    40  // SetObservation for this {{ .CRD.Kind }}
    41  func (tr *{{ .CRD.Kind }}) SetObservation(obs map[string]any) error {
    42      p, err := json.TFParser.Marshal(obs)
    43      if err != nil {
    44          return err
    45      }
    46      return json.TFParser.Unmarshal(p, &tr.Status.AtProvider)
    47  }
    48  
    49  // GetID returns ID of underlying Terraform resource of this {{ .CRD.Kind }}
    50  func (tr *{{ .CRD.Kind }}) GetID() string {
    51      if tr.Status.AtProvider.ID == nil {
    52          return ""
    53      }
    54      return *tr.Status.AtProvider.ID
    55  }
    56  
    57  // GetParameters of this {{ .CRD.Kind }}
    58  func (tr *{{ .CRD.Kind }}) GetParameters() (map[string]any, error) {
    59      p, err := json.TFParser.Marshal(tr.Spec.ForProvider)
    60      if err != nil {
    61          return nil, err
    62      }
    63      base := map[string]any{}
    64      return base, json.TFParser.Unmarshal(p, &base)
    65  }
    66  
    67  // SetParameters for this {{ .CRD.Kind }}
    68  func (tr *{{ .CRD.Kind }}) SetParameters(params map[string]any) error {
    69      p, err := json.TFParser.Marshal(params)
    70      if err != nil {
    71          return err
    72      }
    73      return json.TFParser.Unmarshal(p, &tr.Spec.ForProvider)
    74  }
    75  
    76  // GetInitParameters of this {{ .CRD.Kind }}
    77  func (tr *{{ .CRD.Kind }}) GetInitParameters() (map[string]any, error) {
    78      p, err := json.TFParser.Marshal(tr.Spec.InitProvider)
    79      if err != nil {
    80          return nil, err
    81      }
    82      base := map[string]any{}
    83      return base, json.TFParser.Unmarshal(p, &base)
    84  }
    85  
    86  // GetInitParameters of this {{ .CRD.Kind }}
    87  func (tr *{{ .CRD.Kind }}) GetMergedParameters(shouldMergeInitProvider bool) (map[string]any, error) {
    88      params, err := tr.GetParameters()
    89      if err != nil {
    90          return nil, errors.Wrapf(err, "cannot get parameters for resource '%q'", tr.GetName())
    91      }
    92      if !shouldMergeInitProvider {
    93          return params, nil
    94      }
    95  
    96      initParams, err := tr.GetInitParameters()
    97      if err != nil {
    98          return nil, errors.Wrapf(err, "cannot get init parameters for resource '%q'", tr.GetName())
    99      }
   100  
   101      // Note(lsviben): mergo.WithSliceDeepCopy is needed to merge the
   102      // slices from the initProvider to forProvider. As it also sets
   103      // overwrite to true, we need to set it back to false, we don't
   104      // want to overwrite the forProvider fields with the initProvider
   105      // fields.
   106      err = mergo.Merge(&params, initParams, mergo.WithSliceDeepCopy, func(c *mergo.Config) {
   107          c.Overwrite = false
   108      })
   109      if err != nil {
   110          return nil, errors.Wrapf(err, "cannot merge spec.initProvider and spec.forProvider parameters for resource '%q'", tr.GetName())
   111      }
   112  
   113      return params, nil
   114  }
   115  
   116  // LateInitialize this {{ .CRD.Kind }} using its observed tfState.
   117  // returns True if there are any spec changes for the resource.
   118  func (tr *{{ .CRD.Kind }}) LateInitialize(attrs []byte) (bool, error) {
   119      params := &{{ .CRD.ParametersTypeName }}{}
   120      if err := json.TFParser.Unmarshal(attrs, params); err != nil {
   121          return false, errors.Wrap(err, "failed to unmarshal Terraform state parameters for late-initialization")
   122      }
   123      opts := []resource.GenericLateInitializerOption{resource.WithZeroValueJSONOmitEmptyFilter(resource.CNameWildcard)}
   124      {{ range .LateInitializer.IgnoredFields -}}
   125          opts = append(opts, resource.WithNameFilter("{{ . }}"))
   126      {{ end }}
   127  
   128      li := resource.NewGenericLateInitializer(opts...)
   129      return li.LateInitialize(&tr.Spec.ForProvider, params)
   130  }
   131  
   132  // GetTerraformSchemaVersion returns the associated Terraform schema version
   133  func (tr *{{ .CRD.Kind }}) GetTerraformSchemaVersion() int {
   134      return {{ .Terraform.SchemaVersion }}
   135  }