diff --git a/internal/rpcapi/stacks.go b/internal/rpcapi/stacks.go index 0917460dd8..3a1f10a847 100644 --- a/internal/rpcapi/stacks.go +++ b/internal/rpcapi/stacks.go @@ -78,3 +78,52 @@ func (s *stacksServer) CloseStackConfiguration(ctx context.Context, req *terrafo } return &terraform1.CloseStackConfiguration_Response{}, nil } + +func (s *stacksServer) FindStackConfigurationComponents(ctx context.Context, req *terraform1.FindStackConfigurationComponents_Request) (*terraform1.FindStackConfigurationComponents_Response, error) { + cfgHnd := handle[*stackconfig.Config](req.StackConfigHandle) + cfg := s.handles.StackConfig(cfgHnd) + if cfg == nil { + return nil, status.Error(codes.InvalidArgument, "the given stack configuration handle is invalid") + } + + return &terraform1.FindStackConfigurationComponents_Response{ + Config: stackConfigMetaforProto(cfg.Root), + }, nil +} + +func stackConfigMetaforProto(cfgNode *stackconfig.ConfigNode) *terraform1.FindStackConfigurationComponents_StackConfig { + ret := &terraform1.FindStackConfigurationComponents_StackConfig{ + Components: make(map[string]*terraform1.FindStackConfigurationComponents_Component), + EmbeddedStacks: make(map[string]*terraform1.FindStackConfigurationComponents_EmbeddedStack), + } + + for name, cc := range cfgNode.Stack.Components { + cProto := &terraform1.FindStackConfigurationComponents_Component{ + SourceAddr: cc.FinalSourceAddr.String(), + } + switch { + case cc.ForEach != nil: + cProto.Instances = terraform1.FindStackConfigurationComponents_FOR_EACH + default: + cProto.Instances = terraform1.FindStackConfigurationComponents_SINGLE + } + ret.Components[name] = cProto + } + + for name, sn := range cfgNode.Children { + sc := cfgNode.Stack.EmbeddedStacks[name] + sProto := &terraform1.FindStackConfigurationComponents_EmbeddedStack{ + SourceAddr: sn.Stack.SourceAddr.String(), + Config: stackConfigMetaforProto(sn), + } + switch { + case sc.ForEach != nil: + sProto.Instances = terraform1.FindStackConfigurationComponents_FOR_EACH + default: + sProto.Instances = terraform1.FindStackConfigurationComponents_SINGLE + } + ret.EmbeddedStacks[name] = sProto + } + + return ret +} diff --git a/internal/rpcapi/stacks_test.go b/internal/rpcapi/stacks_test.go index 6e5c451516..02b2a1ce07 100644 --- a/internal/rpcapi/stacks_test.go +++ b/internal/rpcapi/stacks_test.go @@ -4,11 +4,14 @@ import ( "context" "testing" + "github.com/google/go-cmp/cmp" "github.com/hashicorp/go-slug/sourcebundle" - "github.com/hashicorp/terraform/internal/rpcapi/terraform1" - "github.com/hashicorp/terraform/internal/stacks/stackconfig" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + "google.golang.org/protobuf/testing/protocmp" + + "github.com/hashicorp/terraform/internal/rpcapi/terraform1" + "github.com/hashicorp/terraform/internal/stacks/stackconfig" ) func TestStacksOpenCloseStackConfiguration(t *testing.T) { @@ -92,3 +95,119 @@ func TestStacksOpenCloseStackConfiguration(t *testing.T) { } } } + +func TestStacksFindStackConfigurationComponents(t *testing.T) { + ctx := context.Background() + + handles := newHandleTable() + stacksServer := newStacksServer(handles) + + // In normal use a client would have previously opened a source bundle + // using Dependencies.OpenSourceBundle, so we'll simulate the effect + // of that here. + var sourcesHnd handle[*sourcebundle.Bundle] + { + sources, err := sourcebundle.OpenDir("testdata/sourcebundle") + if err != nil { + t.Fatal(err) + } + sourcesHnd = handles.NewSourceBundle(sources) + } + + t.Run("empty config", func(t *testing.T) { + openResp, err := stacksServer.OpenStackConfiguration(ctx, &terraform1.OpenStackConfiguration_Request{ + SourceBundleHandle: sourcesHnd.ForProtobuf(), + SourceAddress: &terraform1.SourceAddress{ + Source: "git::https://example.com/foo.git", + }, + }) + if err != nil { + t.Fatal(err) + } + if len(openResp.Diagnostics) != 0 { + t.Error("empty configuration generated diagnostics; expected none") + if openResp.StackConfigHandle == 0 { + return // Our later operations will fail if given the nil handle + } + } + + cmpntResp, err := stacksServer.FindStackConfigurationComponents(ctx, &terraform1.FindStackConfigurationComponents_Request{ + StackConfigHandle: openResp.StackConfigHandle, + }) + if err != nil { + t.Fatal(err) + } + + got := cmpntResp.Config + want := &terraform1.FindStackConfigurationComponents_StackConfig{ + // Intentionally empty, because the configuration we've loaded + // is itself empty. + } + if diff := cmp.Diff(want, got, protocmp.Transform()); diff != "" { + t.Errorf("wrong result\n%s", diff) + } + }) + t.Run("non-empty config", func(t *testing.T) { + openResp, err := stacksServer.OpenStackConfiguration(ctx, &terraform1.OpenStackConfiguration_Request{ + SourceBundleHandle: sourcesHnd.ForProtobuf(), + SourceAddress: &terraform1.SourceAddress{ + Source: "git::https://example.com/foo.git//non-empty-stack", + }, + }) + if err != nil { + t.Fatal(err) + } + if len(openResp.Diagnostics) != 0 { + t.Error("empty configuration generated diagnostics; expected none") + if openResp.StackConfigHandle == 0 { + return // Our later operations will fail if given the nil handle + } + } + + cmpntResp, err := stacksServer.FindStackConfigurationComponents(ctx, &terraform1.FindStackConfigurationComponents_Request{ + StackConfigHandle: openResp.StackConfigHandle, + }) + if err != nil { + t.Fatal(err) + } + + got := cmpntResp.Config + want := &terraform1.FindStackConfigurationComponents_StackConfig{ + Components: map[string]*terraform1.FindStackConfigurationComponents_Component{ + "single": { + SourceAddr: "git::https://example.com/foo.git//non-empty-stack/empty-module", + }, + "for_each": { + SourceAddr: "git::https://example.com/foo.git//non-empty-stack/empty-module", + Instances: terraform1.FindStackConfigurationComponents_FOR_EACH, + }, + }, + EmbeddedStacks: map[string]*terraform1.FindStackConfigurationComponents_EmbeddedStack{ + "single": { + SourceAddr: "git::https://example.com/foo.git//non-empty-stack/child", + Config: &terraform1.FindStackConfigurationComponents_StackConfig{ + Components: map[string]*terraform1.FindStackConfigurationComponents_Component{ + "foo": { + SourceAddr: "git::https://example.com/foo.git//non-empty-stack/empty-module", + }, + }, + }, + }, + "for_each": { + SourceAddr: "git::https://example.com/foo.git//non-empty-stack/child", + Instances: terraform1.FindStackConfigurationComponents_FOR_EACH, + Config: &terraform1.FindStackConfigurationComponents_StackConfig{ + Components: map[string]*terraform1.FindStackConfigurationComponents_Component{ + "foo": { + SourceAddr: "git::https://example.com/foo.git//non-empty-stack/empty-module", + }, + }, + }, + }, + }, + } + if diff := cmp.Diff(want, got, protocmp.Transform()); diff != "" { + t.Errorf("wrong result\n%s", diff) + } + }) +} diff --git a/internal/rpcapi/terraform1/terraform1.pb.go b/internal/rpcapi/terraform1/terraform1.pb.go index 2a89dafa16..2a7f7c4c00 100644 --- a/internal/rpcapi/terraform1/terraform1.pb.go +++ b/internal/rpcapi/terraform1/terraform1.pb.go @@ -27,6 +27,55 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type FindStackConfigurationComponents_Instances int32 + +const ( + FindStackConfigurationComponents_SINGLE FindStackConfigurationComponents_Instances = 0 + FindStackConfigurationComponents_COUNT FindStackConfigurationComponents_Instances = 1 + FindStackConfigurationComponents_FOR_EACH FindStackConfigurationComponents_Instances = 2 +) + +// Enum value maps for FindStackConfigurationComponents_Instances. +var ( + FindStackConfigurationComponents_Instances_name = map[int32]string{ + 0: "SINGLE", + 1: "COUNT", + 2: "FOR_EACH", + } + FindStackConfigurationComponents_Instances_value = map[string]int32{ + "SINGLE": 0, + "COUNT": 1, + "FOR_EACH": 2, + } +) + +func (x FindStackConfigurationComponents_Instances) Enum() *FindStackConfigurationComponents_Instances { + p := new(FindStackConfigurationComponents_Instances) + *p = x + return p +} + +func (x FindStackConfigurationComponents_Instances) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (FindStackConfigurationComponents_Instances) Descriptor() protoreflect.EnumDescriptor { + return file_terraform1_proto_enumTypes[0].Descriptor() +} + +func (FindStackConfigurationComponents_Instances) Type() protoreflect.EnumType { + return &file_terraform1_proto_enumTypes[0] +} + +func (x FindStackConfigurationComponents_Instances) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use FindStackConfigurationComponents_Instances.Descriptor instead. +func (FindStackConfigurationComponents_Instances) EnumDescriptor() ([]byte, []int) { + return file_terraform1_proto_rawDescGZIP(), []int{7, 0} +} + type Diagnostic_Severity int32 const ( @@ -60,11 +109,11 @@ func (x Diagnostic_Severity) String() string { } func (Diagnostic_Severity) Descriptor() protoreflect.EnumDescriptor { - return file_terraform1_proto_enumTypes[0].Descriptor() + return file_terraform1_proto_enumTypes[1].Descriptor() } func (Diagnostic_Severity) Type() protoreflect.EnumType { - return &file_terraform1_proto_enumTypes[0] + return &file_terraform1_proto_enumTypes[1] } func (x Diagnostic_Severity) Number() protoreflect.EnumNumber { @@ -428,6 +477,10 @@ func (*FindStackConfigurationProviders) Descriptor() ([]byte, []int) { // A source address in the same form as it would appear in a Terraform // configuration: a source string combined with an optional version constraint // string, where the latter is valid only for registry module addresses. +// +// This is not used for "final" source addresses that have already been reduced +// to an exact version selection. For those we just directly encode the string +// representation of the final address, including a version number if necessary. type SourceAddress struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1207,6 +1260,8 @@ type FindStackConfigurationComponents_Response struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Config *FindStackConfigurationComponents_StackConfig `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"` } func (x *FindStackConfigurationComponents_Response) Reset() { @@ -1241,6 +1296,186 @@ func (*FindStackConfigurationComponents_Response) Descriptor() ([]byte, []int) { return file_terraform1_proto_rawDescGZIP(), []int{7, 1} } +func (x *FindStackConfigurationComponents_Response) GetConfig() *FindStackConfigurationComponents_StackConfig { + if x != nil { + return x.Config + } + return nil +} + +type FindStackConfigurationComponents_StackConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Components map[string]*FindStackConfigurationComponents_Component `protobuf:"bytes,1,rep,name=components,proto3" json:"components,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + EmbeddedStacks map[string]*FindStackConfigurationComponents_EmbeddedStack `protobuf:"bytes,2,rep,name=embedded_stacks,json=embeddedStacks,proto3" json:"embedded_stacks,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *FindStackConfigurationComponents_StackConfig) Reset() { + *x = FindStackConfigurationComponents_StackConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_terraform1_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FindStackConfigurationComponents_StackConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FindStackConfigurationComponents_StackConfig) ProtoMessage() {} + +func (x *FindStackConfigurationComponents_StackConfig) ProtoReflect() protoreflect.Message { + mi := &file_terraform1_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FindStackConfigurationComponents_StackConfig.ProtoReflect.Descriptor instead. +func (*FindStackConfigurationComponents_StackConfig) Descriptor() ([]byte, []int) { + return file_terraform1_proto_rawDescGZIP(), []int{7, 2} +} + +func (x *FindStackConfigurationComponents_StackConfig) GetComponents() map[string]*FindStackConfigurationComponents_Component { + if x != nil { + return x.Components + } + return nil +} + +func (x *FindStackConfigurationComponents_StackConfig) GetEmbeddedStacks() map[string]*FindStackConfigurationComponents_EmbeddedStack { + if x != nil { + return x.EmbeddedStacks + } + return nil +} + +type FindStackConfigurationComponents_EmbeddedStack struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SourceAddr string `protobuf:"bytes,1,opt,name=source_addr,json=sourceAddr,proto3" json:"source_addr,omitempty"` + Instances FindStackConfigurationComponents_Instances `protobuf:"varint,2,opt,name=instances,proto3,enum=terraform1.FindStackConfigurationComponents_Instances" json:"instances,omitempty"` + Config *FindStackConfigurationComponents_StackConfig `protobuf:"bytes,3,opt,name=config,proto3" json:"config,omitempty"` +} + +func (x *FindStackConfigurationComponents_EmbeddedStack) Reset() { + *x = FindStackConfigurationComponents_EmbeddedStack{} + if protoimpl.UnsafeEnabled { + mi := &file_terraform1_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FindStackConfigurationComponents_EmbeddedStack) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FindStackConfigurationComponents_EmbeddedStack) ProtoMessage() {} + +func (x *FindStackConfigurationComponents_EmbeddedStack) ProtoReflect() protoreflect.Message { + mi := &file_terraform1_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FindStackConfigurationComponents_EmbeddedStack.ProtoReflect.Descriptor instead. +func (*FindStackConfigurationComponents_EmbeddedStack) Descriptor() ([]byte, []int) { + return file_terraform1_proto_rawDescGZIP(), []int{7, 3} +} + +func (x *FindStackConfigurationComponents_EmbeddedStack) GetSourceAddr() string { + if x != nil { + return x.SourceAddr + } + return "" +} + +func (x *FindStackConfigurationComponents_EmbeddedStack) GetInstances() FindStackConfigurationComponents_Instances { + if x != nil { + return x.Instances + } + return FindStackConfigurationComponents_SINGLE +} + +func (x *FindStackConfigurationComponents_EmbeddedStack) GetConfig() *FindStackConfigurationComponents_StackConfig { + if x != nil { + return x.Config + } + return nil +} + +type FindStackConfigurationComponents_Component struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SourceAddr string `protobuf:"bytes,1,opt,name=source_addr,json=sourceAddr,proto3" json:"source_addr,omitempty"` + Instances FindStackConfigurationComponents_Instances `protobuf:"varint,2,opt,name=instances,proto3,enum=terraform1.FindStackConfigurationComponents_Instances" json:"instances,omitempty"` +} + +func (x *FindStackConfigurationComponents_Component) Reset() { + *x = FindStackConfigurationComponents_Component{} + if protoimpl.UnsafeEnabled { + mi := &file_terraform1_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FindStackConfigurationComponents_Component) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FindStackConfigurationComponents_Component) ProtoMessage() {} + +func (x *FindStackConfigurationComponents_Component) ProtoReflect() protoreflect.Message { + mi := &file_terraform1_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FindStackConfigurationComponents_Component.ProtoReflect.Descriptor instead. +func (*FindStackConfigurationComponents_Component) Descriptor() ([]byte, []int) { + return file_terraform1_proto_rawDescGZIP(), []int{7, 4} +} + +func (x *FindStackConfigurationComponents_Component) GetSourceAddr() string { + if x != nil { + return x.SourceAddr + } + return "" +} + +func (x *FindStackConfigurationComponents_Component) GetInstances() FindStackConfigurationComponents_Instances { + if x != nil { + return x.Instances + } + return FindStackConfigurationComponents_SINGLE +} + type FindStackConfigurationProviders_Request struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1252,7 +1487,7 @@ type FindStackConfigurationProviders_Request struct { func (x *FindStackConfigurationProviders_Request) Reset() { *x = FindStackConfigurationProviders_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[25] + mi := &file_terraform1_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1265,7 +1500,7 @@ func (x *FindStackConfigurationProviders_Request) String() string { func (*FindStackConfigurationProviders_Request) ProtoMessage() {} func (x *FindStackConfigurationProviders_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[25] + mi := &file_terraform1_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1297,7 +1532,7 @@ type FindStackConfigurationProviders_Response struct { func (x *FindStackConfigurationProviders_Response) Reset() { *x = FindStackConfigurationProviders_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[26] + mi := &file_terraform1_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1310,7 +1545,7 @@ func (x *FindStackConfigurationProviders_Response) String() string { func (*FindStackConfigurationProviders_Response) ProtoMessage() {} func (x *FindStackConfigurationProviders_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[26] + mi := &file_terraform1_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1381,107 +1616,168 @@ var file_terraform1_proto_rawDesc = []byte{ 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x69, 0x0a, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x39, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x1a, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x68, - 0x0a, 0x1f, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x73, 0x1a, 0x39, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, - 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x0a, 0x0a, 0x08, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x0a, 0x0d, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x92, 0x02, - 0x0a, 0x0a, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x12, 0x3b, 0x0a, 0x08, - 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, - 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x52, - 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x31, 0x0a, 0x07, 0x73, - 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x31, - 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x22, 0x2f, 0x0a, 0x08, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x0b, 0x0a, - 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, - 0x10, 0x02, 0x22, 0x84, 0x01, 0x0a, 0x0b, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, - 0x64, 0x64, 0x72, 0x12, 0x2b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x12, 0x27, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x50, 0x6f, 0x73, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x4b, 0x0a, 0x09, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x50, 0x6f, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x79, 0x74, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x62, 0x79, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, - 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x32, 0x53, 0x0a, 0x05, 0x53, 0x65, 0x74, 0x75, 0x70, 0x12, - 0x4a, 0x0a, 0x09, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x12, 0x1d, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, - 0x61, 0x6b, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, - 0x6b, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xd3, 0x01, 0x0a, 0x0c, - 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x5f, 0x0a, 0x10, + 0x6e, 0x73, 0x65, 0x22, 0xb4, 0x08, 0x0a, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x39, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, + 0x64, 0x6c, 0x65, 0x1a, 0x5c, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x50, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x38, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, + 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x1a, 0xe4, 0x03, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x68, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x75, 0x0a, 0x0f, 0x65, + 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x45, + 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x73, 0x1a, 0x75, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x7d, 0x0a, 0x13, 0x45, 0x6d, 0x62, + 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x50, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, + 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xd8, 0x01, 0x0a, 0x0d, 0x45, 0x6d, 0x62, + 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x54, 0x0a, 0x09, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x73, 0x12, 0x50, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x38, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, + 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x1a, 0x82, 0x01, 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, + 0x64, 0x72, 0x12, 0x54, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x09, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, + 0x00, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, + 0x46, 0x4f, 0x52, 0x5f, 0x45, 0x41, 0x43, 0x48, 0x10, 0x02, 0x22, 0x68, 0x0a, 0x1f, 0x46, 0x69, + 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x39, 0x0a, + 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x63, + 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x0a, 0x0d, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x92, 0x02, 0x0a, 0x0a, 0x44, 0x69, + 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x12, 0x3b, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, + 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, + 0x69, 0x63, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x52, 0x08, 0x73, 0x65, 0x76, + 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, + 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x31, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x2f, 0x0a, + 0x08, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, + 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, + 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x22, 0x84, + 0x01, 0x0a, 0x0b, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1f, + 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, + 0x2b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x50, 0x6f, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x27, 0x0a, 0x03, + 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x73, + 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x4b, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, + 0x6f, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x79, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x04, 0x62, 0x79, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x32, 0x53, 0x0a, 0x05, 0x53, 0x65, 0x74, 0x75, 0x70, 0x12, 0x4a, 0x0a, 0x09, 0x48, + 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x12, 0x1d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x2e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xd3, 0x01, 0x0a, 0x0c, 0x44, 0x65, 0x70, 0x65, + 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x4f, 0x70, 0x65, 0x6e, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x24, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, - 0x12, 0x24, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, - 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, - 0x11, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, - 0x6c, 0x65, 0x12, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, - 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x32, 0x92, 0x04, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x71, 0x0a, 0x16, - 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, + 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x43, 0x6c, 0x6f, + 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x25, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, + 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x92, 0x04, + 0x0a, 0x06, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x71, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x74, 0x0a, 0x17, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8c, 0x01, 0x0a, 0x1f, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x33, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, + 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x17, 0x43, + 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, + 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x8c, 0x01, 0x0a, 0x1f, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x33, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x8f, 0x01, 0x0a, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x34, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x34, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x35, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, - 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1496,67 +1792,81 @@ func file_terraform1_proto_rawDescGZIP() []byte { return file_terraform1_proto_rawDescData } -var file_terraform1_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_terraform1_proto_msgTypes = make([]protoimpl.MessageInfo, 27) +var file_terraform1_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_terraform1_proto_msgTypes = make([]protoimpl.MessageInfo, 32) var file_terraform1_proto_goTypes = []interface{}{ - (Diagnostic_Severity)(0), // 0: terraform1.Diagnostic.Severity - (*Handshake)(nil), // 1: terraform1.Handshake - (*OpenSourceBundle)(nil), // 2: terraform1.OpenSourceBundle - (*CloseSourceBundle)(nil), // 3: terraform1.CloseSourceBundle - (*ClientCapabilities)(nil), // 4: terraform1.ClientCapabilities - (*ServerCapabilities)(nil), // 5: terraform1.ServerCapabilities - (*OpenStackConfiguration)(nil), // 6: terraform1.OpenStackConfiguration - (*CloseStackConfiguration)(nil), // 7: terraform1.CloseStackConfiguration - (*FindStackConfigurationComponents)(nil), // 8: terraform1.FindStackConfigurationComponents - (*FindStackConfigurationProviders)(nil), // 9: terraform1.FindStackConfigurationProviders - (*SourceAddress)(nil), // 10: terraform1.SourceAddress - (*Diagnostic)(nil), // 11: terraform1.Diagnostic - (*SourceRange)(nil), // 12: terraform1.SourceRange - (*SourcePos)(nil), // 13: terraform1.SourcePos - (*Handshake_Request)(nil), // 14: terraform1.Handshake.Request - (*Handshake_Response)(nil), // 15: terraform1.Handshake.Response - (*OpenSourceBundle_Request)(nil), // 16: terraform1.OpenSourceBundle.Request - (*OpenSourceBundle_Response)(nil), // 17: terraform1.OpenSourceBundle.Response - (*CloseSourceBundle_Request)(nil), // 18: terraform1.CloseSourceBundle.Request - (*CloseSourceBundle_Response)(nil), // 19: terraform1.CloseSourceBundle.Response - (*OpenStackConfiguration_Request)(nil), // 20: terraform1.OpenStackConfiguration.Request - (*OpenStackConfiguration_Response)(nil), // 21: terraform1.OpenStackConfiguration.Response - (*CloseStackConfiguration_Request)(nil), // 22: terraform1.CloseStackConfiguration.Request - (*CloseStackConfiguration_Response)(nil), // 23: terraform1.CloseStackConfiguration.Response - (*FindStackConfigurationComponents_Request)(nil), // 24: terraform1.FindStackConfigurationComponents.Request - (*FindStackConfigurationComponents_Response)(nil), // 25: terraform1.FindStackConfigurationComponents.Response - (*FindStackConfigurationProviders_Request)(nil), // 26: terraform1.FindStackConfigurationProviders.Request - (*FindStackConfigurationProviders_Response)(nil), // 27: terraform1.FindStackConfigurationProviders.Response + (FindStackConfigurationComponents_Instances)(0), // 0: terraform1.FindStackConfigurationComponents.Instances + (Diagnostic_Severity)(0), // 1: terraform1.Diagnostic.Severity + (*Handshake)(nil), // 2: terraform1.Handshake + (*OpenSourceBundle)(nil), // 3: terraform1.OpenSourceBundle + (*CloseSourceBundle)(nil), // 4: terraform1.CloseSourceBundle + (*ClientCapabilities)(nil), // 5: terraform1.ClientCapabilities + (*ServerCapabilities)(nil), // 6: terraform1.ServerCapabilities + (*OpenStackConfiguration)(nil), // 7: terraform1.OpenStackConfiguration + (*CloseStackConfiguration)(nil), // 8: terraform1.CloseStackConfiguration + (*FindStackConfigurationComponents)(nil), // 9: terraform1.FindStackConfigurationComponents + (*FindStackConfigurationProviders)(nil), // 10: terraform1.FindStackConfigurationProviders + (*SourceAddress)(nil), // 11: terraform1.SourceAddress + (*Diagnostic)(nil), // 12: terraform1.Diagnostic + (*SourceRange)(nil), // 13: terraform1.SourceRange + (*SourcePos)(nil), // 14: terraform1.SourcePos + (*Handshake_Request)(nil), // 15: terraform1.Handshake.Request + (*Handshake_Response)(nil), // 16: terraform1.Handshake.Response + (*OpenSourceBundle_Request)(nil), // 17: terraform1.OpenSourceBundle.Request + (*OpenSourceBundle_Response)(nil), // 18: terraform1.OpenSourceBundle.Response + (*CloseSourceBundle_Request)(nil), // 19: terraform1.CloseSourceBundle.Request + (*CloseSourceBundle_Response)(nil), // 20: terraform1.CloseSourceBundle.Response + (*OpenStackConfiguration_Request)(nil), // 21: terraform1.OpenStackConfiguration.Request + (*OpenStackConfiguration_Response)(nil), // 22: terraform1.OpenStackConfiguration.Response + (*CloseStackConfiguration_Request)(nil), // 23: terraform1.CloseStackConfiguration.Request + (*CloseStackConfiguration_Response)(nil), // 24: terraform1.CloseStackConfiguration.Response + (*FindStackConfigurationComponents_Request)(nil), // 25: terraform1.FindStackConfigurationComponents.Request + (*FindStackConfigurationComponents_Response)(nil), // 26: terraform1.FindStackConfigurationComponents.Response + (*FindStackConfigurationComponents_StackConfig)(nil), // 27: terraform1.FindStackConfigurationComponents.StackConfig + (*FindStackConfigurationComponents_EmbeddedStack)(nil), // 28: terraform1.FindStackConfigurationComponents.EmbeddedStack + (*FindStackConfigurationComponents_Component)(nil), // 29: terraform1.FindStackConfigurationComponents.Component + nil, // 30: terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry + nil, // 31: terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry + (*FindStackConfigurationProviders_Request)(nil), // 32: terraform1.FindStackConfigurationProviders.Request + (*FindStackConfigurationProviders_Response)(nil), // 33: terraform1.FindStackConfigurationProviders.Response } var file_terraform1_proto_depIdxs = []int32{ - 0, // 0: terraform1.Diagnostic.severity:type_name -> terraform1.Diagnostic.Severity - 12, // 1: terraform1.Diagnostic.subject:type_name -> terraform1.SourceRange - 12, // 2: terraform1.Diagnostic.context:type_name -> terraform1.SourceRange - 13, // 3: terraform1.SourceRange.start:type_name -> terraform1.SourcePos - 13, // 4: terraform1.SourceRange.end:type_name -> terraform1.SourcePos - 4, // 5: terraform1.Handshake.Request.capabilities:type_name -> terraform1.ClientCapabilities - 5, // 6: terraform1.Handshake.Response.capabilities:type_name -> terraform1.ServerCapabilities - 10, // 7: terraform1.OpenStackConfiguration.Request.source_address:type_name -> terraform1.SourceAddress - 11, // 8: terraform1.OpenStackConfiguration.Response.diagnostics:type_name -> terraform1.Diagnostic - 14, // 9: terraform1.Setup.Handshake:input_type -> terraform1.Handshake.Request - 16, // 10: terraform1.Dependencies.OpenSourceBundle:input_type -> terraform1.OpenSourceBundle.Request - 18, // 11: terraform1.Dependencies.CloseSourceBundle:input_type -> terraform1.CloseSourceBundle.Request - 20, // 12: terraform1.Stacks.OpenStackConfiguration:input_type -> terraform1.OpenStackConfiguration.Request - 22, // 13: terraform1.Stacks.CloseStackConfiguration:input_type -> terraform1.CloseStackConfiguration.Request - 26, // 14: terraform1.Stacks.FindStackConfigurationProviders:input_type -> terraform1.FindStackConfigurationProviders.Request - 24, // 15: terraform1.Stacks.FindStackConfigurationComponents:input_type -> terraform1.FindStackConfigurationComponents.Request - 15, // 16: terraform1.Setup.Handshake:output_type -> terraform1.Handshake.Response - 17, // 17: terraform1.Dependencies.OpenSourceBundle:output_type -> terraform1.OpenSourceBundle.Response - 19, // 18: terraform1.Dependencies.CloseSourceBundle:output_type -> terraform1.CloseSourceBundle.Response - 21, // 19: terraform1.Stacks.OpenStackConfiguration:output_type -> terraform1.OpenStackConfiguration.Response - 23, // 20: terraform1.Stacks.CloseStackConfiguration:output_type -> terraform1.CloseStackConfiguration.Response - 27, // 21: terraform1.Stacks.FindStackConfigurationProviders:output_type -> terraform1.FindStackConfigurationProviders.Response - 25, // 22: terraform1.Stacks.FindStackConfigurationComponents:output_type -> terraform1.FindStackConfigurationComponents.Response - 16, // [16:23] is the sub-list for method output_type - 9, // [9:16] is the sub-list for method input_type - 9, // [9:9] is the sub-list for extension type_name - 9, // [9:9] is the sub-list for extension extendee - 0, // [0:9] is the sub-list for field type_name + 1, // 0: terraform1.Diagnostic.severity:type_name -> terraform1.Diagnostic.Severity + 13, // 1: terraform1.Diagnostic.subject:type_name -> terraform1.SourceRange + 13, // 2: terraform1.Diagnostic.context:type_name -> terraform1.SourceRange + 14, // 3: terraform1.SourceRange.start:type_name -> terraform1.SourcePos + 14, // 4: terraform1.SourceRange.end:type_name -> terraform1.SourcePos + 5, // 5: terraform1.Handshake.Request.capabilities:type_name -> terraform1.ClientCapabilities + 6, // 6: terraform1.Handshake.Response.capabilities:type_name -> terraform1.ServerCapabilities + 11, // 7: terraform1.OpenStackConfiguration.Request.source_address:type_name -> terraform1.SourceAddress + 12, // 8: terraform1.OpenStackConfiguration.Response.diagnostics:type_name -> terraform1.Diagnostic + 27, // 9: terraform1.FindStackConfigurationComponents.Response.config:type_name -> terraform1.FindStackConfigurationComponents.StackConfig + 30, // 10: terraform1.FindStackConfigurationComponents.StackConfig.components:type_name -> terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry + 31, // 11: terraform1.FindStackConfigurationComponents.StackConfig.embedded_stacks:type_name -> terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry + 0, // 12: terraform1.FindStackConfigurationComponents.EmbeddedStack.instances:type_name -> terraform1.FindStackConfigurationComponents.Instances + 27, // 13: terraform1.FindStackConfigurationComponents.EmbeddedStack.config:type_name -> terraform1.FindStackConfigurationComponents.StackConfig + 0, // 14: terraform1.FindStackConfigurationComponents.Component.instances:type_name -> terraform1.FindStackConfigurationComponents.Instances + 29, // 15: terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry.value:type_name -> terraform1.FindStackConfigurationComponents.Component + 28, // 16: terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry.value:type_name -> terraform1.FindStackConfigurationComponents.EmbeddedStack + 15, // 17: terraform1.Setup.Handshake:input_type -> terraform1.Handshake.Request + 17, // 18: terraform1.Dependencies.OpenSourceBundle:input_type -> terraform1.OpenSourceBundle.Request + 19, // 19: terraform1.Dependencies.CloseSourceBundle:input_type -> terraform1.CloseSourceBundle.Request + 21, // 20: terraform1.Stacks.OpenStackConfiguration:input_type -> terraform1.OpenStackConfiguration.Request + 23, // 21: terraform1.Stacks.CloseStackConfiguration:input_type -> terraform1.CloseStackConfiguration.Request + 32, // 22: terraform1.Stacks.FindStackConfigurationProviders:input_type -> terraform1.FindStackConfigurationProviders.Request + 25, // 23: terraform1.Stacks.FindStackConfigurationComponents:input_type -> terraform1.FindStackConfigurationComponents.Request + 16, // 24: terraform1.Setup.Handshake:output_type -> terraform1.Handshake.Response + 18, // 25: terraform1.Dependencies.OpenSourceBundle:output_type -> terraform1.OpenSourceBundle.Response + 20, // 26: terraform1.Dependencies.CloseSourceBundle:output_type -> terraform1.CloseSourceBundle.Response + 22, // 27: terraform1.Stacks.OpenStackConfiguration:output_type -> terraform1.OpenStackConfiguration.Response + 24, // 28: terraform1.Stacks.CloseStackConfiguration:output_type -> terraform1.CloseStackConfiguration.Response + 33, // 29: terraform1.Stacks.FindStackConfigurationProviders:output_type -> terraform1.FindStackConfigurationProviders.Response + 26, // 30: terraform1.Stacks.FindStackConfigurationComponents:output_type -> terraform1.FindStackConfigurationComponents.Response + 24, // [24:31] is the sub-list for method output_type + 17, // [17:24] is the sub-list for method input_type + 17, // [17:17] is the sub-list for extension type_name + 17, // [17:17] is the sub-list for extension extendee + 0, // [0:17] is the sub-list for field type_name } func init() { file_terraform1_proto_init() } @@ -1866,7 +2176,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindStackConfigurationProviders_Request); i { + switch v := v.(*FindStackConfigurationComponents_StackConfig); i { case 0: return &v.state case 1: @@ -1878,6 +2188,42 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FindStackConfigurationComponents_EmbeddedStack); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_terraform1_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FindStackConfigurationComponents_Component); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_terraform1_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FindStackConfigurationProviders_Request); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_terraform1_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FindStackConfigurationProviders_Response); i { case 0: return &v.state @@ -1895,8 +2241,8 @@ func file_terraform1_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_terraform1_proto_rawDesc, - NumEnums: 1, - NumMessages: 27, + NumEnums: 2, + NumMessages: 32, NumExtensions: 0, NumServices: 3, }, diff --git a/internal/rpcapi/terraform1/terraform1.proto b/internal/rpcapi/terraform1/terraform1.proto index cd6ca5b73a..d7632d947a 100644 --- a/internal/rpcapi/terraform1/terraform1.proto +++ b/internal/rpcapi/terraform1/terraform1.proto @@ -110,7 +110,26 @@ message FindStackConfigurationComponents { int64 stack_config_handle = 1; } message Response { - // TODO + StackConfig config = 1; + } + + enum Instances { + SINGLE = 0; + COUNT = 1; + FOR_EACH = 2; + } + message StackConfig { + map components = 1; + map embedded_stacks = 2; + } + message EmbeddedStack { + string source_addr = 1; + Instances instances = 2; + StackConfig config = 3; + } + message Component { + string source_addr = 1; + Instances instances = 2; } } @@ -126,6 +145,10 @@ message FindStackConfigurationProviders { // A source address in the same form as it would appear in a Terraform // configuration: a source string combined with an optional version constraint // string, where the latter is valid only for registry module addresses. +// +// This is not used for "final" source addresses that have already been reduced +// to an exact version selection. For those we just directly encode the string +// representation of the final address, including a version number if necessary. message SourceAddress { string source = 1; string versions = 2; diff --git a/internal/rpcapi/testdata/sourcebundle/foo/foo.tfstack.hcl b/internal/rpcapi/testdata/sourcebundle/foo/foo.tfstack.hcl index e69de29bb2..4be2ddcd2b 100644 --- a/internal/rpcapi/testdata/sourcebundle/foo/foo.tfstack.hcl +++ b/internal/rpcapi/testdata/sourcebundle/foo/foo.tfstack.hcl @@ -0,0 +1,3 @@ +# This is intentionally empty. Some of our tests use this to straightfowardly +# test the empty configuration case, so adding declarations here will break +# those tests. diff --git a/internal/rpcapi/testdata/sourcebundle/foo/non-empty-stack/child/non-empty-stack-child.tfstack.hcl b/internal/rpcapi/testdata/sourcebundle/foo/non-empty-stack/child/non-empty-stack-child.tfstack.hcl new file mode 100644 index 0000000000..43a242b42f --- /dev/null +++ b/internal/rpcapi/testdata/sourcebundle/foo/non-empty-stack/child/non-empty-stack-child.tfstack.hcl @@ -0,0 +1,3 @@ +component "foo" { + source = "../empty-module" +} diff --git a/internal/rpcapi/testdata/sourcebundle/foo/non-empty-stack/empty-module/nothing.tf b/internal/rpcapi/testdata/sourcebundle/foo/non-empty-stack/empty-module/nothing.tf new file mode 100644 index 0000000000..7e92eb7021 --- /dev/null +++ b/internal/rpcapi/testdata/sourcebundle/foo/non-empty-stack/empty-module/nothing.tf @@ -0,0 +1,3 @@ +# This module is intentionally empty, since it's called from stack +# configurations where we're only testing the stack configuration stuff and +# not the main Terraform language stuff. diff --git a/internal/rpcapi/testdata/sourcebundle/foo/non-empty-stack/non-empty-stack.tfstack.hcl b/internal/rpcapi/testdata/sourcebundle/foo/non-empty-stack/non-empty-stack.tfstack.hcl new file mode 100644 index 0000000000..5e9d4173cd --- /dev/null +++ b/internal/rpcapi/testdata/sourcebundle/foo/non-empty-stack/non-empty-stack.tfstack.hcl @@ -0,0 +1,18 @@ + +component "single" { + source = "./empty-module" +} + +component "for_each" { + source = "./empty-module" + for_each = {} +} + +stack "single" { + source = "./child" +} + +stack "for_each" { + source = "./child" + for_each = {} +}