github.com/terramate-io/tf@v0.0.0-20230830114523-fce866b4dfcd/provider-simple-v6/provider.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: MPL-2.0 3 4 // simple provider a minimal provider implementation for testing 5 package simple 6 7 import ( 8 "errors" 9 "fmt" 10 "time" 11 12 "github.com/terramate-io/tf/configs/configschema" 13 "github.com/terramate-io/tf/providers" 14 "github.com/zclconf/go-cty/cty" 15 ctyjson "github.com/zclconf/go-cty/cty/json" 16 ) 17 18 type simple struct { 19 schema providers.GetProviderSchemaResponse 20 } 21 22 func Provider() providers.Interface { 23 simpleResource := providers.Schema{ 24 Block: &configschema.Block{ 25 Attributes: map[string]*configschema.Attribute{ 26 "id": { 27 Computed: true, 28 Type: cty.String, 29 }, 30 "value": { 31 Optional: true, 32 Type: cty.String, 33 }, 34 }, 35 }, 36 } 37 38 return simple{ 39 schema: providers.GetProviderSchemaResponse{ 40 Provider: providers.Schema{ 41 Block: nil, 42 }, 43 ResourceTypes: map[string]providers.Schema{ 44 "simple_resource": simpleResource, 45 }, 46 DataSources: map[string]providers.Schema{ 47 "simple_resource": simpleResource, 48 }, 49 ServerCapabilities: providers.ServerCapabilities{ 50 PlanDestroy: true, 51 }, 52 }, 53 } 54 } 55 56 func (s simple) GetProviderSchema() providers.GetProviderSchemaResponse { 57 return s.schema 58 } 59 60 func (s simple) ValidateProviderConfig(req providers.ValidateProviderConfigRequest) (resp providers.ValidateProviderConfigResponse) { 61 return resp 62 } 63 64 func (s simple) ValidateResourceConfig(req providers.ValidateResourceConfigRequest) (resp providers.ValidateResourceConfigResponse) { 65 return resp 66 } 67 68 func (s simple) ValidateDataResourceConfig(req providers.ValidateDataResourceConfigRequest) (resp providers.ValidateDataResourceConfigResponse) { 69 return resp 70 } 71 72 func (p simple) UpgradeResourceState(req providers.UpgradeResourceStateRequest) (resp providers.UpgradeResourceStateResponse) { 73 ty := p.schema.ResourceTypes[req.TypeName].Block.ImpliedType() 74 val, err := ctyjson.Unmarshal(req.RawStateJSON, ty) 75 resp.Diagnostics = resp.Diagnostics.Append(err) 76 resp.UpgradedState = val 77 return resp 78 } 79 80 func (s simple) ConfigureProvider(providers.ConfigureProviderRequest) (resp providers.ConfigureProviderResponse) { 81 return resp 82 } 83 84 func (s simple) Stop() error { 85 return nil 86 } 87 88 func (s simple) ReadResource(req providers.ReadResourceRequest) (resp providers.ReadResourceResponse) { 89 // just return the same state we received 90 resp.NewState = req.PriorState 91 return resp 92 } 93 94 func (s simple) PlanResourceChange(req providers.PlanResourceChangeRequest) (resp providers.PlanResourceChangeResponse) { 95 if req.ProposedNewState.IsNull() { 96 // destroy op 97 resp.PlannedState = req.ProposedNewState 98 99 // signal that this resource was properly planned for destruction, 100 // verifying that the schema capabilities with PlanDestroy took effect. 101 resp.PlannedPrivate = []byte("destroy planned") 102 return resp 103 } 104 105 m := req.ProposedNewState.AsValueMap() 106 _, ok := m["id"] 107 if !ok { 108 m["id"] = cty.UnknownVal(cty.String) 109 } 110 111 resp.PlannedState = cty.ObjectVal(m) 112 return resp 113 } 114 115 func (s simple) ApplyResourceChange(req providers.ApplyResourceChangeRequest) (resp providers.ApplyResourceChangeResponse) { 116 if req.PlannedState.IsNull() { 117 // make sure this was transferred from the plan action 118 if string(req.PlannedPrivate) != "destroy planned" { 119 resp.Diagnostics = resp.Diagnostics.Append(fmt.Errorf("resource not planned for destroy, private data %q", req.PlannedPrivate)) 120 } 121 122 resp.NewState = req.PlannedState 123 return resp 124 } 125 126 m := req.PlannedState.AsValueMap() 127 _, ok := m["id"] 128 if !ok { 129 m["id"] = cty.StringVal(time.Now().String()) 130 } 131 resp.NewState = cty.ObjectVal(m) 132 133 return resp 134 } 135 136 func (s simple) ImportResourceState(providers.ImportResourceStateRequest) (resp providers.ImportResourceStateResponse) { 137 resp.Diagnostics = resp.Diagnostics.Append(errors.New("unsupported")) 138 return resp 139 } 140 141 func (s simple) ReadDataSource(req providers.ReadDataSourceRequest) (resp providers.ReadDataSourceResponse) { 142 m := req.Config.AsValueMap() 143 m["id"] = cty.StringVal("static_id") 144 resp.State = cty.ObjectVal(m) 145 return resp 146 } 147 148 func (s simple) Close() error { 149 return nil 150 }