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(¶ms, 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 }