Skip to content

Commit 037ed81

Browse files
PSS: Implement first gRPC methods: config validation and usage, listing and deleting workspaces (#37418)
* Implement first grpc methods: config validation and use, listing and deleting workspaces * Add a state store to the default provider schema used in protocol 6 GRPCProvider tests * Add `ValidateStateStoreConfig` test that shows diagnostics are returned as expected * Add `ValidateStateStoreConfig` test that shows schema-related errors are returned before the `ValidateStateStoreConfig` RPC takes place * Add similar tests for `ConfigureStateStore` - check errors are returned and schema errors are caught early * Refactor to avoid looping over cases * Update `GetStates` to check the store type is implemented before retrieving states. Add tests. * Fix defect in DeleteState, update it to check state store type is valid * Add tests for `DeleteState` method --------- Co-authored-by: Radek Simko <[email protected]>
1 parent 3b55d61 commit 037ed81

File tree

2 files changed

+565
-8
lines changed

2 files changed

+565
-8
lines changed

internal/plugin6/grpc_provider.go

Lines changed: 120 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1405,20 +1405,132 @@ func (p *GRPCProvider) ListResource(r providers.ListResourceRequest) providers.L
14051405
return resp
14061406
}
14071407

1408-
func (p *GRPCProvider) ValidateStateStoreConfig(r providers.ValidateStateStoreConfigRequest) providers.ValidateStateStoreConfigResponse {
1409-
panic("not implemented")
1408+
func (p *GRPCProvider) ValidateStateStoreConfig(r providers.ValidateStateStoreConfigRequest) (resp providers.ValidateStateStoreConfigResponse) {
1409+
logger.Trace("GRPCProvider.v6: ValidateStateStoreConfig")
1410+
1411+
schema := p.GetProviderSchema()
1412+
if schema.Diagnostics.HasErrors() {
1413+
resp.Diagnostics = schema.Diagnostics
1414+
return resp
1415+
}
1416+
1417+
ssSchema, ok := schema.StateStores[r.TypeName]
1418+
if !ok {
1419+
resp.Diagnostics = resp.Diagnostics.Append(fmt.Errorf("unknown state store type %q", r.TypeName))
1420+
return resp
1421+
}
1422+
1423+
mp, err := msgpack.Marshal(r.Config, ssSchema.Body.ImpliedType())
1424+
if err != nil {
1425+
resp.Diagnostics = resp.Diagnostics.Append(err)
1426+
return resp
1427+
}
1428+
1429+
protoReq := &proto6.ValidateStateStore_Request{
1430+
TypeName: r.TypeName,
1431+
Config: &proto6.DynamicValue{Msgpack: mp},
1432+
}
1433+
1434+
protoResp, err := p.client.ValidateStateStoreConfig(p.ctx, protoReq)
1435+
if err != nil {
1436+
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
1437+
return resp
1438+
}
1439+
1440+
resp.Diagnostics = resp.Diagnostics.Append(convert.ProtoToDiagnostics(protoResp.Diagnostics))
1441+
return resp
14101442
}
14111443

1412-
func (p *GRPCProvider) ConfigureStateStore(r providers.ConfigureStateStoreRequest) providers.ConfigureStateStoreResponse {
1413-
panic("not implemented")
1444+
func (p *GRPCProvider) ConfigureStateStore(r providers.ConfigureStateStoreRequest) (resp providers.ConfigureStateStoreResponse) {
1445+
logger.Trace("GRPCProvider.v6: ConfigureStateStore")
1446+
1447+
schema := p.GetProviderSchema()
1448+
if schema.Diagnostics.HasErrors() {
1449+
resp.Diagnostics = schema.Diagnostics
1450+
return resp
1451+
}
1452+
1453+
ssSchema, ok := schema.StateStores[r.TypeName]
1454+
if !ok {
1455+
resp.Diagnostics = resp.Diagnostics.Append(fmt.Errorf("unknown state store type %q", r.TypeName))
1456+
return resp
1457+
}
1458+
1459+
mp, err := msgpack.Marshal(r.Config, ssSchema.Body.ImpliedType())
1460+
if err != nil {
1461+
resp.Diagnostics = resp.Diagnostics.Append(err)
1462+
return resp
1463+
}
1464+
1465+
protoReq := &proto6.ConfigureStateStore_Request{
1466+
TypeName: r.TypeName,
1467+
Config: &proto6.DynamicValue{
1468+
Msgpack: mp,
1469+
},
1470+
}
1471+
1472+
protoResp, err := p.client.ConfigureStateStore(p.ctx, protoReq)
1473+
if err != nil {
1474+
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
1475+
return resp
1476+
}
1477+
resp.Diagnostics = resp.Diagnostics.Append(convert.ProtoToDiagnostics(protoResp.Diagnostics))
1478+
return resp
14141479
}
14151480

1416-
func (p *GRPCProvider) GetStates(r providers.GetStatesRequest) providers.GetStatesResponse {
1417-
panic("not implemented")
1481+
func (p *GRPCProvider) GetStates(r providers.GetStatesRequest) (resp providers.GetStatesResponse) {
1482+
logger.Trace("GRPCProvider.v6: GetStates")
1483+
1484+
schema := p.GetProviderSchema()
1485+
if schema.Diagnostics.HasErrors() {
1486+
resp.Diagnostics = schema.Diagnostics
1487+
return resp
1488+
}
1489+
1490+
if _, ok := schema.StateStores[r.TypeName]; !ok {
1491+
resp.Diagnostics = resp.Diagnostics.Append(fmt.Errorf("unknown state store type %q", r.TypeName))
1492+
return resp
1493+
}
1494+
1495+
protoReq := &proto6.GetStates_Request{
1496+
TypeName: r.TypeName,
1497+
}
1498+
1499+
protoResp, err := p.client.GetStates(p.ctx, protoReq)
1500+
if err != nil {
1501+
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
1502+
return resp
1503+
}
1504+
resp.Diagnostics = resp.Diagnostics.Append(convert.ProtoToDiagnostics(protoResp.Diagnostics))
1505+
resp.States = protoResp.StateId
1506+
return resp
14181507
}
14191508

1420-
func (p *GRPCProvider) DeleteState(r providers.DeleteStateRequest) providers.DeleteStateResponse {
1421-
panic("not implemented")
1509+
func (p *GRPCProvider) DeleteState(r providers.DeleteStateRequest) (resp providers.DeleteStateResponse) {
1510+
logger.Trace("GRPCProvider.v6: DeleteState")
1511+
1512+
protoReq := &proto6.DeleteState_Request{
1513+
TypeName: r.TypeName,
1514+
}
1515+
1516+
schema := p.GetProviderSchema()
1517+
if schema.Diagnostics.HasErrors() {
1518+
resp.Diagnostics = schema.Diagnostics
1519+
return resp
1520+
}
1521+
1522+
if _, ok := schema.StateStores[r.TypeName]; !ok {
1523+
resp.Diagnostics = resp.Diagnostics.Append(fmt.Errorf("unknown state store type %q", r.TypeName))
1524+
return resp
1525+
}
1526+
1527+
protoResp, err := p.client.DeleteState(p.ctx, protoReq)
1528+
if err != nil {
1529+
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
1530+
return resp
1531+
}
1532+
resp.Diagnostics = resp.Diagnostics.Append(convert.ProtoToDiagnostics(protoResp.Diagnostics))
1533+
return resp
14221534
}
14231535

14241536
// closing the grpc connection is final, and terraform will call it at the end of every phase.

0 commit comments

Comments
 (0)