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