diff --git a/api/resource/definitions/runtime/runtime.proto b/api/resource/definitions/runtime/runtime.proto index d2bfe0045..c4e2faa6e 100755 --- a/api/resource/definitions/runtime/runtime.proto +++ b/api/resource/definitions/runtime/runtime.proto @@ -12,6 +12,11 @@ message DevicesStatusSpec { bool ready = 1; } +// EventSinkConfigSpec describes configuration of Talos event log streaming. +message EventSinkConfigSpec { + string endpoint = 1; +} + // KernelModuleSpecSpec describes Linux kernel module to load. message KernelModuleSpecSpec { string name = 1; @@ -31,7 +36,7 @@ message KernelParamStatusSpec { bool unsupported = 3; } -// KmsgLogConfigSpec describes status of the defined sysctls. +// KmsgLogConfigSpec describes configuration for kmsg log streaming. message KmsgLogConfigSpec { repeated common.URL destinations = 1; } diff --git a/internal/app/machined/pkg/controllers/runtime/events_sink.go b/internal/app/machined/pkg/controllers/runtime/events_sink.go index a31dfb84f..f955b770b 100644 --- a/internal/app/machined/pkg/controllers/runtime/events_sink.go +++ b/internal/app/machined/pkg/controllers/runtime/events_sink.go @@ -7,35 +7,32 @@ package runtime import ( "context" "fmt" - "sync/atomic" "github.com/cosi-project/runtime/pkg/controller" - "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/safe" "github.com/cosi-project/runtime/pkg/state" "github.com/rs/xid" + "github.com/siderolabs/gen/channel" "github.com/siderolabs/go-pointer" - "github.com/siderolabs/go-procfs/procfs" "github.com/siderolabs/siderolink/api/events" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/protobuf/types/known/anypb" - "github.com/siderolabs/talos/internal/app/machined/pkg/runtime" - "github.com/siderolabs/talos/pkg/machinery/constants" + networkutils "github.com/siderolabs/talos/internal/app/machined/pkg/controllers/network/utils" + machinedruntime "github.com/siderolabs/talos/internal/app/machined/pkg/runtime" "github.com/siderolabs/talos/pkg/machinery/resources/network" + "github.com/siderolabs/talos/pkg/machinery/resources/runtime" ) // EventsSinkController watches events and forwards them to the events sink server // if it's configured. type EventsSinkController struct { - V1Alpha1Events runtime.Watcher - Cmdline *procfs.Cmdline - Drainer *runtime.Drainer + V1Alpha1Events machinedruntime.Watcher + Drainer *machinedruntime.Drainer - drainSub *runtime.DrainSubscription - drain bool - backlog atomic.Int32 + drainSub *machinedruntime.DrainSubscription eventID xid.ID } @@ -46,14 +43,7 @@ func (ctrl *EventsSinkController) Name() string { // Inputs implements controller.Controller interface. func (ctrl *EventsSinkController) Inputs() []controller.Input { - return []controller.Input{ - { - Namespace: network.NamespaceName, - Type: network.StatusType, - ID: pointer.To(network.StatusID), - Kind: controller.InputWeak, - }, - } + return nil } // Outputs implements controller.Controller interface. @@ -63,131 +53,151 @@ func (ctrl *EventsSinkController) Outputs() []controller.Output { // Run implements controller.Controller interface. // -//nolint:gocyclo -func (ctrl *EventsSinkController) Run(ctx context.Context, r controller.Runtime, logger *zap.Logger) (err error) { - if ctrl.Cmdline == nil || ctrl.Cmdline.Get(constants.KernelParamEventsSink).First() == nil { - return nil - } +//nolint:gocyclo,cyclop +func (ctrl *EventsSinkController) Run(ctx context.Context, r controller.Runtime, logger *zap.Logger) error { + ctx, cancel := context.WithCancel(ctx) + defer cancel() if ctrl.drainSub == nil { - ctrl.backlog.Store(-1) ctrl.drainSub = ctrl.Drainer.Subscribe() } defer func() { - if ctrl.backlog.Load() == 0 { + if ctrl.drainSub != nil { ctrl.drainSub.Cancel() } }() + if err := networkutils.WaitForNetworkReady(ctx, r, + func(status *network.StatusSpec) bool { + return status.AddressReady + }, + []controller.Input{ + { + Namespace: runtime.NamespaceName, + Type: runtime.EventSinkConfigType, + ID: pointer.To(runtime.EventSinkConfigID), + Kind: controller.InputWeak, + }, + }, + ); err != nil { + return fmt.Errorf("error waiting for network: %w", err) + } + + var ( + conn *grpc.ClientConn + client events.EventSinkServiceClient + watchCh, consumeWatchCh chan machinedruntime.EventInfo + backlog int + draining bool + ) + + defer func() { + if conn != nil { + conn.Close() //nolint:errcheck + } + }() + for { select { case <-ctx.Done(): return nil - case <-r.EventCh(): - } - - var netStatus resource.Resource - - netStatus, err = r.Get(ctx, resource.NewMetadata(network.NamespaceName, network.StatusType, network.StatusID, resource.VersionUndefined)) - if err != nil { - if state.IsNotFoundError(err) { - // no network state yet - continue - } - - return fmt.Errorf("error reading network status: %w", err) - } - - if !netStatus.(*network.Status).TypedSpec().AddressReady { - // wait for address - continue - } - - break - } - - errCh := make(chan error) - - sink := ctrl.Cmdline.Get(constants.KernelParamEventsSink).First() - - conn, err := grpc.DialContext(ctx, *sink, grpc.WithTransportCredentials(insecure.NewCredentials())) - if err != nil { - return err - } - - defer conn.Close() //nolint:errcheck - - client := events.NewEventSinkServiceClient(conn) - - opts := []runtime.WatchOptionFunc{} - if ctrl.eventID.IsNil() { - opts = append(opts, runtime.WithTailEvents(-1)) - } else { - opts = append(opts, runtime.WithTailID(ctrl.eventID)) - } - - if err = ctrl.V1Alpha1Events.Watch(func(eventCh <-chan runtime.EventInfo) { - errCh <- ctrl.handleEvents(ctx, eventCh, client) - }, opts...); err != nil { - return err - } - - err = <-errCh - - return err -} - -//nolint:gocyclo -func (ctrl *EventsSinkController) handleEvents(ctx context.Context, eventCh <-chan runtime.EventInfo, client events.EventSinkServiceClient) error { - for { - var ( - event runtime.EventInfo - ok bool - data *anypb.Any - err error - ) - - select { - case <-ctx.Done(): - return nil - case event, ok = <-eventCh: - if !ok { - return nil - } case <-ctrl.drainSub.EventCh(): - backlog := ctrl.backlog.Load() + // drain started, return immediately if there's no backlog + draining = true if backlog == 0 { return nil } + case event := <-consumeWatchCh: + // if consumeWatchCh is not nil, client connection was established + backlog = event.Backlog - ctrl.drain = true + data, err := anypb.New(event.Payload) + if err != nil { + return err + } - continue - } + req := &events.EventRequest{ + Id: event.ID.String(), + Data: data, + } - ctrl.backlog.Store(int32(event.Backlog)) + _, err = client.Publish(ctx, req) + if err != nil { + return fmt.Errorf("error publishing event: %w", err) + } - data, err = anypb.New(event.Payload) - if err != nil { - return err - } + // adjust last consumed event + ctrl.eventID = event.ID - req := &events.EventRequest{ - Id: event.ID.String(), - Data: data, - } + // if draining and backlog is 0, return immediately + if draining && backlog == 0 { + return nil + } + case <-r.EventCh(): + // configuration changed, re-establish connection + cfg, err := safe.ReaderGetByID[*runtime.EventSinkConfig](ctx, r, runtime.EventSinkConfigID) + if err != nil && !state.IsNotFoundError(err) { + return fmt.Errorf("error getting event sink config: %w", err) + } - _, err = client.Publish(ctx, req) - if err != nil { - return err - } + if conn != nil { + logger.Debug("closing connection to event sink") - ctrl.eventID = event.ID + conn.Close() //nolint:errcheck + conn = nil + client = nil + consumeWatchCh = nil // stop consuming events + backlog = 0 + } - if ctrl.drain && event.Backlog == 0 { - return nil + if cfg == nil { + // no config, no event streaming + continue + } + + // establish connection + logger.Debug("establishing connection to event sink", zap.String("endpoint", cfg.TypedSpec().Endpoint)) + + conn, err = grpc.DialContext(ctx, cfg.TypedSpec().Endpoint, grpc.WithTransportCredentials(insecure.NewCredentials())) + if err != nil { + return fmt.Errorf("error establishing connection to event sink: %w", err) + } + + client = events.NewEventSinkServiceClient(conn) + + // start watching events if we haven't already done so + // + // watch is only established with the first live connection to make sure we don't miss any events + if watchCh == nil { + watchCh = make(chan machinedruntime.EventInfo) + + opts := []machinedruntime.WatchOptionFunc{} + if ctrl.eventID.IsNil() { + opts = append(opts, machinedruntime.WithTailEvents(-1)) + } else { + opts = append(opts, machinedruntime.WithTailID(ctrl.eventID)) + } + + // Watch returns immediately, setting up a goroutine which will copy events to `watchCh` + if err = ctrl.V1Alpha1Events.Watch(func(eventCh <-chan machinedruntime.EventInfo) { + for { + select { + case <-ctx.Done(): + return + case event := <-eventCh: + if !channel.SendWithContext(ctx, watchCh, event) { + return + } + } + } + }, opts...); err != nil { + return err + } + } + + consumeWatchCh = watchCh } } } diff --git a/internal/app/machined/pkg/controllers/runtime/events_sink_config.go b/internal/app/machined/pkg/controllers/runtime/events_sink_config.go new file mode 100644 index 000000000..f11a37dde --- /dev/null +++ b/internal/app/machined/pkg/controllers/runtime/events_sink_config.go @@ -0,0 +1,81 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package runtime + +import ( + "context" + "fmt" + + "github.com/cosi-project/runtime/pkg/controller" + "github.com/cosi-project/runtime/pkg/safe" + "github.com/cosi-project/runtime/pkg/state" + "github.com/siderolabs/go-procfs/procfs" + "go.uber.org/zap" + + "github.com/siderolabs/talos/pkg/machinery/constants" + "github.com/siderolabs/talos/pkg/machinery/resources/runtime" +) + +// EventsSinkConfigController generates configuration for kmsg log delivery. +type EventsSinkConfigController struct { + Cmdline *procfs.Cmdline +} + +// Name implements controller.Controller interface. +func (ctrl *EventsSinkConfigController) Name() string { + return "runtime.EventsSinkConfigController" +} + +// Inputs implements controller.Controller interface. +func (ctrl *EventsSinkConfigController) Inputs() []controller.Input { + return nil +} + +// Outputs implements controller.Controller interface. +func (ctrl *EventsSinkConfigController) Outputs() []controller.Output { + return []controller.Output{ + { + Type: runtime.EventSinkConfigType, + Kind: controller.OutputExclusive, + }, + } +} + +// Run implements controller.Controller interface. +// +//nolint:gocyclo,cyclop +func (ctrl *EventsSinkConfigController) Run(ctx context.Context, r controller.Runtime, logger *zap.Logger) (err error) { + for { + select { + case <-ctx.Done(): + return nil + case <-r.EventCh(): + } + + var endpoint string + + if ctrl.Cmdline != nil { + if val := ctrl.Cmdline.Get(constants.KernelParamEventsSink).First(); val != nil { + endpoint = *val + } + } + + if endpoint == "" { + if err := r.Destroy(ctx, runtime.NewEventSinkConfig().Metadata()); err != nil && !state.IsNotFoundError(err) { + return fmt.Errorf("error destroying event sink config: %w", err) + } + } else { + if err := safe.WriterModify(ctx, r, runtime.NewEventSinkConfig(), func(cfg *runtime.EventSinkConfig) error { + cfg.TypedSpec().Endpoint = endpoint + + return nil + }); err != nil { + return fmt.Errorf("error updating kmsg log config: %w", err) + } + } + + r.ResetRestartBackoff() + } +} diff --git a/internal/app/machined/pkg/controllers/runtime/events_sink_config_test.go b/internal/app/machined/pkg/controllers/runtime/events_sink_config_test.go new file mode 100644 index 000000000..c96d3cfa6 --- /dev/null +++ b/internal/app/machined/pkg/controllers/runtime/events_sink_config_test.go @@ -0,0 +1,51 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package runtime_test + +import ( + "testing" + + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/rtestutils" + "github.com/siderolabs/go-procfs/procfs" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" + + "github.com/siderolabs/talos/internal/app/machined/pkg/controllers/ctest" + runtimectrls "github.com/siderolabs/talos/internal/app/machined/pkg/controllers/runtime" + "github.com/siderolabs/talos/pkg/machinery/constants" + "github.com/siderolabs/talos/pkg/machinery/resources/runtime" +) + +type EventsSinkConfigSuite struct { + ctest.DefaultSuite +} + +func TestEventsSinkConfigSuite(t *testing.T) { + suite.Run(t, new(EventsSinkConfigSuite)) +} + +func (suite *EventsSinkConfigSuite) TestEventSinkConfigNone() { + suite.Require().NoError(suite.Runtime().RegisterController(&runtimectrls.EventsSinkConfigController{})) + + rtestutils.AssertNoResource[*runtime.EventSinkConfig](suite.Ctx(), suite.T(), suite.State(), runtime.EventSinkConfigID) +} + +func (suite *EventsSinkConfigSuite) TestEventSinkConfigCmdline() { + cmdline := procfs.NewCmdline("") + cmdline.Append(constants.KernelParamEventsSink, "10.0.0.1:3333") + + suite.Require().NoError(suite.Runtime().RegisterController(&runtimectrls.EventsSinkConfigController{ + Cmdline: cmdline, + })) + + rtestutils.AssertResources[*runtime.EventSinkConfig](suite.Ctx(), suite.T(), suite.State(), []resource.ID{runtime.EventSinkConfigID}, + func(cfg *runtime.EventSinkConfig, asrt *assert.Assertions) { + asrt.Equal( + "10.0.0.1:3333", + cfg.TypedSpec().Endpoint, + ) + }) +} diff --git a/internal/app/machined/pkg/controllers/runtime/events_sink_test.go b/internal/app/machined/pkg/controllers/runtime/events_sink_test.go index a239295a8..34ba6d468 100644 --- a/internal/app/machined/pkg/controllers/runtime/events_sink_test.go +++ b/internal/app/machined/pkg/controllers/runtime/events_sink_test.go @@ -6,33 +6,31 @@ package runtime_test import ( "context" - "fmt" - "log" "net" "sync" "testing" "time" "github.com/cosi-project/runtime/pkg/controller/runtime" + "github.com/cosi-project/runtime/pkg/safe" "github.com/cosi-project/runtime/pkg/state" "github.com/cosi-project/runtime/pkg/state/impl/inmem" "github.com/cosi-project/runtime/pkg/state/impl/namespaced" - "github.com/siderolabs/go-procfs/procfs" "github.com/siderolabs/go-retry/retry" eventsapi "github.com/siderolabs/siderolink/api/events" "github.com/siderolabs/siderolink/pkg/events" "github.com/stretchr/testify/suite" + "go.uber.org/zap/zaptest" "golang.org/x/sync/errgroup" "google.golang.org/grpc" controllerruntime "github.com/siderolabs/talos/internal/app/machined/pkg/controllers/runtime" talosruntime "github.com/siderolabs/talos/internal/app/machined/pkg/runtime" "github.com/siderolabs/talos/internal/app/machined/pkg/runtime/v1alpha1" - "github.com/siderolabs/talos/pkg/logging" "github.com/siderolabs/talos/pkg/machinery/api/machine" - "github.com/siderolabs/talos/pkg/machinery/constants" "github.com/siderolabs/talos/pkg/machinery/proto" "github.com/siderolabs/talos/pkg/machinery/resources/network" + runtimeres "github.com/siderolabs/talos/pkg/machinery/resources/runtime" ) type handler struct { @@ -56,7 +54,6 @@ type EventsSinkSuite struct { events *v1alpha1.Events state state.State handler *handler - cmdline *procfs.Cmdline server *grpc.Server sink *events.Sink @@ -78,23 +75,26 @@ func (suite *EventsSinkSuite) SetupTest() { var err error - suite.runtime, err = runtime.NewRuntime(suite.state, logging.Wrap(log.Writer())) + suite.runtime, err = runtime.NewRuntime(suite.state, zaptest.NewLogger(suite.T())) suite.Require().NoError(err) suite.handler = &handler{} - suite.cmdline = procfs.NewCmdline(fmt.Sprintf("%s=%s", constants.KernelParamEventsSink, "localhost")) suite.drainer = talosruntime.NewDrainer() suite.Require().NoError( suite.runtime.RegisterController( &controllerruntime.EventsSinkController{ V1Alpha1Events: suite.events, - Cmdline: suite.cmdline, Drainer: suite.drainer, }, ), ) + status := network.NewStatus(network.NamespaceName, network.StatusID) + status.TypedSpec().AddressReady = true + + suite.Require().NoError(suite.state.Create(suite.ctx, status)) + suite.startRuntime() } @@ -108,7 +108,7 @@ func (suite *EventsSinkSuite) startRuntime() { }() } -func (suite *EventsSinkSuite) startServer(ctx context.Context) { +func (suite *EventsSinkSuite) startServer(ctx context.Context) string { suite.sink = events.NewSink( suite.handler, []proto.Message{ @@ -116,18 +116,9 @@ func (suite *EventsSinkSuite) startServer(ctx context.Context) { &machine.PhaseEvent{}, }) - status := network.NewStatus(network.NamespaceName, network.StatusID) - status.TypedSpec().AddressReady = true - - suite.Require().NoError(suite.state.Create(ctx, status)) - lis, err := net.Listen("tcp", "localhost:0") suite.Require().NoError(err) - param := procfs.NewParameter(constants.KernelParamEventsSink) - param.Append(lis.Addr().String()) - - suite.cmdline.Set(constants.KernelParamEventsSink, param) suite.server = grpc.NewServer() eventsapi.RegisterEventSinkServiceServer(suite.server, suite.sink) @@ -146,6 +137,8 @@ func (suite *EventsSinkSuite) startServer(ctx context.Context) { return suite.server.Serve(lis) }, ) + + return lis.Addr().String() } func (suite *EventsSinkSuite) TestPublish() { @@ -169,21 +162,44 @@ func (suite *EventsSinkSuite) TestPublish() { suite.Require().Equal(0, len(suite.handler.events)) - suite.startServer(ctx) + endpoint := suite.startServer(ctx) + config := runtimeres.NewEventSinkConfig() + config.TypedSpec().Endpoint = endpoint + suite.Require().NoError(suite.state.Create(ctx, config)) - err := retry.Constant(time.Second*5, retry.WithUnits(time.Millisecond*100)).Retry( + suite.Require().NoError(retry.Constant(time.Second*5, retry.WithUnits(time.Millisecond*100)).Retry( func() error { suite.handler.eventsMu.Lock() defer suite.handler.eventsMu.Unlock() if len(suite.handler.events) != 2 { - return retry.ExpectedErrorf("expected 2 events") + return retry.ExpectedErrorf("expected 2 events, got %d", len(suite.handler.events)) } return nil }, + )) + + suite.events.Publish( + ctx, + &machine.PhaseEvent{ + Phase: "test", + Action: machine.PhaseEvent_STOP, + }, ) - suite.Require().NoError(err) + + suite.Require().NoError(retry.Constant(time.Second*5, retry.WithUnits(time.Millisecond*100)).Retry( + func() error { + suite.handler.eventsMu.Lock() + defer suite.handler.eventsMu.Unlock() + + if len(suite.handler.events) != 3 { + return retry.ExpectedErrorf("expected 3 events, got %d", len(suite.handler.events)) + } + + return nil + }, + )) } func (suite *EventsSinkSuite) TestDrain() { @@ -209,30 +225,56 @@ func (suite *EventsSinkSuite) TestDrain() { suite.Require().Equal(0, len(suite.handler.events)) + // first, publish wrong endpoint + badLis, err := net.Listen("tcp", "localhost:0") + suite.Require().NoError(err) + + badEndpoint := badLis.Addr().String() + suite.Require().NoError(badLis.Close()) + + config := runtimeres.NewEventSinkConfig() + config.TypedSpec().Endpoint = badEndpoint + suite.Require().NoError(suite.state.Create(ctx, config)) + + suite.T().Logf("%s starting bad server at %s", time.Now().Format(time.RFC3339), badEndpoint) + time.Sleep(time.Second * 1) - c, abort := context.WithTimeout(context.Background(), time.Second*5) - defer abort() + drainCtx, drainCtxCancel := context.WithTimeout(ctx, time.Second*5) + defer drainCtxCancel() var eg errgroup.Group eg.Go( func() error { - return suite.drainer.Drain(c) + suite.T().Logf("%s starting drain", time.Now().Format(time.RFC3339)) + + return suite.drainer.Drain(drainCtx) }, ) eg.Go( func() error { - time.Sleep(time.Millisecond * 300) + // start real server with delay + time.Sleep(300 * time.Millisecond) - suite.startServer(ctx) + endpoint := suite.startServer(ctx) - return nil + suite.T().Logf("%s starting real server at %s", time.Now().Format(time.RFC3339), endpoint) + + _, updateErr := safe.StateUpdateWithConflicts( + ctx, suite.state, runtimeres.NewEventSinkConfig().Metadata(), + func(cfg *runtimeres.EventSinkConfig) error { + cfg.TypedSpec().Endpoint = endpoint + + return nil + }) + + return updateErr }, ) - err := retry.Constant(time.Second*5, retry.WithUnits(time.Millisecond*100)).Retry( + suite.Require().NoError(retry.Constant(time.Second*5, retry.WithUnits(time.Millisecond*100)).Retry( func() error { suite.handler.eventsMu.Lock() defer suite.handler.eventsMu.Unlock() @@ -243,8 +285,7 @@ func (suite *EventsSinkSuite) TestDrain() { return nil }, - ) - suite.Require().NoError(err) + )) suite.Require().NoError(eg.Wait()) } diff --git a/internal/app/machined/pkg/controllers/siderolink/manager.go b/internal/app/machined/pkg/controllers/siderolink/manager.go index be3f4e0de..cbeff2667 100644 --- a/internal/app/machined/pkg/controllers/siderolink/manager.go +++ b/internal/app/machined/pkg/controllers/siderolink/manager.go @@ -30,6 +30,7 @@ import ( "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" + networkutils "github.com/siderolabs/talos/internal/app/machined/pkg/controllers/network/utils" "github.com/siderolabs/talos/pkg/machinery/constants" "github.com/siderolabs/talos/pkg/machinery/nethelpers" "github.com/siderolabs/talos/pkg/machinery/resources/config" @@ -110,62 +111,29 @@ func parseAPIEndpoint(sideroLinkParam string) (apiEndpoint, error) { //nolint:gocyclo,cyclop func (ctrl *ManagerController) Run(ctx context.Context, r controller.Runtime, logger *zap.Logger) error { // initially, wait for the network address status to be ready - if err := r.UpdateInputs([]controller.Input{ - { - Namespace: network.NamespaceName, - Type: network.StatusType, - ID: pointer.To(network.StatusID), - Kind: controller.InputWeak, + if err := networkutils.WaitForNetworkReady(ctx, r, + func(status *network.StatusSpec) bool { + return status.AddressReady }, - }); err != nil { - return err - } - - for { - select { - case <-ctx.Done(): - return nil - case <-r.EventCh(): - } - - netStatus, err := safe.ReaderGet[*network.Status](ctx, r, network.NewStatus(network.NamespaceName, network.StatusID).Metadata()) - if err != nil { - if state.IsNotFoundError(err) { - // no network state yet - continue - } - - return fmt.Errorf("error reading network status: %w", err) - } - - if !netStatus.TypedSpec().AddressReady { - // wait for address - continue - } - - break + []controller.Input{ + { + Namespace: config.NamespaceName, + Type: siderolink.ConfigType, + ID: pointer.To(siderolink.ConfigID), + Kind: controller.InputWeak, + }, + { + Namespace: hardware.NamespaceName, + Type: hardware.SystemInformationType, + ID: pointer.To(hardware.SystemInformationID), + Kind: controller.InputWeak, + }, + }, + ); err != nil { + return fmt.Errorf("error waiting for network: %w", err) } // normal reconcile loop - if err := r.UpdateInputs([]controller.Input{ - { - Namespace: config.NamespaceName, - Type: siderolink.ConfigType, - ID: pointer.To(siderolink.ConfigID), - Kind: controller.InputWeak, - }, - { - Namespace: hardware.NamespaceName, - Type: hardware.SystemInformationType, - ID: pointer.To(hardware.SystemInformationID), - Kind: controller.InputWeak, - }, - }); err != nil { - return err - } - - r.QueueReconcile() - wgClient, wgClientErr := wgctrl.New() if wgClientErr != nil { return wgClientErr diff --git a/internal/app/machined/pkg/runtime/v1alpha2/v1alpha2_controller.go b/internal/app/machined/pkg/runtime/v1alpha2/v1alpha2_controller.go index 25dda7033..3879b7294 100644 --- a/internal/app/machined/pkg/runtime/v1alpha2/v1alpha2_controller.go +++ b/internal/app/machined/pkg/runtime/v1alpha2/v1alpha2_controller.go @@ -217,9 +217,11 @@ func (ctrl *Controller) Run(ctx context.Context, drainer *runtime.Drainer) error &runtimecontrollers.DevicesStatusController{ V1Alpha1Mode: ctrl.v1alpha1Runtime.State().Platform().Mode(), }, + &runtimecontrollers.EventsSinkConfigController{ + Cmdline: procfs.ProcCmdline(), + }, &runtimecontrollers.EventsSinkController{ V1Alpha1Events: ctrl.v1alpha1Runtime.Events(), - Cmdline: procfs.ProcCmdline(), Drainer: drainer, }, &runtimecontrollers.ExtensionServiceController{ diff --git a/internal/app/machined/pkg/runtime/v1alpha2/v1alpha2_state.go b/internal/app/machined/pkg/runtime/v1alpha2/v1alpha2_state.go index f71154a79..6001b94ba 100644 --- a/internal/app/machined/pkg/runtime/v1alpha2/v1alpha2_state.go +++ b/internal/app/machined/pkg/runtime/v1alpha2/v1alpha2_state.go @@ -165,6 +165,7 @@ func NewState() (*State, error) { &perf.CPU{}, &perf.Memory{}, &runtime.DevicesStatus{}, + &runtime.EventSinkConfig{}, &runtime.ExtensionStatus{}, &runtime.KernelModuleSpec{}, &runtime.KernelParamSpec{}, diff --git a/pkg/machinery/api/resource/definitions/runtime/runtime.pb.go b/pkg/machinery/api/resource/definitions/runtime/runtime.pb.go index 6c0b35ce0..0c91803d0 100644 --- a/pkg/machinery/api/resource/definitions/runtime/runtime.pb.go +++ b/pkg/machinery/api/resource/definitions/runtime/runtime.pb.go @@ -72,6 +72,54 @@ func (x *DevicesStatusSpec) GetReady() bool { return false } +// EventSinkConfigSpec describes configuration of Talos event log streaming. +type EventSinkConfigSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Endpoint string `protobuf:"bytes,1,opt,name=endpoint,proto3" json:"endpoint,omitempty"` +} + +func (x *EventSinkConfigSpec) Reset() { + *x = EventSinkConfigSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EventSinkConfigSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EventSinkConfigSpec) ProtoMessage() {} + +func (x *EventSinkConfigSpec) ProtoReflect() protoreflect.Message { + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[1] + 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 EventSinkConfigSpec.ProtoReflect.Descriptor instead. +func (*EventSinkConfigSpec) Descriptor() ([]byte, []int) { + return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{1} +} + +func (x *EventSinkConfigSpec) GetEndpoint() string { + if x != nil { + return x.Endpoint + } + return "" +} + // KernelModuleSpecSpec describes Linux kernel module to load. type KernelModuleSpecSpec struct { state protoimpl.MessageState @@ -85,7 +133,7 @@ type KernelModuleSpecSpec struct { func (x *KernelModuleSpecSpec) Reset() { *x = KernelModuleSpecSpec{} if protoimpl.UnsafeEnabled { - mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[1] + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -98,7 +146,7 @@ func (x *KernelModuleSpecSpec) String() string { func (*KernelModuleSpecSpec) ProtoMessage() {} func (x *KernelModuleSpecSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[1] + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -111,7 +159,7 @@ func (x *KernelModuleSpecSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use KernelModuleSpecSpec.ProtoReflect.Descriptor instead. func (*KernelModuleSpecSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{1} + return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{2} } func (x *KernelModuleSpecSpec) GetName() string { @@ -141,7 +189,7 @@ type KernelParamSpecSpec struct { func (x *KernelParamSpecSpec) Reset() { *x = KernelParamSpecSpec{} if protoimpl.UnsafeEnabled { - mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[2] + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -154,7 +202,7 @@ func (x *KernelParamSpecSpec) String() string { func (*KernelParamSpecSpec) ProtoMessage() {} func (x *KernelParamSpecSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[2] + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -167,7 +215,7 @@ func (x *KernelParamSpecSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use KernelParamSpecSpec.ProtoReflect.Descriptor instead. func (*KernelParamSpecSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{2} + return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{3} } func (x *KernelParamSpecSpec) GetValue() string { @@ -198,7 +246,7 @@ type KernelParamStatusSpec struct { func (x *KernelParamStatusSpec) Reset() { *x = KernelParamStatusSpec{} if protoimpl.UnsafeEnabled { - mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[3] + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -211,7 +259,7 @@ func (x *KernelParamStatusSpec) String() string { func (*KernelParamStatusSpec) ProtoMessage() {} func (x *KernelParamStatusSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[3] + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -224,7 +272,7 @@ func (x *KernelParamStatusSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use KernelParamStatusSpec.ProtoReflect.Descriptor instead. func (*KernelParamStatusSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{3} + return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{4} } func (x *KernelParamStatusSpec) GetCurrent() string { @@ -248,7 +296,7 @@ func (x *KernelParamStatusSpec) GetUnsupported() bool { return false } -// KmsgLogConfigSpec describes status of the defined sysctls. +// KmsgLogConfigSpec describes configuration for kmsg log streaming. type KmsgLogConfigSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -260,7 +308,7 @@ type KmsgLogConfigSpec struct { func (x *KmsgLogConfigSpec) Reset() { *x = KmsgLogConfigSpec{} if protoimpl.UnsafeEnabled { - mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[4] + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -273,7 +321,7 @@ func (x *KmsgLogConfigSpec) String() string { func (*KmsgLogConfigSpec) ProtoMessage() {} func (x *KmsgLogConfigSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[4] + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -286,7 +334,7 @@ func (x *KmsgLogConfigSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use KmsgLogConfigSpec.ProtoReflect.Descriptor instead. func (*KmsgLogConfigSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{4} + return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{5} } func (x *KmsgLogConfigSpec) GetDestinations() []*common.URL { @@ -309,7 +357,7 @@ type MachineStatusSpec struct { func (x *MachineStatusSpec) Reset() { *x = MachineStatusSpec{} if protoimpl.UnsafeEnabled { - mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[5] + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -322,7 +370,7 @@ func (x *MachineStatusSpec) String() string { func (*MachineStatusSpec) ProtoMessage() {} func (x *MachineStatusSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[5] + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -335,7 +383,7 @@ func (x *MachineStatusSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use MachineStatusSpec.ProtoReflect.Descriptor instead. func (*MachineStatusSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{5} + return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{6} } func (x *MachineStatusSpec) GetStage() enums.RuntimeMachineStage { @@ -365,7 +413,7 @@ type MachineStatusStatus struct { func (x *MachineStatusStatus) Reset() { *x = MachineStatusStatus{} if protoimpl.UnsafeEnabled { - mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[6] + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -378,7 +426,7 @@ func (x *MachineStatusStatus) String() string { func (*MachineStatusStatus) ProtoMessage() {} func (x *MachineStatusStatus) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[6] + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -391,7 +439,7 @@ func (x *MachineStatusStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use MachineStatusStatus.ProtoReflect.Descriptor instead. func (*MachineStatusStatus) Descriptor() ([]byte, []int) { - return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{6} + return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{7} } func (x *MachineStatusStatus) GetReady() bool { @@ -420,7 +468,7 @@ type MetaKeySpec struct { func (x *MetaKeySpec) Reset() { *x = MetaKeySpec{} if protoimpl.UnsafeEnabled { - mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[7] + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -433,7 +481,7 @@ func (x *MetaKeySpec) String() string { func (*MetaKeySpec) ProtoMessage() {} func (x *MetaKeySpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[7] + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -446,7 +494,7 @@ func (x *MetaKeySpec) ProtoReflect() protoreflect.Message { // Deprecated: Use MetaKeySpec.ProtoReflect.Descriptor instead. func (*MetaKeySpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{7} + return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{8} } func (x *MetaKeySpec) GetValue() string { @@ -471,7 +519,7 @@ type MountStatusSpec struct { func (x *MountStatusSpec) Reset() { *x = MountStatusSpec{} if protoimpl.UnsafeEnabled { - mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[8] + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -484,7 +532,7 @@ func (x *MountStatusSpec) String() string { func (*MountStatusSpec) ProtoMessage() {} func (x *MountStatusSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[8] + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -497,7 +545,7 @@ func (x *MountStatusSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use MountStatusSpec.ProtoReflect.Descriptor instead. func (*MountStatusSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{8} + return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{9} } func (x *MountStatusSpec) GetSource() string { @@ -547,7 +595,7 @@ type PlatformMetadataSpec struct { func (x *PlatformMetadataSpec) Reset() { *x = PlatformMetadataSpec{} if protoimpl.UnsafeEnabled { - mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[9] + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -560,7 +608,7 @@ func (x *PlatformMetadataSpec) String() string { func (*PlatformMetadataSpec) ProtoMessage() {} func (x *PlatformMetadataSpec) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[9] + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -573,7 +621,7 @@ func (x *PlatformMetadataSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use PlatformMetadataSpec.ProtoReflect.Descriptor instead. func (*PlatformMetadataSpec) Descriptor() ([]byte, []int) { - return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{9} + return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{10} } func (x *PlatformMetadataSpec) GetPlatform() string { @@ -645,7 +693,7 @@ type UnmetCondition struct { func (x *UnmetCondition) Reset() { *x = UnmetCondition{} if protoimpl.UnsafeEnabled { - mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[10] + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -658,7 +706,7 @@ func (x *UnmetCondition) String() string { func (*UnmetCondition) ProtoMessage() {} func (x *UnmetCondition) ProtoReflect() protoreflect.Message { - mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[10] + mi := &file_resource_definitions_runtime_runtime_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -671,7 +719,7 @@ func (x *UnmetCondition) ProtoReflect() protoreflect.Message { // Deprecated: Use UnmetCondition.ProtoReflect.Descriptor instead. func (*UnmetCondition) Descriptor() ([]byte, []int) { - return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{10} + return file_resource_definitions_runtime_runtime_proto_rawDescGZIP(), []int{11} } func (x *UnmetCondition) GetName() string { @@ -702,84 +750,87 @@ var file_resource_definitions_runtime_runtime_proto_rawDesc = []byte{ 0x73, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x4a, 0x0a, 0x14, 0x4b, 0x65, 0x72, 0x6e, - 0x65, 0x6c, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x53, 0x70, 0x65, 0x63, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x22, 0x50, 0x0a, 0x13, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x53, 0x70, 0x65, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x6d, 0x0a, 0x15, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, - 0x18, 0x0a, 0x07, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x6e, 0x73, 0x75, 0x70, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x64, 0x22, 0x44, 0x0a, 0x11, 0x4b, 0x6d, 0x73, 0x67, 0x4c, 0x6f, 0x67, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2f, 0x0a, 0x0c, 0x64, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0b, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x52, 0x4c, 0x52, 0x0c, 0x64, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb1, 0x01, 0x0a, 0x11, - 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, - 0x63, 0x12, 0x4b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x35, 0x2e, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x65, 0x6e, - 0x75, 0x6d, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x12, 0x4f, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, - 0x2e, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, - 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, - 0x8a, 0x01, 0x0a, 0x13, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x5d, 0x0a, - 0x10, 0x75, 0x6e, 0x6d, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2e, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x55, 0x6e, 0x6d, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x75, 0x6e, 0x6d, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x23, 0x0a, 0x0b, - 0x4d, 0x65, 0x74, 0x61, 0x4b, 0x65, 0x79, 0x53, 0x70, 0x65, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0x84, 0x01, 0x0a, 0x0f, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xf5, 0x01, 0x0a, 0x14, 0x50, 0x6c, 0x61, - 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x53, 0x70, 0x65, - 0x63, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x1a, 0x0a, - 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x73, 0x70, 0x6f, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x73, 0x70, 0x6f, 0x74, - 0x22, 0x3c, 0x0a, 0x0e, 0x55, 0x6e, 0x6d, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x4c, - 0x5a, 0x4a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x69, 0x64, - 0x65, 0x72, 0x6f, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2f, 0x70, 0x6b, - 0x67, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x31, 0x0a, 0x13, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x53, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, + 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x4a, 0x0a, 0x14, 0x4b, + 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x50, 0x0a, 0x13, 0x4b, 0x65, 0x72, 0x6e, 0x65, + 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x53, 0x70, 0x65, 0x63, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x67, 0x6e, + 0x6f, 0x72, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x6d, 0x0a, 0x15, 0x4b, 0x65, 0x72, + 0x6e, 0x65, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, + 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x6e, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x6e, 0x73, + 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x22, 0x44, 0x0a, 0x11, 0x4b, 0x6d, 0x73, 0x67, + 0x4c, 0x6f, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2f, 0x0a, + 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x52, 0x4c, + 0x52, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb1, + 0x01, 0x0a, 0x11, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x53, 0x70, 0x65, 0x63, 0x12, 0x4b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x67, + 0x65, 0x12, 0x4f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x61, 0x6c, 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x22, 0x8a, 0x01, 0x0a, 0x13, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x12, 0x5d, 0x0a, 0x10, 0x75, 0x6e, 0x6d, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x61, 0x6c, + 0x6f, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x55, 0x6e, 0x6d, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, + 0x75, 0x6e, 0x6d, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x23, 0x0a, 0x0b, 0x4d, 0x65, 0x74, 0x61, 0x4b, 0x65, 0x79, 0x53, 0x70, 0x65, 0x63, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x0f, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xf5, 0x01, 0x0a, 0x14, + 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x53, 0x70, 0x65, 0x63, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, + 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, + 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x73, 0x70, 0x6f, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x73, + 0x70, 0x6f, 0x74, 0x22, 0x3c, 0x0a, 0x0e, 0x55, 0x6e, 0x6d, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x42, 0x4c, 0x5a, 0x4a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x73, 0x69, 0x64, 0x65, 0x72, 0x6f, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61, 0x6c, 0x6f, 0x73, + 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2f, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -794,27 +845,28 @@ func file_resource_definitions_runtime_runtime_proto_rawDescGZIP() []byte { return file_resource_definitions_runtime_runtime_proto_rawDescData } -var file_resource_definitions_runtime_runtime_proto_msgTypes = make([]protoimpl.MessageInfo, 11) +var file_resource_definitions_runtime_runtime_proto_msgTypes = make([]protoimpl.MessageInfo, 12) var file_resource_definitions_runtime_runtime_proto_goTypes = []interface{}{ (*DevicesStatusSpec)(nil), // 0: talos.resource.definitions.runtime.DevicesStatusSpec - (*KernelModuleSpecSpec)(nil), // 1: talos.resource.definitions.runtime.KernelModuleSpecSpec - (*KernelParamSpecSpec)(nil), // 2: talos.resource.definitions.runtime.KernelParamSpecSpec - (*KernelParamStatusSpec)(nil), // 3: talos.resource.definitions.runtime.KernelParamStatusSpec - (*KmsgLogConfigSpec)(nil), // 4: talos.resource.definitions.runtime.KmsgLogConfigSpec - (*MachineStatusSpec)(nil), // 5: talos.resource.definitions.runtime.MachineStatusSpec - (*MachineStatusStatus)(nil), // 6: talos.resource.definitions.runtime.MachineStatusStatus - (*MetaKeySpec)(nil), // 7: talos.resource.definitions.runtime.MetaKeySpec - (*MountStatusSpec)(nil), // 8: talos.resource.definitions.runtime.MountStatusSpec - (*PlatformMetadataSpec)(nil), // 9: talos.resource.definitions.runtime.PlatformMetadataSpec - (*UnmetCondition)(nil), // 10: talos.resource.definitions.runtime.UnmetCondition - (*common.URL)(nil), // 11: common.URL - (enums.RuntimeMachineStage)(0), // 12: talos.resource.definitions.enums.RuntimeMachineStage + (*EventSinkConfigSpec)(nil), // 1: talos.resource.definitions.runtime.EventSinkConfigSpec + (*KernelModuleSpecSpec)(nil), // 2: talos.resource.definitions.runtime.KernelModuleSpecSpec + (*KernelParamSpecSpec)(nil), // 3: talos.resource.definitions.runtime.KernelParamSpecSpec + (*KernelParamStatusSpec)(nil), // 4: talos.resource.definitions.runtime.KernelParamStatusSpec + (*KmsgLogConfigSpec)(nil), // 5: talos.resource.definitions.runtime.KmsgLogConfigSpec + (*MachineStatusSpec)(nil), // 6: talos.resource.definitions.runtime.MachineStatusSpec + (*MachineStatusStatus)(nil), // 7: talos.resource.definitions.runtime.MachineStatusStatus + (*MetaKeySpec)(nil), // 8: talos.resource.definitions.runtime.MetaKeySpec + (*MountStatusSpec)(nil), // 9: talos.resource.definitions.runtime.MountStatusSpec + (*PlatformMetadataSpec)(nil), // 10: talos.resource.definitions.runtime.PlatformMetadataSpec + (*UnmetCondition)(nil), // 11: talos.resource.definitions.runtime.UnmetCondition + (*common.URL)(nil), // 12: common.URL + (enums.RuntimeMachineStage)(0), // 13: talos.resource.definitions.enums.RuntimeMachineStage } var file_resource_definitions_runtime_runtime_proto_depIdxs = []int32{ - 11, // 0: talos.resource.definitions.runtime.KmsgLogConfigSpec.destinations:type_name -> common.URL - 12, // 1: talos.resource.definitions.runtime.MachineStatusSpec.stage:type_name -> talos.resource.definitions.enums.RuntimeMachineStage - 6, // 2: talos.resource.definitions.runtime.MachineStatusSpec.status:type_name -> talos.resource.definitions.runtime.MachineStatusStatus - 10, // 3: talos.resource.definitions.runtime.MachineStatusStatus.unmet_conditions:type_name -> talos.resource.definitions.runtime.UnmetCondition + 12, // 0: talos.resource.definitions.runtime.KmsgLogConfigSpec.destinations:type_name -> common.URL + 13, // 1: talos.resource.definitions.runtime.MachineStatusSpec.stage:type_name -> talos.resource.definitions.enums.RuntimeMachineStage + 7, // 2: talos.resource.definitions.runtime.MachineStatusSpec.status:type_name -> talos.resource.definitions.runtime.MachineStatusStatus + 11, // 3: talos.resource.definitions.runtime.MachineStatusStatus.unmet_conditions:type_name -> talos.resource.definitions.runtime.UnmetCondition 4, // [4:4] is the sub-list for method output_type 4, // [4:4] is the sub-list for method input_type 4, // [4:4] is the sub-list for extension type_name @@ -841,7 +893,7 @@ func file_resource_definitions_runtime_runtime_proto_init() { } } file_resource_definitions_runtime_runtime_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KernelModuleSpecSpec); i { + switch v := v.(*EventSinkConfigSpec); i { case 0: return &v.state case 1: @@ -853,7 +905,7 @@ func file_resource_definitions_runtime_runtime_proto_init() { } } file_resource_definitions_runtime_runtime_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KernelParamSpecSpec); i { + switch v := v.(*KernelModuleSpecSpec); i { case 0: return &v.state case 1: @@ -865,7 +917,7 @@ func file_resource_definitions_runtime_runtime_proto_init() { } } file_resource_definitions_runtime_runtime_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KernelParamStatusSpec); i { + switch v := v.(*KernelParamSpecSpec); i { case 0: return &v.state case 1: @@ -877,7 +929,7 @@ func file_resource_definitions_runtime_runtime_proto_init() { } } file_resource_definitions_runtime_runtime_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KmsgLogConfigSpec); i { + switch v := v.(*KernelParamStatusSpec); i { case 0: return &v.state case 1: @@ -889,7 +941,7 @@ func file_resource_definitions_runtime_runtime_proto_init() { } } file_resource_definitions_runtime_runtime_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MachineStatusSpec); i { + switch v := v.(*KmsgLogConfigSpec); i { case 0: return &v.state case 1: @@ -901,7 +953,7 @@ func file_resource_definitions_runtime_runtime_proto_init() { } } file_resource_definitions_runtime_runtime_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MachineStatusStatus); i { + switch v := v.(*MachineStatusSpec); i { case 0: return &v.state case 1: @@ -913,7 +965,7 @@ func file_resource_definitions_runtime_runtime_proto_init() { } } file_resource_definitions_runtime_runtime_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetaKeySpec); i { + switch v := v.(*MachineStatusStatus); i { case 0: return &v.state case 1: @@ -925,7 +977,7 @@ func file_resource_definitions_runtime_runtime_proto_init() { } } file_resource_definitions_runtime_runtime_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MountStatusSpec); i { + switch v := v.(*MetaKeySpec); i { case 0: return &v.state case 1: @@ -937,7 +989,7 @@ func file_resource_definitions_runtime_runtime_proto_init() { } } file_resource_definitions_runtime_runtime_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PlatformMetadataSpec); i { + switch v := v.(*MountStatusSpec); i { case 0: return &v.state case 1: @@ -949,6 +1001,18 @@ func file_resource_definitions_runtime_runtime_proto_init() { } } file_resource_definitions_runtime_runtime_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PlatformMetadataSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_resource_definitions_runtime_runtime_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UnmetCondition); i { case 0: return &v.state @@ -967,7 +1031,7 @@ func file_resource_definitions_runtime_runtime_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_resource_definitions_runtime_runtime_proto_rawDesc, NumEnums: 0, - NumMessages: 11, + NumMessages: 12, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/machinery/api/resource/definitions/runtime/runtime_vtproto.pb.go b/pkg/machinery/api/resource/definitions/runtime/runtime_vtproto.pb.go index 17ff265c8..387be0a96 100644 --- a/pkg/machinery/api/resource/definitions/runtime/runtime_vtproto.pb.go +++ b/pkg/machinery/api/resource/definitions/runtime/runtime_vtproto.pb.go @@ -66,6 +66,46 @@ func (m *DevicesStatusSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *EventSinkConfigSpec) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EventSinkConfigSpec) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *EventSinkConfigSpec) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Endpoint) > 0 { + i -= len(m.Endpoint) + copy(dAtA[i:], m.Endpoint) + i = encodeVarint(dAtA, i, uint64(len(m.Endpoint))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *KernelModuleSpecSpec) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -648,6 +688,20 @@ func (m *DevicesStatusSpec) SizeVT() (n int) { return n } +func (m *EventSinkConfigSpec) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Endpoint) + if l > 0 { + n += 1 + l + sov(uint64(l)) + } + n += len(m.unknownFields) + return n +} + func (m *KernelModuleSpecSpec) SizeVT() (n int) { if m == nil { return 0 @@ -942,6 +996,89 @@ func (m *DevicesStatusSpec) UnmarshalVT(dAtA []byte) error { } return nil } +func (m *EventSinkConfigSpec) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EventSinkConfigSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EventSinkConfigSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Endpoint", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Endpoint = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *KernelModuleSpecSpec) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pkg/machinery/resources/runtime/deep_copy.generated.go b/pkg/machinery/resources/runtime/deep_copy.generated.go index 2c8cc8eb4..273e43da1 100644 --- a/pkg/machinery/resources/runtime/deep_copy.generated.go +++ b/pkg/machinery/resources/runtime/deep_copy.generated.go @@ -2,7 +2,7 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -// Code generated by "deep-copy -type DevicesStatusSpec -type KernelModuleSpecSpec -type KernelParamSpecSpec -type KernelParamStatusSpec -type KmsgLogConfigSpec -type MachineStatusSpec -type MetaKeySpec -type MountStatusSpec -type PlatformMetadataSpec -header-file ../../../../hack/boilerplate.txt -o deep_copy.generated.go ."; DO NOT EDIT. +// Code generated by "deep-copy -type DevicesStatusSpec -type EventSinkConfigSpec -type KernelModuleSpecSpec -type KernelParamSpecSpec -type KernelParamStatusSpec -type KmsgLogConfigSpec -type MachineStatusSpec -type MetaKeySpec -type MountStatusSpec -type PlatformMetadataSpec -header-file ../../../../hack/boilerplate.txt -o deep_copy.generated.go ."; DO NOT EDIT. package runtime @@ -16,6 +16,12 @@ func (o DevicesStatusSpec) DeepCopy() DevicesStatusSpec { return cp } +// DeepCopy generates a deep copy of EventSinkConfigSpec. +func (o EventSinkConfigSpec) DeepCopy() EventSinkConfigSpec { + var cp EventSinkConfigSpec = o + return cp +} + // DeepCopy generates a deep copy of KernelModuleSpecSpec. func (o KernelModuleSpecSpec) DeepCopy() KernelModuleSpecSpec { var cp KernelModuleSpecSpec = o diff --git a/pkg/machinery/resources/runtime/event_sink_config.go b/pkg/machinery/resources/runtime/event_sink_config.go new file mode 100644 index 000000000..3851c035b --- /dev/null +++ b/pkg/machinery/resources/runtime/event_sink_config.go @@ -0,0 +1,59 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package runtime + +import ( + "github.com/cosi-project/runtime/pkg/resource" + "github.com/cosi-project/runtime/pkg/resource/meta" + "github.com/cosi-project/runtime/pkg/resource/protobuf" + "github.com/cosi-project/runtime/pkg/resource/typed" + + "github.com/siderolabs/talos/pkg/machinery/proto" +) + +// EventSinkConfigType is type of EventSinkConfig resource. +const EventSinkConfigType = resource.Type("EventSinkConfigs.runtime.talos.dev") + +// EventSinkConfig resource holds configuration for Talos event log streaming. +type EventSinkConfig = typed.Resource[EventSinkConfigSpec, EventSinkConfigExtension] + +// EventSinkConfigID is a resource ID for EventSinkConfig. +const EventSinkConfigID resource.ID = "event-sink" + +// EventSinkConfigSpec describes configuration of Talos event log streaming. +// +//gotagsrewrite:gen +type EventSinkConfigSpec struct { + Endpoint string `yaml:"endpoint" protobuf:"1"` +} + +// NewEventSinkConfig initializes a EventSinkConfig resource. +func NewEventSinkConfig() *EventSinkConfig { + return typed.NewResource[EventSinkConfigSpec, EventSinkConfigExtension]( + resource.NewMetadata(NamespaceName, EventSinkConfigType, EventSinkConfigID, resource.VersionUndefined), + EventSinkConfigSpec{}, + ) +} + +// EventSinkConfigExtension is auxiliary resource data for EventSinkConfig. +type EventSinkConfigExtension struct{} + +// ResourceDefinition implements meta.ResourceDefinitionProvider interface. +func (EventSinkConfigExtension) ResourceDefinition() meta.ResourceDefinitionSpec { + return meta.ResourceDefinitionSpec{ + Type: EventSinkConfigType, + Aliases: []resource.Type{}, + DefaultNamespace: NamespaceName, + } +} + +func init() { + proto.RegisterDefaultTypes() + + err := protobuf.RegisterDynamic[EventSinkConfigSpec](EventSinkConfigType, &EventSinkConfig{}) + if err != nil { + panic(err) + } +} diff --git a/pkg/machinery/resources/runtime/kmsg_log_config.go b/pkg/machinery/resources/runtime/kmsg_log_config.go index 0e40e2dd3..3aeb18864 100644 --- a/pkg/machinery/resources/runtime/kmsg_log_config.go +++ b/pkg/machinery/resources/runtime/kmsg_log_config.go @@ -15,7 +15,7 @@ import ( "github.com/siderolabs/talos/pkg/machinery/proto" ) -// KmsgLogConfigType is type of KernelParam resource. +// KmsgLogConfigType is type of KmsgLogConfig resource. const KmsgLogConfigType = resource.Type("KmsgLogConfigs.runtime.talos.dev") // KmsgLogConfig resource holds configuration for kernel message log streaming. @@ -24,7 +24,7 @@ type KmsgLogConfig = typed.Resource[KmsgLogConfigSpec, KmsgLogConfigExtension] // KmsgLogConfigID is a resource ID for KmsgLogConfig. const KmsgLogConfigID resource.ID = "kmsg-log" -// KmsgLogConfigSpec describes status of the defined sysctls. +// KmsgLogConfigSpec describes configuration for kmsg log streaming. // //gotagsrewrite:gen type KmsgLogConfigSpec struct { diff --git a/pkg/machinery/resources/runtime/runtime.go b/pkg/machinery/resources/runtime/runtime.go index d3bfec7ae..6f5b93fe3 100644 --- a/pkg/machinery/resources/runtime/runtime.go +++ b/pkg/machinery/resources/runtime/runtime.go @@ -5,4 +5,4 @@ package runtime //nolint:lll -//go:generate deep-copy -type DevicesStatusSpec -type KernelModuleSpecSpec -type KernelParamSpecSpec -type KernelParamStatusSpec -type KmsgLogConfigSpec -type MachineStatusSpec -type MetaKeySpec -type MountStatusSpec -type PlatformMetadataSpec -header-file ../../../../hack/boilerplate.txt -o deep_copy.generated.go . +//go:generate deep-copy -type DevicesStatusSpec -type EventSinkConfigSpec -type KernelModuleSpecSpec -type KernelParamSpecSpec -type KernelParamStatusSpec -type KmsgLogConfigSpec -type MachineStatusSpec -type MetaKeySpec -type MountStatusSpec -type PlatformMetadataSpec -header-file ../../../../hack/boilerplate.txt -o deep_copy.generated.go . diff --git a/pkg/machinery/resources/runtime/runtime_test.go b/pkg/machinery/resources/runtime/runtime_test.go index 97fca2996..8b9e0442b 100644 --- a/pkg/machinery/resources/runtime/runtime_test.go +++ b/pkg/machinery/resources/runtime/runtime_test.go @@ -26,6 +26,7 @@ func TestRegisterResource(t *testing.T) { for _, resource := range []resource.Resource{ &runtime.DevicesStatus{}, + &runtime.EventSinkConfig{}, &runtime.ExtensionStatus{}, &runtime.KernelModuleSpec{}, &runtime.KernelParamSpec{}, diff --git a/website/content/v1.5/reference/api.md b/website/content/v1.5/reference/api.md index 928338ce0..79c5f924d 100644 --- a/website/content/v1.5/reference/api.md +++ b/website/content/v1.5/reference/api.md @@ -179,6 +179,7 @@ description: Talos gRPC API reference. - [resource/definitions/runtime/runtime.proto](#resource/definitions/runtime/runtime.proto) - [DevicesStatusSpec](#talos.resource.definitions.runtime.DevicesStatusSpec) + - [EventSinkConfigSpec](#talos.resource.definitions.runtime.EventSinkConfigSpec) - [KernelModuleSpecSpec](#talos.resource.definitions.runtime.KernelModuleSpecSpec) - [KernelParamSpecSpec](#talos.resource.definitions.runtime.KernelParamSpecSpec) - [KernelParamStatusSpec](#talos.resource.definitions.runtime.KernelParamStatusSpec) @@ -3274,6 +3275,21 @@ DevicesStatusSpec is the spec for devices status. + + +### EventSinkConfigSpec +EventSinkConfigSpec describes configuration of Talos event log streaming. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| endpoint | [string](#string) | | | + + + + + + ### KernelModuleSpecSpec @@ -3326,7 +3342,7 @@ KernelParamStatusSpec describes status of the defined sysctls. ### KmsgLogConfigSpec -KmsgLogConfigSpec describes status of the defined sysctls. +KmsgLogConfigSpec describes configuration for kmsg log streaming. | Field | Type | Label | Description |