metropolis/pkg/logtree: move logtree protobuf definition to logtree pkg

Before this change we had the LogEntry message inside the metropolis
common proto file. This splits it out into the logtree package to make
it standalone in a future change.

Change-Id: Idb26a829d6174efa946a6c4ce0f1b984cb2f18a2
Reviewed-on: https://review.monogon.dev/c/monogon/+/3080
Tested-by: Jenkins CI
Reviewed-by: Serge Bazanski <serge@monogon.tech>
diff --git a/metropolis/pkg/logbuffer/BUILD.bazel b/metropolis/pkg/logbuffer/BUILD.bazel
index e890df8..8433802 100644
--- a/metropolis/pkg/logbuffer/BUILD.bazel
+++ b/metropolis/pkg/logbuffer/BUILD.bazel
@@ -8,7 +8,7 @@
     ],
     importpath = "source.monogon.dev/metropolis/pkg/logbuffer",
     visibility = ["//metropolis:__subpackages__"],
-    deps = ["//metropolis/proto/common"],
+    deps = ["//metropolis/pkg/logtree/proto"],
 )
 
 go_test(
diff --git a/metropolis/pkg/logbuffer/linebuffer.go b/metropolis/pkg/logbuffer/linebuffer.go
index 92b70e9..3892e0c 100644
--- a/metropolis/pkg/logbuffer/linebuffer.go
+++ b/metropolis/pkg/logbuffer/linebuffer.go
@@ -22,7 +22,7 @@
 	"strings"
 	"sync"
 
-	cpb "source.monogon.dev/metropolis/proto/common"
+	lpb "source.monogon.dev/metropolis/pkg/logtree/proto"
 )
 
 // Line is a line stored in the log buffer - a string, that has been perhaps
@@ -47,15 +47,15 @@
 }
 
 // ProtoLog returns a Logging-specific protobuf structure.
-func (l *Line) ProtoLog() *cpb.LogEntry_Raw {
-	return &cpb.LogEntry_Raw{
+func (l *Line) ProtoLog() *lpb.LogEntry_Raw {
+	return &lpb.LogEntry_Raw{
 		Data:           l.Data,
 		OriginalLength: int64(l.OriginalLength),
 	}
 }
 
 // LineFromLogProto converts a Logging-specific protobuf message back into a Line.
-func LineFromLogProto(raw *cpb.LogEntry_Raw) (*Line, error) {
+func LineFromLogProto(raw *lpb.LogEntry_Raw) (*Line, error) {
 	if raw.OriginalLength < int64(len(raw.Data)) {
 		return nil, fmt.Errorf("original_length smaller than length of data")
 	}
diff --git a/metropolis/pkg/logtree/BUILD.bazel b/metropolis/pkg/logtree/BUILD.bazel
index 595e8cf..a2f86ad 100644
--- a/metropolis/pkg/logtree/BUILD.bazel
+++ b/metropolis/pkg/logtree/BUILD.bazel
@@ -24,7 +24,7 @@
     visibility = ["//visibility:public"],
     deps = [
         "//metropolis/pkg/logbuffer",
-        "//metropolis/proto/common",
+        "//metropolis/pkg/logtree/proto",
         "@com_github_mitchellh_go_wordwrap//:go-wordwrap",
         "@org_golang_google_grpc//grpclog",
         "@org_golang_google_protobuf//types/known/timestamppb",
diff --git a/metropolis/pkg/logtree/leveled.go b/metropolis/pkg/logtree/leveled.go
index 5c57222..0facbb1 100644
--- a/metropolis/pkg/logtree/leveled.go
+++ b/metropolis/pkg/logtree/leveled.go
@@ -19,7 +19,7 @@
 import (
 	"fmt"
 
-	cpb "source.monogon.dev/metropolis/proto/common"
+	lpb "source.monogon.dev/metropolis/pkg/logtree/proto"
 )
 
 // LeveledLogger is a generic interface for glog-style logging. There are four
@@ -144,32 +144,32 @@
 	}
 }
 
-func SeverityFromProto(s cpb.LeveledLogSeverity) (Severity, error) {
+func SeverityFromProto(s lpb.LeveledLogSeverity) (Severity, error) {
 	switch s {
-	case cpb.LeveledLogSeverity_INFO:
+	case lpb.LeveledLogSeverity_INFO:
 		return INFO, nil
-	case cpb.LeveledLogSeverity_WARNING:
+	case lpb.LeveledLogSeverity_WARNING:
 		return WARNING, nil
-	case cpb.LeveledLogSeverity_ERROR:
+	case lpb.LeveledLogSeverity_ERROR:
 		return ERROR, nil
-	case cpb.LeveledLogSeverity_FATAL:
+	case lpb.LeveledLogSeverity_FATAL:
 		return FATAL, nil
 	default:
 		return "", fmt.Errorf("unknown severity value %d", s)
 	}
 }
 
-func (s Severity) ToProto() cpb.LeveledLogSeverity {
+func (s Severity) ToProto() lpb.LeveledLogSeverity {
 	switch s {
 	case INFO:
-		return cpb.LeveledLogSeverity_INFO
+		return lpb.LeveledLogSeverity_INFO
 	case WARNING:
-		return cpb.LeveledLogSeverity_WARNING
+		return lpb.LeveledLogSeverity_WARNING
 	case ERROR:
-		return cpb.LeveledLogSeverity_ERROR
+		return lpb.LeveledLogSeverity_ERROR
 	case FATAL:
-		return cpb.LeveledLogSeverity_FATAL
+		return lpb.LeveledLogSeverity_FATAL
 	default:
-		return cpb.LeveledLogSeverity_INVALID
+		return lpb.LeveledLogSeverity_INVALID
 	}
 }
diff --git a/metropolis/pkg/logtree/leveled_payload.go b/metropolis/pkg/logtree/leveled_payload.go
index e2b2ff1..b4a0630 100644
--- a/metropolis/pkg/logtree/leveled_payload.go
+++ b/metropolis/pkg/logtree/leveled_payload.go
@@ -24,7 +24,7 @@
 
 	tpb "google.golang.org/protobuf/types/known/timestamppb"
 
-	cpb "source.monogon.dev/metropolis/proto/common"
+	lpb "source.monogon.dev/metropolis/pkg/logtree/proto"
 )
 
 // LeveledPayload is a log entry for leveled logs (as per leveled.go). It contains
@@ -114,8 +114,8 @@
 func (p *LeveledPayload) Severity() Severity { return p.severity }
 
 // Proto converts a LeveledPayload to protobuf format.
-func (p *LeveledPayload) Proto() *cpb.LogEntry_Leveled {
-	return &cpb.LogEntry_Leveled{
+func (p *LeveledPayload) Proto() *lpb.LogEntry_Leveled {
+	return &lpb.LogEntry_Leveled{
 		Lines:     p.Messages(),
 		Timestamp: tpb.New(p.Timestamp()),
 		Severity:  p.Severity().ToProto(),
@@ -124,7 +124,7 @@
 }
 
 // LeveledPayloadFromProto parses a protobuf message into the internal format.
-func LeveledPayloadFromProto(p *cpb.LogEntry_Leveled) (*LeveledPayload, error) {
+func LeveledPayloadFromProto(p *lpb.LogEntry_Leveled) (*LeveledPayload, error) {
 	severity, err := SeverityFromProto(p.Severity)
 	if err != nil {
 		return nil, fmt.Errorf("could not convert severity: %w", err)
diff --git a/metropolis/pkg/logtree/logtree_entry.go b/metropolis/pkg/logtree/logtree_entry.go
index 6bd8752..d1c700e 100644
--- a/metropolis/pkg/logtree/logtree_entry.go
+++ b/metropolis/pkg/logtree/logtree_entry.go
@@ -23,7 +23,7 @@
 	"github.com/mitchellh/go-wordwrap"
 
 	"source.monogon.dev/metropolis/pkg/logbuffer"
-	cpb "source.monogon.dev/metropolis/proto/common"
+	lpb "source.monogon.dev/metropolis/pkg/logtree/proto"
 )
 
 // LogEntry contains a log entry, combining both leveled and raw logging into a
@@ -207,19 +207,19 @@
 
 // Proto converts this LogEntry to proto. Returned value may be nil if given
 // LogEntry is invalid, eg. contains neither a Raw nor Leveled entry.
-func (l *LogEntry) Proto() *cpb.LogEntry {
-	p := &cpb.LogEntry{
+func (l *LogEntry) Proto() *lpb.LogEntry {
+	p := &lpb.LogEntry{
 		Dn: string(l.DN),
 	}
 	switch {
 	case l.Leveled != nil:
 		leveled := l.Leveled
-		p.Kind = &cpb.LogEntry_Leveled_{
+		p.Kind = &lpb.LogEntry_Leveled_{
 			Leveled: leveled.Proto(),
 		}
 	case l.Raw != nil:
 		raw := l.Raw
-		p.Kind = &cpb.LogEntry_Raw_{
+		p.Kind = &lpb.LogEntry_Raw_{
 			Raw: raw.ProtoLog(),
 		}
 	default:
@@ -231,7 +231,7 @@
 // LogEntryFromProto parses a proto LogEntry back into internal structure.
 // This can be used in log proto API consumers to easily print received log
 // entries.
-func LogEntryFromProto(l *cpb.LogEntry) (*LogEntry, error) {
+func LogEntryFromProto(l *lpb.LogEntry) (*LogEntry, error) {
 	dn := DN(l.Dn)
 	if _, err := dn.Path(); err != nil {
 		return nil, fmt.Errorf("could not convert DN: %w", err)
@@ -240,13 +240,13 @@
 		DN: dn,
 	}
 	switch inner := l.Kind.(type) {
-	case *cpb.LogEntry_Leveled_:
+	case *lpb.LogEntry_Leveled_:
 		leveled, err := LeveledPayloadFromProto(inner.Leveled)
 		if err != nil {
 			return nil, fmt.Errorf("could not convert leveled entry: %w", err)
 		}
 		res.Leveled = leveled
-	case *cpb.LogEntry_Raw_:
+	case *lpb.LogEntry_Raw_:
 		line, err := logbuffer.LineFromLogProto(inner.Raw)
 		if err != nil {
 			return nil, fmt.Errorf("could not convert raw entry: %w", err)
diff --git a/metropolis/pkg/logtree/proto/BUILD.bazel b/metropolis/pkg/logtree/proto/BUILD.bazel
new file mode 100644
index 0000000..e7f8c82
--- /dev/null
+++ b/metropolis/pkg/logtree/proto/BUILD.bazel
@@ -0,0 +1,24 @@
+load("@rules_proto//proto:defs.bzl", "proto_library")
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
+
+proto_library(
+    name = "proto_proto",
+    srcs = ["logtree.proto"],
+    visibility = ["//visibility:public"],
+    deps = ["@com_google_protobuf//:timestamp_proto"],
+)
+
+go_proto_library(
+    name = "proto_go_proto",
+    importpath = "source.monogon.dev/metropolis/pkg/logtree/proto",
+    proto = ":proto_proto",
+    visibility = ["//visibility:public"],
+)
+
+go_library(
+    name = "proto",
+    embed = [":proto_go_proto"],
+    importpath = "source.monogon.dev/metropolis/pkg/logtree/proto",
+    visibility = ["//visibility:public"],
+)
diff --git a/metropolis/pkg/logtree/proto/gomod-generated-placeholder.go b/metropolis/pkg/logtree/proto/gomod-generated-placeholder.go
new file mode 100644
index 0000000..92256db
--- /dev/null
+++ b/metropolis/pkg/logtree/proto/gomod-generated-placeholder.go
@@ -0,0 +1 @@
+package proto
diff --git a/metropolis/pkg/logtree/proto/logtree.proto b/metropolis/pkg/logtree/proto/logtree.proto
new file mode 100644
index 0000000..7586187
--- /dev/null
+++ b/metropolis/pkg/logtree/proto/logtree.proto
@@ -0,0 +1,59 @@
+// Copyright 2020 The Monogon Project Authors.
+//
+// SPDX-License-Identifier: Apache-2.0
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+package metropolis.pkg.logtree.proto;
+option go_package = "source.monogon.dev/metropolis/pkg/logtree/proto";
+
+import "google/protobuf/timestamp.proto";
+
+// Severity level corresponding to //metropolis/pkg/logtree.Severity.
+enum LeveledLogSeverity {
+  INVALID = 0;
+  INFO = 1;
+  WARNING = 2;
+  ERROR = 3;
+  FATAL = 4;
+}
+
+// LogEntry corresponding to logtree.LogEntry in //metropolis/pkg/logtree.
+message LogEntry {
+  // A leveled log entry emitted from a compatible system, eg. Metorpolis code
+  // or a klog-parsed line.
+  message Leveled {
+    repeated string lines = 1;
+    google.protobuf.Timestamp timestamp = 2;
+    LeveledLogSeverity severity = 3;
+    // Source of the error, expressed as file:line.
+    string location = 4;
+  }
+  // Raw log entry, captured from an external system without parting. Might
+  // contain some timestamp/level/origin information embedded in data. Data
+  // contained within should be treated as unsanitized external data.
+  message Raw {
+    string data = 1;
+    // Original length of line, set if data was truncated.
+    int64 original_length = 2;
+  }
+
+  // Origin DN (Distinguished Name), a unique identifier which is provided by
+  // the supervisor system.
+  string dn = 1;
+  oneof kind {
+    Leveled leveled = 2;
+    Raw raw = 3;
+  }
+}