github.com/terramate-io/tf@v0.0.0-20230830114523-fce866b4dfcd/provider-simple/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 "time" 10 11 "github.com/terramate-io/tf/configs/configschema" 12 "github.com/terramate-io/tf/providers" 13 "github.com/zclconf/go-cty/cty" 14 ctyjson "github.com/zclconf/go-cty/cty/json" 15 ) 16 17 type simple struct { 18 schema providers.GetProviderSchemaResponse 19 } 20 21 func Provider() providers.Interface { 22 simpleResource := providers.Schema{ 23 Block: &configschema.Block{ 24 Attributes: map[string]*configschema.Attribute{ 25 "id": { 26 Computed: true, 27 Type: cty.String, 28 }, 29 "value": { 30 Optional: true, 31 Type: cty.String, 32 }, 33 }, 34 }, 35 } 36 37 return simple{ 38 schema: providers.GetProviderSchemaResponse{ 39 Provider: providers.Schema{ 40 Block: nil, 41 }, 42 ResourceTypes: map[string]providers.Schema{ 43 "simple_resource": simpleResource, 44 }, 45 DataSources: map[string]providers.Schema{ 46 "simple_resource": simpleResource, 47 }, 48 ServerCapabilities: providers.ServerCapabilities{ 49 PlanDestroy: true, 50 }, 51 }, 52 } 53 } 54 55 func (s simple) GetProviderSchema() providers.GetProviderSchemaResponse { 56 return s.schema 57 } 58 59 func (s simple) ValidateProviderConfig(req providers.ValidateProviderConfigRequest) (resp providers.ValidateProviderConfigResponse) { 60 return resp 61 } 62 63 func (s simple) ValidateResourceConfig(req providers.ValidateResourceConfigRequest) (resp providers.ValidateResourceConfigResponse) { 64 return resp 65 } 66 67 func (s simple) ValidateDataResourceConfig(req providers.ValidateDataResourceConfigRequest) (resp providers.ValidateDataResourceConfigResponse) { 68 return resp 69 } 70 71 func (p simple) UpgradeResourceState(req providers.UpgradeResourceStateRequest) (resp providers.UpgradeResourceStateResponse) { 72 ty := p.schema.ResourceTypes[req.TypeName].Block.ImpliedType() 73 val, err := ctyjson.Unmarshal(req.RawStateJSON, ty) 74 resp.Diagnostics = resp.Diagnostics.Append(err) 75 resp.UpgradedState = val 76 return resp 77 } 78 79 func (s simple) ConfigureProvider(providers.ConfigureProviderRequest) (resp providers.ConfigureProviderResponse) { 80 return resp 81 } 82 83 func (s simple) Stop() error { 84 return nil 85 } 86 87 func (s simple) ReadResource(req providers.ReadResourceRequest) (resp providers.ReadResourceResponse) { 88 // just return the same state we received 89 resp.NewState = req.PriorState 90 return resp 91 } 92 93 func (s simple) PlanResourceChange(req providers.PlanResourceChangeRequest) (resp providers.PlanResourceChangeResponse) { 94 if req.ProposedNewState.IsNull() { 95 // destroy op 96 resp.PlannedState = req.ProposedNewState 97 resp.PlannedPrivate = req.PriorPrivate 98 return resp 99 } 100 101 m := req.ProposedNewState.AsValueMap() 102 _, ok := m["id"] 103 if !ok { 104 m["id"] = cty.UnknownVal(cty.String) 105 } 106 107 resp.PlannedState = cty.ObjectVal(m) 108 return resp 109 } 110 111 func (s simple) ApplyResourceChange(req providers.ApplyResourceChangeRequest) (resp providers.ApplyResourceChangeResponse) { 112 if req.PlannedState.IsNull() { 113 resp.NewState = req.PlannedState 114 return resp 115 } 116 117 m := req.PlannedState.AsValueMap() 118 _, ok := m["id"] 119 if !ok { 120 m["id"] = cty.StringVal(time.Now().String()) 121 } 122 resp.NewState = cty.ObjectVal(m) 123 124 return resp 125 } 126 127 func (s simple) ImportResourceState(providers.ImportResourceStateRequest) (resp providers.ImportResourceStateResponse) { 128 resp.Diagnostics = resp.Diagnostics.Append(errors.New("unsupported")) 129 return resp 130 } 131 132 func (s simple) ReadDataSource(req providers.ReadDataSourceRequest) (resp providers.ReadDataSourceResponse) { 133 m := req.Config.AsValueMap() 134 m["id"] = cty.StringVal("static_id") 135 resp.State = cty.ObjectVal(m) 136 return resp 137 } 138 139 func (s simple) Close() error { 140 return nil 141 }