Skip to content

Commit 8d2f4b8

Browse files
committed
WIP
1 parent b6a8135 commit 8d2f4b8

File tree

12 files changed

+120
-2
lines changed

12 files changed

+120
-2
lines changed

Diff for: internal/builtin/providers/terraform/provider.go

+6
Original file line numberDiff line numberDiff line change
@@ -268,3 +268,9 @@ func (p *Provider) CallFunction(req providers.CallFunctionRequest) providers.Cal
268268
func (p *Provider) Close() error {
269269
return nil
270270
}
271+
272+
func (p *Provider) ValidateStorageConfig(req providers.ValidateStorageConfigRequest) providers.ValidateStorageConfigResponse {
273+
var resp providers.ValidateStorageConfigResponse
274+
resp.Diagnostics.Append(fmt.Errorf("unsupported storage type %q", req.TypeName))
275+
return resp
276+
}

Diff for: internal/plugin/grpc_provider.go

+8
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ func (p *GRPCProviderPlugin) GRPCServer(broker *plugin.GRPCBroker, s *grpc.Serve
4646
return nil
4747
}
4848

49+
var _ providers.Interface = &GRPCProvider{}
50+
4951
// GRPCProvider handles the client, or core side of the plugin rpc connection.
5052
// The GRPCProvider methods are mostly a translation layer between the
5153
// terraform providers types and the grpc proto types, directly converting
@@ -101,6 +103,7 @@ func (p *GRPCProvider) GetProviderSchema() providers.GetProviderSchemaResponse {
101103
resp.ResourceTypes = make(map[string]providers.Schema)
102104
resp.DataSources = make(map[string]providers.Schema)
103105
resp.EphemeralResourceTypes = make(map[string]providers.Schema)
106+
// TODO: resp.StateStores = make(map[string]providers.Schema)
104107

105108
// Some providers may generate quite large schemas, and the internal default
106109
// grpc response size limit is 4MB. 64MB should cover most any use case, and
@@ -1251,3 +1254,8 @@ func clientCapabilitiesToProto(c providers.ClientCapabilities) *proto.ClientCapa
12511254
WriteOnlyAttributesAllowed: c.WriteOnlyAttributesAllowed,
12521255
}
12531256
}
1257+
1258+
func (p *GRPCProvider) ValidateStorageConfig(r providers.ValidateStorageConfigRequest) providers.ValidateStorageConfigResponse {
1259+
// TODO
1260+
return providers.ValidateStorageConfigResponse{}
1261+
}

Diff for: internal/plugin6/grpc_provider.go

+7
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ func (p *GRPCProviderPlugin) GRPCServer(broker *plugin.GRPCBroker, s *grpc.Serve
4646
return nil
4747
}
4848

49+
var _ providers.Interface = &GRPCProvider{}
50+
4951
// GRPCProvider handles the client, or core side of the plugin rpc connection.
5052
// The GRPCProvider methods are mostly a translation layer between the
5153
// terraform providers types and the grpc proto types, directly converting
@@ -1196,6 +1198,11 @@ func (p *GRPCProvider) CallFunction(r providers.CallFunctionRequest) (resp provi
11961198
return resp
11971199
}
11981200

1201+
func (p *GRPCProvider) ValidateStorageConfig(r providers.ValidateStorageConfigRequest) providers.ValidateStorageConfigResponse {
1202+
// TODO
1203+
return providers.ValidateStorageConfigResponse{}
1204+
}
1205+
11991206
// closing the grpc connection is final, and terraform will call it at the end of every phase.
12001207
func (p *GRPCProvider) Close() error {
12011208
logger.Trace("GRPCProvider.v6: Close")

Diff for: internal/provider-simple-v6/provider.go

+7
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ type simple struct {
2121
schema providers.GetProviderSchemaResponse
2222
}
2323

24+
var _ providers.Interface = simple{}
25+
2426
func Provider() providers.Interface {
2527
simpleResource := providers.Schema{
2628
Body: &configschema.Block{
@@ -247,6 +249,11 @@ func (s simple) CallFunction(req providers.CallFunctionRequest) (resp providers.
247249
return resp
248250
}
249251

252+
func (s simple) ValidateStorageConfig(req providers.ValidateStorageConfigRequest) providers.ValidateStorageConfigResponse {
253+
// TODO
254+
return providers.ValidateStorageConfigResponse{}
255+
}
256+
250257
func (s simple) Close() error {
251258
return nil
252259
}

Diff for: internal/provider-simple/provider.go

+6
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,12 @@ func (s simple) CallFunction(req providers.CallFunctionRequest) (resp providers.
204204
panic("CallFunction on provider that didn't declare any functions")
205205
}
206206

207+
func (s simple) ValidateStorageConfig(req providers.ValidateStorageConfigRequest) providers.ValidateStorageConfigResponse {
208+
// Our schema doesn't include any storages, so it should be impossible
209+
// to get in here.
210+
panic("ValidateStorageConfig on provider that didn't declare any storages")
211+
}
212+
207213
func (s simple) Close() error {
208214
return nil
209215
}

Diff for: internal/providers/mock.go

+4
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,10 @@ func (m *Mock) CallFunction(request CallFunctionRequest) CallFunctionResponse {
407407
return m.Provider.CallFunction(request)
408408
}
409409

410+
func (m *Mock) ValidateStorageConfig(req ValidateStorageConfigRequest) ValidateStorageConfigResponse {
411+
return m.Provider.ValidateStorageConfig(req)
412+
}
413+
410414
func (m *Mock) Close() error {
411415
return m.Provider.Close()
412416
}

Diff for: internal/providers/provider.go

+15-2
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ type Interface interface {
100100
// CallFunction calls a provider-contributed function.
101101
CallFunction(CallFunctionRequest) CallFunctionResponse
102102

103-
// TODO
104-
// ValidateStorageConfig(ValidateStorageRequest) ValidateStorageResponse
103+
// ValidateStorageConfig allows the provider to validate storage configuration values
104+
ValidateStorageConfig(ValidateStorageConfigRequest) ValidateStorageConfigResponse
105105
// ConfigureStorage(ConfigureStorageRequest) ConfigureStorageResponse
106106

107107
// ReadState(ReadStateRequest, srv ProviderReadStateServer)
@@ -703,3 +703,16 @@ type CallFunctionResponse struct {
703703
// specific argument.
704704
Err error
705705
}
706+
707+
type ValidateStorageConfigRequest struct {
708+
// TypeName is the name of the storage type to validate.
709+
TypeName string
710+
711+
// Config is the configuration value to validate.
712+
Config cty.Value
713+
}
714+
715+
type ValidateStorageConfigResponse struct {
716+
// Diagnostics contains any warnings or errors from the method call.
717+
Diagnostics tfdiags.Diagnostics
718+
}

Diff for: internal/providers/testing/provider_mock.go

+38
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,11 @@ type MockProvider struct {
121121
CallFunctionRequest providers.CallFunctionRequest
122122
CallFunctionFn func(providers.CallFunctionRequest) providers.CallFunctionResponse
123123

124+
ValidateStorageConfigCalled bool
125+
ValidateStorageConfigResponse *providers.ValidateStorageConfigResponse
126+
ValidateStorageConfigRequest providers.ValidateStorageConfigRequest
127+
ValidateStorageConfigFn func(providers.ValidateStorageConfigRequest) providers.ValidateStorageConfigResponse
128+
124129
CloseCalled bool
125130
CloseError error
126131
}
@@ -792,6 +797,39 @@ func (p *MockProvider) CallFunction(r providers.CallFunctionRequest) providers.C
792797
return p.CallFunctionResponse
793798
}
794799

800+
func (p *MockProvider) ValidateStorageConfig(r providers.ValidateStorageConfigRequest) (resp providers.ValidateStorageConfigResponse) {
801+
p.Lock()
802+
defer p.Unlock()
803+
804+
p.ValidateStorageConfigCalled = true
805+
p.ValidateStorageConfigRequest = r
806+
807+
// Marshall the value to replicate behavior by the GRPC protocol,
808+
// and return any relevant errors
809+
// TODO
810+
// storageSchema, ok := p.getProviderSchema().StorageTypes[r.TypeName]
811+
// if !ok {
812+
// resp.Diagnostics = resp.Diagnostics.Append(fmt.Errorf("no schema found for %q", r.TypeName))
813+
// return resp
814+
// }
815+
816+
// _, err := msgpack.Marshal(r.Config, storageSchema.Body.ImpliedType())
817+
// if err != nil {
818+
// resp.Diagnostics = resp.Diagnostics.Append(err)
819+
// return resp
820+
// }
821+
822+
if p.ValidateStorageConfigFn != nil {
823+
return p.ValidateStorageConfigFn(r)
824+
}
825+
826+
if p.ValidateStorageConfigResponse != nil {
827+
return *p.ValidateStorageConfigResponse
828+
}
829+
830+
return resp
831+
}
832+
795833
func (p *MockProvider) Close() error {
796834
p.Lock()
797835
defer p.Unlock()

Diff for: internal/refactoring/mock_provider.go

+4
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ func (provider *mockProvider) CallFunction(providers.CallFunctionRequest) provid
114114
panic("not implemented in mock")
115115
}
116116

117+
func (provider *mockProvider) ValidateStorageConfig(req providers.ValidateStorageConfigRequest) providers.ValidateStorageConfigResponse {
118+
panic("not implemented in mock")
119+
}
120+
117121
func (provider *mockProvider) Close() error {
118122
return nil // do nothing
119123
}

Diff for: internal/stacks/stackruntime/internal/stackeval/stubs/errored.go

+6
Original file line numberDiff line numberDiff line change
@@ -237,3 +237,9 @@ func (p *erroredProvider) ValidateResourceConfig(providers.ValidateResourceConfi
237237
Diagnostics: nil,
238238
}
239239
}
240+
241+
func (p *erroredProvider) ValidateStorageConfig(req providers.ValidateStorageConfigRequest) providers.ValidateStorageConfigResponse {
242+
return providers.ValidateStorageConfigResponse{
243+
Diagnostics: nil,
244+
}
245+
}

Diff for: internal/stacks/stackruntime/internal/stackeval/stubs/offline.go

+13
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,19 @@ func (o *offlineProvider) CallFunction(request providers.CallFunctionRequest) pr
235235
return o.unconfiguredClient.CallFunction(request)
236236
}
237237

238+
func (o *offlineProvider) ValidateStorageConfig(req providers.ValidateStorageConfigRequest) providers.ValidateStorageConfigResponse {
239+
var diags tfdiags.Diagnostics
240+
diags = diags.Append(tfdiags.AttributeValue(
241+
tfdiags.Error,
242+
"Called ValidateStorageConfig on an unconfigured provider",
243+
"Cannot validate storage configuration because this provider is not configured. This is a bug in Terraform - please report it.",
244+
nil, // nil attribute path means the overall configuration block
245+
))
246+
return providers.ValidateStorageConfigResponse{
247+
Diagnostics: diags,
248+
}
249+
}
250+
238251
func (o *offlineProvider) Close() error {
239252
// pass the close call to the underlying unconfigured client
240253
return o.unconfiguredClient.Close()

Diff for: internal/stacks/stackruntime/internal/stackeval/stubs/unknown.go

+6
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,12 @@ func (u *unknownProvider) CallFunction(_ providers.CallFunctionRequest) provider
290290
}
291291
}
292292

293+
func (u *unknownProvider) ValidateStorageConfig(request providers.ValidateStorageConfigRequest) providers.ValidateStorageConfigResponse {
294+
// This is offline functionality, so we can hand it off to the unconfigured
295+
// client.
296+
return u.unconfiguredClient.ValidateStorageConfig(request)
297+
}
298+
293299
func (u *unknownProvider) Close() error {
294300
// the underlying unconfiguredClient is managed elsewhere.
295301
return nil

0 commit comments

Comments
 (0)