Skip to content

Commit c7c3888

Browse files
authored
Merge branch 'main' into t-bump-aws-sdk-go-base
2 parents f650603 + 922fdb2 commit c7c3888

File tree

17 files changed

+1158
-428
lines changed

17 files changed

+1158
-428
lines changed

docs/plugin-protocol/tfplugin6.proto

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,11 @@ service Provider {
395395
// WriteStateBytes streams byte chunks of a given state file into a state store
396396
rpc WriteStateBytes(stream WriteStateBytes.RequestChunk) returns (WriteStateBytes.Response);
397397

398+
// LockState locks a given state (i.e. CE workspace)
399+
rpc LockState(LockState.Request) returns (LockState.Response);
400+
// UnlockState unlocks a given state (i.e. CE workspace)
401+
rpc UnlockState(UnlockState.Request) returns (UnlockState.Response);
402+
398403
// GetStates returns a list of all states (i.e. CE workspaces) managed by a given state store
399404
rpc GetStates(GetStates.Request) returns (GetStates.Response);
400405
// DeleteState instructs a given state store to delete a specific state (i.e. a CE workspace)
@@ -968,6 +973,30 @@ message StateRange {
968973
int64 end = 2;
969974
}
970975

976+
message LockState {
977+
message Request {
978+
string type_name = 1;
979+
string state_id = 2;
980+
// operation represents an ongoing operation due to which lock is held (e.g. refresh, plan, apply)
981+
string operation = 3;
982+
}
983+
message Response {
984+
string lock_id = 1;
985+
repeated Diagnostic diagnostics = 2;
986+
}
987+
}
988+
989+
message UnlockState {
990+
message Request {
991+
string type_name = 1;
992+
string state_id = 2;
993+
string lock_id = 3;
994+
}
995+
message Response {
996+
repeated Diagnostic diagnostics = 1;
997+
}
998+
}
999+
9711000
message GetStates {
9721001
message Request {
9731002
string type_name = 1;

internal/builtin/providers/terraform/provider.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,18 @@ func (p *Provider) WriteStateBytes(req providers.WriteStateBytesRequest) provide
307307
return resp
308308
}
309309

310+
func (p *Provider) LockState(req providers.LockStateRequest) providers.LockStateResponse {
311+
var resp providers.LockStateResponse
312+
resp.Diagnostics.Append(fmt.Errorf("unsupported state store type %q", req.TypeName))
313+
return resp
314+
}
315+
316+
func (p *Provider) UnlockState(req providers.UnlockStateRequest) providers.UnlockStateResponse {
317+
var resp providers.UnlockStateResponse
318+
resp.Diagnostics.Append(fmt.Errorf("unsupported state store type %q", req.TypeName))
319+
return resp
320+
}
321+
310322
func (p *Provider) GetStates(req providers.GetStatesRequest) providers.GetStatesResponse {
311323
var resp providers.GetStatesResponse
312324
resp.Diagnostics.Append(fmt.Errorf("unsupported state store type %q", req.TypeName))

internal/grpcwrap/provider6.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -915,6 +915,14 @@ func (p *provider6) WriteStateBytes(srv tfplugin6.Provider_WriteStateBytesServer
915915
panic("not implemented")
916916
}
917917

918+
func (p *provider6) LockState(ctx context.Context, req *tfplugin6.LockState_Request) (*tfplugin6.LockState_Response, error) {
919+
panic("not implemented")
920+
}
921+
922+
func (p *provider6) UnlockState(ctx context.Context, req *tfplugin6.UnlockState_Request) (*tfplugin6.UnlockState_Response, error) {
923+
panic("not implemented")
924+
}
925+
918926
func (p *provider6) GetStates(ctx context.Context, req *tfplugin6.GetStates_Request) (*tfplugin6.GetStates_Response, error) {
919927
panic("not implemented")
920928
}

internal/plugin/grpc_provider.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1452,6 +1452,14 @@ func (p *GRPCProvider) WriteStateBytes(r providers.WriteStateBytesRequest) provi
14521452
panic("not implemented")
14531453
}
14541454

1455+
func (p *GRPCProvider) LockState(r providers.LockStateRequest) providers.LockStateResponse {
1456+
panic("not implemented")
1457+
}
1458+
1459+
func (p *GRPCProvider) UnlockState(r providers.UnlockStateRequest) providers.UnlockStateResponse {
1460+
panic("not implemented")
1461+
}
1462+
14551463
func (p *GRPCProvider) GetStates(r providers.GetStatesRequest) providers.GetStatesResponse {
14561464
panic("not implemented")
14571465
}

internal/plugin6/grpc_provider.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1738,6 +1738,67 @@ func (p *GRPCProvider) WriteStateBytes(r providers.WriteStateBytesRequest) (resp
17381738
return resp
17391739
}
17401740

1741+
func (p *GRPCProvider) LockState(r providers.LockStateRequest) (resp providers.LockStateResponse) {
1742+
logger.Trace("GRPCProvider.v6: LockState")
1743+
1744+
schema := p.GetProviderSchema()
1745+
if schema.Diagnostics.HasErrors() {
1746+
resp.Diagnostics = schema.Diagnostics
1747+
return resp
1748+
}
1749+
1750+
_, ok := schema.StateStores[r.TypeName]
1751+
if !ok {
1752+
resp.Diagnostics = resp.Diagnostics.Append(fmt.Errorf("unknown state store type %q", r.TypeName))
1753+
return resp
1754+
}
1755+
1756+
protoReq := &proto6.LockState_Request{
1757+
TypeName: r.TypeName,
1758+
StateId: r.StateId,
1759+
Operation: r.Operation,
1760+
}
1761+
1762+
protoResp, err := p.client.LockState(p.ctx, protoReq)
1763+
if err != nil {
1764+
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
1765+
return resp
1766+
}
1767+
resp.LockId = protoResp.LockId
1768+
resp.Diagnostics = resp.Diagnostics.Append(convert.ProtoToDiagnostics(protoResp.Diagnostics))
1769+
return resp
1770+
}
1771+
1772+
func (p *GRPCProvider) UnlockState(r providers.UnlockStateRequest) (resp providers.UnlockStateResponse) {
1773+
logger.Trace("GRPCProvider.v6: UnlockState")
1774+
1775+
schema := p.GetProviderSchema()
1776+
if schema.Diagnostics.HasErrors() {
1777+
resp.Diagnostics = schema.Diagnostics
1778+
return resp
1779+
}
1780+
1781+
_, ok := schema.StateStores[r.TypeName]
1782+
if !ok {
1783+
resp.Diagnostics = resp.Diagnostics.Append(fmt.Errorf("unknown state store type %q", r.TypeName))
1784+
return resp
1785+
}
1786+
1787+
protoReq := &proto6.UnlockState_Request{
1788+
TypeName: r.TypeName,
1789+
StateId: r.StateId,
1790+
LockId: r.LockId,
1791+
}
1792+
1793+
protoResp, err := p.client.UnlockState(p.ctx, protoReq)
1794+
if err != nil {
1795+
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
1796+
return resp
1797+
}
1798+
resp.Diagnostics = resp.Diagnostics.Append(convert.ProtoToDiagnostics(protoResp.Diagnostics))
1799+
return resp
1800+
}
1801+
17411802
func (p *GRPCProvider) SetStateStoreChunkSize(typeName string, size int) {
17421803
p.mu.Lock()
17431804
defer p.mu.Unlock()

internal/plugin6/mock_proto/mock.go

Lines changed: 40 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/provider-simple-v6/provider.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,14 @@ func (s simple) WriteStateBytes(req providers.WriteStateBytesRequest) providers.
325325
panic("not implemented")
326326
}
327327

328+
func (s simple) LockState(req providers.LockStateRequest) providers.LockStateResponse {
329+
panic("not implemented")
330+
}
331+
332+
func (s simple) UnlockState(req providers.UnlockStateRequest) providers.UnlockStateResponse {
333+
panic("not implemented")
334+
}
335+
328336
func (s simple) GetStates(req providers.GetStatesRequest) providers.GetStatesResponse {
329337
panic("not implemented")
330338
}

internal/provider-simple/provider.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,14 @@ func (s simple) WriteStateBytes(req providers.WriteStateBytesRequest) providers.
285285
panic("not implemented")
286286
}
287287

288+
func (s simple) LockState(req providers.LockStateRequest) providers.LockStateResponse {
289+
panic("not implemented")
290+
}
291+
292+
func (s simple) UnlockState(req providers.UnlockStateRequest) providers.UnlockStateResponse {
293+
panic("not implemented")
294+
}
295+
288296
func (s simple) GetStates(req providers.GetStatesRequest) providers.GetStatesResponse {
289297
// provider-simple uses protocol version 5, which does not include the RPC that maps to this method
290298
panic("not implemented")

internal/providers/mock.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,14 @@ func (m *Mock) WriteStateBytes(req WriteStateBytesRequest) WriteStateBytesRespon
444444
return m.Provider.WriteStateBytes(req)
445445
}
446446

447+
func (m *Mock) LockState(req LockStateRequest) LockStateResponse {
448+
return m.Provider.LockState(req)
449+
}
450+
451+
func (m *Mock) UnlockState(req UnlockStateRequest) UnlockStateResponse {
452+
return m.Provider.UnlockState(req)
453+
}
454+
447455
func (m *Mock) GetStates(req GetStatesRequest) GetStatesResponse {
448456
return m.Provider.GetStates(req)
449457
}

internal/providers/provider.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,11 @@ type Interface interface {
128128
// WriteStateBytes streams byte chunks of a given state file into a state store
129129
WriteStateBytes(WriteStateBytesRequest) WriteStateBytesResponse
130130

131+
// LockState locks a given state (i.e. CE workspace)
132+
LockState(LockStateRequest) LockStateResponse
133+
// UnlockState unlocks a given state (i.e. CE workspace)
134+
UnlockState(UnlockStateRequest) UnlockStateResponse
135+
131136
// GetStates returns a list of all states (i.e. CE workspaces) managed by a given state store
132137
GetStates(GetStatesRequest) GetStatesResponse
133138
// DeleteState instructs a given state store to delete a specific state (i.e. a CE workspace)
@@ -903,6 +908,29 @@ type WriteStateBytesResponse struct {
903908
Diagnostics tfdiags.Diagnostics
904909
}
905910

911+
type LockStateRequest struct {
912+
TypeName string
913+
StateId string
914+
Operation string
915+
}
916+
917+
type LockStateResponse struct {
918+
LockId string
919+
// Diagnostics contains any warnings or errors from the method call.
920+
Diagnostics tfdiags.Diagnostics
921+
}
922+
923+
type UnlockStateRequest struct {
924+
TypeName string
925+
StateId string
926+
LockId string
927+
}
928+
929+
type UnlockStateResponse struct {
930+
// Diagnostics contains any warnings or errors from the method call.
931+
Diagnostics tfdiags.Diagnostics
932+
}
933+
906934
type GetStatesRequest struct {
907935
// TypeName is the name of the state store to request the list of states from
908936
TypeName string

0 commit comments

Comments
 (0)