From cef047221c4f103f2997837e2209a317c389319f Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Wed, 8 Apr 2026 10:51:52 +0200 Subject: [PATCH] feat(machine-logs): add server side of journal logs (#282) * Add server side of journal logs This add the server side and grpc methods to get a journal logs from a machine. It repurposes ServiceLogEntry for these logs to keep the changes somewhat to a minimum. And it lets us re-use the merging of the various logs. In the protobufs ContainerLog has been renamed to just Log and LogEntry, as these are now also used for journal logs. It does api.LogOptions in more places to reduce the various logOpts that were used. It does not yet plumb it through to the uc client, that needs a follow up pr. Following logs is also not yet implemented. Signed-off-by: Miek Gieben * Fix test too Signed-off-by: Miek Gieben * remove entire comment Signed-off-by: Miek Gieben * Implement the follow option, untested mind you Signed-off-by: Miek Gieben * update debug line Signed-off-by: Miek Gieben * internal/jounal: First batch of PR comments Signed-off-by: Miek Gieben * internal/journal: code review comments Signed-off-by: Miek Gieben * Manually apply suggestion Signed-off-by: Miek Gieben * apply comment manually Signed-off-by: Miek Gieben * internal/journal: add unit test Signed-off-by: Miek Gieben * Use testify Signed-off-by: Miek Gieben * -amFix scanner.Err checking Signed-off-by: Miek Gieben * Implement code review comments Signed-off-by: Miek Gieben --------- Signed-off-by: Miek Gieben --- internal/journal/journal.go | 69 ++ internal/journal/logs.go | 83 ++ internal/journal/logs_test.go | 51 + internal/journal/testdata/logs | 6 + internal/machine/api/pb/common.pb.go | 344 +++++- internal/machine/api/pb/common.proto | 23 + internal/machine/api/pb/docker.pb.go | 1160 ++++++++------------ internal/machine/api/pb/docker.proto | 25 +- internal/machine/api/pb/docker_grpc.pb.go | 18 +- internal/machine/api/pb/machine.pb.go | 41 +- internal/machine/api/pb/machine.proto | 2 + internal/machine/api/pb/machine_grpc.pb.go | 44 +- internal/machine/docker/server.go | 23 +- internal/machine/docker/service.go | 21 +- internal/machine/machine.go | 94 ++ pkg/api/logs.go | 28 +- pkg/client/logmerger.go | 2 +- pkg/client/logmerger_test.go | 6 +- pkg/client/logs.go | 26 +- 19 files changed, 1204 insertions(+), 862 deletions(-) create mode 100644 internal/journal/journal.go create mode 100644 internal/journal/logs.go create mode 100644 internal/journal/logs_test.go create mode 100644 internal/journal/testdata/logs diff --git a/internal/journal/journal.go b/internal/journal/journal.go new file mode 100644 index 00000000..f1e32764 --- /dev/null +++ b/internal/journal/journal.go @@ -0,0 +1,69 @@ +package journal + +import ( + "bufio" + "context" + "fmt" + "io" + "os/exec" + + "github.com/psviderski/uncloud/pkg/api" +) + +const journalctl = "journalctl" + +var commandContext = exec.CommandContext // overidable for the test + +func logs(ctx context.Context, unit string, opts api.ServiceLogsOptions) (io.ReadCloser, error) { + args := []string{"-u", unit, "--no-hostname"} + args = append(args, "-n") + if opts.Tail > -1 { + args = append(args, fmt.Sprintf("%d", opts.Tail)) + } else { + args = append(args, "all") + } + if opts.Follow { + args = append(args, "-f") + } + + args = append(args, "-o") + args = append(args, "short-iso-precise") + + if opts.Since != "" { + args = append(args, "-S") + args = append(args, opts.Since) + } + if opts.Until != "" { + args = append(args, "-U") + args = append(args, opts.Until) + } + + cmd := commandContext(ctx, journalctl, args...) + p, err := cmd.StdoutPipe() + if err != nil { + return nil, err + } + + if err := cmd.Start(); err != nil { + return nil, err + } + + return p, nil +} + +// follow synchronously follows the io.Reader, writing each new journal entry to channel. +func follow(ctx context.Context, reader io.Reader, outCh chan api.LogEntry) error { + scanner := bufio.NewScanner(reader) + + for scanner.Scan() { + select { + case outCh <- entry(scanner.Bytes()): + case <-ctx.Done(): + return nil + } + } + if err := scanner.Err(); err != nil { + outCh <- api.LogEntry{Err: fmt.Errorf("journal logs: %w", err)} + } + return nil +} diff --git a/internal/journal/logs.go b/internal/journal/logs.go new file mode 100644 index 00000000..6fb45e38 --- /dev/null +++ b/internal/journal/logs.go @@ -0,0 +1,83 @@ +package journal + +import ( + "bufio" + "bytes" + "context" + "fmt" + "slices" + "time" + + "github.com/psviderski/uncloud/pkg/api" +) + +// Logs streams logs from a service and returns entries via a channel. +func Logs(ctx context.Context, unit string, opts api.ServiceLogsOptions) (<-chan api.LogEntry, error) { + // Hard code unit check for now + switch unit { + case "uncloud": + case "corrosion": + case "docker": + default: + return nil, fmt.Errorf("journal logs: invalid unit: %s", unit) + } + + reader, err := logs(ctx, unit, opts) + if err != nil { + return nil, err + } + + outCh := make(chan api.LogEntry) + + switch opts.Follow { + case false: + + go func() { + defer close(outCh) + + scanner := bufio.NewScanner(reader) + for scanner.Scan() { + outCh <- entry(scanner.Bytes()) + } + + if err := scanner.Err(); err != nil { + outCh <- api.LogEntry{Err: fmt.Errorf("journal logs: %w", err)} + } + }() + + case true: + go func() { + defer close(outCh) + + err := follow(ctx, reader, outCh) + if err != nil { + outCh <- api.LogEntry{Err: fmt.Errorf("journal logs: %w", err)} + } + }() + } + + return outCh, nil +} + +func entry(data []byte) api.LogEntry { + // 2025-10-12T11:03:27+02:00 systemd[1]: + timestamp := time.Time{} + message := data + if len(data) > 30 && data[4] == '-' && data[7] == '-' && data[10] == 'T' { + timestampPart, messagePart, found := bytes.Cut(data, []byte(" ")) + var err error + if found { + timestamp, err = time.Parse(time.RFC3339Nano, string(timestampPart)) + if err != nil { + timestamp = time.Time{} + } + message = messagePart + } + } + + return api.LogEntry{ + Timestamp: timestamp, + Message: slices.Clone(message), // scanner controls the buffer + Stream: api.LogStreamStdout, + } +} diff --git a/internal/journal/logs_test.go b/internal/journal/logs_test.go new file mode 100644 index 00000000..7364cb88 --- /dev/null +++ b/internal/journal/logs_test.go @@ -0,0 +1,51 @@ +package journal + +import ( + "context" + "os/exec" + "testing" + "time" + + "github.com/psviderski/uncloud/pkg/api" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestLogs(t *testing.T) { + t.Parallel() + + commandContext = func(ctx context.Context, _ string, _ ...string) *exec.Cmd { + return exec.CommandContext(ctx, "/usr/bin/tail", "testdata/logs") + } + + ctx := context.Background() + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + ch, err := Logs(ctx, "uncloud", api.ServiceLogsOptions{}) + require.NoError(t, err) + + i := 0 + for range ch { + i++ + } + assert.Equal(t, i, 6) + cancel() + + commandContext = func(ctx context.Context, _ string, _ ...string) *exec.Cmd { + return exec.CommandContext(ctx, "/usr/bin/tail", "-f", "testdata/logs") + } + + ctx = context.Background() + ctx, cancel = context.WithCancel(ctx) + go func() { time.Sleep(1 * time.Second); cancel() }() + + ch, err = Logs(ctx, "uncloud", api.ServiceLogsOptions{Tail: 3}) + require.NoError(t, err) + + i = 0 + for range ch { + i++ + } + assert.Equal(t, i, 6) // still six is hardbeats are not written here. +} diff --git a/internal/journal/testdata/logs b/internal/journal/testdata/logs new file mode 100644 index 00000000..60eccc04 --- /dev/null +++ b/internal/journal/testdata/logs @@ -0,0 +1,6 @@ +2026-01-23T17:19:33.686964+01:00 fedora kernel: apple-dcp 271c00000.dcp: DCP index:1 dptx target phy: 5 dptx die: 0 +2026-01-23T17:19:33.687155+01:00 fedora kernel: platform 271c00000.dcp:piodma: Adding to iommu group 9 +2026-01-23T17:19:33.687343+01:00 fedora kernel: apple-dcp 271c00000.dcp: RTKit: Initializing (protocol version 12) +2026-01-23T17:19:33.687500+01:00 fedora kernel: apple-dcp 271c00000.dcp: shmem_setup: iova: 880255000 -> pa: be4f29000 -> iomem: ffff800082> +2026-01-23T17:19:33.687657+01:00 fedora kernel: apple-dcp 271c00000.dcp: shmem_setup: iova: ffffec000, buffer: ffff8000817cc000 +2026-01-23T17:19:33.687826+01:00 fedora kernel: apple-dcp 271c00000.dcp: shmem_setup: iova: ffffe8000, buffer: ffff8000817d4000 diff --git a/internal/machine/api/pb/common.pb.go b/internal/machine/api/pb/common.pb.go index 1843bf63..c657b503 100644 --- a/internal/machine/api/pb/common.pb.go +++ b/internal/machine/api/pb/common.pb.go @@ -10,6 +10,7 @@ import ( status "google.golang.org/genproto/googleapis/rpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" ) @@ -21,6 +22,58 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type LogEntry_StreamType int32 + +const ( + LogEntry_UNKNOWN LogEntry_StreamType = 0 + LogEntry_STDOUT LogEntry_StreamType = 1 + LogEntry_STDERR LogEntry_StreamType = 2 + LogEntry_HEARTBEAT LogEntry_StreamType = 3 +) + +// Enum value maps for LogEntry_StreamType. +var ( + LogEntry_StreamType_name = map[int32]string{ + 0: "UNKNOWN", + 1: "STDOUT", + 2: "STDERR", + 3: "HEARTBEAT", + } + LogEntry_StreamType_value = map[string]int32{ + "UNKNOWN": 0, + "STDOUT": 1, + "STDERR": 2, + "HEARTBEAT": 3, + } +) + +func (x LogEntry_StreamType) Enum() *LogEntry_StreamType { + p := new(LogEntry_StreamType) + *p = x + return p +} + +func (x LogEntry_StreamType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (LogEntry_StreamType) Descriptor() protoreflect.EnumDescriptor { + return file_internal_machine_api_pb_common_proto_enumTypes[0].Descriptor() +} + +func (LogEntry_StreamType) Type() protoreflect.EnumType { + return &file_internal_machine_api_pb_common_proto_enumTypes[0] +} + +func (x LogEntry_StreamType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use LogEntry_StreamType.Descriptor instead. +func (LogEntry_StreamType) EnumDescriptor() ([]byte, []int) { + return file_internal_machine_api_pb_common_proto_rawDescGZIP(), []int{7, 0} +} + // Common metadata message nested in all reply message types, injected by the gRPC proxy to provide information // about the machine that responded to the request. type Metadata struct { @@ -343,6 +396,150 @@ func (x *IPPrefix) GetBits() uint32 { return 0 } +type LogsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // Options for logs retrieval. + Follow bool `protobuf:"varint,2,opt,name=follow,proto3" json:"follow,omitempty"` + Tail int32 `protobuf:"varint,3,opt,name=tail,proto3" json:"tail,omitempty"` // -1 means all + Since string `protobuf:"bytes,4,opt,name=since,proto3" json:"since,omitempty"` // https://www.rfc-editor.org/rfc/rfc3339.html timestamp or Go duration string + Until string `protobuf:"bytes,5,opt,name=until,proto3" json:"until,omitempty"` // https://www.rfc-editor.org/rfc/rfc3339.html timestamp or Go duration string +} + +func (x *LogsRequest) Reset() { + *x = LogsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_internal_machine_api_pb_common_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LogsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LogsRequest) ProtoMessage() {} + +func (x *LogsRequest) ProtoReflect() protoreflect.Message { + mi := &file_internal_machine_api_pb_common_proto_msgTypes[6] + 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 LogsRequest.ProtoReflect.Descriptor instead. +func (*LogsRequest) Descriptor() ([]byte, []int) { + return file_internal_machine_api_pb_common_proto_rawDescGZIP(), []int{6} +} + +func (x *LogsRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *LogsRequest) GetFollow() bool { + if x != nil { + return x.Follow + } + return false +} + +func (x *LogsRequest) GetTail() int32 { + if x != nil { + return x.Tail + } + return 0 +} + +func (x *LogsRequest) GetSince() string { + if x != nil { + return x.Since + } + return "" +} + +func (x *LogsRequest) GetUntil() string { + if x != nil { + return x.Until + } + return "" +} + +type LogEntry struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Stream LogEntry_StreamType `protobuf:"varint,1,opt,name=stream,proto3,enum=api.LogEntry_StreamType" json:"stream,omitempty"` + Timestamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + // Log line content. Empty for heartbeat entries. + Message []byte `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` +} + +func (x *LogEntry) Reset() { + *x = LogEntry{} + if protoimpl.UnsafeEnabled { + mi := &file_internal_machine_api_pb_common_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LogEntry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LogEntry) ProtoMessage() {} + +func (x *LogEntry) ProtoReflect() protoreflect.Message { + mi := &file_internal_machine_api_pb_common_proto_msgTypes[7] + 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 LogEntry.ProtoReflect.Descriptor instead. +func (*LogEntry) Descriptor() ([]byte, []int) { + return file_internal_machine_api_pb_common_proto_rawDescGZIP(), []int{7} +} + +func (x *LogEntry) GetStream() LogEntry_StreamType { + if x != nil { + return x.Stream + } + return LogEntry_UNKNOWN +} + +func (x *LogEntry) GetTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.Timestamp + } + return nil +} + +func (x *LogEntry) GetMessage() []byte { + if x != nil { + return x.Message + } + return nil +} + var File_internal_machine_api_pb_common_proto protoreflect.FileDescriptor var file_internal_machine_api_pb_common_proto_rawDesc = []byte{ @@ -350,32 +547,55 @@ var file_internal_machine_api_pb_common_proto_rawDesc = []byte{ 0x6e, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, 0x70, 0x69, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x66, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x32, 0x0a, 0x05, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x29, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x22, 0x37, 0x0a, 0x0d, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x26, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, - 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x14, 0x0a, 0x02, 0x49, 0x50, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x70, 0x22, - 0x35, 0x0a, 0x06, 0x49, 0x50, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x70, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x07, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x50, 0x52, 0x02, - 0x69, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x37, 0x0a, 0x08, 0x49, 0x50, 0x50, 0x72, 0x65, 0x66, - 0x69, 0x78, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x07, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x50, 0x52, 0x02, 0x69, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x62, - 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x62, 0x69, 0x74, 0x73, 0x42, - 0x37, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x73, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x6b, 0x69, 0x2f, 0x75, 0x6e, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x66, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x32, 0x0a, + 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x29, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x22, 0x37, 0x0a, 0x0d, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x26, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x14, 0x0a, 0x02, 0x49, 0x50, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x70, + 0x22, 0x35, 0x0a, 0x06, 0x49, 0x50, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x70, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x07, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x50, 0x52, + 0x02, 0x69, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x37, 0x0a, 0x08, 0x49, 0x50, 0x50, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x07, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x50, 0x52, 0x02, 0x69, 0x70, 0x12, 0x12, 0x0a, 0x04, + 0x62, 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x62, 0x69, 0x74, 0x73, + 0x22, 0x75, 0x0a, 0x0b, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x69, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x69, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x69, 0x6e, 0x63, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x22, 0xd2, 0x01, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x40, 0x0a, 0x0a, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, + 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x44, 0x4f, 0x55, 0x54, 0x10, + 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x44, 0x45, 0x52, 0x52, 0x10, 0x02, 0x12, 0x0d, 0x0a, + 0x09, 0x48, 0x45, 0x41, 0x52, 0x54, 0x42, 0x45, 0x41, 0x54, 0x10, 0x03, 0x42, 0x37, 0x5a, 0x35, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x73, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x73, 0x6b, 0x69, 0x2f, 0x75, 0x6e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -390,27 +610,34 @@ func file_internal_machine_api_pb_common_proto_rawDescGZIP() []byte { return file_internal_machine_api_pb_common_proto_rawDescData } -var file_internal_machine_api_pb_common_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_internal_machine_api_pb_common_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_internal_machine_api_pb_common_proto_msgTypes = make([]protoimpl.MessageInfo, 8) var file_internal_machine_api_pb_common_proto_goTypes = []any{ - (*Metadata)(nil), // 0: api.Metadata - (*Empty)(nil), // 1: api.Empty - (*EmptyResponse)(nil), // 2: api.EmptyResponse - (*IP)(nil), // 3: api.IP - (*IPPort)(nil), // 4: api.IPPort - (*IPPrefix)(nil), // 5: api.IPPrefix - (*status.Status)(nil), // 6: google.rpc.Status + (LogEntry_StreamType)(0), // 0: api.LogEntry.StreamType + (*Metadata)(nil), // 1: api.Metadata + (*Empty)(nil), // 2: api.Empty + (*EmptyResponse)(nil), // 3: api.EmptyResponse + (*IP)(nil), // 4: api.IP + (*IPPort)(nil), // 5: api.IPPort + (*IPPrefix)(nil), // 6: api.IPPrefix + (*LogsRequest)(nil), // 7: api.LogsRequest + (*LogEntry)(nil), // 8: api.LogEntry + (*status.Status)(nil), // 9: google.rpc.Status + (*timestamppb.Timestamp)(nil), // 10: google.protobuf.Timestamp } var file_internal_machine_api_pb_common_proto_depIdxs = []int32{ - 6, // 0: api.Metadata.status:type_name -> google.rpc.Status - 0, // 1: api.Empty.metadata:type_name -> api.Metadata - 1, // 2: api.EmptyResponse.messages:type_name -> api.Empty - 3, // 3: api.IPPort.ip:type_name -> api.IP - 3, // 4: api.IPPrefix.ip:type_name -> api.IP - 5, // [5:5] is the sub-list for method output_type - 5, // [5:5] is the sub-list for method input_type - 5, // [5:5] is the sub-list for extension type_name - 5, // [5:5] is the sub-list for extension extendee - 0, // [0:5] is the sub-list for field type_name + 9, // 0: api.Metadata.status:type_name -> google.rpc.Status + 1, // 1: api.Empty.metadata:type_name -> api.Metadata + 2, // 2: api.EmptyResponse.messages:type_name -> api.Empty + 4, // 3: api.IPPort.ip:type_name -> api.IP + 4, // 4: api.IPPrefix.ip:type_name -> api.IP + 0, // 5: api.LogEntry.stream:type_name -> api.LogEntry.StreamType + 10, // 6: api.LogEntry.timestamp:type_name -> google.protobuf.Timestamp + 7, // [7:7] is the sub-list for method output_type + 7, // [7:7] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name } func init() { file_internal_machine_api_pb_common_proto_init() } @@ -491,19 +718,44 @@ func file_internal_machine_api_pb_common_proto_init() { return nil } } + file_internal_machine_api_pb_common_proto_msgTypes[6].Exporter = func(v any, i int) any { + switch v := v.(*LogsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_internal_machine_api_pb_common_proto_msgTypes[7].Exporter = func(v any, i int) any { + switch v := v.(*LogEntry); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_internal_machine_api_pb_common_proto_rawDesc, - NumEnums: 0, - NumMessages: 6, + NumEnums: 1, + NumMessages: 8, NumExtensions: 0, NumServices: 0, }, GoTypes: file_internal_machine_api_pb_common_proto_goTypes, DependencyIndexes: file_internal_machine_api_pb_common_proto_depIdxs, + EnumInfos: file_internal_machine_api_pb_common_proto_enumTypes, MessageInfos: file_internal_machine_api_pb_common_proto_msgTypes, }.Build() File_internal_machine_api_pb_common_proto = out.File diff --git a/internal/machine/api/pb/common.proto b/internal/machine/api/pb/common.proto index 67a04cce..b1876158 100644 --- a/internal/machine/api/pb/common.proto +++ b/internal/machine/api/pb/common.proto @@ -6,6 +6,7 @@ option go_package = "github.com/psviderski/uncloud/internal/machine/api/pb"; // Vendored at internal/machine/api/vendor/google/rpc/status.proto. import "google/rpc/status.proto"; +import "google/protobuf/timestamp.proto"; // Common metadata message nested in all reply message types, injected by the gRPC proxy to provide information // about the machine that responded to the request. @@ -42,3 +43,25 @@ message IPPrefix { IP ip = 1; uint32 bits = 2; } + +message LogsRequest { + string id = 1; + // Options for logs retrieval. + bool follow = 2; + int32 tail = 3; // -1 means all + string since = 4; // https://www.rfc-editor.org/rfc/rfc3339.html timestamp or Go duration string + string until = 5; // https://www.rfc-editor.org/rfc/rfc3339.html timestamp or Go duration string +} + +message LogEntry { + enum StreamType { + UNKNOWN = 0; + STDOUT = 1; + STDERR = 2; + HEARTBEAT = 3; + } + StreamType stream = 1; + google.protobuf.Timestamp timestamp = 2; + // Log line content. Empty for heartbeat entries. + bytes message = 3; +} diff --git a/internal/machine/api/pb/docker.pb.go b/internal/machine/api/pb/docker.pb.go index 2905e680..da212270 100644 --- a/internal/machine/api/pb/docker.pb.go +++ b/internal/machine/api/pb/docker.pb.go @@ -10,7 +10,6 @@ import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" - timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" ) @@ -22,58 +21,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -type ContainerLogEntry_StreamType int32 - -const ( - ContainerLogEntry_UNKNOWN ContainerLogEntry_StreamType = 0 - ContainerLogEntry_STDOUT ContainerLogEntry_StreamType = 1 - ContainerLogEntry_STDERR ContainerLogEntry_StreamType = 2 - ContainerLogEntry_HEARTBEAT ContainerLogEntry_StreamType = 3 -) - -// Enum value maps for ContainerLogEntry_StreamType. -var ( - ContainerLogEntry_StreamType_name = map[int32]string{ - 0: "UNKNOWN", - 1: "STDOUT", - 2: "STDERR", - 3: "HEARTBEAT", - } - ContainerLogEntry_StreamType_value = map[string]int32{ - "UNKNOWN": 0, - "STDOUT": 1, - "STDERR": 2, - "HEARTBEAT": 3, - } -) - -func (x ContainerLogEntry_StreamType) Enum() *ContainerLogEntry_StreamType { - p := new(ContainerLogEntry_StreamType) - *p = x - return p -} - -func (x ContainerLogEntry_StreamType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ContainerLogEntry_StreamType) Descriptor() protoreflect.EnumDescriptor { - return file_internal_machine_api_pb_docker_proto_enumTypes[0].Descriptor() -} - -func (ContainerLogEntry_StreamType) Type() protoreflect.EnumType { - return &file_internal_machine_api_pb_docker_proto_enumTypes[0] -} - -func (x ContainerLogEntry_StreamType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ContainerLogEntry_StreamType.Descriptor instead. -func (ContainerLogEntry_StreamType) EnumDescriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{15, 0} -} - type CreateContainerRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -943,150 +890,6 @@ func (*ExecContainerResponse_Stderr) isExecContainerResponse_Payload() {} func (*ExecContainerResponse_ExitCode) isExecContainerResponse_Payload() {} -type ContainerLogsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ContainerId string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` - // Options for logs retrieval. - Follow bool `protobuf:"varint,2,opt,name=follow,proto3" json:"follow,omitempty"` - Tail int32 `protobuf:"varint,3,opt,name=tail,proto3" json:"tail,omitempty"` // -1 means all - Since string `protobuf:"bytes,4,opt,name=since,proto3" json:"since,omitempty"` // https://www.rfc-editor.org/rfc/rfc3339.html timestamp or Go duration string - Until string `protobuf:"bytes,5,opt,name=until,proto3" json:"until,omitempty"` // https://www.rfc-editor.org/rfc/rfc3339.html timestamp or Go duration string -} - -func (x *ContainerLogsRequest) Reset() { - *x = ContainerLogsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ContainerLogsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ContainerLogsRequest) ProtoMessage() {} - -func (x *ContainerLogsRequest) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[14] - 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 ContainerLogsRequest.ProtoReflect.Descriptor instead. -func (*ContainerLogsRequest) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{14} -} - -func (x *ContainerLogsRequest) GetContainerId() string { - if x != nil { - return x.ContainerId - } - return "" -} - -func (x *ContainerLogsRequest) GetFollow() bool { - if x != nil { - return x.Follow - } - return false -} - -func (x *ContainerLogsRequest) GetTail() int32 { - if x != nil { - return x.Tail - } - return 0 -} - -func (x *ContainerLogsRequest) GetSince() string { - if x != nil { - return x.Since - } - return "" -} - -func (x *ContainerLogsRequest) GetUntil() string { - if x != nil { - return x.Until - } - return "" -} - -type ContainerLogEntry struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Stream ContainerLogEntry_StreamType `protobuf:"varint,1,opt,name=stream,proto3,enum=api.ContainerLogEntry_StreamType" json:"stream,omitempty"` - Timestamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - // Log line content. Empty for heartbeat entries. - Message []byte `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` -} - -func (x *ContainerLogEntry) Reset() { - *x = ContainerLogEntry{} - if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ContainerLogEntry) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ContainerLogEntry) ProtoMessage() {} - -func (x *ContainerLogEntry) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[15] - 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 ContainerLogEntry.ProtoReflect.Descriptor instead. -func (*ContainerLogEntry) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{15} -} - -func (x *ContainerLogEntry) GetStream() ContainerLogEntry_StreamType { - if x != nil { - return x.Stream - } - return ContainerLogEntry_UNKNOWN -} - -func (x *ContainerLogEntry) GetTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.Timestamp - } - return nil -} - -func (x *ContainerLogEntry) GetMessage() []byte { - if x != nil { - return x.Message - } - return nil -} - type PullImageRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1100,7 +903,7 @@ type PullImageRequest struct { func (x *PullImageRequest) Reset() { *x = PullImageRequest{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[16] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1113,7 +916,7 @@ func (x *PullImageRequest) String() string { func (*PullImageRequest) ProtoMessage() {} func (x *PullImageRequest) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[16] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1126,7 +929,7 @@ func (x *PullImageRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PullImageRequest.ProtoReflect.Descriptor instead. func (*PullImageRequest) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{16} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{14} } func (x *PullImageRequest) GetImage() string { @@ -1155,7 +958,7 @@ type JSONMessage struct { func (x *JSONMessage) Reset() { *x = JSONMessage{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[17] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1168,7 +971,7 @@ func (x *JSONMessage) String() string { func (*JSONMessage) ProtoMessage() {} func (x *JSONMessage) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[17] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1181,7 +984,7 @@ func (x *JSONMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use JSONMessage.ProtoReflect.Descriptor instead. func (*JSONMessage) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{17} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{15} } func (x *JSONMessage) GetMessage() []byte { @@ -1202,7 +1005,7 @@ type InspectImageRequest struct { func (x *InspectImageRequest) Reset() { *x = InspectImageRequest{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[18] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1215,7 +1018,7 @@ func (x *InspectImageRequest) String() string { func (*InspectImageRequest) ProtoMessage() {} func (x *InspectImageRequest) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[18] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1228,7 +1031,7 @@ func (x *InspectImageRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use InspectImageRequest.ProtoReflect.Descriptor instead. func (*InspectImageRequest) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{18} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{16} } func (x *InspectImageRequest) GetId() string { @@ -1250,7 +1053,7 @@ type InspectImageResponse struct { func (x *InspectImageResponse) Reset() { *x = InspectImageResponse{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[19] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1263,7 +1066,7 @@ func (x *InspectImageResponse) String() string { func (*InspectImageResponse) ProtoMessage() {} func (x *InspectImageResponse) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[19] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1276,7 +1079,7 @@ func (x *InspectImageResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use InspectImageResponse.ProtoReflect.Descriptor instead. func (*InspectImageResponse) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{19} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{17} } func (x *InspectImageResponse) GetMessages() []*Image { @@ -1299,7 +1102,7 @@ type Image struct { func (x *Image) Reset() { *x = Image{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[20] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1312,7 +1115,7 @@ func (x *Image) String() string { func (*Image) ProtoMessage() {} func (x *Image) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[20] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1325,7 +1128,7 @@ func (x *Image) ProtoReflect() protoreflect.Message { // Deprecated: Use Image.ProtoReflect.Descriptor instead. func (*Image) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{20} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{18} } func (x *Image) GetMetadata() *Metadata { @@ -1353,7 +1156,7 @@ type InspectRemoteImageRequest struct { func (x *InspectRemoteImageRequest) Reset() { *x = InspectRemoteImageRequest{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[21] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1366,7 +1169,7 @@ func (x *InspectRemoteImageRequest) String() string { func (*InspectRemoteImageRequest) ProtoMessage() {} func (x *InspectRemoteImageRequest) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[21] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1379,7 +1182,7 @@ func (x *InspectRemoteImageRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use InspectRemoteImageRequest.ProtoReflect.Descriptor instead. func (*InspectRemoteImageRequest) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{21} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{19} } func (x *InspectRemoteImageRequest) GetId() string { @@ -1401,7 +1204,7 @@ type InspectRemoteImageResponse struct { func (x *InspectRemoteImageResponse) Reset() { *x = InspectRemoteImageResponse{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[22] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1414,7 +1217,7 @@ func (x *InspectRemoteImageResponse) String() string { func (*InspectRemoteImageResponse) ProtoMessage() {} func (x *InspectRemoteImageResponse) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[22] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1427,7 +1230,7 @@ func (x *InspectRemoteImageResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use InspectRemoteImageResponse.ProtoReflect.Descriptor instead. func (*InspectRemoteImageResponse) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{22} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{20} } func (x *InspectRemoteImageResponse) GetMessages() []*RemoteImage { @@ -1452,7 +1255,7 @@ type RemoteImage struct { func (x *RemoteImage) Reset() { *x = RemoteImage{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[23] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1465,7 +1268,7 @@ func (x *RemoteImage) String() string { func (*RemoteImage) ProtoMessage() {} func (x *RemoteImage) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[23] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1478,7 +1281,7 @@ func (x *RemoteImage) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoteImage.ProtoReflect.Descriptor instead. func (*RemoteImage) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{23} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{21} } func (x *RemoteImage) GetMetadata() *Metadata { @@ -1514,7 +1317,7 @@ type ListImagesRequest struct { func (x *ListImagesRequest) Reset() { *x = ListImagesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[24] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1527,7 +1330,7 @@ func (x *ListImagesRequest) String() string { func (*ListImagesRequest) ProtoMessage() {} func (x *ListImagesRequest) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[24] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1540,7 +1343,7 @@ func (x *ListImagesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListImagesRequest.ProtoReflect.Descriptor instead. func (*ListImagesRequest) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{24} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{22} } func (x *ListImagesRequest) GetOptions() []byte { @@ -1562,7 +1365,7 @@ type ListImagesResponse struct { func (x *ListImagesResponse) Reset() { *x = ListImagesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[25] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1575,7 +1378,7 @@ func (x *ListImagesResponse) String() string { func (*ListImagesResponse) ProtoMessage() {} func (x *ListImagesResponse) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[25] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1588,7 +1391,7 @@ func (x *ListImagesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListImagesResponse.ProtoReflect.Descriptor instead. func (*ListImagesResponse) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{25} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{23} } func (x *ListImagesResponse) GetMessages() []*MachineImages { @@ -1613,7 +1416,7 @@ type MachineImages struct { func (x *MachineImages) Reset() { *x = MachineImages{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[26] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1626,7 +1429,7 @@ func (x *MachineImages) String() string { func (*MachineImages) ProtoMessage() {} func (x *MachineImages) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[26] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1639,7 +1442,7 @@ func (x *MachineImages) ProtoReflect() protoreflect.Message { // Deprecated: Use MachineImages.ProtoReflect.Descriptor instead. func (*MachineImages) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{26} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{24} } func (x *MachineImages) GetMetadata() *Metadata { @@ -1675,7 +1478,7 @@ type CreateVolumeRequest struct { func (x *CreateVolumeRequest) Reset() { *x = CreateVolumeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[27] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1688,7 +1491,7 @@ func (x *CreateVolumeRequest) String() string { func (*CreateVolumeRequest) ProtoMessage() {} func (x *CreateVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[27] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1701,7 +1504,7 @@ func (x *CreateVolumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateVolumeRequest.ProtoReflect.Descriptor instead. func (*CreateVolumeRequest) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{27} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{25} } func (x *CreateVolumeRequest) GetOptions() []byte { @@ -1723,7 +1526,7 @@ type CreateVolumeResponse struct { func (x *CreateVolumeResponse) Reset() { *x = CreateVolumeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[28] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1736,7 +1539,7 @@ func (x *CreateVolumeResponse) String() string { func (*CreateVolumeResponse) ProtoMessage() {} func (x *CreateVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[28] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1749,7 +1552,7 @@ func (x *CreateVolumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateVolumeResponse.ProtoReflect.Descriptor instead. func (*CreateVolumeResponse) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{28} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{26} } func (x *CreateVolumeResponse) GetVolume() []byte { @@ -1771,7 +1574,7 @@ type ListVolumesRequest struct { func (x *ListVolumesRequest) Reset() { *x = ListVolumesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[29] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1784,7 +1587,7 @@ func (x *ListVolumesRequest) String() string { func (*ListVolumesRequest) ProtoMessage() {} func (x *ListVolumesRequest) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[29] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1797,7 +1600,7 @@ func (x *ListVolumesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListVolumesRequest.ProtoReflect.Descriptor instead. func (*ListVolumesRequest) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{29} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{27} } func (x *ListVolumesRequest) GetOptions() []byte { @@ -1819,7 +1622,7 @@ type ListVolumesResponse struct { func (x *ListVolumesResponse) Reset() { *x = ListVolumesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[30] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1832,7 +1635,7 @@ func (x *ListVolumesResponse) String() string { func (*ListVolumesResponse) ProtoMessage() {} func (x *ListVolumesResponse) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[30] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1845,7 +1648,7 @@ func (x *ListVolumesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListVolumesResponse.ProtoReflect.Descriptor instead. func (*ListVolumesResponse) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{30} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{28} } func (x *ListVolumesResponse) GetMessages() []*MachineVolumes { @@ -1868,7 +1671,7 @@ type MachineVolumes struct { func (x *MachineVolumes) Reset() { *x = MachineVolumes{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[31] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1881,7 +1684,7 @@ func (x *MachineVolumes) String() string { func (*MachineVolumes) ProtoMessage() {} func (x *MachineVolumes) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[31] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1894,7 +1697,7 @@ func (x *MachineVolumes) ProtoReflect() protoreflect.Message { // Deprecated: Use MachineVolumes.ProtoReflect.Descriptor instead. func (*MachineVolumes) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{31} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{29} } func (x *MachineVolumes) GetMetadata() *Metadata { @@ -1923,7 +1726,7 @@ type RemoveVolumeRequest struct { func (x *RemoveVolumeRequest) Reset() { *x = RemoveVolumeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[32] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1936,7 +1739,7 @@ func (x *RemoveVolumeRequest) String() string { func (*RemoveVolumeRequest) ProtoMessage() {} func (x *RemoveVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[32] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1949,7 +1752,7 @@ func (x *RemoveVolumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveVolumeRequest.ProtoReflect.Descriptor instead. func (*RemoveVolumeRequest) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{32} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{30} } func (x *RemoveVolumeRequest) GetId() string { @@ -1980,7 +1783,7 @@ type CreateServiceContainerRequest struct { func (x *CreateServiceContainerRequest) Reset() { *x = CreateServiceContainerRequest{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[33] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1993,7 +1796,7 @@ func (x *CreateServiceContainerRequest) String() string { func (*CreateServiceContainerRequest) ProtoMessage() {} func (x *CreateServiceContainerRequest) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[33] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2006,7 +1809,7 @@ func (x *CreateServiceContainerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateServiceContainerRequest.ProtoReflect.Descriptor instead. func (*CreateServiceContainerRequest) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{33} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{31} } func (x *CreateServiceContainerRequest) GetServiceId() string { @@ -2044,7 +1847,7 @@ type ServiceContainer struct { func (x *ServiceContainer) Reset() { *x = ServiceContainer{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[34] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2057,7 +1860,7 @@ func (x *ServiceContainer) String() string { func (*ServiceContainer) ProtoMessage() {} func (x *ServiceContainer) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[34] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2070,7 +1873,7 @@ func (x *ServiceContainer) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceContainer.ProtoReflect.Descriptor instead. func (*ServiceContainer) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{34} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{32} } func (x *ServiceContainer) GetContainer() []byte { @@ -2100,7 +1903,7 @@ type ListServiceContainersRequest struct { func (x *ListServiceContainersRequest) Reset() { *x = ListServiceContainersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[35] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2113,7 +1916,7 @@ func (x *ListServiceContainersRequest) String() string { func (*ListServiceContainersRequest) ProtoMessage() {} func (x *ListServiceContainersRequest) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[35] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2126,7 +1929,7 @@ func (x *ListServiceContainersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListServiceContainersRequest.ProtoReflect.Descriptor instead. func (*ListServiceContainersRequest) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{35} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{33} } func (x *ListServiceContainersRequest) GetServiceId() string { @@ -2156,7 +1959,7 @@ type ListServiceContainersResponse struct { func (x *ListServiceContainersResponse) Reset() { *x = ListServiceContainersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[36] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2169,7 +1972,7 @@ func (x *ListServiceContainersResponse) String() string { func (*ListServiceContainersResponse) ProtoMessage() {} func (x *ListServiceContainersResponse) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[36] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2182,7 +1985,7 @@ func (x *ListServiceContainersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListServiceContainersResponse.ProtoReflect.Descriptor instead. func (*ListServiceContainersResponse) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{36} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{34} } func (x *ListServiceContainersResponse) GetMessages() []*MachineServiceContainers { @@ -2204,7 +2007,7 @@ type MachineServiceContainers struct { func (x *MachineServiceContainers) Reset() { *x = MachineServiceContainers{} if protoimpl.UnsafeEnabled { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[37] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2217,7 +2020,7 @@ func (x *MachineServiceContainers) String() string { func (*MachineServiceContainers) ProtoMessage() {} func (x *MachineServiceContainers) ProtoReflect() protoreflect.Message { - mi := &file_internal_machine_api_pb_docker_proto_msgTypes[37] + mi := &file_internal_machine_api_pb_docker_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2230,7 +2033,7 @@ func (x *MachineServiceContainers) ProtoReflect() protoreflect.Message { // Deprecated: Use MachineServiceContainers.ProtoReflect.Descriptor instead. func (*MachineServiceContainers) Descriptor() ([]byte, []int) { - return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{37} + return file_internal_machine_api_pb_docker_proto_rawDescGZIP(), []int{35} } func (x *MachineServiceContainers) GetMetadata() *Metadata { @@ -2254,306 +2057,279 @@ var file_internal_machine_api_pb_docker_proto_rawDesc = []byte{ 0x6e, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x62, 0x2f, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, 0x70, 0x69, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, - 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x24, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x70, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, - 0xa8, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, - 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x6c, - 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x35, 0x0a, 0x17, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x29, 0x0a, 0x17, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, + 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x24, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, + 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa8, + 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x61, + 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x6c, 0x61, + 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x35, 0x0a, 0x17, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x29, 0x0a, 0x17, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x36, 0x0a, 0x18, 0x49, + 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x41, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x36, 0x0a, 0x18, - 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x41, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x40, 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x31, 0x0a, 0x15, 0x4c, 0x69, 0x73, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x4c, 0x0a, 0x16, - 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, - 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x5e, 0x0a, 0x11, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, - 0x29, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x42, 0x0a, 0x16, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x90, - 0x01, 0x0a, 0x14, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, - 0x65, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x16, 0x0a, 0x05, 0x73, 0x74, 0x64, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x48, 0x00, 0x52, 0x05, 0x73, 0x74, 0x64, 0x69, 0x6e, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x52, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, - 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x22, 0x49, 0x0a, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3b, 0x0a, 0x0b, - 0x52, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x68, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x90, 0x01, 0x0a, 0x15, 0x45, 0x78, - 0x65, 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x07, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x65, 0x78, 0x65, 0x63, 0x49, 0x64, 0x12, 0x18, - 0x0a, 0x06, 0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, - 0x52, 0x06, 0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x18, 0x0a, 0x06, 0x73, 0x74, 0x64, 0x65, - 0x72, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x64, 0x65, - 0x72, 0x72, 0x12, 0x1d, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, 0x6f, 0x64, - 0x65, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x91, 0x01, 0x0a, - 0x14, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x6c, - 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, - 0x74, 0x61, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x75, 0x6e, - 0x74, 0x69, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, - 0x22, 0xe4, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, - 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x40, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, - 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x44, 0x4f, 0x55, 0x54, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, - 0x53, 0x54, 0x44, 0x45, 0x52, 0x52, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x41, 0x52, - 0x54, 0x42, 0x45, 0x41, 0x54, 0x10, 0x03, 0x22, 0x42, 0x0a, 0x10, 0x50, 0x75, 0x6c, 0x6c, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x27, 0x0a, 0x0b, 0x4a, - 0x53, 0x4f, 0x4e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x22, 0x25, 0x0a, 0x13, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x3e, 0x0a, 0x14, 0x49, - 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6d, 0x61, 0x67, - 0x65, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x48, 0x0a, 0x05, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x22, 0x2b, 0x0a, 0x19, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x22, 0x4a, 0x0a, 0x1a, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2c, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x72, - 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, - 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, - 0x73, 0x74, 0x22, 0x2d, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x44, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x52, 0x08, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x7d, 0x0a, 0x0d, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x40, 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, + 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x31, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x4c, 0x0a, 0x16, 0x4c, + 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, + 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x5e, 0x0a, 0x11, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x29, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x42, 0x0a, 0x16, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x90, 0x01, + 0x0a, 0x14, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, + 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x16, 0x0a, 0x05, 0x73, 0x74, 0x64, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x48, 0x00, 0x52, 0x05, 0x73, 0x74, 0x64, 0x69, 0x6e, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x52, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x72, + 0x65, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x22, 0x49, 0x0a, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x21, + 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3b, 0x0a, 0x0b, 0x52, + 0x65, 0x73, 0x69, 0x7a, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x90, 0x01, 0x0a, 0x15, 0x45, 0x78, 0x65, + 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x19, 0x0a, 0x07, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x65, 0x78, 0x65, 0x63, 0x49, 0x64, 0x12, 0x18, 0x0a, + 0x06, 0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, + 0x06, 0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x18, 0x0a, 0x06, 0x73, 0x74, 0x64, 0x65, 0x72, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x64, 0x65, 0x72, + 0x72, 0x12, 0x1d, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65, + 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x42, 0x0a, 0x10, 0x50, + 0x75, 0x6c, 0x6c, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x27, 0x0a, 0x0b, 0x4a, 0x53, 0x4f, 0x4e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x25, 0x0a, 0x13, 0x49, 0x6e, 0x73, 0x70, + 0x65, 0x63, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, + 0x3e, 0x0a, 0x14, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, + 0x48, 0x0a, 0x05, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x64, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2e, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x2e, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x46, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, - 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, - 0x57, 0x0a, 0x0e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x73, 0x12, 0x29, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, + 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x22, 0x2b, 0x0a, 0x19, 0x49, 0x6e, 0x73, + 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4a, 0x0a, 0x1a, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, + 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x73, 0x22, 0x72, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x12, 0x29, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1c, 0x0a, 0x09, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, + 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6d, 0x61, + 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x22, 0x2d, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x44, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x73, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x7d, 0x0a, 0x0d, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, + 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x5f, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x64, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2e, 0x0a, 0x14, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x2e, 0x0a, 0x12, 0x4c, + 0x69, 0x73, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x46, 0x0a, 0x13, 0x4c, + 0x69, 0x73, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x73, 0x22, 0x57, 0x0a, 0x0e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x0a, 0x13, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x1d, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x25, 0x0a, + 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x53, 0x0a, 0x10, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x22, 0x53, 0x0a, 0x10, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x70, - 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x53, 0x70, 0x65, 0x63, 0x22, 0x57, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5a, - 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x39, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, - 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x7c, 0x0a, 0x18, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x29, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x35, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x0a, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x32, 0x8d, 0x0b, 0x0a, 0x06, 0x44, 0x6f, 0x63, - 0x6b, 0x65, 0x72, 0x12, 0x4c, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x4f, 0x0a, 0x10, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, - 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x49, 0x0a, 0x0e, - 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1a, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x22, 0x57, 0x0a, 0x1c, 0x4c, 0x69, 0x73, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x5a, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x73, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x7c, + 0x0a, 0x18, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x29, 0x0a, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x35, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x32, 0xfb, 0x0a, 0x0a, + 0x06, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x12, 0x4c, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x10, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, + 0x73, 0x70, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x0d, + 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x12, 0x49, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x73, 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0f, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1b, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x4a, 0x0a, 0x0d, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, + 0x32, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x73, + 0x12, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x30, 0x01, 0x12, 0x36, 0x0a, 0x09, 0x50, 0x75, 0x6c, 0x6c, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x12, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x75, 0x6c, 0x6c, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4a, 0x53, + 0x4f, 0x4e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x30, 0x01, 0x12, 0x43, 0x0a, 0x0c, 0x49, + 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x18, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, + 0x65, 0x63, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x55, 0x0a, 0x12, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, + 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, + 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x4c, + 0x69, 0x73, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, + 0x0c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x18, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, - 0x4a, 0x0a, 0x0d, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0d, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x19, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x30, - 0x01, 0x12, 0x36, 0x0a, 0x09, 0x50, 0x75, 0x6c, 0x6c, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x15, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x75, 0x6c, 0x6c, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x30, 0x01, 0x12, 0x43, 0x0a, 0x0c, 0x49, 0x6e, 0x73, - 0x70, 0x65, 0x63, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, - 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, - 0x0a, 0x12, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, - 0x63, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, - 0x63, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, - 0x67, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, - 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x4c, 0x69, 0x73, - 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0c, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x18, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x5a, 0x0a, - 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x17, 0x49, 0x6e, 0x73, - 0x70, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, - 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x5e, 0x0a, 0x15, 0x4c, 0x69, 0x73, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x16, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x37, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x73, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x6b, - 0x69, 0x2f, 0x75, 0x6e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, - 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x5a, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x17, 0x49, + 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, + 0x70, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x5e, 0x0a, 0x15, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x16, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x37, 0x5a, 0x35, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x73, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x6b, 0x69, 0x2f, 0x75, 0x6e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2568,113 +2344,108 @@ func file_internal_machine_api_pb_docker_proto_rawDescGZIP() []byte { return file_internal_machine_api_pb_docker_proto_rawDescData } -var file_internal_machine_api_pb_docker_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_internal_machine_api_pb_docker_proto_msgTypes = make([]protoimpl.MessageInfo, 38) +var file_internal_machine_api_pb_docker_proto_msgTypes = make([]protoimpl.MessageInfo, 36) var file_internal_machine_api_pb_docker_proto_goTypes = []any{ - (ContainerLogEntry_StreamType)(0), // 0: api.ContainerLogEntry.StreamType - (*CreateContainerRequest)(nil), // 1: api.CreateContainerRequest - (*CreateContainerResponse)(nil), // 2: api.CreateContainerResponse - (*InspectContainerRequest)(nil), // 3: api.InspectContainerRequest - (*InspectContainerResponse)(nil), // 4: api.InspectContainerResponse - (*StartContainerRequest)(nil), // 5: api.StartContainerRequest - (*StopContainerRequest)(nil), // 6: api.StopContainerRequest - (*ListContainersRequest)(nil), // 7: api.ListContainersRequest - (*ListContainersResponse)(nil), // 8: api.ListContainersResponse - (*MachineContainers)(nil), // 9: api.MachineContainers - (*RemoveContainerRequest)(nil), // 10: api.RemoveContainerRequest - (*ExecContainerRequest)(nil), // 11: api.ExecContainerRequest - (*ExecConfig)(nil), // 12: api.ExecConfig - (*ResizeEvent)(nil), // 13: api.ResizeEvent - (*ExecContainerResponse)(nil), // 14: api.ExecContainerResponse - (*ContainerLogsRequest)(nil), // 15: api.ContainerLogsRequest - (*ContainerLogEntry)(nil), // 16: api.ContainerLogEntry - (*PullImageRequest)(nil), // 17: api.PullImageRequest - (*JSONMessage)(nil), // 18: api.JSONMessage - (*InspectImageRequest)(nil), // 19: api.InspectImageRequest - (*InspectImageResponse)(nil), // 20: api.InspectImageResponse - (*Image)(nil), // 21: api.Image - (*InspectRemoteImageRequest)(nil), // 22: api.InspectRemoteImageRequest - (*InspectRemoteImageResponse)(nil), // 23: api.InspectRemoteImageResponse - (*RemoteImage)(nil), // 24: api.RemoteImage - (*ListImagesRequest)(nil), // 25: api.ListImagesRequest - (*ListImagesResponse)(nil), // 26: api.ListImagesResponse - (*MachineImages)(nil), // 27: api.MachineImages - (*CreateVolumeRequest)(nil), // 28: api.CreateVolumeRequest - (*CreateVolumeResponse)(nil), // 29: api.CreateVolumeResponse - (*ListVolumesRequest)(nil), // 30: api.ListVolumesRequest - (*ListVolumesResponse)(nil), // 31: api.ListVolumesResponse - (*MachineVolumes)(nil), // 32: api.MachineVolumes - (*RemoveVolumeRequest)(nil), // 33: api.RemoveVolumeRequest - (*CreateServiceContainerRequest)(nil), // 34: api.CreateServiceContainerRequest - (*ServiceContainer)(nil), // 35: api.ServiceContainer - (*ListServiceContainersRequest)(nil), // 36: api.ListServiceContainersRequest - (*ListServiceContainersResponse)(nil), // 37: api.ListServiceContainersResponse - (*MachineServiceContainers)(nil), // 38: api.MachineServiceContainers - (*Metadata)(nil), // 39: api.Metadata - (*timestamppb.Timestamp)(nil), // 40: google.protobuf.Timestamp - (*emptypb.Empty)(nil), // 41: google.protobuf.Empty + (*CreateContainerRequest)(nil), // 0: api.CreateContainerRequest + (*CreateContainerResponse)(nil), // 1: api.CreateContainerResponse + (*InspectContainerRequest)(nil), // 2: api.InspectContainerRequest + (*InspectContainerResponse)(nil), // 3: api.InspectContainerResponse + (*StartContainerRequest)(nil), // 4: api.StartContainerRequest + (*StopContainerRequest)(nil), // 5: api.StopContainerRequest + (*ListContainersRequest)(nil), // 6: api.ListContainersRequest + (*ListContainersResponse)(nil), // 7: api.ListContainersResponse + (*MachineContainers)(nil), // 8: api.MachineContainers + (*RemoveContainerRequest)(nil), // 9: api.RemoveContainerRequest + (*ExecContainerRequest)(nil), // 10: api.ExecContainerRequest + (*ExecConfig)(nil), // 11: api.ExecConfig + (*ResizeEvent)(nil), // 12: api.ResizeEvent + (*ExecContainerResponse)(nil), // 13: api.ExecContainerResponse + (*PullImageRequest)(nil), // 14: api.PullImageRequest + (*JSONMessage)(nil), // 15: api.JSONMessage + (*InspectImageRequest)(nil), // 16: api.InspectImageRequest + (*InspectImageResponse)(nil), // 17: api.InspectImageResponse + (*Image)(nil), // 18: api.Image + (*InspectRemoteImageRequest)(nil), // 19: api.InspectRemoteImageRequest + (*InspectRemoteImageResponse)(nil), // 20: api.InspectRemoteImageResponse + (*RemoteImage)(nil), // 21: api.RemoteImage + (*ListImagesRequest)(nil), // 22: api.ListImagesRequest + (*ListImagesResponse)(nil), // 23: api.ListImagesResponse + (*MachineImages)(nil), // 24: api.MachineImages + (*CreateVolumeRequest)(nil), // 25: api.CreateVolumeRequest + (*CreateVolumeResponse)(nil), // 26: api.CreateVolumeResponse + (*ListVolumesRequest)(nil), // 27: api.ListVolumesRequest + (*ListVolumesResponse)(nil), // 28: api.ListVolumesResponse + (*MachineVolumes)(nil), // 29: api.MachineVolumes + (*RemoveVolumeRequest)(nil), // 30: api.RemoveVolumeRequest + (*CreateServiceContainerRequest)(nil), // 31: api.CreateServiceContainerRequest + (*ServiceContainer)(nil), // 32: api.ServiceContainer + (*ListServiceContainersRequest)(nil), // 33: api.ListServiceContainersRequest + (*ListServiceContainersResponse)(nil), // 34: api.ListServiceContainersResponse + (*MachineServiceContainers)(nil), // 35: api.MachineServiceContainers + (*Metadata)(nil), // 36: api.Metadata + (*LogsRequest)(nil), // 37: api.LogsRequest + (*emptypb.Empty)(nil), // 38: google.protobuf.Empty + (*LogEntry)(nil), // 39: api.LogEntry } var file_internal_machine_api_pb_docker_proto_depIdxs = []int32{ - 9, // 0: api.ListContainersResponse.messages:type_name -> api.MachineContainers - 39, // 1: api.MachineContainers.metadata:type_name -> api.Metadata - 12, // 2: api.ExecContainerRequest.config:type_name -> api.ExecConfig - 13, // 3: api.ExecContainerRequest.resize:type_name -> api.ResizeEvent - 0, // 4: api.ContainerLogEntry.stream:type_name -> api.ContainerLogEntry.StreamType - 40, // 5: api.ContainerLogEntry.timestamp:type_name -> google.protobuf.Timestamp - 21, // 6: api.InspectImageResponse.messages:type_name -> api.Image - 39, // 7: api.Image.metadata:type_name -> api.Metadata - 24, // 8: api.InspectRemoteImageResponse.messages:type_name -> api.RemoteImage - 39, // 9: api.RemoteImage.metadata:type_name -> api.Metadata - 27, // 10: api.ListImagesResponse.messages:type_name -> api.MachineImages - 39, // 11: api.MachineImages.metadata:type_name -> api.Metadata - 32, // 12: api.ListVolumesResponse.messages:type_name -> api.MachineVolumes - 39, // 13: api.MachineVolumes.metadata:type_name -> api.Metadata - 38, // 14: api.ListServiceContainersResponse.messages:type_name -> api.MachineServiceContainers - 39, // 15: api.MachineServiceContainers.metadata:type_name -> api.Metadata - 35, // 16: api.MachineServiceContainers.containers:type_name -> api.ServiceContainer - 1, // 17: api.Docker.CreateContainer:input_type -> api.CreateContainerRequest - 3, // 18: api.Docker.InspectContainer:input_type -> api.InspectContainerRequest - 5, // 19: api.Docker.StartContainer:input_type -> api.StartContainerRequest - 6, // 20: api.Docker.StopContainer:input_type -> api.StopContainerRequest - 7, // 21: api.Docker.ListContainers:input_type -> api.ListContainersRequest - 10, // 22: api.Docker.RemoveContainer:input_type -> api.RemoveContainerRequest - 11, // 23: api.Docker.ExecContainer:input_type -> api.ExecContainerRequest - 15, // 24: api.Docker.ContainerLogs:input_type -> api.ContainerLogsRequest - 17, // 25: api.Docker.PullImage:input_type -> api.PullImageRequest - 19, // 26: api.Docker.InspectImage:input_type -> api.InspectImageRequest - 22, // 27: api.Docker.InspectRemoteImage:input_type -> api.InspectRemoteImageRequest - 25, // 28: api.Docker.ListImages:input_type -> api.ListImagesRequest - 28, // 29: api.Docker.CreateVolume:input_type -> api.CreateVolumeRequest - 30, // 30: api.Docker.ListVolumes:input_type -> api.ListVolumesRequest - 33, // 31: api.Docker.RemoveVolume:input_type -> api.RemoveVolumeRequest - 34, // 32: api.Docker.CreateServiceContainer:input_type -> api.CreateServiceContainerRequest - 3, // 33: api.Docker.InspectServiceContainer:input_type -> api.InspectContainerRequest - 36, // 34: api.Docker.ListServiceContainers:input_type -> api.ListServiceContainersRequest - 10, // 35: api.Docker.RemoveServiceContainer:input_type -> api.RemoveContainerRequest - 2, // 36: api.Docker.CreateContainer:output_type -> api.CreateContainerResponse - 4, // 37: api.Docker.InspectContainer:output_type -> api.InspectContainerResponse - 41, // 38: api.Docker.StartContainer:output_type -> google.protobuf.Empty - 41, // 39: api.Docker.StopContainer:output_type -> google.protobuf.Empty - 8, // 40: api.Docker.ListContainers:output_type -> api.ListContainersResponse - 41, // 41: api.Docker.RemoveContainer:output_type -> google.protobuf.Empty - 14, // 42: api.Docker.ExecContainer:output_type -> api.ExecContainerResponse - 16, // 43: api.Docker.ContainerLogs:output_type -> api.ContainerLogEntry - 18, // 44: api.Docker.PullImage:output_type -> api.JSONMessage - 20, // 45: api.Docker.InspectImage:output_type -> api.InspectImageResponse - 23, // 46: api.Docker.InspectRemoteImage:output_type -> api.InspectRemoteImageResponse - 26, // 47: api.Docker.ListImages:output_type -> api.ListImagesResponse - 29, // 48: api.Docker.CreateVolume:output_type -> api.CreateVolumeResponse - 31, // 49: api.Docker.ListVolumes:output_type -> api.ListVolumesResponse - 41, // 50: api.Docker.RemoveVolume:output_type -> google.protobuf.Empty - 2, // 51: api.Docker.CreateServiceContainer:output_type -> api.CreateContainerResponse - 35, // 52: api.Docker.InspectServiceContainer:output_type -> api.ServiceContainer - 37, // 53: api.Docker.ListServiceContainers:output_type -> api.ListServiceContainersResponse - 41, // 54: api.Docker.RemoveServiceContainer:output_type -> google.protobuf.Empty - 36, // [36:55] is the sub-list for method output_type - 17, // [17:36] 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 + 8, // 0: api.ListContainersResponse.messages:type_name -> api.MachineContainers + 36, // 1: api.MachineContainers.metadata:type_name -> api.Metadata + 11, // 2: api.ExecContainerRequest.config:type_name -> api.ExecConfig + 12, // 3: api.ExecContainerRequest.resize:type_name -> api.ResizeEvent + 18, // 4: api.InspectImageResponse.messages:type_name -> api.Image + 36, // 5: api.Image.metadata:type_name -> api.Metadata + 21, // 6: api.InspectRemoteImageResponse.messages:type_name -> api.RemoteImage + 36, // 7: api.RemoteImage.metadata:type_name -> api.Metadata + 24, // 8: api.ListImagesResponse.messages:type_name -> api.MachineImages + 36, // 9: api.MachineImages.metadata:type_name -> api.Metadata + 29, // 10: api.ListVolumesResponse.messages:type_name -> api.MachineVolumes + 36, // 11: api.MachineVolumes.metadata:type_name -> api.Metadata + 35, // 12: api.ListServiceContainersResponse.messages:type_name -> api.MachineServiceContainers + 36, // 13: api.MachineServiceContainers.metadata:type_name -> api.Metadata + 32, // 14: api.MachineServiceContainers.containers:type_name -> api.ServiceContainer + 0, // 15: api.Docker.CreateContainer:input_type -> api.CreateContainerRequest + 2, // 16: api.Docker.InspectContainer:input_type -> api.InspectContainerRequest + 4, // 17: api.Docker.StartContainer:input_type -> api.StartContainerRequest + 5, // 18: api.Docker.StopContainer:input_type -> api.StopContainerRequest + 6, // 19: api.Docker.ListContainers:input_type -> api.ListContainersRequest + 9, // 20: api.Docker.RemoveContainer:input_type -> api.RemoveContainerRequest + 10, // 21: api.Docker.ExecContainer:input_type -> api.ExecContainerRequest + 37, // 22: api.Docker.ContainerLogs:input_type -> api.LogsRequest + 14, // 23: api.Docker.PullImage:input_type -> api.PullImageRequest + 16, // 24: api.Docker.InspectImage:input_type -> api.InspectImageRequest + 19, // 25: api.Docker.InspectRemoteImage:input_type -> api.InspectRemoteImageRequest + 22, // 26: api.Docker.ListImages:input_type -> api.ListImagesRequest + 25, // 27: api.Docker.CreateVolume:input_type -> api.CreateVolumeRequest + 27, // 28: api.Docker.ListVolumes:input_type -> api.ListVolumesRequest + 30, // 29: api.Docker.RemoveVolume:input_type -> api.RemoveVolumeRequest + 31, // 30: api.Docker.CreateServiceContainer:input_type -> api.CreateServiceContainerRequest + 2, // 31: api.Docker.InspectServiceContainer:input_type -> api.InspectContainerRequest + 33, // 32: api.Docker.ListServiceContainers:input_type -> api.ListServiceContainersRequest + 9, // 33: api.Docker.RemoveServiceContainer:input_type -> api.RemoveContainerRequest + 1, // 34: api.Docker.CreateContainer:output_type -> api.CreateContainerResponse + 3, // 35: api.Docker.InspectContainer:output_type -> api.InspectContainerResponse + 38, // 36: api.Docker.StartContainer:output_type -> google.protobuf.Empty + 38, // 37: api.Docker.StopContainer:output_type -> google.protobuf.Empty + 7, // 38: api.Docker.ListContainers:output_type -> api.ListContainersResponse + 38, // 39: api.Docker.RemoveContainer:output_type -> google.protobuf.Empty + 13, // 40: api.Docker.ExecContainer:output_type -> api.ExecContainerResponse + 39, // 41: api.Docker.ContainerLogs:output_type -> api.LogEntry + 15, // 42: api.Docker.PullImage:output_type -> api.JSONMessage + 17, // 43: api.Docker.InspectImage:output_type -> api.InspectImageResponse + 20, // 44: api.Docker.InspectRemoteImage:output_type -> api.InspectRemoteImageResponse + 23, // 45: api.Docker.ListImages:output_type -> api.ListImagesResponse + 26, // 46: api.Docker.CreateVolume:output_type -> api.CreateVolumeResponse + 28, // 47: api.Docker.ListVolumes:output_type -> api.ListVolumesResponse + 38, // 48: api.Docker.RemoveVolume:output_type -> google.protobuf.Empty + 1, // 49: api.Docker.CreateServiceContainer:output_type -> api.CreateContainerResponse + 32, // 50: api.Docker.InspectServiceContainer:output_type -> api.ServiceContainer + 34, // 51: api.Docker.ListServiceContainers:output_type -> api.ListServiceContainersResponse + 38, // 52: api.Docker.RemoveServiceContainer:output_type -> google.protobuf.Empty + 34, // [34:53] is the sub-list for method output_type + 15, // [15:34] is the sub-list for method input_type + 15, // [15:15] is the sub-list for extension type_name + 15, // [15:15] is the sub-list for extension extendee + 0, // [0:15] is the sub-list for field type_name } func init() { file_internal_machine_api_pb_docker_proto_init() } @@ -2853,30 +2624,6 @@ func file_internal_machine_api_pb_docker_proto_init() { } } file_internal_machine_api_pb_docker_proto_msgTypes[14].Exporter = func(v any, i int) any { - switch v := v.(*ContainerLogsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_internal_machine_api_pb_docker_proto_msgTypes[15].Exporter = func(v any, i int) any { - switch v := v.(*ContainerLogEntry); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_internal_machine_api_pb_docker_proto_msgTypes[16].Exporter = func(v any, i int) any { switch v := v.(*PullImageRequest); i { case 0: return &v.state @@ -2888,7 +2635,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[17].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[15].Exporter = func(v any, i int) any { switch v := v.(*JSONMessage); i { case 0: return &v.state @@ -2900,7 +2647,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[18].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[16].Exporter = func(v any, i int) any { switch v := v.(*InspectImageRequest); i { case 0: return &v.state @@ -2912,7 +2659,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[19].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[17].Exporter = func(v any, i int) any { switch v := v.(*InspectImageResponse); i { case 0: return &v.state @@ -2924,7 +2671,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[20].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[18].Exporter = func(v any, i int) any { switch v := v.(*Image); i { case 0: return &v.state @@ -2936,7 +2683,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[21].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[19].Exporter = func(v any, i int) any { switch v := v.(*InspectRemoteImageRequest); i { case 0: return &v.state @@ -2948,7 +2695,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[22].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[20].Exporter = func(v any, i int) any { switch v := v.(*InspectRemoteImageResponse); i { case 0: return &v.state @@ -2960,7 +2707,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[23].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[21].Exporter = func(v any, i int) any { switch v := v.(*RemoteImage); i { case 0: return &v.state @@ -2972,7 +2719,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[24].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[22].Exporter = func(v any, i int) any { switch v := v.(*ListImagesRequest); i { case 0: return &v.state @@ -2984,7 +2731,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[25].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[23].Exporter = func(v any, i int) any { switch v := v.(*ListImagesResponse); i { case 0: return &v.state @@ -2996,7 +2743,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[26].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[24].Exporter = func(v any, i int) any { switch v := v.(*MachineImages); i { case 0: return &v.state @@ -3008,7 +2755,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[27].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[25].Exporter = func(v any, i int) any { switch v := v.(*CreateVolumeRequest); i { case 0: return &v.state @@ -3020,7 +2767,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[28].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[26].Exporter = func(v any, i int) any { switch v := v.(*CreateVolumeResponse); i { case 0: return &v.state @@ -3032,7 +2779,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[29].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[27].Exporter = func(v any, i int) any { switch v := v.(*ListVolumesRequest); i { case 0: return &v.state @@ -3044,7 +2791,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[30].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[28].Exporter = func(v any, i int) any { switch v := v.(*ListVolumesResponse); i { case 0: return &v.state @@ -3056,7 +2803,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[31].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[29].Exporter = func(v any, i int) any { switch v := v.(*MachineVolumes); i { case 0: return &v.state @@ -3068,7 +2815,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[32].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[30].Exporter = func(v any, i int) any { switch v := v.(*RemoveVolumeRequest); i { case 0: return &v.state @@ -3080,7 +2827,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[33].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[31].Exporter = func(v any, i int) any { switch v := v.(*CreateServiceContainerRequest); i { case 0: return &v.state @@ -3092,7 +2839,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[34].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[32].Exporter = func(v any, i int) any { switch v := v.(*ServiceContainer); i { case 0: return &v.state @@ -3104,7 +2851,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[35].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[33].Exporter = func(v any, i int) any { switch v := v.(*ListServiceContainersRequest); i { case 0: return &v.state @@ -3116,7 +2863,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[36].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[34].Exporter = func(v any, i int) any { switch v := v.(*ListServiceContainersResponse); i { case 0: return &v.state @@ -3128,7 +2875,7 @@ func file_internal_machine_api_pb_docker_proto_init() { return nil } } - file_internal_machine_api_pb_docker_proto_msgTypes[37].Exporter = func(v any, i int) any { + file_internal_machine_api_pb_docker_proto_msgTypes[35].Exporter = func(v any, i int) any { switch v := v.(*MachineServiceContainers); i { case 0: return &v.state @@ -3157,14 +2904,13 @@ func file_internal_machine_api_pb_docker_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_internal_machine_api_pb_docker_proto_rawDesc, - NumEnums: 1, - NumMessages: 38, + NumEnums: 0, + NumMessages: 36, NumExtensions: 0, NumServices: 1, }, GoTypes: file_internal_machine_api_pb_docker_proto_goTypes, DependencyIndexes: file_internal_machine_api_pb_docker_proto_depIdxs, - EnumInfos: file_internal_machine_api_pb_docker_proto_enumTypes, MessageInfos: file_internal_machine_api_pb_docker_proto_msgTypes, }.Build() File_internal_machine_api_pb_docker_proto = out.File diff --git a/internal/machine/api/pb/docker.proto b/internal/machine/api/pb/docker.proto index 4f4370db..7984fa39 100644 --- a/internal/machine/api/pb/docker.proto +++ b/internal/machine/api/pb/docker.proto @@ -5,7 +5,6 @@ package api; option go_package = "github.com/psviderski/uncloud/internal/machine/api/pb"; import "google/protobuf/empty.proto"; -import "google/protobuf/timestamp.proto"; import "internal/machine/api/pb/common.proto"; service Docker { @@ -17,7 +16,7 @@ service Docker { rpc RemoveContainer(RemoveContainerRequest) returns (google.protobuf.Empty); rpc ExecContainer(stream ExecContainerRequest) returns (stream ExecContainerResponse); - rpc ContainerLogs(ContainerLogsRequest) returns (stream ContainerLogEntry); + rpc ContainerLogs(LogsRequest) returns (stream LogEntry); rpc PullImage(PullImageRequest) returns (stream JSONMessage); rpc InspectImage(InspectImageRequest) returns (InspectImageResponse); @@ -132,28 +131,6 @@ message ExecContainerResponse { } } -message ContainerLogsRequest { - string container_id = 1; - // Options for logs retrieval. - bool follow = 2; - int32 tail = 3; // -1 means all - string since = 4; // https://www.rfc-editor.org/rfc/rfc3339.html timestamp or Go duration string - string until = 5; // https://www.rfc-editor.org/rfc/rfc3339.html timestamp or Go duration string -} - -message ContainerLogEntry { - enum StreamType { - UNKNOWN = 0; - STDOUT = 1; - STDERR = 2; - HEARTBEAT = 3; - } - StreamType stream = 1; - google.protobuf.Timestamp timestamp = 2; - // Log line content. Empty for heartbeat entries. - bytes message = 3; -} - message PullImageRequest { string image = 1; // JSON serialised image.PullOptions. diff --git a/internal/machine/api/pb/docker_grpc.pb.go b/internal/machine/api/pb/docker_grpc.pb.go index 4362b5b6..e5a743ce 100644 --- a/internal/machine/api/pb/docker_grpc.pb.go +++ b/internal/machine/api/pb/docker_grpc.pb.go @@ -52,7 +52,7 @@ type DockerClient interface { ListContainers(ctx context.Context, in *ListContainersRequest, opts ...grpc.CallOption) (*ListContainersResponse, error) RemoveContainer(ctx context.Context, in *RemoveContainerRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) ExecContainer(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[ExecContainerRequest, ExecContainerResponse], error) - ContainerLogs(ctx context.Context, in *ContainerLogsRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[ContainerLogEntry], error) + ContainerLogs(ctx context.Context, in *LogsRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[LogEntry], error) PullImage(ctx context.Context, in *PullImageRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[JSONMessage], error) InspectImage(ctx context.Context, in *InspectImageRequest, opts ...grpc.CallOption) (*InspectImageResponse, error) // InspectRemoteImage returns the image metadata for an image in a remote registry using the machine's @@ -149,13 +149,13 @@ func (c *dockerClient) ExecContainer(ctx context.Context, opts ...grpc.CallOptio // This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. type Docker_ExecContainerClient = grpc.BidiStreamingClient[ExecContainerRequest, ExecContainerResponse] -func (c *dockerClient) ContainerLogs(ctx context.Context, in *ContainerLogsRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[ContainerLogEntry], error) { +func (c *dockerClient) ContainerLogs(ctx context.Context, in *LogsRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[LogEntry], error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) stream, err := c.cc.NewStream(ctx, &Docker_ServiceDesc.Streams[1], Docker_ContainerLogs_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &grpc.GenericClientStream[ContainerLogsRequest, ContainerLogEntry]{ClientStream: stream} + x := &grpc.GenericClientStream[LogsRequest, LogEntry]{ClientStream: stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -166,7 +166,7 @@ func (c *dockerClient) ContainerLogs(ctx context.Context, in *ContainerLogsReque } // This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type Docker_ContainerLogsClient = grpc.ServerStreamingClient[ContainerLogEntry] +type Docker_ContainerLogsClient = grpc.ServerStreamingClient[LogEntry] func (c *dockerClient) PullImage(ctx context.Context, in *PullImageRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[JSONMessage], error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) @@ -298,7 +298,7 @@ type DockerServer interface { ListContainers(context.Context, *ListContainersRequest) (*ListContainersResponse, error) RemoveContainer(context.Context, *RemoveContainerRequest) (*emptypb.Empty, error) ExecContainer(grpc.BidiStreamingServer[ExecContainerRequest, ExecContainerResponse]) error - ContainerLogs(*ContainerLogsRequest, grpc.ServerStreamingServer[ContainerLogEntry]) error + ContainerLogs(*LogsRequest, grpc.ServerStreamingServer[LogEntry]) error PullImage(*PullImageRequest, grpc.ServerStreamingServer[JSONMessage]) error InspectImage(context.Context, *InspectImageRequest) (*InspectImageResponse, error) // InspectRemoteImage returns the image metadata for an image in a remote registry using the machine's @@ -343,7 +343,7 @@ func (UnimplementedDockerServer) RemoveContainer(context.Context, *RemoveContain func (UnimplementedDockerServer) ExecContainer(grpc.BidiStreamingServer[ExecContainerRequest, ExecContainerResponse]) error { return status.Errorf(codes.Unimplemented, "method ExecContainer not implemented") } -func (UnimplementedDockerServer) ContainerLogs(*ContainerLogsRequest, grpc.ServerStreamingServer[ContainerLogEntry]) error { +func (UnimplementedDockerServer) ContainerLogs(*LogsRequest, grpc.ServerStreamingServer[LogEntry]) error { return status.Errorf(codes.Unimplemented, "method ContainerLogs not implemented") } func (UnimplementedDockerServer) PullImage(*PullImageRequest, grpc.ServerStreamingServer[JSONMessage]) error { @@ -516,15 +516,15 @@ func _Docker_ExecContainer_Handler(srv interface{}, stream grpc.ServerStream) er type Docker_ExecContainerServer = grpc.BidiStreamingServer[ExecContainerRequest, ExecContainerResponse] func _Docker_ContainerLogs_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(ContainerLogsRequest) + m := new(LogsRequest) if err := stream.RecvMsg(m); err != nil { return err } - return srv.(DockerServer).ContainerLogs(m, &grpc.GenericServerStream[ContainerLogsRequest, ContainerLogEntry]{ServerStream: stream}) + return srv.(DockerServer).ContainerLogs(m, &grpc.GenericServerStream[LogsRequest, LogEntry]{ServerStream: stream}) } // This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type Docker_ContainerLogsServer = grpc.ServerStreamingServer[ContainerLogEntry] +type Docker_ContainerLogsServer = grpc.ServerStreamingServer[LogEntry] func _Docker_PullImage_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(PullImageRequest) diff --git a/internal/machine/api/pb/machine.pb.go b/internal/machine/api/pb/machine.pb.go index 0c34efe3..37d3031b 100644 --- a/internal/machine/api/pb/machine.pb.go +++ b/internal/machine/api/pb/machine.pb.go @@ -1146,7 +1146,7 @@ var file_internal_machine_api_pb_machine_proto_rawDesc = []byte{ 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x49, 0x70, - 0x73, 0x32, 0xe3, 0x04, 0x0a, 0x07, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x4d, 0x0a, + 0x73, 0x32, 0x95, 0x05, 0x0a, 0x07, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x61, 0x70, @@ -1184,11 +1184,14 @@ var file_internal_machine_api_pb_machine_proto_rawDesc = []byte{ 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x37, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x73, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x6b, 0x69, - 0x2f, 0x75, 0x6e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x62, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x0b, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, + 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x30, 0x01, 0x42, 0x37, 0x5a, 0x35, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x73, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x6b, 0x69, 0x2f, 0x75, 0x6e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1227,6 +1230,8 @@ var file_internal_machine_api_pb_machine_proto_goTypes = []any{ (*Metadata)(nil), // 19: api.Metadata (*timestamppb.Timestamp)(nil), // 20: google.protobuf.Timestamp (*emptypb.Empty)(nil), // 21: google.protobuf.Empty + (*LogsRequest)(nil), // 22: api.LogsRequest + (*LogEntry)(nil), // 23: api.LogEntry } var file_internal_machine_api_pb_machine_proto_depIdxs = []int32{ 1, // 0: api.MachineInfo.network:type_name -> api.NetworkConfig @@ -1256,17 +1261,19 @@ var file_internal_machine_api_pb_machine_proto_depIdxs = []int32{ 21, // 24: api.Machine.InspectWireGuardNetwork:input_type -> google.protobuf.Empty 9, // 25: api.Machine.Reset:input_type -> api.ResetRequest 11, // 26: api.Machine.InspectService:input_type -> api.InspectServiceRequest - 2, // 27: api.Machine.CheckPrerequisites:output_type -> api.CheckPrerequisitesResponse - 4, // 28: api.Machine.InitCluster:output_type -> api.InitClusterResponse - 21, // 29: api.Machine.JoinCluster:output_type -> google.protobuf.Empty - 8, // 30: api.Machine.Token:output_type -> api.TokenResponse - 0, // 31: api.Machine.Inspect:output_type -> api.MachineInfo - 6, // 32: api.Machine.InspectMachine:output_type -> api.InspectMachineResponse - 13, // 33: api.Machine.InspectWireGuardNetwork:output_type -> api.InspectWireGuardNetworkResponse - 21, // 34: api.Machine.Reset:output_type -> google.protobuf.Empty - 12, // 35: api.Machine.InspectService:output_type -> api.InspectServiceResponse - 27, // [27:36] is the sub-list for method output_type - 18, // [18:27] is the sub-list for method input_type + 22, // 27: api.Machine.MachineLogs:input_type -> api.LogsRequest + 2, // 28: api.Machine.CheckPrerequisites:output_type -> api.CheckPrerequisitesResponse + 4, // 29: api.Machine.InitCluster:output_type -> api.InitClusterResponse + 21, // 30: api.Machine.JoinCluster:output_type -> google.protobuf.Empty + 8, // 31: api.Machine.Token:output_type -> api.TokenResponse + 0, // 32: api.Machine.Inspect:output_type -> api.MachineInfo + 6, // 33: api.Machine.InspectMachine:output_type -> api.InspectMachineResponse + 13, // 34: api.Machine.InspectWireGuardNetwork:output_type -> api.InspectWireGuardNetworkResponse + 21, // 35: api.Machine.Reset:output_type -> google.protobuf.Empty + 12, // 36: api.Machine.InspectService:output_type -> api.InspectServiceResponse + 23, // 37: api.Machine.MachineLogs:output_type -> api.LogEntry + 28, // [28:38] is the sub-list for method output_type + 18, // [18:28] is the sub-list for method input_type 18, // [18:18] is the sub-list for extension type_name 18, // [18:18] is the sub-list for extension extendee 0, // [0:18] is the sub-list for field type_name diff --git a/internal/machine/api/pb/machine.proto b/internal/machine/api/pb/machine.proto index 1bc9ae63..737386c4 100644 --- a/internal/machine/api/pb/machine.proto +++ b/internal/machine/api/pb/machine.proto @@ -24,6 +24,8 @@ service Machine { rpc Reset(ResetRequest) returns (google.protobuf.Empty); rpc InspectService(InspectServiceRequest) returns (InspectServiceResponse); + + rpc MachineLogs(LogsRequest) returns (stream LogEntry); } message MachineInfo { diff --git a/internal/machine/api/pb/machine_grpc.pb.go b/internal/machine/api/pb/machine_grpc.pb.go index 3f9c19bd..0fc7df01 100644 --- a/internal/machine/api/pb/machine_grpc.pb.go +++ b/internal/machine/api/pb/machine_grpc.pb.go @@ -29,6 +29,7 @@ const ( Machine_InspectWireGuardNetwork_FullMethodName = "/api.Machine/InspectWireGuardNetwork" Machine_Reset_FullMethodName = "/api.Machine/Reset" Machine_InspectService_FullMethodName = "/api.Machine/InspectService" + Machine_MachineLogs_FullMethodName = "/api.Machine/MachineLogs" ) // MachineClient is the client API for Machine service. @@ -49,6 +50,7 @@ type MachineClient interface { // Reset restores the machine to a clean state, removing all cluster-related configuration and data. Reset(ctx context.Context, in *ResetRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) InspectService(ctx context.Context, in *InspectServiceRequest, opts ...grpc.CallOption) (*InspectServiceResponse, error) + MachineLogs(ctx context.Context, in *LogsRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[LogEntry], error) } type machineClient struct { @@ -149,6 +151,25 @@ func (c *machineClient) InspectService(ctx context.Context, in *InspectServiceRe return out, nil } +func (c *machineClient) MachineLogs(ctx context.Context, in *LogsRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[LogEntry], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &Machine_ServiceDesc.Streams[0], Machine_MachineLogs_FullMethodName, cOpts...) + if err != nil { + return nil, err + } + x := &grpc.GenericClientStream[LogsRequest, LogEntry]{ClientStream: stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type Machine_MachineLogsClient = grpc.ServerStreamingClient[LogEntry] + // MachineServer is the server API for Machine service. // All implementations must embed UnimplementedMachineServer // for forward compatibility. @@ -167,6 +188,7 @@ type MachineServer interface { // Reset restores the machine to a clean state, removing all cluster-related configuration and data. Reset(context.Context, *ResetRequest) (*emptypb.Empty, error) InspectService(context.Context, *InspectServiceRequest) (*InspectServiceResponse, error) + MachineLogs(*LogsRequest, grpc.ServerStreamingServer[LogEntry]) error mustEmbedUnimplementedMachineServer() } @@ -204,6 +226,9 @@ func (UnimplementedMachineServer) Reset(context.Context, *ResetRequest) (*emptyp func (UnimplementedMachineServer) InspectService(context.Context, *InspectServiceRequest) (*InspectServiceResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method InspectService not implemented") } +func (UnimplementedMachineServer) MachineLogs(*LogsRequest, grpc.ServerStreamingServer[LogEntry]) error { + return status.Errorf(codes.Unimplemented, "method MachineLogs not implemented") +} func (UnimplementedMachineServer) mustEmbedUnimplementedMachineServer() {} func (UnimplementedMachineServer) testEmbeddedByValue() {} @@ -387,6 +412,17 @@ func _Machine_InspectService_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } +func _Machine_MachineLogs_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(LogsRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(MachineServer).MachineLogs(m, &grpc.GenericServerStream[LogsRequest, LogEntry]{ServerStream: stream}) +} + +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type Machine_MachineLogsServer = grpc.ServerStreamingServer[LogEntry] + // Machine_ServiceDesc is the grpc.ServiceDesc for Machine service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -431,6 +467,12 @@ var Machine_ServiceDesc = grpc.ServiceDesc{ Handler: _Machine_InspectService_Handler, }, }, - Streams: []grpc.StreamDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "MachineLogs", + Handler: _Machine_MachineLogs_Handler, + ServerStreams: true, + }, + }, Metadata: "internal/machine/api/pb/machine.proto", } diff --git a/internal/machine/docker/server.go b/internal/machine/docker/server.go index 9225b150..ece38179 100644 --- a/internal/machine/docker/server.go +++ b/internal/machine/docker/server.go @@ -1078,20 +1078,19 @@ const logsHeartbeatInterval = 200 * time.Millisecond // ContainerLogs streams logs from a container. func (s *Server) ContainerLogs( - req *pb.ContainerLogsRequest, stream grpc.ServerStreamingServer[pb.ContainerLogEntry], + req *pb.LogsRequest, stream grpc.ServerStreamingServer[pb.LogEntry], ) error { // Stream context is cancelled when the client has disconnected or the stream has ended. ctx := stream.Context() - opts := ContainerLogsOptions{ - ContainerID: req.ContainerId, - Follow: req.Follow, - Tail: int(req.Tail), - Since: req.Since, - Until: req.Until, + opts := api.ServiceLogsOptions{ + Follow: req.Follow, + Tail: int(req.Tail), + Since: req.Since, + Until: req.Until, } - logsCh, err := s.service.ContainerLogs(ctx, opts) + logsCh, err := s.service.ContainerLogs(ctx, req.Id, opts) if err != nil { if errdefs.IsNotFound(err) { return status.Error(codes.NotFound, err.Error()) @@ -1099,7 +1098,7 @@ func (s *Server) ContainerLogs( return status.Errorf(codes.Internal, "get container logs: %v", err) } - log := slog.With("container_id", req.ContainerId, "stream_id", fmt.Sprintf("%p", stream)[2:]) + log := slog.With("container_id", req.Id, "stream_id", fmt.Sprintf("%p", stream)[2:]) log.Debug("Starting container logs streaming.", "follow", req.Follow, "tail", req.Tail, "since", req.Since, "until", req.Until) @@ -1127,7 +1126,7 @@ func (s *Server) ContainerLogs( return status.Error(codes.Internal, entry.Err.Error()) } - pbEntry := &pb.ContainerLogEntry{ + pbEntry := &pb.LogEntry{ Stream: api.LogStreamTypeToProto(entry.Stream), Timestamp: timestamppb.New(entry.Timestamp), Message: entry.Message, @@ -1148,8 +1147,8 @@ func (s *Server) ContainerLogs( // Use the timestamp one heartbeat in the past to be conservative. This reduces the chance of sending // a timestamp that is greater than a log entry currently being parsed but not yet sent, which would // cause the client to incorrectly believe it has received all logs up to that point. - heartbeat := &pb.ContainerLogEntry{ - Stream: pb.ContainerLogEntry_HEARTBEAT, + heartbeat := &pb.LogEntry{ + Stream: pb.LogEntry_HEARTBEAT, Timestamp: timestamppb.New(now.Add(-logsHeartbeatInterval)), } if err = stream.Send(heartbeat); err != nil { diff --git a/internal/machine/docker/service.go b/internal/machine/docker/service.go index c77bb18a..4b736e1e 100644 --- a/internal/machine/docker/service.go +++ b/internal/machine/docker/service.go @@ -155,18 +155,9 @@ func (s *Service) ListImages(ctx context.Context, opts image.ListOptions) (Image return imagesResp, nil } -// ContainerLogsOptions specifies parameters for ContainerLogs. -type ContainerLogsOptions struct { - ContainerID string - Follow bool - Tail int - Since string - Until string -} - // ContainerLogs streams logs from a container and returns demultiplexed entries via a channel. // The channel is closed when streaming completes or context is cancelled. -func (s *Service) ContainerLogs(ctx context.Context, opts ContainerLogsOptions) (<-chan api.ContainerLogEntry, error) { +func (s *Service) ContainerLogs(ctx context.Context, containerID string, opts api.ServiceLogsOptions) (<-chan api.LogEntry, error) { dockerOpts := container.LogsOptions{ ShowStdout: true, ShowStderr: true, @@ -177,12 +168,12 @@ func (s *Service) ContainerLogs(ctx context.Context, opts ContainerLogsOptions) Timestamps: true, } - reader, err := s.Client.ContainerLogs(ctx, opts.ContainerID, dockerOpts) + reader, err := s.Client.ContainerLogs(ctx, containerID, dockerOpts) if err != nil { return nil, err } - outCh := make(chan api.ContainerLogEntry) + outCh := make(chan api.LogEntry) stdoutWriter := &logsChannelWriter{ctx: ctx, ch: outCh, isStderr: false} stderrWriter := &logsChannelWriter{ctx: ctx, ch: outCh, isStderr: true} @@ -198,7 +189,7 @@ func (s *Service) ContainerLogs(ctx context.Context, opts ContainerLogsOptions) if _, err := stdcopy.StdCopy(stdoutWriter, stderrWriter, reader); err != nil { // Send error as the last entry. select { - case outCh <- api.ContainerLogEntry{Err: fmt.Errorf("demultiplex container logs: %w", err)}: + case outCh <- api.LogEntry{Err: fmt.Errorf("demultiplex container logs: %w", err)}: case <-ctx.Done(): } } @@ -216,7 +207,7 @@ func (s *Service) ContainerLogs(ctx context.Context, opts ContainerLogsOptions) // logsChannelWriter is a writer for stdcopy.StdCopy that sends demultiplexed container logs to a channel. type logsChannelWriter struct { ctx context.Context - ch chan<- api.ContainerLogEntry + ch chan<- api.LogEntry isStderr bool } @@ -236,7 +227,7 @@ func (w *logsChannelWriter) Write(data []byte) (n int, err error) { } } - entry := api.ContainerLogEntry{ + entry := api.LogEntry{ Timestamp: timestamp, // Clone is required because message is a slice into data, which stdcopy.StdCopy may reuse // after Write returns but before the entry is consumed from the channel. diff --git a/internal/machine/machine.go b/internal/machine/machine.go index 2d2dc502..0c0f730c 100644 --- a/internal/machine/machine.go +++ b/internal/machine/machine.go @@ -14,12 +14,15 @@ import ( "slices" "strconv" "sync" + "time" + "github.com/containerd/errdefs" "github.com/docker/docker/client" "github.com/docker/go-connections/sockets" "github.com/psviderski/uncloud/internal/corrosion" "github.com/psviderski/uncloud/internal/docker" "github.com/psviderski/uncloud/internal/fs" + "github.com/psviderski/uncloud/internal/journal" "github.com/psviderski/uncloud/internal/machine/api/pb" apiproxy "github.com/psviderski/uncloud/internal/machine/api/proxy" "github.com/psviderski/uncloud/internal/machine/caddyconfig" @@ -30,6 +33,7 @@ import ( machinedocker "github.com/psviderski/uncloud/internal/machine/docker" "github.com/psviderski/uncloud/internal/machine/network" "github.com/psviderski/uncloud/internal/machine/store" + "github.com/psviderski/uncloud/pkg/api" "github.com/psviderski/unregistry" "github.com/siderolabs/grpc-proxy/proxy" "golang.org/x/sync/errgroup" @@ -1073,3 +1077,93 @@ func (m *Machine) InspectService( } return &pb.InspectServiceResponse{Service: svc}, nil } + +// logsHeartbeatInterval is the interval at which heartbeat entries are sent when there are no logs to stream. +const logsHeartbeatInterval = 200 * time.Millisecond + +// MachineLogs streams logs from a systemd service. +func (s *Machine) MachineLogs( + req *pb.LogsRequest, stream grpc.ServerStreamingServer[pb.LogEntry], +) error { + // TODO(miek): almost duplicate of docker/server.ContainerLogs + ctx := stream.Context() + + opts := api.ServiceLogsOptions{ + Follow: req.Follow, + Tail: int(req.Tail), + Since: req.Since, + Until: req.Until, + } + + logsCh, err := journal.Logs(ctx, req.Id, opts) + if err != nil { + if errdefs.IsNotFound(err) { + return status.Error(codes.NotFound, err.Error()) + } + return status.Errorf(codes.Internal, "get journal logs: %v", err) + } + + log := slog.With("unit", req.Id, "stream_id", fmt.Sprintf("%p", stream)[2:]) + log.Debug("Starting systemd service logs streaming.", + "follow", req.Follow, "tail", req.Tail, "since", req.Since, "until", req.Until) + + // Heartbeats are needed only when following logs to let the client know when there are no new log entries + // to allow it to advance the watermark of last received log timestamp. + var heartbeatCh <-chan time.Time + if req.Follow { + heartbeatTicker := time.NewTicker(logsHeartbeatInterval) + defer heartbeatTicker.Stop() + heartbeatCh = heartbeatTicker.C + } + + started := time.Now() + lastSent := time.Time{} + + for { + select { + case entry, ok := <-logsCh: + if !ok { + // Channel closed, no more log entries. + return nil + } + + if entry.Err != nil { + return status.Error(codes.Internal, entry.Err.Error()) + } + + pbEntry := &pb.LogEntry{ + Stream: api.LogStreamTypeToProto(entry.Stream), + Timestamp: timestamppb.New(entry.Timestamp), + Message: entry.Message, + } + if err = stream.Send(pbEntry); err != nil { + return status.Errorf(codes.Internal, "send log entry: %v", err) + } + lastSent = entry.Timestamp + + case now := <-heartbeatCh: + // Only send heartbeat if no log entries have been sent since the last heartbeat interval or + // if no log entries have been sent at all for at least a heartbeat interval since starting. + if now.Sub(lastSent) < logsHeartbeatInterval || + (lastSent.IsZero() && now.Sub(started) < logsHeartbeatInterval) { + continue + } + + // Use the timestamp one heartbeat in the past to be conservative. This reduces the chance of sending + // a timestamp that is greater than a log entry currently being parsed but not yet sent, which would + // cause the client to incorrectly believe it has received all logs up to that point. + heartbeat := &pb.LogEntry{ + Stream: pb.LogEntry_HEARTBEAT, + Timestamp: timestamppb.New(now.Add(-logsHeartbeatInterval)), + } + if err = stream.Send(heartbeat); err != nil { + return status.Errorf(codes.Internal, "send log stream heartbeat: %v", err) + } + lastSent = heartbeat.Timestamp.AsTime() + log.Debug("Sent log stream heartbeat.", "timestamp", lastSent) + + case <-ctx.Done(): + return status.Error(codes.Canceled, ctx.Err().Error()) + } + } +} diff --git a/pkg/api/logs.go b/pkg/api/logs.go index c0de7e0f..f36d88cd 100644 --- a/pkg/api/logs.go +++ b/pkg/api/logs.go @@ -18,31 +18,31 @@ const ( type LogStreamType int -// LogStreamTypeFromProto converts a protobuf ContainerLogEntry.StreamType to the internal LogStreamType. -func LogStreamTypeFromProto(s pb.ContainerLogEntry_StreamType) LogStreamType { +// LogStreamTypeFromProto converts a protobuf LogEntry.StreamType to the internal LogStreamType. +func LogStreamTypeFromProto(s pb.LogEntry_StreamType) LogStreamType { switch s { - case pb.ContainerLogEntry_STDOUT: + case pb.LogEntry_STDOUT: return LogStreamStdout - case pb.ContainerLogEntry_STDERR: + case pb.LogEntry_STDERR: return LogStreamStderr - case pb.ContainerLogEntry_HEARTBEAT: + case pb.LogEntry_HEARTBEAT: return LogStreamHeartbeat default: return LogStreamUnknown } } -// LogStreamTypeToProto converts LogStreamType to protobuf ContainerLogEntry.StreamType. -func LogStreamTypeToProto(s LogStreamType) pb.ContainerLogEntry_StreamType { +// LogStreamTypeToProto converts LogStreamType to protobuf LogEntry.StreamType. +func LogStreamTypeToProto(s LogStreamType) pb.LogEntry_StreamType { switch s { case LogStreamStdout: - return pb.ContainerLogEntry_STDOUT + return pb.LogEntry_STDOUT case LogStreamStderr: - return pb.ContainerLogEntry_STDERR + return pb.LogEntry_STDERR case LogStreamHeartbeat: - return pb.ContainerLogEntry_HEARTBEAT + return pb.LogEntry_HEARTBEAT default: - return pb.ContainerLogEntry_UNKNOWN + return pb.LogEntry_UNKNOWN } } @@ -61,7 +61,7 @@ type ServiceLogsOptions struct { type ServiceLogEntry struct { // Metadata may not be set if an error occurred (Err is not nil). Metadata ServiceLogEntryMetadata - ContainerLogEntry + LogEntry } // ServiceLogEntryMetadata contains metadata about the source of a log entry. @@ -73,8 +73,8 @@ type ServiceLogEntryMetadata struct { MachineName string } -// ContainerLogEntry represents a single log entry from a container. -type ContainerLogEntry struct { +// LogEntry represents a single log entry from a container or a service. +type LogEntry struct { Stream LogStreamType Timestamp time.Time Message []byte diff --git a/pkg/client/logmerger.go b/pkg/client/logmerger.go index b54ebad6..e2adc574 100644 --- a/pkg/client/logmerger.go +++ b/pkg/client/logmerger.go @@ -214,7 +214,7 @@ func (m *LogMerger) run() { for _, s := range stalled { errEntry := api.ServiceLogEntry{ - ContainerLogEntry: api.ContainerLogEntry{ + LogEntry: api.LogEntry{ Err: api.ErrLogStreamStalled, }, } diff --git a/pkg/client/logmerger_test.go b/pkg/client/logmerger_test.go index 2130811c..15899a87 100644 --- a/pkg/client/logmerger_test.go +++ b/pkg/client/logmerger_test.go @@ -12,7 +12,7 @@ import ( // testEntry creates a ServiceLogEntry for testing. func testEntry(stream api.LogStreamType, ts time.Time, msg string) api.ServiceLogEntry { return api.ServiceLogEntry{ - ContainerLogEntry: api.ContainerLogEntry{ + LogEntry: api.LogEntry{ Stream: stream, Timestamp: ts, Message: []byte(msg), @@ -91,7 +91,7 @@ func TestLogMerger_PreservesData(t *testing.T) { e := api.ServiceLogEntry{ Metadata: metadata, - ContainerLogEntry: api.ContainerLogEntry{ + LogEntry: api.LogEntry{ Stream: api.LogStreamStdout, Timestamp: time.Now(), Message: []byte("test"), @@ -199,7 +199,7 @@ func TestLogMerger_ErrorForwarding(t *testing.T) { ch1 <- testEntry(api.LogStreamStdout, t1, "ch1-first") // Send an error entry. ch1 <- api.ServiceLogEntry{ - ContainerLogEntry: api.ContainerLogEntry{ + LogEntry: api.LogEntry{ Err: assert.AnError, }, } diff --git a/pkg/client/logs.go b/pkg/client/logs.go index 48dbf4f5..8414e7bc 100644 --- a/pkg/client/logs.go +++ b/pkg/client/logs.go @@ -81,18 +81,18 @@ func (cli *Client) ServiceLogs( // ContainerLogs streams log entries from a single container on a specified machine. func (cli *Client) ContainerLogs( ctx context.Context, machineNameOrID string, containerID string, opts api.ServiceLogsOptions, -) (<-chan api.ContainerLogEntry, error) { +) (<-chan api.LogEntry, error) { proxyCtx, _, err := cli.ProxyMachinesContext(ctx, []string{machineNameOrID}) if err != nil { return nil, fmt.Errorf("create request context to proxy to machine '%s': %w", machineNameOrID, err) } - req := &pb.ContainerLogsRequest{ - ContainerId: containerID, - Follow: opts.Follow, - Tail: int32(opts.Tail), - Since: opts.Since, - Until: opts.Until, + req := &pb.LogsRequest{ + Id: containerID, + Follow: opts.Follow, + Tail: int32(opts.Tail), + Since: opts.Since, + Until: opts.Until, } if !opts.Follow && opts.Tail == 0 { // If not following and tail is 0, set tail to -1 to return all logs. @@ -105,7 +105,7 @@ func (cli *Client) ContainerLogs( return nil, err } - ch := make(chan api.ContainerLogEntry) + ch := make(chan api.LogEntry) go func() { defer close(ch) @@ -116,13 +116,13 @@ func (cli *Client) ContainerLogs( return } if err != nil { - ch <- api.ContainerLogEntry{ + ch <- api.LogEntry{ Err: err, } return } - entry := api.ContainerLogEntry{ + entry := api.LogEntry{ Stream: api.LogStreamTypeFromProto(pbEntry.Stream), Message: pbEntry.Message, Timestamp: pbEntry.Timestamp.AsTime(), @@ -141,15 +141,15 @@ func (cli *Client) ContainerLogs( // logsStreamWithServiceMetadata wraps a container logs stream and enriches each log entry with service metadata. func logsStreamWithServiceMetadata( - stream <-chan api.ContainerLogEntry, metadata api.ServiceLogEntryMetadata, + stream <-chan api.LogEntry, metadata api.ServiceLogEntryMetadata, ) <-chan api.ServiceLogEntry { out := make(chan api.ServiceLogEntry) go func() { for entry := range stream { out <- api.ServiceLogEntry{ - Metadata: metadata, - ContainerLogEntry: entry, + Metadata: metadata, + LogEntry: entry, } } close(out)