From 176db756f7f2036a6b77396fd1342b7c24b2ef93 Mon Sep 17 00:00:00 2001 From: Austin Pond Date: Mon, 18 Nov 2024 11:20:31 -0500 Subject: [PATCH 1/3] Use context.Context instead of <-chan struct{} for all Run methods in the operator package. --- .../operator/opinionated/reconciler/main.go | 16 +-- examples/operator/opinionated/watcher/main.go | 14 +-- examples/operator/simple/reconciler/main.go | 14 +-- examples/operator/simple/watcher/main.go | 14 +-- operator/informer_controller.go | 19 +-- operator/informer_controller_test.go | 114 +++++++++--------- operator/informer_customcache.go | 4 +- operator/informer_customcache_test.go | 24 ++-- operator/informer_kubernetes.go | 12 +- operator/operator.go | 19 +-- operator/operator_test.go | 31 +++-- simple/app.go | 6 +- simple/operator.go | 12 +- 13 files changed, 134 insertions(+), 165 deletions(-) diff --git a/examples/operator/opinionated/reconciler/main.go b/examples/operator/opinionated/reconciler/main.go index b96c2282..e77c784a 100644 --- a/examples/operator/opinionated/reconciler/main.go +++ b/examples/operator/opinionated/reconciler/main.go @@ -7,7 +7,6 @@ import ( "log" "os" "os/signal" - "syscall" "time" "github.com/grafana/grafana-app-sdk/k8s" @@ -125,21 +124,14 @@ func main() { // Informers also implement Controller, so we can use them as a controller directly if there's no need for an intermediary. op.AddController(informerController) - // Create the stop channel - stopCh := make(chan struct{}, 1) - - // Set up a signal handler - sigChan := make(chan os.Signal, 1) - signal.Notify(sigChan, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) - go func() { - <-sigChan - close(stopCh) - }() + // Create the run context + ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill) + defer cancel() log.Printf("%sStarting Operator%s", green, nc) // Run the controller (will block until stopCh receives a message or is closed) - err = op.Run(stopCh) + err = op.Run(ctx) if err != nil { panic(fmt.Errorf("error running operator: %w", err)) } diff --git a/examples/operator/opinionated/watcher/main.go b/examples/operator/opinionated/watcher/main.go index 1c2ca762..0a27ed7e 100644 --- a/examples/operator/opinionated/watcher/main.go +++ b/examples/operator/opinionated/watcher/main.go @@ -7,7 +7,6 @@ import ( "log" "os" "os/signal" - "syscall" "time" "github.com/grafana/grafana-app-sdk/k8s" @@ -120,21 +119,14 @@ func main() { // Informers also implement Controller, so we can use them as a controller directly if there's no need for an intermediary. op.AddController(informer) - // Create the stop channel - stopCh := make(chan struct{}, 1) - // Set up a signal handler - sigChan := make(chan os.Signal, 1) - signal.Notify(sigChan, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) - go func() { - <-sigChan - close(stopCh) - }() + ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill) + defer cancel() log.Printf("%sStarting Operator%s", green, nc) // Run the controller (will block until stopCh receives a message or is closed) - op.Run(stopCh) + op.Run(ctx) } type OpinionatedModel struct { diff --git a/examples/operator/simple/reconciler/main.go b/examples/operator/simple/reconciler/main.go index 82486ba9..16df4478 100644 --- a/examples/operator/simple/reconciler/main.go +++ b/examples/operator/simple/reconciler/main.go @@ -7,7 +7,6 @@ import ( "log" "os" "os/signal" - "syscall" "time" "github.com/grafana/grafana-app-sdk/k8s" @@ -89,21 +88,14 @@ func main() { panic(fmt.Errorf("unable to reconcile kind: %w", err)) } - // Create the stop channel - stopCh := make(chan struct{}, 1) - // Set up a signal handler - sigChan := make(chan os.Signal, 1) - signal.Notify(sigChan, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) - go func() { - <-sigChan - close(stopCh) - }() + ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill) + defer cancel() log.Print("\u001B[1;32mStarting Operator\u001B[0m") // Run the controller (will block until stopCh receives a message or is closed) - err = simpleOperator.Run(stopCh) + err = simpleOperator.Run(ctx) if err != nil { panic(fmt.Errorf("error running operator: %w", err)) } diff --git a/examples/operator/simple/watcher/main.go b/examples/operator/simple/watcher/main.go index 849881a4..d3306983 100644 --- a/examples/operator/simple/watcher/main.go +++ b/examples/operator/simple/watcher/main.go @@ -7,7 +7,6 @@ import ( "log" "os" "os/signal" - "syscall" "time" "github.com/grafana/grafana-app-sdk/k8s" @@ -96,21 +95,14 @@ func main() { panic(fmt.Errorf("unable to watch kind: %w", err)) } - // Create the stop channel - stopCh := make(chan struct{}, 1) - // Set up a signal handler - sigChan := make(chan os.Signal, 1) - signal.Notify(sigChan, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) - go func() { - <-sigChan - close(stopCh) - }() + ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill) + defer cancel() log.Print("\u001B[1;32mStarting Operator\u001B[0m") // Run the controller (will block until stopCh receives a message or is closed) - err = simpleOperator.Run(stopCh) + err = simpleOperator.Run(ctx) if err != nil { panic(fmt.Errorf("error running operator: %w", err)) } diff --git a/operator/informer_controller.go b/operator/informer_controller.go index c4184698..3dcad218 100644 --- a/operator/informer_controller.go +++ b/operator/informer_controller.go @@ -9,11 +9,14 @@ import ( "github.com/prometheus/client_golang/prometheus" + "github.com/grafana/grafana-app-sdk/app" "github.com/grafana/grafana-app-sdk/logging" "github.com/grafana/grafana-app-sdk/metrics" "github.com/grafana/grafana-app-sdk/resource" ) +var _ Controller = &InformerController{} + type ResourceAction string const ( @@ -38,8 +41,8 @@ var DefaultErrorHandler = func(ctx context.Context, err error) { // Informer is an interface describing an informer which can be managed by InformerController type Informer interface { + app.Runnable AddEventHandler(handler ResourceWatcher) error - Run(stopCh <-chan struct{}) error } // ResourceWatcher describes an object which handles Add/Update/Delete actions for a resource @@ -283,14 +286,16 @@ func (c *InformerController) RemoveAllReconcilersForResource(resourceKind string // Run runs the controller, which starts all informers, until stopCh is closed // //nolint:errcheck -func (c *InformerController) Run(stopCh <-chan struct{}) error { +func (c *InformerController) Run(ctx context.Context) error { + derivedCtx, cancel := context.WithCancel(ctx) + defer cancel() c.informers.RangeAll(func(_ string, _ int, inf Informer) { - go inf.Run(stopCh) + go inf.Run(derivedCtx) }) - go c.retryTicker(stopCh) + go c.retryTicker(derivedCtx) - <-stopCh + <-ctx.Done() return nil } @@ -542,7 +547,7 @@ func (c *InformerController) doReconcile(ctx context.Context, reconciler Reconci // retryTicker blocks until stopCh is closed or receives a message. // It checks if there are function calls to be retried every second, and, if there are any, calls the function. // If the function returns an error, it schedules a new retry according to the RetryPolicy. -func (c *InformerController) retryTicker(stopCh <-chan struct{}) { +func (c *InformerController) retryTicker(ctx context.Context) { ticker := time.NewTicker(c.retryTickerInterval) defer ticker.Stop() for { @@ -583,7 +588,7 @@ func (c *InformerController) retryTicker(stopCh <-chan struct{}) { c.toRetry.AddItem(key, inf) } } - case <-stopCh: + case <-ctx.Done(): return } } diff --git a/operator/informer_controller_test.go b/operator/informer_controller_test.go index ef7b8ac4..0b707ccd 100644 --- a/operator/informer_controller_test.go +++ b/operator/informer_controller_test.go @@ -345,16 +345,16 @@ func TestInformerController_Run(t *testing.T) { wg := sync.WaitGroup{} c := NewInformerController(InformerControllerConfig{}) inf1 := &mockInformer{ - RunFunc: func(stopCh <-chan struct{}) error { - <-stopCh + RunFunc: func(ctx context.Context) error { + <-ctx.Done() wg.Done() return nil }, } c.AddInformer(inf1, "foo") inf2 := &mockInformer{ - RunFunc: func(stopCh <-chan struct{}) error { - <-stopCh + RunFunc: func(ctx context.Context) error { + <-ctx.Done() wg.Done() return nil }, @@ -362,16 +362,13 @@ func TestInformerController_Run(t *testing.T) { c.AddInformer(inf2, "bar") wg.Add(3) - stopCh := make(chan struct{}) + ctx, cancel := context.WithTimeout(context.Background(), time.Second*3) + defer cancel() go func() { - err := c.Run(stopCh) + err := c.Run(ctx) assert.Nil(t, err) wg.Done() }() - go func() { - time.Sleep(time.Second * 3) - close(stopCh) - }() wg.Wait() }) @@ -379,16 +376,16 @@ func TestInformerController_Run(t *testing.T) { wg := sync.WaitGroup{} c := NewInformerController(InformerControllerConfig{}) inf1 := &mockInformer{ - RunFunc: func(stopCh <-chan struct{}) error { - <-stopCh + RunFunc: func(ctx context.Context) error { + <-ctx.Done() wg.Done() return nil }, } c.AddInformer(inf1, "foo") inf2 := &mockInformer{ - RunFunc: func(stopCh <-chan struct{}) error { - <-stopCh + RunFunc: func(ctx context.Context) error { + <-ctx.Done() wg.Done() return nil }, @@ -396,16 +393,13 @@ func TestInformerController_Run(t *testing.T) { c.AddInformer(inf2, "bar") wg.Add(3) - stopCh := make(chan struct{}) + ctx, cancel := context.WithTimeout(context.Background(), time.Second*3) + defer cancel() go func() { - err := c.Run(stopCh) + err := c.Run(ctx) assert.Nil(t, err) wg.Done() }() - go func() { - time.Sleep(time.Second * 3) - close(stopCh) - }() wg.Wait() }) } @@ -432,10 +426,10 @@ func TestInformerController_Run_WithWatcherAndReconciler(t *testing.T) { c.AddInformer(inf, kind) // Run - stopCh := make(chan struct{}) - go c.Run(stopCh) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + go c.Run(ctx) inf.FireAdd(context.Background(), emptyObject) - close(stopCh) assert.Equal(t, 1, addCalls) assert.Equal(t, 1, reconcileCalls) }) @@ -471,11 +465,11 @@ func TestInformerController_Run_WithWatcherAndReconciler(t *testing.T) { c.AddInformer(inf, kind) // Run - stopCh := make(chan struct{}) - go c.Run(stopCh) + ctx, cancel := context.WithCancel(context.Background()) + go c.Run(ctx) inf.FireAdd(context.Background(), emptyObject) wg.Wait() - close(stopCh) + cancel() assert.Equal(t, 2, addCalls) assert.Equal(t, 1, reconcileCalls) }) @@ -520,11 +514,11 @@ func TestInformerController_Run_WithWatcherAndReconciler(t *testing.T) { c.AddInformer(inf, kind) // Run - stopCh := make(chan struct{}) - go c.Run(stopCh) + ctx, cancel := context.WithCancel(context.Background()) + go c.Run(ctx) inf.FireAdd(context.Background(), emptyObject) wg.Wait() - close(stopCh) + cancel() assert.Equal(t, 1, addCalls) assert.Equal(t, 2, reconcileCalls) }) @@ -570,11 +564,11 @@ func TestInformerController_Run_WithWatcherAndReconciler(t *testing.T) { c.AddInformer(inf, kind) // Run - stopCh := make(chan struct{}) - go c.Run(stopCh) + ctx, cancel := context.WithCancel(context.Background()) + go c.Run(ctx) inf.FireAdd(context.Background(), emptyObject) wg.Wait() - close(stopCh) + cancel() assert.Equal(t, 2, addCalls) assert.Equal(t, 2, reconcileCalls) }) @@ -610,11 +604,11 @@ func TestInformerController_Run_WithWatcherAndReconciler(t *testing.T) { c.AddInformer(inf, kind) // Run - stopCh := make(chan struct{}) - go c.Run(stopCh) + ctx, cancel := context.WithCancel(context.Background()) + go c.Run(ctx) inf.FireAdd(context.Background(), emptyObject) wg.Wait() - close(stopCh) + cancel() assert.Equal(t, 1, addCalls) assert.Equal(t, 2, reconcileCalls) }) @@ -651,11 +645,11 @@ func TestInformerController_Run_WithWatcherAndReconciler(t *testing.T) { c.AddInformer(inf, kind) // Run - stopCh := make(chan struct{}) - go c.Run(stopCh) + ctx, cancel := context.WithCancel(context.Background()) + go c.Run(ctx) inf.FireAdd(context.Background(), emptyObject) wg.Wait() - close(stopCh) + cancel() assert.Equal(t, 2, addCalls) assert.Equal(t, 2, reconcileCalls) }) @@ -692,9 +686,9 @@ func TestInformerController_Run_BackoffRetry(t *testing.T) { }, "foo") wg.Add(2) - stopCh := make(chan struct{}) + ctx, cancel := context.WithCancel(context.Background()) go func() { - err := c.Run(stopCh) + err := c.Run(ctx) assert.Nil(t, err) wg.Done() }() @@ -706,7 +700,7 @@ func TestInformerController_Run_BackoffRetry(t *testing.T) { go func() { // 3 retries takes 7 seconds, 4 takes 15. Use 10 for some leeway time.Sleep(time.Second * 10) - close(stopCh) + cancel() }() wg.Wait() // We should have four total attempts for each call, initial + three retries @@ -747,9 +741,9 @@ func TestInformerController_Run_WithRetries(t *testing.T) { }, "foo") wg.Add(2) - stopCh := make(chan struct{}) + ctx, cancel := context.WithCancel(context.Background()) go func() { - err := c.Run(stopCh) + err := c.Run(ctx) assert.Nil(t, err) wg.Done() }() @@ -761,7 +755,7 @@ func TestInformerController_Run_WithRetries(t *testing.T) { go func() { // 3 retries takes 7 seconds, 4 takes 15. Use 10 for some leeway time.Sleep(time.Second) - close(stopCh) + cancel() }() wg.Wait() // We should have four total attempts, though we may be off-by-one because timing is hard, @@ -809,9 +803,9 @@ func TestInformerController_Run_WithRetries(t *testing.T) { }, "foo") wg.Add(2) - stopCh := make(chan struct{}) + ctx, cancel := context.WithCancel(context.Background()) go func() { - err := c.Run(stopCh) + err := c.Run(ctx) assert.Nil(t, err) wg.Done() }() @@ -822,7 +816,7 @@ func TestInformerController_Run_WithRetries(t *testing.T) { go func() { // Wait for half a second, this should be enough time for many retries if the halt doesn't work time.Sleep(time.Millisecond * 500) - close(stopCh) + cancel() }() wg.Wait() // We should have only two attempts for each @@ -859,9 +853,9 @@ func TestInformerController_Run_WithRetries(t *testing.T) { }, "foo") wg.Add(2) - stopCh := make(chan struct{}) + ctx, cancel := context.WithCancel(context.Background()) go func() { - err := c.Run(stopCh) + err := c.Run(ctx) assert.Nil(t, err) wg.Done() }() @@ -869,7 +863,7 @@ func TestInformerController_Run_WithRetries(t *testing.T) { go func() { // Wait for half a second, this should be enough time for many retries if the halt doesn't work time.Sleep(time.Millisecond * 500) - close(stopCh) + cancel() }() wg.Wait() // We should have only two attempts for each @@ -906,9 +900,10 @@ func TestInformerController_Run_WithRetriesAndDequeuePolicy(t *testing.T) { return nil }, }, "foo") - stopCh := make(chan struct{}) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() go func() { - err := c.Run(stopCh) + err := c.Run(ctx) assert.Nil(t, err) }() @@ -966,9 +961,10 @@ func TestInformerController_Run_WithRetriesAndDequeuePolicy(t *testing.T) { return updateError }, }, "foo") - stopCh := make(chan struct{}) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() go func() { - err := c.Run(stopCh) + err := c.Run(ctx) assert.Nil(t, err) }() @@ -1087,7 +1083,7 @@ func TestOpinionatedRetryDequeuePolicy(t *testing.T) { type mockInformer struct { AddEventHandlerFunc func(handler ResourceWatcher) - RunFunc func(stopCh <-chan struct{}) error + RunFunc func(ctx context.Context) error } func (i *mockInformer) AddEventHandler(handler ResourceWatcher) error { @@ -1096,9 +1092,9 @@ func (i *mockInformer) AddEventHandler(handler ResourceWatcher) error { } return nil } -func (i *mockInformer) Run(stopCh <-chan struct{}) error { +func (i *mockInformer) Run(ctx context.Context) error { if i.RunFunc != nil { - return i.RunFunc(stopCh) + return i.RunFunc(ctx) } return nil } @@ -1113,8 +1109,8 @@ func (ti *testInformer) AddEventHandler(handler ResourceWatcher) error { return nil } -func (ti *testInformer) Run(stopCh <-chan struct{}) error { - <-stopCh +func (ti *testInformer) Run(ctx context.Context) error { + <-ctx.Done() if ti.onStop != nil { ti.onStop() } diff --git a/operator/informer_customcache.go b/operator/informer_customcache.go index ea58eba3..c15251e5 100644 --- a/operator/informer_customcache.go +++ b/operator/informer_customcache.go @@ -98,7 +98,7 @@ func (c *CustomCacheInformer) AddEventHandler(handler ResourceWatcher) error { // Run runs the informer until stopCh is closed or receives a message. // While running, events from the ListerWatcher will be propagated to all registered ResourceWatcher handlers, // and current state of all resources will be stored in the custom cache.Store. -func (c *CustomCacheInformer) Run(stopCh <-chan struct{}) error { +func (c *CustomCacheInformer) Run(ctx context.Context) error { defer utilruntime.HandleCrash() if c.HasStarted() { @@ -128,7 +128,7 @@ func (c *CustomCacheInformer) Run(stopCh <-chan struct{}) error { }() // Wait for the processor to complete startup before running the controller (otherwise events may be dropped by distribution) <-c.processor.startedCh - c.controller.Run(stopCh) + c.controller.Run(ctx.Done()) return nil } diff --git a/operator/informer_customcache_test.go b/operator/informer_customcache_test.go index 5c35a80e..ac813c9e 100644 --- a/operator/informer_customcache_test.go +++ b/operator/informer_customcache_test.go @@ -30,13 +30,13 @@ func TestCustomCacheInformer_Run(t *testing.T) { return nil, fmt.Errorf("I AM ERROR") }, }, untypedKind) - stopCh := make(chan struct{}) + ctx, cancel := context.WithCancel(context.Background()) stopped := false go func() { - inf.Run(stopCh) + inf.Run(ctx) stopped = true }() - close(stopCh) + cancel() time.Sleep(time.Second) assert.True(t, stopped, "informer did not stop when stopCh was closed") }) @@ -92,9 +92,9 @@ func TestCustomCacheInformer_Run_DistributeEvents(t *testing.T) { }) } - stopCh := make(chan struct{}) - defer close(stopCh) - go inf.Run(stopCh) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + go inf.Run(ctx) // Add wg.Add(numHandlers) @@ -155,9 +155,9 @@ func TestCustomCacheInformer_Run_ManyEvents(t *testing.T) { }, }) } - stopCh := make(chan struct{}) - defer close(stopCh) - go inf.Run(stopCh) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + go inf.Run(ctx) for i := 0; i < numEvents; i++ { etype := watch.Added switch i % 3 { @@ -215,9 +215,9 @@ func TestCustomCacheInformer_Run_CacheState(t *testing.T) { return nil }, }) - stopCh := make(chan struct{}) - go inf.Run(stopCh) - defer close(stopCh) + ctx, cancel := context.WithCancel(context.Background()) + go inf.Run(ctx) + defer cancel() obj := &resource.UntypedObject{ ObjectMeta: metav1.ObjectMeta{ diff --git a/operator/informer_kubernetes.go b/operator/informer_kubernetes.go index cd41a736..b923eb11 100644 --- a/operator/informer_kubernetes.go +++ b/operator/informer_kubernetes.go @@ -12,6 +12,8 @@ import ( "github.com/grafana/grafana-app-sdk/resource" ) +var _ Informer = &KubernetesBasedInformer{} + // KubernetesBasedInformer is a k8s apimachinery-based informer. It wraps a k8s cache.SharedIndexInformer, // and works most optimally with a client that has a Watch response that implements KubernetesCompatibleWatch. type KubernetesBasedInformer struct { @@ -20,7 +22,7 @@ type KubernetesBasedInformer struct { schema resource.Kind } -type KubernetesBasedIformerOptions struct { +type KubernetesBasedInformerOptions struct { ListWatchOptions ListWatchOptions // CacheResyncInterval is the interval at which the informer will emit CacheResync events for all resources in the cache. // This is distinct from a full resync, as no information is fetched from the API server. @@ -32,14 +34,14 @@ type KubernetesBasedIformerOptions struct { // using the ListWatchClient provided to do its List and Watch requests. func NewKubernetesBasedInformer(sch resource.Kind, client ListWatchClient, namespace string) ( *KubernetesBasedInformer, error) { - return NewKubernetesBasedInformerWithFilters(sch, client, KubernetesBasedIformerOptions{ + return NewKubernetesBasedInformerWithFilters(sch, client, KubernetesBasedInformerOptions{ ListWatchOptions: ListWatchOptions{Namespace: namespace}, }) } // NewKubernetesBasedInformerWithFilters creates a new KubernetesBasedInformer for the provided schema and namespace, // using the ListWatchClient provided to do its List and Watch requests applying provided labelFilters if it is not empty. -func NewKubernetesBasedInformerWithFilters(sch resource.Kind, client ListWatchClient, options KubernetesBasedIformerOptions) ( +func NewKubernetesBasedInformerWithFilters(sch resource.Kind, client ListWatchClient, options KubernetesBasedInformerOptions) ( *KubernetesBasedInformer, error) { if client == nil { return nil, fmt.Errorf("client cannot be nil") @@ -72,8 +74,8 @@ func (k *KubernetesBasedInformer) AddEventHandler(handler ResourceWatcher) error } // Run starts the informer and blocks until stopCh receives a message -func (k *KubernetesBasedInformer) Run(stopCh <-chan struct{}) error { - k.SharedIndexInformer.Run(stopCh) +func (k *KubernetesBasedInformer) Run(ctx context.Context) error { + k.SharedIndexInformer.Run(ctx.Done()) return nil } diff --git a/operator/operator.go b/operator/operator.go index 1a1059e6..f789d9e8 100644 --- a/operator/operator.go +++ b/operator/operator.go @@ -1,8 +1,11 @@ package operator import ( + "context" + "github.com/prometheus/client_golang/prometheus" + "github.com/grafana/grafana-app-sdk/app" "github.com/grafana/grafana-app-sdk/metrics" ) @@ -15,7 +18,7 @@ type ListWatchOptions struct { // Controller is an interface that describes a controller which can be run as part of an operator type Controller interface { - Run(<-chan struct{}) error + app.Runnable } // Operator is the highest-level construct of the `operator` package, @@ -52,17 +55,18 @@ func (o *Operator) PrometheusCollectors() []prometheus.Collector { return collectors } -// Run runs the operator until an unrecoverable error occurs or the stopCh is closed/receives a message. -func (o *Operator) Run(stopCh <-chan struct{}) error { +// Run runs the operator until an unrecoverable error occurs or the context is canceled. +func (o *Operator) Run(ctx context.Context) error { // TODO: operator should deal with scaling logic if possible. errs := make(chan error) - controllerStopChannel := make(chan struct{}) + derivedCtx, cancel := context.WithCancel(ctx) + defer cancel() // Start all controllers for _, controller := range o.controllers { go func(c Controller) { - err := c.Run(controllerStopChannel) + err := c.Run(derivedCtx) if err != nil { errs <- err } @@ -73,12 +77,9 @@ func (o *Operator) Run(stopCh <-chan struct{}) error { var err error select { case err = <-errs: - case <-stopCh: + case <-ctx.Done(): } - // Stop all controllers - close(controllerStopChannel) - // If we encountered an error, return it (if we didn't, this will be nil) return err } diff --git a/operator/operator_test.go b/operator/operator_test.go index 2d9ff369..a2d198a6 100644 --- a/operator/operator_test.go +++ b/operator/operator_test.go @@ -1,6 +1,7 @@ package operator import ( + "context" "errors" "testing" "time" @@ -9,12 +10,12 @@ import ( ) type mockController struct { - RunFunc func(<-chan struct{}) error + RunFunc func(ctx context.Context) error } -func (m *mockController) Run(ch <-chan struct{}) error { +func (m *mockController) Run(ctx context.Context) error { if m.RunFunc != nil { - return m.RunFunc(ch) + return m.RunFunc(ctx) } return nil } @@ -36,22 +37,23 @@ func TestOperator_Run(t *testing.T) { done := make(chan struct{}, 1) o := New() o.AddController(&mockController{ - RunFunc: func(i <-chan struct{}) error { - <-i + RunFunc: func(ctx context.Context) error { + <-ctx.Done() close(done) return nil }, }) o.AddController(&mockController{ - RunFunc: func(<-chan struct{}) error { + RunFunc: func(_ context.Context) error { time.Sleep(time.Second) return errors.New("I AM ERROR") }, }) - stopCh := make(chan struct{}, 1) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() - err := o.Run(stopCh) + err := o.Run(ctx) assert.Equal(t, errors.New("I AM ERROR"), err) _, open := <-done assert.False(t, open) @@ -61,20 +63,17 @@ func TestOperator_Run(t *testing.T) { done := make(chan struct{}, 1) o := New() o.AddController(&mockController{ - RunFunc: func(i <-chan struct{}) error { - <-i + RunFunc: func(ctx context.Context) error { + <-ctx.Done() close(done) return nil }, }) - stopCh := make(chan struct{}, 1) - go func() { - time.Sleep(time.Second) - close(stopCh) - }() + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() - err := o.Run(stopCh) + err := o.Run(ctx) assert.Nil(t, err) _, open := <-done assert.False(t, open) diff --git a/simple/app.go b/simple/app.go index 91d0b182..2e6b7fc9 100644 --- a/simple/app.go +++ b/simple/app.go @@ -221,9 +221,7 @@ func NewApp(config AppConfig) (*App, error) { for gk, converter := range config.Converters { a.RegisterKindConverter(gk, converter) } - a.runner.AddRunnable(&k8sRunnable{ - runner: a.informerController, - }) + a.runner.AddRunnable(a.informerController) return a, nil } @@ -323,7 +321,7 @@ func (a *App) watchKind(kind AppUnmanagedKind) error { if err != nil { return err } - inf, err := operator.NewKubernetesBasedInformerWithFilters(kind.Kind, client, operator.KubernetesBasedIformerOptions{ + inf, err := operator.NewKubernetesBasedInformerWithFilters(kind.Kind, client, operator.KubernetesBasedInformerOptions{ ListWatchOptions: operator.ListWatchOptions{ Namespace: kind.ReconcileOptions.Namespace, LabelFilters: kind.ReconcileOptions.LabelFilters, diff --git a/simple/operator.go b/simple/operator.go index 268d8160..867c22be 100644 --- a/simple/operator.go +++ b/simple/operator.go @@ -165,16 +165,16 @@ func (o *Operator) ClientGenerator() resource.ClientGenerator { // * Expose all configured webhooks as an HTTPS server // // * Expose a prometheus metrics endpoint if configured -func (o *Operator) Run(stopCh <-chan struct{}) error { +func (o *Operator) Run(ctx context.Context) error { op := operator.New() op.AddController(o.controller) if o.admission != nil { - op.AddController(o.admission) + op.AddController(&k8sRunnable{runner: o.admission}) } if o.metricsExporter != nil { - op.AddController(o.metricsExporter) + op.AddController(&k8sRunnable{runner: o.metricsExporter}) } - return op.Run(stopCh) + return op.Run(ctx) } // RegisterMetricsCollectors registers Prometheus collectors with the exporter used by the operator, @@ -190,7 +190,7 @@ func (o *Operator) WatchKind(kind resource.Kind, watcher SyncWatcher, options op if err != nil { return err } - inf, err := operator.NewKubernetesBasedInformerWithFilters(kind, client, operator.KubernetesBasedIformerOptions{ + inf, err := operator.NewKubernetesBasedInformerWithFilters(kind, client, operator.KubernetesBasedInformerOptions{ ListWatchOptions: operator.ListWatchOptions{Namespace: options.Namespace, LabelFilters: options.LabelFilters, FieldSelectors: options.FieldSelectors}, CacheResyncInterval: o.cacheResyncInterval, }) @@ -227,7 +227,7 @@ func (o *Operator) ReconcileKind(kind resource.Kind, reconciler operator.Reconci if err != nil { return err } - inf, err := operator.NewKubernetesBasedInformerWithFilters(kind, client, operator.KubernetesBasedIformerOptions{ + inf, err := operator.NewKubernetesBasedInformerWithFilters(kind, client, operator.KubernetesBasedInformerOptions{ ListWatchOptions: operator.ListWatchOptions{Namespace: options.Namespace, LabelFilters: options.LabelFilters, FieldSelectors: options.FieldSelectors}, CacheResyncInterval: o.cacheResyncInterval, }) From b2e4c8c9b5839013e76bdf5271f2df447417ca3e Mon Sep 17 00:00:00 2001 From: Austin Pond Date: Mon, 18 Nov 2024 16:34:00 -0500 Subject: [PATCH 2/3] Use context passed to Run() (if available) when ResourceWatcher methods are called in KubernetesBasedInformer and CustomCacheInformer. --- operator/informer_customcache.go | 20 +++++++++++++++----- operator/informer_kubernetes.go | 12 +++++++++++- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/operator/informer_customcache.go b/operator/informer_customcache.go index c15251e5..eff5ab74 100644 --- a/operator/informer_customcache.go +++ b/operator/informer_customcache.go @@ -43,6 +43,7 @@ type CustomCacheInformer struct { objectType resource.Object processor *informerProcessor objectTransformer func(any) (resource.Object, error) + runContext context.Context } // NewMemcachedInformer creates a new CustomCacheInformer which uses memcached as its custom cache. @@ -91,7 +92,12 @@ func (c *CustomCacheInformer) PrometheusCollectors() []prometheus.Collector { // AddEventHandler adds the provided ResourceWatcher to the list of handlers to have events reported to. func (c *CustomCacheInformer) AddEventHandler(handler ResourceWatcher) error { - c.processor.addListener(newInformerProcessorListener(toResourceEventHandlerFuncs(handler, c.objectTransformer, c.errorHandler), processorBufferSize)) + c.processor.addListener(newInformerProcessorListener(toResourceEventHandlerFuncs(handler, c.objectTransformer, c.errorHandler, func() context.Context { + if c.runContext != nil { + return c.runContext + } + return context.Background() + }), processorBufferSize)) return nil } @@ -104,6 +110,10 @@ func (c *CustomCacheInformer) Run(ctx context.Context) error { if c.HasStarted() { return fmt.Errorf("informer is already started") } + c.runContext = ctx + defer func() { + c.runContext = nil + }() func() { c.startedLock.Lock() @@ -257,10 +267,10 @@ func NewListerWatcher(client ListWatchClient, sch resource.Schema, filterOptions } } -func toResourceEventHandlerFuncs(handler ResourceWatcher, transformer func(any) (resource.Object, error), errorHandler func(context.Context, error)) *cache.ResourceEventHandlerFuncs { +func toResourceEventHandlerFuncs(handler ResourceWatcher, transformer func(any) (resource.Object, error), errorHandler func(context.Context, error), contextProvider func() context.Context) *cache.ResourceEventHandlerFuncs { return &cache.ResourceEventHandlerFuncs{ AddFunc: func(obj any) { - ctx, span := GetTracer().Start(context.Background(), "informer-event-add") + ctx, span := GetTracer().Start(contextProvider(), "informer-event-add") defer span.End() cast, err := transformer(obj) if err != nil { @@ -283,7 +293,7 @@ func toResourceEventHandlerFuncs(handler ResourceWatcher, transformer func(any) } }, UpdateFunc: func(oldObj, newObj any) { - ctx, span := GetTracer().Start(context.Background(), "informer-event-update") + ctx, span := GetTracer().Start(contextProvider(), "informer-event-update") defer span.End() cOld, err := transformer(oldObj) if err != nil { @@ -313,7 +323,7 @@ func toResourceEventHandlerFuncs(handler ResourceWatcher, transformer func(any) } }, DeleteFunc: func(obj any) { - ctx, span := GetTracer().Start(context.Background(), "informer-event-delete") + ctx, span := GetTracer().Start(contextProvider(), "informer-event-delete") defer span.End() cast, err := transformer(obj) if err != nil { diff --git a/operator/informer_kubernetes.go b/operator/informer_kubernetes.go index b923eb11..c27b0786 100644 --- a/operator/informer_kubernetes.go +++ b/operator/informer_kubernetes.go @@ -20,6 +20,7 @@ type KubernetesBasedInformer struct { ErrorHandler func(context.Context, error) SharedIndexInformer cache.SharedIndexInformer schema resource.Kind + runContext context.Context } type KubernetesBasedInformerOptions struct { @@ -68,13 +69,22 @@ func (k *KubernetesBasedInformer) AddEventHandler(handler ResourceWatcher) error // TODO: AddEventHandler returns the registration handle which should be supplied to RemoveEventHandler // but we don't currently call the latter. We should add RemoveEventHandler to the informer API // and let controller call it when appropriate. - _, err := k.SharedIndexInformer.AddEventHandler(toResourceEventHandlerFuncs(handler, k.toResourceObject, k.errorHandler)) + _, err := k.SharedIndexInformer.AddEventHandler(toResourceEventHandlerFuncs(handler, k.toResourceObject, k.errorHandler, func() context.Context { + if k.runContext != nil { + return k.runContext + } + return context.Background() + })) return err } // Run starts the informer and blocks until stopCh receives a message func (k *KubernetesBasedInformer) Run(ctx context.Context) error { + k.runContext = ctx + defer func() { + k.runContext = nil + }() k.SharedIndexInformer.Run(ctx.Done()) return nil } From a329584835249c5a54681cb6862fd69769790ed8 Mon Sep 17 00:00:00 2001 From: Austin Pond Date: Fri, 22 Nov 2024 16:24:29 -0500 Subject: [PATCH 3/3] Update workspace. --- go.work.sum | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/go.work.sum b/go.work.sum index 399c707b..d094858a 100644 --- a/go.work.sum +++ b/go.work.sum @@ -7,6 +7,7 @@ cel.dev/expr v0.16.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= cel.dev/expr v0.16.1 h1:NR0+oFYzR1CqLFhTAqg3ql59G9VfN8fKq1TCHJ6gq1g= cel.dev/expr v0.16.1/go.mod h1:AsGA5zb3WruAEQeQng1RZdGEXmBj0jvMWh6l5SnNuC8= cloud.google.com/go v0.26.0 h1:e0WKqKTd5BnrG8aKH3J3h+QvEIQtSUcf2n5UZ5ZgLtQ= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.110.7 h1:rJyC7nWRg2jWGZ4wSJ5nY65GTdYJkg0cd/uXb+ACI6o= cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= @@ -641,11 +642,14 @@ github.com/bufbuild/protovalidate-go v0.2.1 h1:pJr07sYhliyfj/STAM7hU4J3FKpVeLVKv github.com/bufbuild/protovalidate-go v0.2.1/go.mod h1:e7XXDtlxj5vlEyAgsrxpzayp4cEMKCSSb8ZCkin+MVA= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f h1:WBZRG4aNOuI15bLRrCgN8fCq8E5Xuty6jGbmSNEvSsU= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403 h1:cqQfy1jclcSy/FwLjemeg3SR1yaINm74aQyupQ0Bl8M= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= @@ -657,6 +661,7 @@ github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20/go.mod h1:W+zGtBO5Y1Ig github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= +github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f h1:6jduT9Hfc0njg5jJ1DdKCFPdMBrp/mdZfCpa5h+WM74= @@ -684,6 +689,8 @@ github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3 github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.12.0 h1:4X+VP1GHd1Mhj6IB5mMeGbLCleqxjletLK6K0rbxyZI= github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= @@ -691,6 +698,7 @@ github.com/envoyproxy/go-control-plane v0.12.1-0.20240621013728-1eb8caab5155 h1: github.com/envoyproxy/go-control-plane v0.12.1-0.20240621013728-1eb8caab5155/go.mod h1:5Wkq+JduFtdAXihLmeTJf+tRYIT4KBc2vPXDhwVo1pA= github.com/envoyproxy/go-control-plane v0.13.0 h1:HzkeUz1Knt+3bK+8LG1bxOO/jzWZmdxpwC51i202les= github.com/envoyproxy/go-control-plane v0.13.0/go.mod h1:GRaKG3dwvFoTg4nj7aXdZnvMg4d7nvT/wl9WgVXn3Q8= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= @@ -742,6 +750,7 @@ github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4= github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= @@ -750,6 +759,9 @@ github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4er github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1 h1:G5FRp8JnTd7RQH5kemVNlMeyXQAztQ3mOWV95KxsXH8= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= @@ -766,6 +778,8 @@ github.com/google/cel-go v0.17.8 h1:j9m730pMZt1Fc4oKhCLUHfjj6527LuhYcYw0Rl8gqto= github.com/google/cel-go v0.17.8/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY= github.com/google/cel-go v0.20.1 h1:nDx9r8S3L4pE61eDdt8igGj8rf5kjYR3ILxWIpWNi84= github.com/google/cel-go v0.20.1/go.mod h1:kWcIzTsPX0zmQ+H3TirHstLLf9ep5QTsZBN9u4dOYLg= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -784,6 +798,7 @@ github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.12.1/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= @@ -908,6 +923,7 @@ github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+v github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= @@ -920,6 +936,7 @@ github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJL github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -953,7 +970,9 @@ github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AV github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/substrait-io/substrait-go v0.4.2 h1:buDnjsb3qAqTaNbOR7VKmNgXf4lYQxWEcnSGUWBtmN8= github.com/substrait-io/substrait-go v0.4.2/go.mod h1:qhpnLmrcvAnlZsUyPXZRqldiHapPTXC3t7xFgDi3aQg= @@ -1047,16 +1066,19 @@ go.opentelemetry.io/contrib/samplers/jaegerremote v0.18.0/go.mod h1:tjp49JHNvreA go.opentelemetry.io/otel v1.23.0/go.mod h1:YCycw9ZeKhcJFrb34iVSkyT0iczq/zYDtZYFufObyB0= go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= go.opentelemetry.io/otel/metric v1.23.0/go.mod h1:MqUW2X2a6Q8RN96E2/nqNoT+z9BSms20Jb7Bbp+HiTo= go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= +go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= go.opentelemetry.io/otel/trace v1.23.0/go.mod h1:GSGTbIClEsuZrGIzoEHqsVfxgn5UkggkflQwDScNUsk= go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -1081,7 +1103,12 @@ golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 h1:XQyxROzUlZH+WIQwySDgnISgOivlhjIEwaQaJEJrrN0= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= @@ -1089,8 +1116,11 @@ golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -1105,18 +1135,27 @@ golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8= golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1131,17 +1170,25 @@ golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457 h1:zf5N6UOrA487eEFacMePxjXAJctxKmyjKUsjA11Uzuk= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= @@ -1154,9 +1201,13 @@ google.golang.org/api v0.164.0/go.mod h1:2OatzO7ZDQsoS7IFf3rvsE17/TldiU3F/zxFHeq google.golang.org/api v0.166.0/go.mod h1:4FcBc686KFi7QI/U51/2GKKevfZMpM17sCdibqe/bSA= google.golang.org/api v0.169.0 h1:QwWPy71FgMWqJN/l6jVlFHUa29a7dcUy02I8o799nPY= google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= @@ -1190,8 +1241,13 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/genproto/googleapis/rpc v0.0.0-20240930140551-af27646dc61f/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= @@ -1205,6 +1261,7 @@ google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvy google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= google.golang.org/grpc v1.66.1/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= @@ -1230,7 +1287,9 @@ gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzE gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc h1:/hemPrYIhOhy8zYrNj+069zDB68us2sMGsfkFJO0iZs= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= k8s.io/apiserver v0.30.3 h1:QZJndA9k2MjFqpnyYv/PH+9PE0SHhx3hBho4X0vE65g= k8s.io/apiserver v0.30.3/go.mod h1:6Oa88y1CZqnzetd2JdepO0UXzQX4ZnOekx2/PtEjrOg= k8s.io/apiserver v0.31.0 h1:p+2dgJjy+bk+B1Csz+mc2wl5gHwvNkC9QJV+w55LVrY= @@ -1239,6 +1298,8 @@ k8s.io/apiserver v0.31.1 h1:Sars5ejQDCRBY5f7R3QFHdqN3s61nhkpaX8/k1iEw1c= k8s.io/apiserver v0.31.1/go.mod h1:lzDhpeToamVZJmmFlaLwdYZwd7zB+WYRYIboqA1kGxM= k8s.io/apiserver v0.31.2 h1:VUzOEUGRCDi6kX1OyQ801m4A7AUPglpsmGvdsekmcI4= k8s.io/apiserver v0.31.2/go.mod h1:o3nKZR7lPlJqkU5I3Ove+Zx3JuoFjQobGX1Gctw6XuE= +k8s.io/apiserver v0.31.3 h1:+1oHTtCB+OheqFEz375D0IlzHZ5VeQKX1KGXnx+TTuY= +k8s.io/apiserver v0.31.3/go.mod h1:PrxVbebxrxQPFhJk4powDISIROkNMKHibTg9lTRQ0Qg= k8s.io/code-generator v0.30.3 h1:bmtnLJKagDS5f5uOEpLyJiDfIMKXGMKgOLBdde+w0Mc= k8s.io/code-generator v0.30.3/go.mod h1:PFgBiv+miFV7TZYp+RXgROkhA+sWYZ+mtpbMLofMke8= k8s.io/code-generator v0.31.0 h1:w607nrMi1KeDKB3/F/J4lIoOgAwc+gV9ZKew4XRfMp8= @@ -1247,6 +1308,8 @@ k8s.io/code-generator v0.31.1 h1:GvkRZEP2g2UnB2QKT2Dgc/kYxIkDxCHENv2Q1itioVs= k8s.io/code-generator v0.31.1/go.mod h1:oL2ky46L48osNqqZAeOcWWy0S5BXj50vVdwOtTefqIs= k8s.io/code-generator v0.31.2 h1:xLWxG0HEpMSHfcM//3u3Ro2Hmc6AyyLINQS//Z2GEOI= k8s.io/code-generator v0.31.2/go.mod h1:eEQHXgBU/m7LDaToDoiz3t97dUUVyOblQdwOr8rivqc= +k8s.io/code-generator v0.31.3 h1:Pj0fYOBms+ZrsulLi4DMsCEx1jG8fWKRLy44onHsLBI= +k8s.io/code-generator v0.31.3/go.mod h1:/umCIlT84g1+Yu5ZXtP1KGSRTnGiIzzX5AzUAxsNlts= k8s.io/component-base v0.30.3 h1:Ci0UqKWf4oiwy8hr1+E3dsnliKnkMLZMVbWzeorlk7s= k8s.io/component-base v0.30.3/go.mod h1:C1SshT3rGPCuNtBs14RmVD2xW0EhRSeLvBh7AGk1quA= k8s.io/component-base v0.31.0 h1:/KIzGM5EvPNQcYgwq5NwoQBaOlVFrghoVGr8lG6vNRs= @@ -1255,6 +1318,8 @@ k8s.io/component-base v0.31.1 h1:UpOepcrX3rQ3ab5NB6g5iP0tvsgJWzxTyAo20sgYSy8= k8s.io/component-base v0.31.1/go.mod h1:WGeaw7t/kTsqpVTaCoVEtillbqAhF2/JgvO0LDOMa0w= k8s.io/component-base v0.31.2 h1:Z1J1LIaC0AV+nzcPRFqfK09af6bZ4D1nAOpWsy9owlA= k8s.io/component-base v0.31.2/go.mod h1:9PeyyFN/drHjtJZMCTkSpQJS3U9OXORnHQqMLDz0sUQ= +k8s.io/component-base v0.31.3 h1:DMCXXVx546Rfvhj+3cOm2EUxhS+EyztH423j+8sOwhQ= +k8s.io/component-base v0.31.3/go.mod h1:xME6BHfUOafRgT0rGVBGl7TuSg8Z9/deT7qq6w7qjIU= k8s.io/kms v0.30.3 h1:NLg+oN45S2Y3U0WiLRzbS61AY/XrS5JBMZp531Z+Pho= k8s.io/kms v0.30.3/go.mod h1:GrMurD0qk3G4yNgGcsCEmepqf9KyyIrTXYR2lyUOJC4= k8s.io/kms v0.31.0 h1:KchILPfB1ZE+ka7223mpU5zeFNkmb45jl7RHnlImUaI= @@ -1263,6 +1328,8 @@ k8s.io/kms v0.31.1 h1:cGLyV3cIwb0ovpP/jtyIe2mEuQ/MkbhmeBF2IYCA9Io= k8s.io/kms v0.31.1/go.mod h1:OZKwl1fan3n3N5FFxnW5C4V3ygrah/3YXeJWS3O6+94= k8s.io/kms v0.31.2 h1:pyx7l2qVOkClzFMIWMVF/FxsSkgd+OIGH7DecpbscJI= k8s.io/kms v0.31.2/go.mod h1:OZKwl1fan3n3N5FFxnW5C4V3ygrah/3YXeJWS3O6+94= +k8s.io/kms v0.31.3 h1:XCFmiJn5CCKs8xoOLpCmu42Ubm/KW85wNHybGFcSAYc= +k8s.io/kms v0.31.3/go.mod h1:OZKwl1fan3n3N5FFxnW5C4V3ygrah/3YXeJWS3O6+94= lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= modernc.org/cc/v3 v3.40.0 h1:P3g79IUS/93SYhtoeaHW+kRCIrYaxJ27MFPv+7kaTOw=