From 751cc3b2a339b33af53cabf4501a5056b7ce0bd1 Mon Sep 17 00:00:00 2001 From: Ellis Tarn Date: Mon, 17 Oct 2022 10:43:04 -0700 Subject: [PATCH] chore: initialization touchups --- cmd/controller/main.go | 23 +- hack/docs/configuration_gen_docs.go | 4 +- hack/docs/instancetypes_gen_docs.go | 7 +- pkg/cloudproviders/aws/apis/v1alpha1/tags.go | 3 +- .../aws/cloudprovider/cloudprovider.go | 2 +- .../aws/cloudprovider/instance.go | 9 +- .../aws/cloudprovider/instancetype.go | 8 +- .../aws/cloudprovider/instancetypes.go | 4 +- .../aws/cloudprovider/instancetypes_test.go | 48 ++--- .../aws/cloudprovider/launchtemplate.go | 12 +- .../aws/cloudprovider/launchtemplate_test.go | 24 +-- .../aws/cloudprovider/suite_test.go | 11 +- .../cloudprovider/metrics/cloudprovider.go | 8 +- pkg/controllers/controllers.go | 28 +-- pkg/controllers/termination/controller.go | 4 +- pkg/operator/context.go | 128 +++++++++++ pkg/operator/injection.go | 49 +++++ pkg/operator/manager.go | 37 +--- pkg/operator/options.go | 176 ++++++++------- pkg/utils/injection/injection.go | 64 ------ pkg/utils/options/options.go | 126 ----------- pkg/webhooks/webhooks.go | 4 +- test/go.mod | 16 -- test/go.sum | 202 ------------------ 24 files changed, 378 insertions(+), 619 deletions(-) create mode 100644 pkg/operator/context.go create mode 100644 pkg/operator/injection.go delete mode 100644 pkg/utils/options/options.go diff --git a/cmd/controller/main.go b/cmd/controller/main.go index 67777ca260f0..b2c3822ef09c 100644 --- a/cmd/controller/main.go +++ b/cmd/controller/main.go @@ -27,20 +27,15 @@ import ( ) func main() { - options, manager := operator.NewOptionsWithManagerOrDie() - cloudProvider := cloudprovider.CloudProvider(awscloudprovider.NewCloudProvider(options.Ctx, cloudprovider.Options{ - ClientSet: options.Clientset, - KubeClient: options.KubeClient, - StartAsync: options.StartAsync, - })) - if hp, ok := cloudProvider.(operator.HealthCheck); ok { - utilruntime.Must(manager.AddHealthzCheck("cloud-provider", hp.LivenessProbe)) - } - cloudProvider = cloudprovidermetrics.Decorate(cloudProvider) - if err := operator.RegisterControllers(options.Ctx, - manager, - controllers.GetControllers(options, cloudProvider)..., - ).Start(options.Ctx); err != nil { + ctx, manager := operator.NewOrDie() + cloudProvider := awscloudprovider.NewCloudProvider(ctx, cloudprovider.Options{ + ClientSet: ctx.Clientset, + KubeClient: ctx.KubeClient, + StartAsync: ctx.StartAsync, + }) + utilruntime.Must(manager.AddHealthzCheck("cloud-provider", cloudProvider.LivenessProbe)) + operator.RegisterControllers(ctx, manager, controllers.GetControllers(ctx, cloudprovidermetrics.Decorate(cloudProvider))...) + if err := manager.Start(ctx); err != nil { panic(fmt.Sprintf("Unable to start manager, %s", err)) } } diff --git a/hack/docs/configuration_gen_docs.go b/hack/docs/configuration_gen_docs.go index e00958aa7c36..cc23839404ea 100644 --- a/hack/docs/configuration_gen_docs.go +++ b/hack/docs/configuration_gen_docs.go @@ -21,7 +21,7 @@ import ( "os" "strings" - "github.com/aws/karpenter/pkg/utils/options" + "github.com/aws/karpenter/pkg/operator" ) func main() { @@ -48,7 +48,7 @@ func main() { topDoc := fmt.Sprintf("%s%s\n\n", startDocSections[0], genStart) bottomDoc := fmt.Sprintf("\n%s%s", genEnd, endDocSections[1]) - opts := options.New() + opts := operator.NewOptions() envVarsBlock := "| Environment Variable | CLI Flag | Description |\n" envVarsBlock += "|--|--|--|\n" diff --git a/hack/docs/instancetypes_gen_docs.go b/hack/docs/instancetypes_gen_docs.go index e50cad1846a8..449778018a4a 100644 --- a/hack/docs/instancetypes_gen_docs.go +++ b/hack/docs/instancetypes_gen_docs.go @@ -35,8 +35,7 @@ import ( "github.com/aws/karpenter/pkg/cloudproviders/aws/apis/v1alpha1" awscloudprovider "github.com/aws/karpenter/pkg/cloudproviders/aws/cloudprovider" "github.com/aws/karpenter/pkg/cloudproviders/common/cloudprovider" - "github.com/aws/karpenter/pkg/utils/injection" - "github.com/aws/karpenter/pkg/utils/options" + "github.com/aws/karpenter/pkg/operator" "github.com/aws/karpenter/pkg/utils/resources" ) @@ -52,9 +51,9 @@ func main() { os.Setenv("CLUSTER_ENDPOINT", "https://docs-gen.aws") os.Setenv("AWS_ISOLATED_VPC", "true") // disable pricing lookup - opts := options.New() + opts := operator.NewOptions() opts = opts.MustParse() - ctx := injection.WithOptions(context.Background(), *opts) + ctx := operator.WithOptions(context.Background(), *opts) cp := awscloudprovider.NewCloudProvider(ctx, cloudprovider.Options{}) provider := v1alpha1.AWS{SubnetSelector: map[string]string{ diff --git a/pkg/cloudproviders/aws/apis/v1alpha1/tags.go b/pkg/cloudproviders/aws/apis/v1alpha1/tags.go index abb052c5ba22..e2ca7ee55246 100644 --- a/pkg/cloudproviders/aws/apis/v1alpha1/tags.go +++ b/pkg/cloudproviders/aws/apis/v1alpha1/tags.go @@ -22,8 +22,9 @@ import ( "github.com/aws/aws-sdk-go/service/ec2" "github.com/samber/lo" - "github.com/aws/karpenter-core/pkg/apis/provisioning/v1alpha5" "github.com/aws/karpenter/pkg/utils/injection" + + "github.com/aws/karpenter-core/pkg/apis/provisioning/v1alpha5" ) func MergeTags(ctx context.Context, custom ...map[string]string) (result []*ec2.Tag) { diff --git a/pkg/cloudproviders/aws/cloudprovider/cloudprovider.go b/pkg/cloudproviders/aws/cloudprovider/cloudprovider.go index 9da693c5f8df..ae502b1c3ffa 100644 --- a/pkg/cloudproviders/aws/cloudprovider/cloudprovider.go +++ b/pkg/cloudproviders/aws/cloudprovider/cloudprovider.go @@ -41,6 +41,7 @@ import ( "k8s.io/client-go/kubernetes" "k8s.io/client-go/transport" "knative.dev/pkg/apis" + "knative.dev/pkg/injection" "knative.dev/pkg/logging" "knative.dev/pkg/ptr" k8sClient "sigs.k8s.io/controller-runtime/pkg/client" @@ -52,7 +53,6 @@ import ( "github.com/aws/karpenter/pkg/cloudproviders/aws/cloudprovider/amifamily" "github.com/aws/karpenter/pkg/cloudproviders/common/cloudprovider" "github.com/aws/karpenter/pkg/utils/functional" - "github.com/aws/karpenter/pkg/utils/injection" "github.com/aws/karpenter/pkg/utils/project" ) diff --git a/pkg/cloudproviders/aws/cloudprovider/instance.go b/pkg/cloudproviders/aws/cloudprovider/instance.go index 22052e296338..1fda72af2ba5 100644 --- a/pkg/cloudproviders/aws/cloudprovider/instance.go +++ b/pkg/cloudproviders/aws/cloudprovider/instance.go @@ -37,13 +37,12 @@ import ( "github.com/aws/karpenter-core/pkg/apis/provisioning/v1alpha5" awserrors "github.com/aws/karpenter/pkg/cloudproviders/aws/errors" + "github.com/aws/karpenter/pkg/operator" "github.com/aws/karpenter/pkg/cloudproviders/aws/apis/v1alpha1" "github.com/aws/karpenter/pkg/cloudproviders/common/cloudprovider" "github.com/aws/karpenter/pkg/scheduling" "github.com/aws/karpenter/pkg/utils/functional" - "github.com/aws/karpenter/pkg/utils/injection" - "github.com/aws/karpenter/pkg/utils/options" "github.com/aws/karpenter/pkg/utils/resources" ) @@ -145,7 +144,7 @@ func (p *InstanceProvider) launchInstance(ctx context.Context, provider *v1alpha logging.FromContext(ctx).Warn(err.Error()) } // Create fleet - tags := v1alpha1.MergeTags(ctx, provider.Tags, map[string]string{fmt.Sprintf("kubernetes.io/cluster/%s", injection.GetOptions(ctx).ClusterName): "owned"}) + tags := v1alpha1.MergeTags(ctx, provider.Tags, map[string]string{fmt.Sprintf("kubernetes.io/cluster/%s", operator.GetOptions(ctx).ClusterName): "owned"}) createFleetInput := &ec2.CreateFleetInput{ Type: aws.String(ec2.FleetTypeInstant), Context: provider.Context, @@ -317,7 +316,7 @@ func (p *InstanceProvider) getInstance(ctx context.Context, id string) (*ec2.Ins if *instance.State.Name == ec2.InstanceStateNameTerminated { return nil, awserrors.InstanceTerminatedError{Err: fmt.Errorf("instance is in terminated state")} } - if injection.GetOptions(ctx).GetAWSNodeNameConvention() == options.ResourceName { + if operator.GetOptions(ctx).GetAWSNodeNameConvention() == operator.ResourceName { return instance, nil } if len(aws.StringValue(instance.PrivateDnsName)) == 0 { @@ -330,7 +329,7 @@ func (p *InstanceProvider) instanceToNode(ctx context.Context, instance *ec2.Ins for _, instanceType := range instanceTypes { if instanceType.Name() == aws.StringValue(instance.InstanceType) { nodeName := strings.ToLower(aws.StringValue(instance.PrivateDnsName)) - if injection.GetOptions(ctx).GetAWSNodeNameConvention() == options.ResourceName { + if operator.GetOptions(ctx).GetAWSNodeNameConvention() == operator.ResourceName { nodeName = aws.StringValue(instance.InstanceId) } diff --git a/pkg/cloudproviders/aws/cloudprovider/instancetype.go b/pkg/cloudproviders/aws/cloudprovider/instancetype.go index a9398576c497..6749f70d2dcf 100644 --- a/pkg/cloudproviders/aws/cloudprovider/instancetype.go +++ b/pkg/cloudproviders/aws/cloudprovider/instancetype.go @@ -34,8 +34,8 @@ import ( "github.com/aws/karpenter/pkg/cloudproviders/aws/apis/v1alpha1" "github.com/aws/karpenter/pkg/cloudproviders/aws/cloudprovider/amifamily" "github.com/aws/karpenter/pkg/cloudproviders/common/cloudprovider" + "github.com/aws/karpenter/pkg/operator" "github.com/aws/karpenter/pkg/scheduling" - "github.com/aws/karpenter/pkg/utils/injection" "github.com/aws/karpenter/pkg/utils/resources" ) @@ -69,8 +69,8 @@ func NewInstanceType(ctx context.Context, info *ec2.InstanceTypeInfo, kc *v1alph instanceType.maxPods = instanceType.computeMaxPods(ctx, kc) // Precompute to minimize memory/compute overhead - instanceType.resources = instanceType.computeResources(injection.GetOptions(ctx).AWSEnablePodENI) - instanceType.overhead = instanceType.computeOverhead(injection.GetOptions(ctx).VMMemoryOverhead, kc) + instanceType.resources = instanceType.computeResources(operator.GetOptions(ctx).AWSEnablePodENI) + instanceType.overhead = instanceType.computeOverhead(operator.GetOptions(ctx).VMMemoryOverhead, kc) instanceType.requirements = instanceType.computeRequirements() return instanceType } @@ -370,7 +370,7 @@ func (i *InstanceType) computeMaxPods(ctx context.Context, kc *v1alpha5.KubeletC switch { case kc != nil && kc.MaxPods != nil: mp = ptr.Int64(int64(ptr.Int32Value(kc.MaxPods))) - case !injection.GetOptions(ctx).AWSENILimitedPodDensity: + case !operator.GetOptions(ctx).AWSENILimitedPodDensity: mp = ptr.Int64(110) default: mp = ptr.Int64(i.eniLimitedPods()) diff --git a/pkg/cloudproviders/aws/cloudprovider/instancetypes.go b/pkg/cloudproviders/aws/cloudprovider/instancetypes.go index 3009df711d4f..1ab892a6e110 100644 --- a/pkg/cloudproviders/aws/cloudprovider/instancetypes.go +++ b/pkg/cloudproviders/aws/cloudprovider/instancetypes.go @@ -24,6 +24,7 @@ import ( "github.com/aws/karpenter-core/pkg/apis/provisioning/v1alpha5" awscache "github.com/aws/karpenter/pkg/cloudproviders/aws/cache" "github.com/aws/karpenter/pkg/cloudproviders/common/cloudprovider" + "github.com/aws/karpenter/pkg/operator" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" @@ -37,7 +38,6 @@ import ( "github.com/aws/karpenter/pkg/cloudproviders/aws/apis/v1alpha1" "github.com/aws/karpenter/pkg/utils/functional" - "github.com/aws/karpenter/pkg/utils/injection" "github.com/aws/karpenter/pkg/utils/pretty" ) @@ -71,7 +71,7 @@ func NewInstanceTypeProvider(ctx context.Context, sess *session.Session, options NewPricingAPI(sess, *sess.Config.Region), ec2api, *sess.Config.Region, - injection.GetOptions(ctx).AWSIsolatedVPC, options.StartAsync), + operator.GetOptions(ctx).AWSIsolatedVPC, options.StartAsync), cache: cache.New(InstanceTypesAndZonesCacheTTL, CacheCleanupInterval), unavailableOfferings: unavailableOfferings, cm: pretty.NewChangeMonitor(), diff --git a/pkg/cloudproviders/aws/cloudprovider/instancetypes_test.go b/pkg/cloudproviders/aws/cloudprovider/instancetypes_test.go index 3f5f2236ee9f..ecfd5103579d 100644 --- a/pkg/cloudproviders/aws/cloudprovider/instancetypes_test.go +++ b/pkg/cloudproviders/aws/cloudprovider/instancetypes_test.go @@ -37,9 +37,9 @@ import ( "github.com/aws/karpenter/pkg/cloudproviders/aws/fake" "github.com/aws/karpenter/pkg/cloudproviders/common/cloudprovider" "github.com/aws/karpenter/pkg/controllers/provisioning" + "github.com/aws/karpenter/pkg/operator" "github.com/aws/karpenter/pkg/test" . "github.com/aws/karpenter/pkg/test/expectations" - "github.com/aws/karpenter/pkg/utils/injection" ) var _ = Describe("Instance Types", func() { @@ -126,7 +126,7 @@ var _ = Describe("Instance Types", func() { // ensure the pod ENI option is off optsCopy := opts optsCopy.AWSEnablePodENI = false - cancelCtx, cancelFunc := context.WithCancel(injection.WithOptions(ctx, optsCopy)) + cancelCtx, cancelFunc := context.WithCancel(operator.WithOptions(ctx, optsCopy)) // ensure the provisioner is shut down at the end of this test defer cancelFunc() @@ -228,7 +228,7 @@ var _ = Describe("Instance Types", func() { Expect(err).To(BeNil()) provisioner = test.Provisioner() for _, info := range instanceInfo { - it := NewInstanceType(injection.WithOptions(ctx, opts), info, provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), info, provisioner.Spec.KubeletConfiguration, "", provider, nil) resources := it.Resources() Expect(resources.Pods().Value()).To(BeNumerically("==", 110)) } @@ -239,7 +239,7 @@ var _ = Describe("Instance Types", func() { Expect(err).To(BeNil()) provisioner = test.Provisioner() for _, info := range instanceInfo { - it := NewInstanceType(injection.WithOptions(ctx, opts), info, provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), info, provisioner.Spec.KubeletConfiguration, "", provider, nil) resources := it.Resources() Expect(resources.Pods().Value()).ToNot(BeNumerically("==", 110)) } @@ -257,7 +257,7 @@ var _ = Describe("Instance Types", func() { }, }, }) - it := NewInstanceType(injection.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) overhead := it.Overhead() Expect(overhead.Cpu().String()).To(Equal("2080m")) }) @@ -271,7 +271,7 @@ var _ = Describe("Instance Types", func() { }, }, }) - it := NewInstanceType(injection.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) overhead := it.Overhead() Expect(overhead.Memory().String()).To(Equal("21473Mi")) }) @@ -292,7 +292,7 @@ var _ = Describe("Instance Types", func() { }, }, }) - it := NewInstanceType(injection.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) overhead := it.Overhead() Expect(overhead.Memory().String()).To(Equal("30820Mi")) Expect(overhead.Cpu().String()).To(Equal("3")) @@ -316,7 +316,7 @@ var _ = Describe("Instance Types", func() { }, }, }) - it := NewInstanceType(injection.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) overhead := it.Overhead() Expect(overhead.Memory().String()).To(Equal("31220Mi")) }) @@ -336,7 +336,7 @@ var _ = Describe("Instance Types", func() { }, }, }) - it := NewInstanceType(injection.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) overhead := it.Overhead() Expect(overhead.Memory().String()).To(Equal("33930241639")) }) @@ -356,7 +356,7 @@ var _ = Describe("Instance Types", func() { }, }, }) - it := NewInstanceType(injection.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) overhead := it.Overhead() Expect(overhead.Memory().String()).To(Equal("30Gi")) }) @@ -376,7 +376,7 @@ var _ = Describe("Instance Types", func() { }, }, }) - it := NewInstanceType(injection.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) overhead := it.Overhead() Expect(overhead.Memory().String()).To(Equal("30770Mi")) }) @@ -396,7 +396,7 @@ var _ = Describe("Instance Types", func() { }, }, }) - it := NewInstanceType(injection.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) overhead := it.Overhead() Expect(overhead.Memory().String()).To(Equal("31220Mi")) }) @@ -419,7 +419,7 @@ var _ = Describe("Instance Types", func() { }, }, }) - it := NewInstanceType(injection.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) overhead := it.Overhead() Expect(overhead.Memory().String()).To(Equal("33930241639")) }) @@ -439,7 +439,7 @@ var _ = Describe("Instance Types", func() { }, }, }) - it := NewInstanceType(injection.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) overhead := it.Overhead() Expect(overhead.Memory().String()).To(Equal("30Gi")) }) @@ -463,7 +463,7 @@ var _ = Describe("Instance Types", func() { }, }, }) - it := NewInstanceType(injection.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) overhead := it.Overhead() Expect(overhead.Memory().String()).To(Equal("31Gi")) }) @@ -486,7 +486,7 @@ var _ = Describe("Instance Types", func() { }, }, }) - it := NewInstanceType(injection.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) overhead := it.Overhead() Expect(overhead.Memory().String()).To(Equal("33Gi")) }) @@ -509,7 +509,7 @@ var _ = Describe("Instance Types", func() { }, }, }) - it := NewInstanceType(injection.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) overhead := it.Overhead() Expect(overhead.Memory().String()).To(Equal("33071248180")) }) @@ -532,7 +532,7 @@ var _ = Describe("Instance Types", func() { }, }, }) - it := NewInstanceType(injection.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) overhead := it.Overhead() Expect(overhead.Memory().String()).To(Equal("33930241639")) }) @@ -542,7 +542,7 @@ var _ = Describe("Instance Types", func() { Expect(err).To(BeNil()) provisioner = test.Provisioner(test.ProvisionerOptions{Kubelet: &v1alpha5.KubeletConfiguration{MaxPods: ptr.Int32(10)}}) for _, info := range instanceInfo { - it := NewInstanceType(injection.WithOptions(ctx, opts), info, provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), info, provisioner.Spec.KubeletConfiguration, "", provider, nil) resources := it.Resources() Expect(resources.Pods().Value()).To(BeNumerically("==", 10)) } @@ -553,7 +553,7 @@ var _ = Describe("Instance Types", func() { Expect(err).To(BeNil()) provisioner = test.Provisioner(test.ProvisionerOptions{Kubelet: &v1alpha5.KubeletConfiguration{MaxPods: ptr.Int32(10)}}) for _, info := range instanceInfo { - it := NewInstanceType(injection.WithOptions(ctx, opts), info, provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), info, provisioner.Spec.KubeletConfiguration, "", provider, nil) resources := it.Resources() Expect(resources.Pods().Value()).To(BeNumerically("==", 10)) } @@ -563,7 +563,7 @@ var _ = Describe("Instance Types", func() { Expect(err).To(BeNil()) provisioner = test.Provisioner(test.ProvisionerOptions{Kubelet: &v1alpha5.KubeletConfiguration{PodsPerCore: ptr.Int32(1)}}) for _, info := range instanceInfo { - it := NewInstanceType(injection.WithOptions(ctx, opts), info, provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), info, provisioner.Spec.KubeletConfiguration, "", provider, nil) resources := it.Resources() Expect(resources.Pods().Value()).To(BeNumerically("==", ptr.Int64Value(info.VCpuInfo.DefaultVCpus))) } @@ -573,7 +573,7 @@ var _ = Describe("Instance Types", func() { Expect(err).To(BeNil()) provisioner = test.Provisioner(test.ProvisionerOptions{Kubelet: &v1alpha5.KubeletConfiguration{PodsPerCore: ptr.Int32(4), MaxPods: ptr.Int32(20)}}) for _, info := range instanceInfo { - it := NewInstanceType(injection.WithOptions(ctx, opts), info, provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), info, provisioner.Spec.KubeletConfiguration, "", provider, nil) resources := it.Resources() Expect(resources.Pods().Value()).To(BeNumerically("==", lo.Min([]int64{20, ptr.Int64Value(info.VCpuInfo.DefaultVCpus) * 4}))) } @@ -584,7 +584,7 @@ var _ = Describe("Instance Types", func() { provider.AMIFamily = &awsv1alpha1.AMIFamilyBottlerocket provisioner = test.Provisioner(test.ProvisionerOptions{Kubelet: &v1alpha5.KubeletConfiguration{PodsPerCore: ptr.Int32(1)}, Provider: provider}) for _, info := range instanceInfo { - it := NewInstanceType(injection.WithOptions(ctx, opts), info, provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), info, provisioner.Spec.KubeletConfiguration, "", provider, nil) resources := it.Resources() Expect(resources.Pods().Value()).To(BeNumerically("==", it.eniLimitedPods())) } @@ -595,7 +595,7 @@ var _ = Describe("Instance Types", func() { Expect(err).To(BeNil()) provisioner = test.Provisioner(test.ProvisionerOptions{Kubelet: &v1alpha5.KubeletConfiguration{PodsPerCore: ptr.Int32(0)}}) for _, info := range instanceInfo { - it := NewInstanceType(injection.WithOptions(ctx, opts), info, provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), info, provisioner.Spec.KubeletConfiguration, "", provider, nil) resources := it.Resources() Expect(resources.Pods().Value()).To(BeNumerically("==", 110)) } diff --git a/pkg/cloudproviders/aws/cloudprovider/launchtemplate.go b/pkg/cloudproviders/aws/cloudprovider/launchtemplate.go index f0f2c7f3710c..976c3fe082cf 100644 --- a/pkg/cloudproviders/aws/cloudprovider/launchtemplate.go +++ b/pkg/cloudproviders/aws/cloudprovider/launchtemplate.go @@ -40,7 +40,7 @@ import ( "github.com/aws/karpenter/pkg/cloudproviders/aws/cloudprovider/amifamily" awserrors "github.com/aws/karpenter/pkg/cloudproviders/aws/errors" "github.com/aws/karpenter/pkg/cloudproviders/common/cloudprovider" - "github.com/aws/karpenter/pkg/utils/injection" + "github.com/aws/karpenter/pkg/operator" "github.com/aws/karpenter/pkg/utils/pretty" ) @@ -117,9 +117,9 @@ func (p *LaunchTemplateProvider) Get(ctx context.Context, provider *v1alpha1.AWS return nil, err } resolvedLaunchTemplates, err := p.amiFamily.Resolve(ctx, provider, nodeRequest, &amifamily.Options{ - ClusterName: injection.GetOptions(ctx).ClusterName, - ClusterEndpoint: injection.GetOptions(ctx).ClusterEndpoint, - AWSENILimitedPodDensity: injection.GetOptions(ctx).AWSENILimitedPodDensity, + ClusterName: operator.GetOptions(ctx).ClusterName, + ClusterEndpoint: operator.GetOptions(ctx).ClusterEndpoint, + AWSENILimitedPodDensity: operator.GetOptions(ctx).AWSENILimitedPodDensity, InstanceProfile: instanceProfile, SecurityGroupsIDs: securityGroupsIDs, Tags: provider.Tags, @@ -259,7 +259,7 @@ func (p *LaunchTemplateProvider) Invalidate(ctx context.Context, ltName string) // hydrateCache queries for existing Launch Templates created by Karpenter for the current cluster and adds to the LT cache. // Any error during hydration will result in a panic func (p *LaunchTemplateProvider) hydrateCache(ctx context.Context) { - clusterName := injection.GetOptions(ctx).ClusterName + clusterName := operator.GetOptions(ctx).ClusterName p.logger.Debugf("Hydrating the launch template cache with tags matching \"%s: %s\"", karpenterManagedTagKey, clusterName) if err := p.ec2api.DescribeLaunchTemplatesPagesWithContext(ctx, &ec2.DescribeLaunchTemplatesInput{ Filters: []*ec2.Filter{{Name: aws.String(fmt.Sprintf("tag:%s", karpenterManagedTagKey)), Values: []*string{aws.String(clusterName)}}}, @@ -295,7 +295,7 @@ func (p *LaunchTemplateProvider) getInstanceProfile(ctx context.Context, provide if provider.InstanceProfile != nil { return aws.StringValue(provider.InstanceProfile), nil } - defaultProfile := injection.GetOptions(ctx).AWSDefaultInstanceProfile + defaultProfile := operator.GetOptions(ctx).AWSDefaultInstanceProfile if defaultProfile == "" { return "", errors.New("neither spec.provider.instanceProfile nor --aws-default-instance-profile is specified") } diff --git a/pkg/cloudproviders/aws/cloudprovider/launchtemplate_test.go b/pkg/cloudproviders/aws/cloudprovider/launchtemplate_test.go index 2080cc95cb6d..446b2cb75371 100644 --- a/pkg/cloudproviders/aws/cloudprovider/launchtemplate_test.go +++ b/pkg/cloudproviders/aws/cloudprovider/launchtemplate_test.go @@ -45,9 +45,9 @@ import ( awsv1alpha1 "github.com/aws/karpenter/pkg/cloudproviders/aws/apis/v1alpha1" "github.com/aws/karpenter/pkg/cloudproviders/aws/cloudprovider/amifamily/bootstrap" "github.com/aws/karpenter/pkg/controllers/provisioning" + "github.com/aws/karpenter/pkg/operator" "github.com/aws/karpenter/pkg/test" . "github.com/aws/karpenter/pkg/test/expectations" - "github.com/aws/karpenter/pkg/utils/injection" "github.com/aws/karpenter/pkg/utils/ptr" ) @@ -565,7 +565,7 @@ var _ = Describe("LaunchTemplates", func() { provider.AMIFamily = &awsv1alpha1.AMIFamilyAL2 instanceInfo, err := instanceTypeProvider.getInstanceTypes(ctx) Expect(err).To(BeNil()) - it := NewInstanceType(injection.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) overhead := it.Overhead() Expect(overhead.Memory().String()).To(Equal("1093Mi")) }) @@ -575,7 +575,7 @@ var _ = Describe("LaunchTemplates", func() { provider.AMIFamily = &awsv1alpha1.AMIFamilyAL2 instanceInfo, err := instanceTypeProvider.getInstanceTypes(ctx) Expect(err).To(BeNil()) - it := NewInstanceType(injection.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) overhead := it.Overhead() Expect(overhead.Memory().String()).To(Equal("1093Mi")) }) @@ -587,7 +587,7 @@ var _ = Describe("LaunchTemplates", func() { provider.AMIFamily = &awsv1alpha1.AMIFamilyBottlerocket instanceInfo, err := instanceTypeProvider.getInstanceTypes(ctx) Expect(err).To(BeNil()) - it := NewInstanceType(injection.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) overhead := it.Overhead() Expect(overhead.Memory().String()).To(Equal("1093Mi")) }) @@ -597,7 +597,7 @@ var _ = Describe("LaunchTemplates", func() { provider.AMIFamily = &awsv1alpha1.AMIFamilyBottlerocket instanceInfo, err := instanceTypeProvider.getInstanceTypes(ctx) Expect(err).To(BeNil()) - it := NewInstanceType(injection.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) + it := NewInstanceType(operator.WithOptions(ctx, opts), instanceInfo["m5.xlarge"], provisioner.Spec.KubeletConfiguration, "", provider, nil) overhead := it.Overhead() Expect(overhead.Memory().String()).To(Equal("1665Mi")) }) @@ -605,7 +605,7 @@ var _ = Describe("LaunchTemplates", func() { Context("User Data", func() { It("should not specify --use-max-pods=false when using ENI-based pod density", func() { opts.AWSENILimitedPodDensity = true - prov := provisioning.NewProvisioner(injection.WithOptions(ctx, opts), cfg, env.Client, corev1.NewForConfigOrDie(env.Config), recorder, cloudProvider, cluster) + prov := provisioning.NewProvisioner(operator.WithOptions(ctx, opts), cfg, env.Client, corev1.NewForConfigOrDie(env.Config), recorder, cloudProvider, cluster) controllerWithOpts := provisioning.NewController(env.Client, prov, recorder) ExpectApplied(ctx, env.Client, test.Provisioner(test.ProvisionerOptions{Provider: provider})) pod := ExpectProvisioned(ctx, env.Client, controllerWithOpts, test.UnschedulablePod())[0] @@ -617,7 +617,7 @@ var _ = Describe("LaunchTemplates", func() { }) It("should specify --use-max-pods=false when not using ENI-based pod density", func() { opts.AWSENILimitedPodDensity = false - prov := provisioning.NewProvisioner(injection.WithOptions(ctx, opts), cfg, env.Client, corev1.NewForConfigOrDie(env.Config), recorder, cloudProvider, cluster) + prov := provisioning.NewProvisioner(operator.WithOptions(ctx, opts), cfg, env.Client, corev1.NewForConfigOrDie(env.Config), recorder, cloudProvider, cluster) controllerWithOpts := provisioning.NewController(env.Client, prov, recorder) ExpectApplied(ctx, env.Client, test.Provisioner(test.ProvisionerOptions{Provider: provider})) pod := ExpectProvisioned(ctx, env.Client, controllerWithOpts, test.UnschedulablePod())[0] @@ -887,7 +887,7 @@ var _ = Describe("LaunchTemplates", func() { Context("Bottlerocket", func() { It("should merge in custom user data", func() { opts.AWSENILimitedPodDensity = false - prov := provisioning.NewProvisioner(injection.WithOptions(ctx, opts), cfg, env.Client, corev1.NewForConfigOrDie(env.Config), recorder, cloudProvider, cluster) + prov := provisioning.NewProvisioner(operator.WithOptions(ctx, opts), cfg, env.Client, corev1.NewForConfigOrDie(env.Config), recorder, cloudProvider, cluster) controllerWithOpts := provisioning.NewController(env.Client, prov, recorder) provider.AMIFamily = &awsv1alpha1.AMIFamilyBottlerocket @@ -921,7 +921,7 @@ var _ = Describe("LaunchTemplates", func() { }) It("should bootstrap when custom user data is empty", func() { opts.AWSENILimitedPodDensity = false - prov := provisioning.NewProvisioner(injection.WithOptions(ctx, opts), cfg, env.Client, corev1.NewForConfigOrDie(env.Config), recorder, cloudProvider, cluster) + prov := provisioning.NewProvisioner(operator.WithOptions(ctx, opts), cfg, env.Client, corev1.NewForConfigOrDie(env.Config), recorder, cloudProvider, cluster) controllerWithOpts := provisioning.NewController(env.Client, prov, recorder) provider.AMIFamily = &awsv1alpha1.AMIFamilyBottlerocket @@ -951,7 +951,7 @@ var _ = Describe("LaunchTemplates", func() { }) It("should not bootstrap when provider ref points to a non-existent resource", func() { opts.AWSENILimitedPodDensity = false - prov := provisioning.NewProvisioner(injection.WithOptions(ctx, opts), cfg, env.Client, corev1.NewForConfigOrDie(env.Config), recorder, cloudProvider, cluster) + prov := provisioning.NewProvisioner(operator.WithOptions(ctx, opts), cfg, env.Client, corev1.NewForConfigOrDie(env.Config), recorder, cloudProvider, cluster) controllerWithOpts := provisioning.NewController(env.Client, prov, recorder) provider.AMIFamily = &awsv1alpha1.AMIFamilyBottlerocket @@ -1088,7 +1088,7 @@ var _ = Describe("LaunchTemplates", func() { Context("AL2 Custom UserData", func() { It("should merge in custom user data", func() { opts.AWSENILimitedPodDensity = false - prov := provisioning.NewProvisioner(injection.WithOptions(ctx, opts), cfg, env.Client, corev1.NewForConfigOrDie(env.Config), recorder, cloudProvider, cluster) + prov := provisioning.NewProvisioner(operator.WithOptions(ctx, opts), cfg, env.Client, corev1.NewForConfigOrDie(env.Config), recorder, cloudProvider, cluster) controllerWithOpts := provisioning.NewController(env.Client, prov, recorder) content, _ := os.ReadFile("testdata/al2_userdata_input.golden") @@ -1110,7 +1110,7 @@ var _ = Describe("LaunchTemplates", func() { }) It("should handle empty custom user data", func() { opts.AWSENILimitedPodDensity = false - prov := provisioning.NewProvisioner(injection.WithOptions(ctx, opts), cfg, env.Client, corev1.NewForConfigOrDie(env.Config), recorder, cloudProvider, cluster) + prov := provisioning.NewProvisioner(operator.WithOptions(ctx, opts), cfg, env.Client, corev1.NewForConfigOrDie(env.Config), recorder, cloudProvider, cluster) controllerWithOpts := provisioning.NewController(env.Client, prov, recorder) nodeTemplate := test.AWSNodeTemplate(v1alpha1.AWSNodeTemplateSpec{ UserData: nil, diff --git a/pkg/cloudproviders/aws/cloudprovider/suite_test.go b/pkg/cloudproviders/aws/cloudprovider/suite_test.go index f9885f7a79d9..283e183befcc 100644 --- a/pkg/cloudproviders/aws/cloudprovider/suite_test.go +++ b/pkg/cloudproviders/aws/cloudprovider/suite_test.go @@ -39,6 +39,7 @@ import ( awscache "github.com/aws/karpenter/pkg/cloudproviders/aws/cache" "github.com/aws/karpenter/pkg/cloudproviders/aws/cloudprovider/amifamily" "github.com/aws/karpenter/pkg/cloudproviders/common/cloudprovider" + "github.com/aws/karpenter/pkg/operator" . "github.com/aws/karpenter/pkg/test/expectations" "github.com/aws/karpenter-core/pkg/apis/provisioning/v1alpha5" @@ -48,14 +49,12 @@ import ( "github.com/aws/karpenter/pkg/controllers/provisioning" "github.com/aws/karpenter/pkg/controllers/state" "github.com/aws/karpenter/pkg/test" - "github.com/aws/karpenter/pkg/utils/injection" - "github.com/aws/karpenter/pkg/utils/options" "github.com/aws/karpenter/pkg/utils/pretty" ) var ctx context.Context var stop context.CancelFunc -var opts options.Options +var opts operator.Options var env *test.Environment var launchTemplateCache *cache.Cache var securityGroupCache *cache.Cache @@ -79,10 +78,10 @@ var provisioner *v1alpha5.Provisioner var provider *awsv1alpha1.AWS var pricingProvider *PricingProvider -var defaultOpts = options.Options{ +var defaultOpts = operator.Options{ ClusterName: "test-cluster", ClusterEndpoint: "https://test-cluster", - AWSNodeNameConvention: string(options.IPName), + AWSNodeNameConvention: string(operator.IPName), AWSENILimitedPodDensity: true, AWSEnablePodENI: true, AWSDefaultInstanceProfile: "test-instance-profile", @@ -98,7 +97,7 @@ var _ = BeforeSuite(func() { env = test.NewEnvironment(ctx, func(e *test.Environment) { opts = defaultOpts Expect(opts.Validate()).To(Succeed(), "Failed to validate options") - ctx = injection.WithOptions(ctx, opts) + ctx = operator.WithOptions(ctx, opts) ctx, stop = context.WithCancel(ctx) launchTemplateCache = cache.New(CacheTTL, CacheCleanupInterval) internalUnavailableOfferingsCache = cache.New(awscache.UnavailableOfferingsTTL, CacheCleanupInterval) diff --git a/pkg/cloudproviders/common/cloudprovider/metrics/cloudprovider.go b/pkg/cloudproviders/common/cloudprovider/metrics/cloudprovider.go index 880215651c7b..0b20c77d8cdd 100644 --- a/pkg/cloudproviders/common/cloudprovider/metrics/cloudprovider.go +++ b/pkg/cloudproviders/common/cloudprovider/metrics/cloudprovider.go @@ -25,7 +25,7 @@ import ( "github.com/aws/karpenter/pkg/cloudproviders/common/cloudprovider" "github.com/aws/karpenter/pkg/metrics" - "github.com/aws/karpenter/pkg/utils/injection" + "github.com/aws/karpenter/pkg/operator" ) const ( @@ -68,16 +68,16 @@ func Decorate(cloudProvider cloudprovider.CloudProvider) cloudprovider.CloudProv } func (d *decorator) Create(ctx context.Context, nodeRequest *cloudprovider.NodeRequest) (*v1.Node, error) { - defer metrics.Measure(methodDurationHistogramVec.WithLabelValues(injection.GetControllerName(ctx), "Create", d.Name()))() + defer metrics.Measure(methodDurationHistogramVec.WithLabelValues(operator.GetControllerName(ctx), "Create", d.Name()))() return d.CloudProvider.Create(ctx, nodeRequest) } func (d *decorator) Delete(ctx context.Context, node *v1.Node) error { - defer metrics.Measure(methodDurationHistogramVec.WithLabelValues(injection.GetControllerName(ctx), "Delete", d.Name()))() + defer metrics.Measure(methodDurationHistogramVec.WithLabelValues(operator.GetControllerName(ctx), "Delete", d.Name()))() return d.CloudProvider.Delete(ctx, node) } func (d *decorator) GetInstanceTypes(ctx context.Context, provisioner *v1alpha5.Provisioner) ([]cloudprovider.InstanceType, error) { - defer metrics.Measure(methodDurationHistogramVec.WithLabelValues(injection.GetControllerName(ctx), "GetInstanceTypes", d.Name()))() + defer metrics.Measure(methodDurationHistogramVec.WithLabelValues(operator.GetControllerName(ctx), "GetInstanceTypes", d.Name()))() return d.CloudProvider.GetInstanceTypes(ctx, provisioner) } diff --git a/pkg/controllers/controllers.go b/pkg/controllers/controllers.go index 389b3ece7f2d..5c927d806745 100644 --- a/pkg/controllers/controllers.go +++ b/pkg/controllers/controllers.go @@ -33,22 +33,22 @@ func init() { metrics.MustRegister() // Registers cross-controller metrics } -func GetControllers(opts operator.Options, cloudProvider cloudprovider.CloudProvider) []operator.Controller { - cluster := state.NewCluster(opts.Clock, opts.Config, opts.KubeClient, cloudProvider) - provisioner := provisioning.NewProvisioner(opts.Ctx, opts.Config, opts.KubeClient, opts.Clientset.CoreV1(), opts.Recorder, cloudProvider, cluster) +func GetControllers(ctx operator.Context, cloudProvider cloudprovider.CloudProvider) []operator.Controller { + cluster := state.NewCluster(ctx.Clock, ctx.Config, ctx.KubeClient, cloudProvider) + provisioner := provisioning.NewProvisioner(ctx, ctx.Config, ctx.KubeClient, ctx.Clientset.CoreV1(), ctx.Recorder, cloudProvider, cluster) - metricsstate.StartMetricScraper(opts.Ctx, cluster) + metricsstate.StartMetricScraper(ctx, cluster) return []operator.Controller{ - provisioning.NewController(opts.KubeClient, provisioner, opts.Recorder), - state.NewNodeController(opts.KubeClient, cluster), - state.NewPodController(opts.KubeClient, cluster), - state.NewProvisionerController(opts.KubeClient, cluster), - node.NewController(opts.Clock, opts.KubeClient, cloudProvider, cluster), - termination.NewController(opts.Ctx, opts.Clock, opts.KubeClient, opts.Clientset.CoreV1(), opts.Recorder, cloudProvider), - metricspod.NewController(opts.KubeClient), - metricsprovisioner.NewController(opts.KubeClient), - counter.NewController(opts.KubeClient, cluster), - consolidation.NewController(opts.Clock, opts.KubeClient, provisioner, cloudProvider, opts.Recorder, cluster), + provisioning.NewController(ctx.KubeClient, provisioner, ctx.Recorder), + state.NewNodeController(ctx.KubeClient, cluster), + state.NewPodController(ctx.KubeClient, cluster), + state.NewProvisionerController(ctx.KubeClient, cluster), + node.NewController(ctx.Clock, ctx.KubeClient, cloudProvider, cluster), + termination.NewController(ctx, ctx.Clock, ctx.KubeClient, ctx.Clientset.CoreV1(), ctx.Recorder, cloudProvider), + metricspod.NewController(ctx.KubeClient), + metricsprovisioner.NewController(ctx.KubeClient), + counter.NewController(ctx.KubeClient, cluster), + consolidation.NewController(ctx.Clock, ctx.KubeClient, provisioner, cloudProvider, ctx.Recorder, cluster), } } diff --git a/pkg/controllers/termination/controller.go b/pkg/controllers/termination/controller.go index 9c8708431fd2..a0752fd37220 100644 --- a/pkg/controllers/termination/controller.go +++ b/pkg/controllers/termination/controller.go @@ -45,7 +45,7 @@ import ( "github.com/aws/karpenter/pkg/cloudproviders/common/cloudprovider" "github.com/aws/karpenter/pkg/events" "github.com/aws/karpenter/pkg/metrics" - "github.com/aws/karpenter/pkg/utils/injection" + "github.com/aws/karpenter/pkg/operator" ) const controllerName = "termination" @@ -94,7 +94,7 @@ func NewController(ctx context.Context, clk clock.Clock, kubeClient client.Clien // Reconcile executes a termination control loop for the resource func (c *Controller) Reconcile(ctx context.Context, req reconcile.Request) (reconcile.Result, error) { ctx = logging.WithLogger(ctx, logging.FromContext(ctx).Named(controllerName).With("node", req.Name)) - ctx = injection.WithControllerName(ctx, controllerName) + ctx = operator.WithControllerName(ctx, controllerName) // 1. Retrieve node from reconcile request node := &v1.Node{} diff --git a/pkg/operator/context.go b/pkg/operator/context.go new file mode 100644 index 000000000000..0d6b54fc7e95 --- /dev/null +++ b/pkg/operator/context.go @@ -0,0 +1,128 @@ +/* +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package operator + +import ( + "context" + "runtime/debug" + + "k8s.io/apimachinery/pkg/runtime" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/client-go/kubernetes" + clientgoscheme "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" + "k8s.io/client-go/util/flowcontrol" + "k8s.io/utils/clock" + "knative.dev/pkg/configmap/informer" + "knative.dev/pkg/injection" + "knative.dev/pkg/injection/sharedmain" + "knative.dev/pkg/logging" + "knative.dev/pkg/signals" + "knative.dev/pkg/system" + controllerruntime "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/manager" + + "github.com/aws/karpenter/pkg/apis" + "github.com/aws/karpenter/pkg/config" + "github.com/aws/karpenter/pkg/events" + "github.com/aws/karpenter/pkg/utils/project" +) + +const ( + appName = "karpenter" + component = "controller" +) + +var ( + scheme = runtime.NewScheme() +) + +func init() { + utilruntime.Must(clientgoscheme.AddToScheme(scheme)) + utilruntime.Must(apis.AddToScheme(scheme)) +} + +// Context is the root context for the operator and exposes shared components used by the entire process +type Context struct { + context.Context + Recorder events.Recorder + Config config.Config + KubeClient client.Client + Clientset *kubernetes.Clientset + Clock clock.Clock + Options *Options + StartAsync <-chan struct{} +} + +func NewOrDie() (Context, manager.Manager) { + options := NewOptions().MustParse() + + // Setup Client + restConfig := controllerruntime.GetConfigOrDie() + restConfig.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(float32(options.KubeClientQPS), options.KubeClientBurst) + restConfig.UserAgent = appName + clientSet := kubernetes.NewForConfigOrDie(restConfig) + + // Set up logger and watch for changes to log level defined in the ConfigMap `config-logging` + cmw := informer.NewInformedWatcher(clientSet, system.Namespace()) + ctx := LoggingContextOrDie(component, restConfig, cmw) + ctx = injection.WithConfig(ctx, restConfig) + ctx = WithOptions(ctx, *options) + + logging.FromContext(ctx).Infof("Initializing with version %s", project.Version) + if options.MemoryLimit > 0 { + newLimit := int64(float64(options.MemoryLimit) * 0.9) + logging.FromContext(ctx).Infof("Setting GC memory limit to %d, container limit = %d", newLimit, options.MemoryLimit) + debug.SetMemoryLimit(newLimit) + } + + cfg, err := config.New(ctx, clientSet, cmw) + if err != nil { + // this does not happen if the config map is missing or invalid, only if some other error occurs + logging.FromContext(ctx).Fatalf("unable to load config, %s", err) + } + if err := cmw.Start(ctx.Done()); err != nil { + logging.FromContext(ctx).Errorf("watching configmaps, config changes won't be applied immediately, %s", err) + } + + manager := NewManagerOrDie(ctx, restConfig, options) + recorder := events.NewRecorder(manager.GetEventRecorderFor(appName)) + recorder = events.NewLoadSheddingRecorder(recorder) + recorder = events.NewDedupeRecorder(recorder) + + return Context{ + Context: ctx, + Recorder: recorder, + Config: cfg, + Clientset: clientSet, + KubeClient: manager.GetClient(), + Clock: clock.RealClock{}, + Options: options, + StartAsync: manager.Elected(), + }, manager +} + +// LoggingContextOrDie injects a logger into the returned context. The logger is +// configured by the ConfigMap `config-logging` and live updates the level. +func LoggingContextOrDie(componentName string, config *rest.Config, cmw *informer.InformedWatcher) context.Context { + ctx, startinformers := injection.EnableInjectionOrDie(signals.NewContext(), config) + logger, atomicLevel := sharedmain.SetupLoggerOrDie(ctx, componentName) + ctx = logging.WithLogger(ctx, logger) + rest.SetDefaultWarningHandler(&logging.WarningHandler{Logger: logger}) + sharedmain.WatchLoggingConfigOrDie(ctx, cmw, logger, atomicLevel, componentName) + startinformers() + return ctx +} diff --git a/pkg/operator/injection.go b/pkg/operator/injection.go new file mode 100644 index 000000000000..e603b7d9a917 --- /dev/null +++ b/pkg/operator/injection.go @@ -0,0 +1,49 @@ +/* +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package operator + +import ( + "context" +) + +type optionsKey struct{} + +func WithOptions(ctx context.Context, opts Options) context.Context { + return context.WithValue(ctx, optionsKey{}, opts) +} + +func GetOptions(ctx context.Context) Options { + retval := ctx.Value(optionsKey{}) + if retval == nil { + return Options{} + } + return retval.(Options) +} + +type controllerNameKeyType struct{} + +var controllerNameKey = controllerNameKeyType{} + +func WithControllerName(ctx context.Context, name string) context.Context { + return context.WithValue(ctx, controllerNameKey, name) +} + +func GetControllerName(ctx context.Context) string { + name := ctx.Value(controllerNameKey) + if name == nil { + return "" + } + return name.(string) +} diff --git a/pkg/operator/manager.go b/pkg/operator/manager.go index d3dc62241ffa..77ea956f2b88 100644 --- a/pkg/operator/manager.go +++ b/pkg/operator/manager.go @@ -21,7 +21,6 @@ import ( "net/http/pprof" "github.com/go-logr/zapr" - "go.uber.org/zap" v1 "k8s.io/api/core/v1" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/client-go/rest" @@ -32,9 +31,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/healthz" "sigs.k8s.io/controller-runtime/pkg/manager" "sigs.k8s.io/controller-runtime/pkg/reconcile" - - "github.com/aws/karpenter/pkg/utils/injection" - "github.com/aws/karpenter/pkg/utils/options" ) // Controller is an interface implemented by Karpenter custom resources. @@ -53,16 +49,16 @@ type HealthCheck interface { } // NewManagerOrDie instantiates a controller manager or panics -func NewManagerOrDie(ctx context.Context, config *rest.Config, opts *options.Options) manager.Manager { +func NewManagerOrDie(ctx context.Context, config *rest.Config, options *Options) manager.Manager { newManager, err := controllerruntime.NewManager(config, controllerruntime.Options{ Logger: ignoreDebugEvents(zapr.NewLogger(logging.FromContext(ctx).Desugar())), - LeaderElection: opts.EnableLeaderElection, + LeaderElection: options.EnableLeaderElection, LeaderElectionID: "karpenter-leader-election", LeaderElectionResourceLock: resourcelock.LeasesResourceLock, Scheme: scheme, - MetricsBindAddress: fmt.Sprintf(":%d", opts.MetricsPort), - HealthProbeBindAddress: fmt.Sprintf(":%d", opts.HealthProbePort), - BaseContext: newRunnableContext(config, opts, logging.FromContext(ctx)), + MetricsBindAddress: fmt.Sprintf(":%d", options.MetricsPort), + HealthProbeBindAddress: fmt.Sprintf(":%d", options.HealthProbePort), + BaseContext: func() context.Context { return ctx }, }) if err != nil { panic(fmt.Sprintf("Failed to create controller newManager, %s", err)) @@ -72,7 +68,7 @@ func NewManagerOrDie(ctx context.Context, config *rest.Config, opts *options.Opt }); err != nil { panic(fmt.Sprintf("Failed to setup pod indexer, %s", err)) } - if opts.EnableProfiling { + if options.EnableProfiling { utilruntime.Must(registerPprof(newManager)) } @@ -80,33 +76,22 @@ func NewManagerOrDie(ctx context.Context, config *rest.Config, opts *options.Opt } // RegisterControllers registers a set of controllers to the controller manager -func RegisterControllers(ctx context.Context, m manager.Manager, controllers ...Controller) manager.Manager { +func RegisterControllers(ctx Context, mgr manager.Manager, controllers ...Controller) { for _, c := range controllers { - if err := c.Register(ctx, m); err != nil { + if err := c.Register(ctx, mgr); err != nil { panic(err) } // if the controller implements a liveness check, connect it if lp, ok := c.(HealthCheck); ok { - utilruntime.Must(m.AddHealthzCheck(fmt.Sprintf("%T", c), lp.LivenessProbe)) + utilruntime.Must(mgr.AddHealthzCheck(fmt.Sprintf("%T", c), lp.LivenessProbe)) } } - if err := m.AddHealthzCheck("healthz", healthz.Ping); err != nil { + if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { panic(fmt.Sprintf("Failed to add health probe, %s", err)) } - if err := m.AddReadyzCheck("readyz", healthz.Ping); err != nil { + if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil { panic(fmt.Sprintf("Failed to add ready probe, %s", err)) } - return m -} - -func newRunnableContext(config *rest.Config, options *options.Options, logger *zap.SugaredLogger) func() context.Context { - return func() context.Context { - ctx := context.Background() - ctx = logging.WithLogger(ctx, logger) - ctx = injection.WithConfig(ctx, config) - ctx = injection.WithOptions(ctx, *options) - return ctx - } } func registerPprof(manager manager.Manager) error { diff --git a/pkg/operator/options.go b/pkg/operator/options.go index fd3f05e6e0e9..b22710700785 100644 --- a/pkg/operator/options.go +++ b/pkg/operator/options.go @@ -15,100 +15,112 @@ limitations under the License. package operator import ( - "context" - "runtime/debug" - - "k8s.io/apimachinery/pkg/runtime" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/client-go/kubernetes" - clientgoscheme "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/util/flowcontrol" - "k8s.io/utils/clock" - "knative.dev/pkg/configmap/informer" - "knative.dev/pkg/logging" - "knative.dev/pkg/system" - controllerruntime "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/manager" - - "github.com/aws/karpenter/pkg/apis" - "github.com/aws/karpenter/pkg/config" - "github.com/aws/karpenter/pkg/events" - "github.com/aws/karpenter/pkg/utils/injection" - "github.com/aws/karpenter/pkg/utils/options" - "github.com/aws/karpenter/pkg/utils/project" -) + "errors" + "flag" + "fmt" + "net/url" + "os" -const ( - appName = "karpenter" - component = "controller" + "go.uber.org/multierr" + + "github.com/aws/karpenter/pkg/utils/env" ) -var ( - scheme = runtime.NewScheme() +type AWSNodeNameConvention string + +const ( + IPName AWSNodeNameConvention = "ip-name" + ResourceName AWSNodeNameConvention = "resource-name" ) -func init() { - utilruntime.Must(clientgoscheme.AddToScheme(scheme)) - utilruntime.Must(apis.AddToScheme(scheme)) +// Options for running this binary +type Options struct { + *flag.FlagSet + // Vendor Neutral + MetricsPort int + HealthProbePort int + KubeClientQPS int + KubeClientBurst int + EnableProfiling bool + EnableLeaderElection bool + MemoryLimit int64 + // AWS Specific + ClusterName string + ClusterEndpoint string + VMMemoryOverhead float64 + AWSNodeNameConvention string + AWSENILimitedPodDensity bool + AWSDefaultInstanceProfile string + AWSEnablePodENI bool + AWSIsolatedVPC bool } -// Options exposes shared components that are initialized by the startup.Initialize() call -type Options struct { - Ctx context.Context - Recorder events.Recorder - Config config.Config - KubeClient client.Client - Clientset *kubernetes.Clientset - Clock clock.Clock - Options *options.Options - StartAsync <-chan struct{} +// New creates an Options struct and registers CLI flags and environment variables to fill-in the Options struct fields +func NewOptions() *Options { + opts := &Options{} + f := flag.NewFlagSet("karpenter", flag.ContinueOnError) + opts.FlagSet = f + + // Vendor Neutral + f.IntVar(&opts.MetricsPort, "metrics-port", env.WithDefaultInt("METRICS_PORT", 8080), "The port the metric endpoint binds to for operating metrics about the controller itself") + f.IntVar(&opts.HealthProbePort, "health-probe-port", env.WithDefaultInt("HEALTH_PROBE_PORT", 8081), "The port the health probe endpoint binds to for reporting controller health") + f.IntVar(&opts.KubeClientQPS, "kube-client-qps", env.WithDefaultInt("KUBE_CLIENT_QPS", 200), "The smoothed rate of qps to kube-apiserver") + f.IntVar(&opts.KubeClientBurst, "kube-client-burst", env.WithDefaultInt("KUBE_CLIENT_BURST", 300), "The maximum allowed burst of queries to the kube-apiserver") + f.BoolVar(&opts.EnableProfiling, "enable-profiling", env.WithDefaultBool("ENABLE_PROFILING", false), "Enable the profiling on the metric endpoint") + f.BoolVar(&opts.EnableLeaderElection, "leader-elect", env.WithDefaultBool("LEADER_ELECT", true), "Start leader election client and gain leadership before executing the main loop. Enable this when running replicated components for high availability.") + f.Int64Var(&opts.MemoryLimit, "memory-limit", env.WithDefaultInt64("MEMORY_LIMIT", -1), "Memory limit on the container running the controller. The GC soft memory limit is set to 90% of this value.") + + // AWS Specific + f.StringVar(&opts.ClusterName, "cluster-name", env.WithDefaultString("CLUSTER_NAME", ""), "The kubernetes cluster name for resource discovery") + f.StringVar(&opts.ClusterEndpoint, "cluster-endpoint", env.WithDefaultString("CLUSTER_ENDPOINT", ""), "The external kubernetes cluster endpoint for new nodes to connect with") + f.Float64Var(&opts.VMMemoryOverhead, "vm-memory-overhead", env.WithDefaultFloat64("VM_MEMORY_OVERHEAD", 0.075), "The VM memory overhead as a percent that will be subtracted from the total memory for all instance types") + f.StringVar(&opts.AWSNodeNameConvention, "aws-node-name-convention", env.WithDefaultString("AWS_NODE_NAME_CONVENTION", string(IPName)), "The node naming convention used by the AWS cloud provider. DEPRECATION WARNING: this field may be deprecated at any time") + f.BoolVar(&opts.AWSENILimitedPodDensity, "aws-eni-limited-pod-density", env.WithDefaultBool("AWS_ENI_LIMITED_POD_DENSITY", true), "Indicates whether new nodes should use ENI-based pod density. DEPRECATED: Use `.spec.kubeletConfiguration.maxPods` to set pod density on a per-provisioner basis") + f.StringVar(&opts.AWSDefaultInstanceProfile, "aws-default-instance-profile", env.WithDefaultString("AWS_DEFAULT_INSTANCE_PROFILE", ""), "The default instance profile to use when provisioning nodes in AWS") + f.BoolVar(&opts.AWSEnablePodENI, "aws-enable-pod-eni", env.WithDefaultBool("AWS_ENABLE_POD_ENI", false), "If true then instances that support pod ENI will report a vpc.amazonaws.com/pod-eni resource") + f.BoolVar(&opts.AWSIsolatedVPC, "aws-isolated-vpc", env.WithDefaultBool("AWS_ISOLATED_VPC", false), "If true then assume we can't reach AWS services which don't have a VPC endpoint. This also has the effect of disabling look-ups to the AWS pricing endpoint.") + return opts } -func NewOptionsWithManagerOrDie() (Options, manager.Manager) { - opts := options.New().MustParse() - - // Setup Client - controllerRuntimeConfig := controllerruntime.GetConfigOrDie() - controllerRuntimeConfig.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(float32(opts.KubeClientQPS), opts.KubeClientBurst) - controllerRuntimeConfig.UserAgent = appName - clientSet := kubernetes.NewForConfigOrDie(controllerRuntimeConfig) - - // Set up logger and watch for changes to log level - cmw := informer.NewInformedWatcher(clientSet, system.Namespace()) - ctx := injection.LoggingContextOrDie(component, controllerRuntimeConfig, cmw) - ctx = injection.WithConfig(ctx, controllerRuntimeConfig) - ctx = injection.WithOptions(ctx, *opts) - - logging.FromContext(ctx).Infof("Initializing with version %s", project.Version) - if opts.MemoryLimit > 0 { - newLimit := int64(float64(opts.MemoryLimit) * 0.9) - logging.FromContext(ctx).Infof("Setting GC memory limit to %d, container limit = %d", newLimit, opts.MemoryLimit) - debug.SetMemoryLimit(newLimit) - } +// MustParse reads the user passed flags, environment variables, and default values. +// Options are valided and panics if an error is returned +func (o *Options) MustParse() *Options { + err := o.Parse(os.Args[1:]) - cfg, err := config.New(ctx, clientSet, cmw) + if errors.Is(err, flag.ErrHelp) { + os.Exit(0) + } if err != nil { - // this does not happen if the config map is missing or invalid, only if some other error occurs - logging.FromContext(ctx).Fatalf("unable to load config, %s", err) + panic(err) } - if err := cmw.Start(ctx.Done()); err != nil { - logging.FromContext(ctx).Errorf("watching configmaps, config changes won't be applied immediately, %s", err) + if err := o.Validate(); err != nil { + panic(err) } + return o +} + +func (o Options) Validate() (err error) { + err = multierr.Append(err, o.validateEndpoint()) + if o.ClusterName == "" { + err = multierr.Append(err, fmt.Errorf("CLUSTER_NAME is required")) + } + awsNodeNameConvention := AWSNodeNameConvention(o.AWSNodeNameConvention) + if awsNodeNameConvention != IPName && awsNodeNameConvention != ResourceName { + err = multierr.Append(err, fmt.Errorf("aws-node-name-convention may only be either ip-name or resource-name")) + } + return err +} + +func (o Options) validateEndpoint() error { + endpoint, err := url.Parse(o.ClusterEndpoint) + // url.Parse() will accept a lot of input without error; make + // sure it's a real URL + if err != nil || !endpoint.IsAbs() || endpoint.Hostname() == "" { + return fmt.Errorf("\"%s\" not a valid CLUSTER_ENDPOINT URL", o.ClusterEndpoint) + } + return nil +} - manager := NewManagerOrDie(ctx, controllerRuntimeConfig, opts) - recorder := events.NewRecorder(manager.GetEventRecorderFor(appName)) - recorder = events.NewLoadSheddingRecorder(recorder) - recorder = events.NewDedupeRecorder(recorder) - - return Options{ - Ctx: ctx, - Recorder: recorder, - Config: cfg, - Clientset: clientSet, - KubeClient: manager.GetClient(), - Clock: clock.RealClock{}, - Options: opts, - StartAsync: manager.Elected(), - }, manager +func (o Options) GetAWSNodeNameConvention() AWSNodeNameConvention { + return AWSNodeNameConvention(o.AWSNodeNameConvention) } diff --git a/pkg/utils/injection/injection.go b/pkg/utils/injection/injection.go index 2b2f12b3077e..df000ce94802 100644 --- a/pkg/utils/injection/injection.go +++ b/pkg/utils/injection/injection.go @@ -18,30 +18,10 @@ import ( "context" "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/rest" - "knative.dev/pkg/configmap/informer" - knativeinjection "knative.dev/pkg/injection" - "knative.dev/pkg/injection/sharedmain" - "knative.dev/pkg/logging" - "knative.dev/pkg/signals" - - "github.com/aws/karpenter/pkg/utils/options" ) type resourceKey struct{} -// LoggingContextOrDie injects a logger into the returned context. The logger is -// configured by the ConfigMap `config-logging` and live updates the level. -func LoggingContextOrDie(componentName string, config *rest.Config, cmw *informer.InformedWatcher) context.Context { - ctx, startinformers := knativeinjection.EnableInjectionOrDie(signals.NewContext(), config) - logger, atomicLevel := sharedmain.SetupLoggerOrDie(ctx, componentName) - ctx = logging.WithLogger(ctx, logger) - rest.SetDefaultWarningHandler(&logging.WarningHandler{Logger: logger}) - sharedmain.WatchLoggingConfigOrDie(ctx, cmw, logger, atomicLevel, componentName) - startinformers() - return ctx -} - func WithNamespacedName(ctx context.Context, namespacedname types.NamespacedName) context.Context { return context.WithValue(ctx, resourceKey{}, namespacedname) } @@ -53,47 +33,3 @@ func GetNamespacedName(ctx context.Context) types.NamespacedName { } return retval.(types.NamespacedName) } - -type optionsKey struct{} - -func WithOptions(ctx context.Context, opts options.Options) context.Context { - return context.WithValue(ctx, optionsKey{}, opts) -} - -func GetOptions(ctx context.Context) options.Options { - retval := ctx.Value(optionsKey{}) - if retval == nil { - return options.Options{} - } - return retval.(options.Options) -} - -type configKey struct{} - -func WithConfig(ctx context.Context, config *rest.Config) context.Context { - return context.WithValue(ctx, configKey{}, config) -} - -func GetConfig(ctx context.Context) *rest.Config { - retval := ctx.Value(configKey{}) - if retval == nil { - return nil - } - return retval.(*rest.Config) -} - -type controllerNameKeyType struct{} - -var controllerNameKey = controllerNameKeyType{} - -func WithControllerName(ctx context.Context, name string) context.Context { - return context.WithValue(ctx, controllerNameKey, name) -} - -func GetControllerName(ctx context.Context) string { - name := ctx.Value(controllerNameKey) - if name == nil { - return "" - } - return name.(string) -} diff --git a/pkg/utils/options/options.go b/pkg/utils/options/options.go deleted file mode 100644 index c72754bb4e64..000000000000 --- a/pkg/utils/options/options.go +++ /dev/null @@ -1,126 +0,0 @@ -/* -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package options - -import ( - "errors" - "flag" - "fmt" - "net/url" - "os" - - "go.uber.org/multierr" - - "github.com/aws/karpenter/pkg/utils/env" -) - -type AWSNodeNameConvention string - -const ( - IPName AWSNodeNameConvention = "ip-name" - ResourceName AWSNodeNameConvention = "resource-name" -) - -// Options for running this binary -type Options struct { - *flag.FlagSet - // Vendor Neutral - MetricsPort int - HealthProbePort int - KubeClientQPS int - KubeClientBurst int - EnableProfiling bool - EnableLeaderElection bool - MemoryLimit int64 - // AWS Specific - ClusterName string - ClusterEndpoint string - VMMemoryOverhead float64 - AWSNodeNameConvention string - AWSENILimitedPodDensity bool - AWSDefaultInstanceProfile string - AWSEnablePodENI bool - AWSIsolatedVPC bool -} - -// New creates an Options struct and registers CLI flags and environment variables to fill-in the Options struct fields -func New() *Options { - opts := &Options{} - f := flag.NewFlagSet("karpenter", flag.ContinueOnError) - opts.FlagSet = f - - // Vendor Neutral - f.IntVar(&opts.MetricsPort, "metrics-port", env.WithDefaultInt("METRICS_PORT", 8080), "The port the metric endpoint binds to for operating metrics about the controller itself") - f.IntVar(&opts.HealthProbePort, "health-probe-port", env.WithDefaultInt("HEALTH_PROBE_PORT", 8081), "The port the health probe endpoint binds to for reporting controller health") - f.IntVar(&opts.KubeClientQPS, "kube-client-qps", env.WithDefaultInt("KUBE_CLIENT_QPS", 200), "The smoothed rate of qps to kube-apiserver") - f.IntVar(&opts.KubeClientBurst, "kube-client-burst", env.WithDefaultInt("KUBE_CLIENT_BURST", 300), "The maximum allowed burst of queries to the kube-apiserver") - f.BoolVar(&opts.EnableProfiling, "enable-profiling", env.WithDefaultBool("ENABLE_PROFILING", false), "Enable the profiling on the metric endpoint") - f.BoolVar(&opts.EnableLeaderElection, "leader-elect", env.WithDefaultBool("LEADER_ELECT", true), "Start leader election client and gain leadership before executing the main loop. Enable this when running replicated components for high availability.") - f.Int64Var(&opts.MemoryLimit, "memory-limit", env.WithDefaultInt64("MEMORY_LIMIT", -1), "Memory limit on the container running the controller. The GC soft memory limit is set to 90% of this value.") - - // AWS Specific - f.StringVar(&opts.ClusterName, "cluster-name", env.WithDefaultString("CLUSTER_NAME", ""), "The kubernetes cluster name for resource discovery") - f.StringVar(&opts.ClusterEndpoint, "cluster-endpoint", env.WithDefaultString("CLUSTER_ENDPOINT", ""), "The external kubernetes cluster endpoint for new nodes to connect with") - f.Float64Var(&opts.VMMemoryOverhead, "vm-memory-overhead", env.WithDefaultFloat64("VM_MEMORY_OVERHEAD", 0.075), "The VM memory overhead as a percent that will be subtracted from the total memory for all instance types") - f.StringVar(&opts.AWSNodeNameConvention, "aws-node-name-convention", env.WithDefaultString("AWS_NODE_NAME_CONVENTION", string(IPName)), "The node naming convention used by the AWS cloud provider. DEPRECATION WARNING: this field may be deprecated at any time") - f.BoolVar(&opts.AWSENILimitedPodDensity, "aws-eni-limited-pod-density", env.WithDefaultBool("AWS_ENI_LIMITED_POD_DENSITY", true), "Indicates whether new nodes should use ENI-based pod density. DEPRECATED: Use `.spec.kubeletConfiguration.maxPods` to set pod density on a per-provisioner basis") - f.StringVar(&opts.AWSDefaultInstanceProfile, "aws-default-instance-profile", env.WithDefaultString("AWS_DEFAULT_INSTANCE_PROFILE", ""), "The default instance profile to use when provisioning nodes in AWS") - f.BoolVar(&opts.AWSEnablePodENI, "aws-enable-pod-eni", env.WithDefaultBool("AWS_ENABLE_POD_ENI", false), "If true then instances that support pod ENI will report a vpc.amazonaws.com/pod-eni resource") - f.BoolVar(&opts.AWSIsolatedVPC, "aws-isolated-vpc", env.WithDefaultBool("AWS_ISOLATED_VPC", false), "If true then assume we can't reach AWS services which don't have a VPC endpoint. This also has the effect of disabling look-ups to the AWS pricing endpoint.") - return opts -} - -// MustParse reads the user passed flags, environment variables, and default values. -// Options are valided and panics if an error is returned -func (o *Options) MustParse() *Options { - err := o.Parse(os.Args[1:]) - - if errors.Is(err, flag.ErrHelp) { - os.Exit(0) - } - if err != nil { - panic(err) - } - if err := o.Validate(); err != nil { - panic(err) - } - return o -} - -func (o Options) Validate() (err error) { - err = multierr.Append(err, o.validateEndpoint()) - if o.ClusterName == "" { - err = multierr.Append(err, fmt.Errorf("CLUSTER_NAME is required")) - } - awsNodeNameConvention := AWSNodeNameConvention(o.AWSNodeNameConvention) - if awsNodeNameConvention != IPName && awsNodeNameConvention != ResourceName { - err = multierr.Append(err, fmt.Errorf("aws-node-name-convention may only be either ip-name or resource-name")) - } - return err -} - -func (o Options) validateEndpoint() error { - endpoint, err := url.Parse(o.ClusterEndpoint) - // url.Parse() will accept a lot of input without error; make - // sure it's a real URL - if err != nil || !endpoint.IsAbs() || endpoint.Hostname() == "" { - return fmt.Errorf("\"%s\" not a valid CLUSTER_ENDPOINT URL", o.ClusterEndpoint) - } - return nil -} - -func (o Options) GetAWSNodeNameConvention() AWSNodeNameConvention { - return AWSNodeNameConvention(o.AWSNodeNameConvention) -} diff --git a/pkg/webhooks/webhooks.go b/pkg/webhooks/webhooks.go index 69912c15e6ce..e2c753dc6856 100644 --- a/pkg/webhooks/webhooks.go +++ b/pkg/webhooks/webhooks.go @@ -36,8 +36,8 @@ import ( "github.com/aws/karpenter/pkg/apis" "github.com/aws/karpenter/pkg/cloudproviders/common/cloudprovider" + "github.com/aws/karpenter/pkg/operator" "github.com/aws/karpenter/pkg/utils/env" - "github.com/aws/karpenter/pkg/utils/injection" ) type WebhookOpts struct { @@ -63,7 +63,7 @@ func Initialize(injectCloudProvider func(context.Context, cloudprovider.Options) // Set up logger and watch for changes to log level clientSet := kubernetes.NewForConfigOrDie(config) cmw := informer.NewInformedWatcher(clientSet, system.Namespace()) - ctx := injection.LoggingContextOrDie(component, config, cmw) + ctx := operator.LoggingContextOrDie(component, config, cmw) ctx = knativeinjection.WithNamespaceScope(ctx, system.Namespace()) ctx = webhook.WithOptions(ctx, webhook.Options{ diff --git a/test/go.mod b/test/go.mod index 7b5be9ace34b..08358355bf5d 100644 --- a/test/go.mod +++ b/test/go.mod @@ -17,23 +17,17 @@ require ( ) require ( - contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d // indirect - contrib.go.opencensus.io/exporter/prometheus v0.4.0 // indirect github.com/Pallinder/go-randomdata v1.2.0 // indirect github.com/PuerkitoBio/purell v1.1.1 // indirect github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/benbjohnson/clock v1.1.0 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver/v4 v4.0.0 // indirect github.com/blendle/zapdriver v1.3.1 // indirect - github.com/census-instrumentation/opencensus-proto v0.3.0 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/emicklei/go-restful/v3 v3.8.0 // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/go-kit/log v0.2.0 // indirect - github.com/go-logfmt/logfmt v0.5.1 // indirect github.com/go-logr/logr v1.2.3 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.19.5 // indirect @@ -45,13 +39,10 @@ require ( github.com/google/go-cmp v0.5.8 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/uuid v1.3.0 // indirect - github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect - github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/kelseyhightower/envconfig v1.4.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect @@ -64,26 +55,19 @@ require ( github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common v0.37.0 // indirect github.com/prometheus/procfs v0.8.0 // indirect - github.com/prometheus/statsd_exporter v0.21.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - go.opencensus.io v0.23.0 // indirect go.uber.org/atomic v1.9.0 // indirect - go.uber.org/automaxprocs v1.4.0 // indirect go.uber.org/multierr v1.8.0 // indirect go.uber.org/zap v1.23.0 // indirect golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect - golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect golang.org/x/text v0.3.7 // indirect golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/api v0.61.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 // indirect - google.golang.org/grpc v1.47.0 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/test/go.sum b/test/go.sum index 66ea1033384f..d86c0d83feaa 100644 --- a/test/go.sum +++ b/test/go.sum @@ -13,18 +13,6 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -42,14 +30,9 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d h1:LblfooH1lKOpp1hIhukktmSAxFkqMPFk9KR6iZ0MJNI= -contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d/go.mod h1:IshRmMJBhDfFj5Y67nVhMYTTIze91RUeT73ipWKs/GY= -contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= -contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/Pallinder/go-randomdata v1.2.0 h1:DZ41wBchNRb/0GfsePLiSwb0PHZmT67XY00lCDlaYPg= github.com/Pallinder/go-randomdata v1.2.0/go.mod h1:yHmJgulpD2Nfrm0cR9tI/+oAgRqCQQixsA8HyRZfV9Y= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= @@ -61,7 +44,6 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/aws/aws-sdk-go v1.44.114 h1:plIkWc/RsHr3DXBj4MEw9sEW4CcL/e2ryokc+CKyq1I= github.com/aws/aws-sdk-go v1.44.114/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/karpenter-core v0.0.1 h1:DYYh7XotfMm7L6pDo01NZJP3yx8JT3WkeG+3Druavgo= @@ -72,14 +54,9 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0 h1:t/LhUZLVitR1Ow2YOnduCsavhwFUklBMoGVYUCqmCqk= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -88,13 +65,6 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -105,11 +75,6 @@ github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry 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.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= @@ -117,19 +82,16 @@ github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJ github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -161,8 +123,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -178,10 +138,8 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= @@ -193,11 +151,8 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/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.4/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.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -205,8 +160,6 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -214,30 +167,14 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= @@ -257,8 +194,6 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= -github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -322,7 +257,6 @@ github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6T github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= @@ -333,16 +267,12 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= -github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/samber/lo v1.32.0 h1:MjbngaDxbQ+ockKTEoF0IQtW2lX1VgqZ5IBhxi4fmTU= github.com/samber/lo v1.32.0/go.mod h1:HLeWcJRRyLKp3+/XBJvOrerCQn9mhdKMHyd7IRlgeQ8= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= @@ -361,22 +291,15 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/automaxprocs v1.4.0 h1:CpDZl6aOlLhReez+8S3eEotD7Jx0Os++lemPlMULQP0= -go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q= go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= @@ -414,8 +337,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -424,9 +345,6 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= 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= @@ -443,7 +361,6 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -459,14 +376,6 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -477,17 +386,7 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -500,9 +399,6 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -534,30 +430,12 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/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-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -571,8 +449,6 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -622,18 +498,7 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -654,25 +519,9 @@ google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/ google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.25.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0 h1:TXXKS1slM3b2bZNJwD5DV/Tp6/M2cLzLOLh9PjDhrw8= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= 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.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -704,44 +553,13 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 h1:hrbNEivu7Zn1pxvHk6MBrq9iE22woVILTHqexqBxe6I= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -754,23 +572,6 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -783,8 +584,6 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -799,7 +598,6 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=