github.com/eliastor/durgaform@v0.0.0-20220816172711-d0ab2d17673e/internal/provider-simple/provider.go (about) 1 // simple provider a minimal provider implementation for testing 2 package simple 3 4 import ( 5 "errors" 6 "time" 7 8 "github.com/eliastor/durgaform/internal/configs/configschema" 9 "github.com/eliastor/durgaform/internal/providers" 10 "github.com/zclconf/go-cty/cty" 11 ctyjson "github.com/zclconf/go-cty/cty/json" 12 ) 13 14 type simple struct { 15 schema providers.GetProviderSchemaResponse 16 } 17 18 func 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 ServerCapabilities: providers.ServerCapabilities{ 46 PlanDestroy: true, 47 }, 48 }, 49 } 50 } 51 52 func (s simple) GetProviderSchema() providers.GetProviderSchemaResponse { 53 return s.schema 54 } 55 56 func (s simple) ValidateProviderConfig(req providers.ValidateProviderConfigRequest) (resp providers.ValidateProviderConfigResponse) { 57 return resp 58 } 59 60 func (s simple) ValidateResourceConfig(req providers.ValidateResourceConfigRequest) (resp providers.ValidateResourceConfigResponse) { 61 return resp 62 } 63 64 func (s simple) ValidateDataResourceConfig(req providers.ValidateDataResourceConfigRequest) (resp providers.ValidateDataResourceConfigResponse) { 65 return resp 66 } 67 68 func (p simple) UpgradeResourceState(req providers.UpgradeResourceStateRequest) (resp providers.UpgradeResourceStateResponse) { 69 ty := p.schema.ResourceTypes[req.TypeName].Block.ImpliedType() 70 val, err := ctyjson.Unmarshal(req.RawStateJSON, ty) 71 resp.Diagnostics = resp.Diagnostics.Append(err) 72 resp.UpgradedState = val 73 return resp 74 } 75 76 func (s simple) ConfigureProvider(providers.ConfigureProviderRequest) (resp providers.ConfigureProviderResponse) { 77 return resp 78 } 79 80 func (s simple) Stop() error { 81 return nil 82 } 83 84 func (s simple) ReadResource(req providers.ReadResourceRequest) (resp providers.ReadResourceResponse) { 85 // just return the same state we received 86 resp.NewState = req.PriorState 87 return resp 88 } 89 90 func (s simple) PlanResourceChange(req providers.PlanResourceChangeRequest) (resp providers.PlanResourceChangeResponse) { 91 if req.ProposedNewState.IsNull() { 92 // destroy op 93 resp.PlannedState = req.ProposedNewState 94 resp.PlannedPrivate = req.PriorPrivate 95 return resp 96 } 97 98 m := req.ProposedNewState.AsValueMap() 99 _, ok := m["id"] 100 if !ok { 101 m["id"] = cty.UnknownVal(cty.String) 102 } 103 104 resp.PlannedState = cty.ObjectVal(m) 105 return resp 106 } 107 108 func (s simple) ApplyResourceChange(req providers.ApplyResourceChangeRequest) (resp providers.ApplyResourceChangeResponse) { 109 if req.PlannedState.IsNull() { 110 resp.NewState = req.PlannedState 111 return resp 112 } 113 114 m := req.PlannedState.AsValueMap() 115 _, ok := m["id"] 116 if !ok { 117 m["id"] = cty.StringVal(time.Now().String()) 118 } 119 resp.NewState = cty.ObjectVal(m) 120 121 return resp 122 } 123 124 func (s simple) ImportResourceState(providers.ImportResourceStateRequest) (resp providers.ImportResourceStateResponse) { 125 resp.Diagnostics = resp.Diagnostics.Append(errors.New("unsupported")) 126 return resp 127 } 128 129 func (s simple) ReadDataSource(req providers.ReadDataSourceRequest) (resp providers.ReadDataSourceResponse) { 130 m := req.Config.AsValueMap() 131 m["id"] = cty.StringVal("static_id") 132 resp.State = cty.ObjectVal(m) 133 return resp 134 } 135 136 func (s simple) Close() error { 137 return nil 138 }