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