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