From dc4cd669fcf90e758927d5ebbc79d3fb1547c597 Mon Sep 17 00:00:00 2001 From: Fabricio Voznika Date: Wed, 3 Aug 2022 14:30:26 -0700 Subject: [PATCH] Add sinks to `runsc trace metadata` output Updates #4805 PiperOrigin-RevId: 465150097 --- pkg/sentry/seccheck/config.go | 2 +- pkg/sentry/seccheck/metadata.go | 12 +++++++----- pkg/sentry/seccheck/metadata_test.go | 2 +- runsc/cmd/trace/metadata.go | 5 +++++ test/trace/config/config.go | 19 ++++++++++++++++--- 5 files changed, 30 insertions(+), 10 deletions(-) diff --git a/pkg/sentry/seccheck/config.go b/pkg/sentry/seccheck/config.go index 54a865457..81e505d62 100644 --- a/pkg/sentry/seccheck/config.go +++ b/pkg/sentry/seccheck/config.go @@ -225,7 +225,7 @@ func setFields(names []string, fields []FieldDesc) (FieldMask, error) { } func findSinkDesc(name string) (SinkDesc, error) { - if desc, ok := sinks[name]; ok { + if desc, ok := Sinks[name]; ok { return desc, nil } return SinkDesc{}, fmt.Errorf("sink %q not found", name) diff --git a/pkg/sentry/seccheck/metadata.go b/pkg/sentry/seccheck/metadata.go index 2e19ec65c..2267608ac 100644 --- a/pkg/sentry/seccheck/metadata.go +++ b/pkg/sentry/seccheck/metadata.go @@ -61,11 +61,13 @@ const ( FieldSentryExecveBinaryInfo Field = iota ) -// Points is a map with all the Points registered in the system. +// Points is a map with all the trace points registered in the system. var Points = map[string]PointDesc{} -var sinks = map[string]SinkDesc{} -// defaultContextFields are the fields present in most Points. +// Sinks is a map with all the sinks registered in the system. +var Sinks = map[string]SinkDesc{} + +// defaultContextFields are the fields present in most trace points. var defaultContextFields = []FieldDesc{ { ID: FieldCtxtTime, @@ -122,10 +124,10 @@ type SinkDesc struct { // RegisterSink registers a new sink to make it discoverable. func RegisterSink(sink SinkDesc) { - if _, ok := sinks[sink.Name]; ok { + if _, ok := Sinks[sink.Name]; ok { panic(fmt.Sprintf("Sink %q already registered", sink.Name)) } - sinks[sink.Name] = sink + Sinks[sink.Name] = sink } // PointDesc describes a Point that is available to be configured. diff --git a/pkg/sentry/seccheck/metadata_test.go b/pkg/sentry/seccheck/metadata_test.go index 7dafe471b..0ef031141 100644 --- a/pkg/sentry/seccheck/metadata_test.go +++ b/pkg/sentry/seccheck/metadata_test.go @@ -21,7 +21,7 @@ import ( func TestSinkRegistration(t *testing.T) { sink := SinkDesc{Name: "test"} RegisterSink(sink) - if _, ok := sinks["test"]; !ok { + if _, ok := Sinks["test"]; !ok { t.Errorf("sink registration failed") } diff --git a/runsc/cmd/trace/metadata.go b/runsc/cmd/trace/metadata.go index 868f3ffff..28b21fa1f 100644 --- a/runsc/cmd/trace/metadata.go +++ b/runsc/cmd/trace/metadata.go @@ -64,6 +64,11 @@ func (l *metadata) Execute(context.Context, *flag.FlagSet, ...interface{}) subco ctxFields := fieldNames(pt.ContextFields) fmt.Printf("Name: %s, optional fields: [%s], context fields: [%s]\n", pt.Name, strings.Join(optFields, "|"), strings.Join(ctxFields, "|")) } + fmt.Printf("\nSINKS (%d)\n", len(seccheck.Sinks)) + for _, sink := range seccheck.Sinks { + fmt.Printf("Name: %s\n", sink.Name) + } + return subcommands.ExitSuccess } diff --git a/test/trace/config/config.go b/test/trace/config/config.go index c3f4343d7..94861be0a 100644 --- a/test/trace/config/config.go +++ b/test/trace/config/config.go @@ -61,14 +61,24 @@ func (b *Builder) LoadAllPoints(runscPath string) error { // The command above produces an output like the following: // POINTS (907) // Name: container/start, optional fields: [], context fields: [time|thread_id] + // + // SINKS (2) + // Name: remote scanner := bufio.NewScanner(bytes.NewReader(out)) if !scanner.Scan() { return fmt.Errorf("%q returned empty", cmd) } - if !scanner.Scan() { - return fmt.Errorf("%q returned empty", cmd) + if line := scanner.Text(); !strings.HasPrefix(line, "POINTS (") { + return fmt.Errorf("%q missing POINTS header: %q", cmd, line) } - for line := scanner.Text(); scanner.Scan(); line = scanner.Text() { + for scanner.Scan() { + line := scanner.Text() + if len(line) == 0 { + continue // Skip empty lines. + } + if strings.HasPrefix(line, "SINKS (") { + break // Starting SINKS section, POINTS section is over. + } elems := strings.Split(line, ",") if len(elems) != 3 { return fmt.Errorf("invalid line: %q", line) @@ -88,6 +98,9 @@ func (b *Builder) LoadAllPoints(runscPath string) error { ContextFields: ctxFields, }) } + if len(b.points) == 0 { + return fmt.Errorf("%q returned no points", cmd) + } return scanner.Err() }