From c7d508023a84f8865f6d8a75486687f5eb8bf82a Mon Sep 17 00:00:00 2001 From: Lucas TESSON Date: Tue, 9 Jul 2024 00:44:38 +0200 Subject: [PATCH] fix: deployments auto configuration --- deploy/components/chall-manager.go | 288 +++++++++++++++-------------- deploy/main.go | 25 ++- go.work | 2 + go.work.sum | 9 +- 4 files changed, 178 insertions(+), 146 deletions(-) diff --git a/deploy/components/chall-manager.go b/deploy/components/chall-manager.go index df114ac..150e2c7 100644 --- a/deploy/components/chall-manager.go +++ b/deploy/components/chall-manager.go @@ -12,6 +12,16 @@ import ( "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) +var crudVerbs = []string{ + "create", + "delete", + "get", + "list", + "patch", + "update", + "watch", +} + type ( ChallManager struct { ns *corev1.Namespace @@ -23,23 +33,30 @@ type ( saltSec *corev1.Secret dep *appsv1.Deployment svc *corev1.Service - etcd *EtcdCluster cjob *batchv1.CronJob + // Non-mandatory values, used internally to get track of arguments logic results. + etcd *EtcdCluster + Port pulumi.IntPtrOutput GatewayPort pulumi.IntPtrOutput } ChallManagerArgs struct { + // Namespace to which deploy the chall-manager and the challenge resources. Namespace pulumi.StringInput // Replicas of the chall-manager instance. If not specified, default to 1. Replicas pulumi.IntPtrInput Gateway bool + Swagger bool // ServiceType enables you to expose your Chall-Manager instance // (e.g. "NodePort" will make it reachable in the Kubernetes NodePort range). ServiceType pulumi.StringPtrInput + // LockKind, know what lock strategy to adopt. + LockKind string + // EtcdReplicas ; if not specified, default to 1. EtcdReplicas pulumi.IntPtrInput @@ -54,7 +71,7 @@ const ( portKey = "grpc" gwPort = 9090 gwPortKey = "gateway" - directory = "/etc/chall-manager/states" + directory = "/etc/chall-manager" defaultCron = "*/1 * * * *" ) @@ -92,72 +109,88 @@ func (cm *ChallManager) provision(ctx *pulumi.Context, args *ChallManagerArgs, o if err != nil { return } + + // Define the namespace to deploy the chall-manager into ns := cm.ns.ToNamespaceOutput().Metadata().Name() - // Start etcd cluster - cm.etcd, err = NewEtcdCluster(ctx, &EtcdArgs{ - Namespace: ns.Elem(), - Replicas: args.EtcdReplicas.ToIntPtrOutput().ApplyT(func(replicas *int) int { - if replicas != nil { - return *replicas - } - return 1 - }).(pulumi.IntOutput), - }, opts...) - if err != nil { - return err + // Check lock kind + switch lk := args.LockKind; lk { + case "", "local": + args.LockKind = "local" // overwrite, for the empty string case + // Nothing special to do, it will work by itself + + case "etcd": + // Start etcd cluster + cm.etcd, err = NewEtcdCluster(ctx, &EtcdArgs{ + Namespace: ns.Elem(), + Replicas: pulumi.All(args.EtcdReplicas).ApplyT(func(all []any) int { + if replicas, ok := all[0].(*int); ok { + return *replicas + } + return 1 // default replicas to 1 + }).(pulumi.IntOutput), + }, opts...) + if err != nil { + return err + } + + default: + return fmt.Errorf("invalid lock kind: %s", lk) } // => ClusterRole, used to create a dedicated service acccount for Chall-Manager cm.cr, err = rbacv1.NewClusterRole(ctx, "chall-manager-role", &rbacv1.ClusterRoleArgs{ Metadata: metav1.ObjectMetaArgs{ - Name: pulumi.String("chall-manager-role"), - Namespace: ns, - Labels: labels, + Name: pulumi.String("chall-manager-role"), + Labels: labels, }, Rules: rbacv1.PolicyRuleArray{ - // TODO review policy rules rbacv1.PolicyRuleArgs{ ApiGroups: pulumi.ToStringArray([]string{ "", }), Resources: pulumi.ToStringArray([]string{ - "services", + // All the following resources are namespaced. + "configmaps", "endpoints", + "persistentvolumeclaims", + "pods", + "resourcequotas", "secrets", + "services", }), - Verbs: pulumi.ToStringArray([]string{ - "get", - "list", - "watch", - }), + Verbs: pulumi.ToStringArray(crudVerbs), }, rbacv1.PolicyRuleArgs{ ApiGroups: pulumi.ToStringArray([]string{ - "extensions", - "networking.k8s.io", + "apps", }), Resources: pulumi.ToStringArray([]string{ - "ingresses", - "ingressclasses", + "deployments", + "replicasets", + "statefulsets", + }), + Verbs: pulumi.ToStringArray(crudVerbs), + }, + rbacv1.PolicyRuleArgs{ + ApiGroups: pulumi.ToStringArray([]string{ + "batch", }), - Verbs: pulumi.ToStringArray([]string{ - "get", - "list", - "watch", + Resources: pulumi.ToStringArray([]string{ + "cronjobs", + "jobs", }), + Verbs: pulumi.ToStringArray(crudVerbs), }, rbacv1.PolicyRuleArgs{ ApiGroups: pulumi.ToStringArray([]string{ - "extensions", "networking.k8s.io", }), Resources: pulumi.ToStringArray([]string{ - "ingresses/status", - }), - Verbs: pulumi.ToStringArray([]string{ - "update", + "ingresses", + "networkpolicies", }), + Verbs: pulumi.ToStringArray(crudVerbs), }, }, }, opts...) @@ -180,9 +213,8 @@ func (cm *ChallManager) provision(ctx *pulumi.Context, args *ChallManagerArgs, o // => ClusterRoleBinding, binds the ClusterRole and ServiceAccount cm.crb, err = rbacv1.NewClusterRoleBinding(ctx, "chall-manager-role-binding", &rbacv1.ClusterRoleBindingArgs{ Metadata: metav1.ObjectMetaArgs{ - Name: pulumi.String("chall-manager-role-binding"), - Namespace: ns, - Labels: labels, + Name: pulumi.String("chall-manager-role-binding"), + Labels: labels, }, RoleRef: rbacv1.RoleRefArgs{ ApiGroup: pulumi.String("rbac.authorization.k8s.io"), @@ -247,6 +279,78 @@ func (cm *ChallManager) provision(ctx *pulumi.Context, args *ChallManagerArgs, o } // => Deployment + initCts := corev1.ContainerArray{} + envs := corev1.EnvVarArray{ + corev1.EnvVarArgs{ + Name: pulumi.String("PORT"), + Value: pulumi.Sprintf("%d", port), + }, + corev1.EnvVarArgs{ + Name: pulumi.String("GATEWAY"), + Value: pulumi.Sprintf("%t", args.Gateway), + }, + corev1.EnvVarArgs{ + Name: pulumi.String("GATEWAY_PORT"), + Value: pulumi.Sprintf("%d", gwPort), + }, + corev1.EnvVarArgs{ + Name: pulumi.String("GATEWAY_SWAGGER"), + Value: pulumi.Sprintf("%t", args.Swagger), + }, + corev1.EnvVarArgs{ + Name: pulumi.String("DIR"), + Value: pulumi.String(directory), + }, + corev1.EnvVarArgs{ + Name: pulumi.String("SALT"), + ValueFrom: corev1.EnvVarSourceArgs{ + SecretKeyRef: corev1.SecretKeySelectorArgs{ + Name: cm.saltSec.Metadata.Name(), + Key: pulumi.String("salt"), + }, + }, + }, + corev1.EnvVarArgs{ + Name: pulumi.String("LOCK_KIND"), + Value: pulumi.String(args.LockKind), + }, + } + + if args.LockKind == "etcd" { + initCts = append(initCts, corev1.ContainerArgs{ + Name: pulumi.String("wait-etcd"), + Image: pulumi.String("bitnami/etcd:3.5.11"), + Command: pulumi.All(cm.etcd.Endpoint, cm.etcd.Username, cm.etcd.Password).ApplyT(func(args []any) []string { + endpoint := args[0].(string) + username := args[1].(string) + password := args[2].(string) + + return []string{ + "/bin/sh", "-c", + fmt.Sprintf(`until etcdctl --endpoints=http://%s --user=%s --password=%s endpoint health; do + echo "Waiting for etcd cluster to be ready..." + sleep 5 + done`, endpoint, username, password), + } + }).(pulumi.StringArrayOutput), + }) + + envs = append(envs, + corev1.EnvVarArgs{ + Name: pulumi.String("LOCK_ETCD_ENDPOINTS"), + Value: cm.etcd.Endpoint, + }, + corev1.EnvVarArgs{ + Name: pulumi.String("LOCK_ETCD_USERNAME"), + Value: cm.etcd.Username, + }, + corev1.EnvVarArgs{ + Name: pulumi.String("LOCK_ETCD_PASSWORD"), + Value: cm.etcd.Password, + }, + ) + } + dpar := corev1.ContainerPortArray{ corev1.ContainerPortArgs{ Name: pulumi.String(portKey), @@ -259,23 +363,7 @@ func (cm *ChallManager) provision(ctx *pulumi.Context, args *ChallManagerArgs, o ContainerPort: pulumi.Int(gwPort), }) } - etcdInitContainer := corev1.ContainerArgs{ - Name: pulumi.String("wait-etcd"), - Image: pulumi.String("bitnami/etcd:3.5.11"), - Command: pulumi.All(cm.etcd.Endpoint, cm.etcd.Username, cm.etcd.Password).ApplyT(func(args []any) []string { - endpoint := args[0].(string) - username := args[1].(string) - password := args[2].(string) - - return []string{ - "/bin/sh", "-c", - fmt.Sprintf(`until etcdctl --endpoints=http://%s --user=%s --password=%s endpoint health; do -echo "Waiting for etcd cluster to be ready..." -sleep 5 -done`, endpoint, username, password), - } - }).(pulumi.StringArrayOutput), - } + cm.dep, err = appsv1.NewDeployment(ctx, "chall-manager-deployment", &appsv1.DeploymentArgs{ Metadata: metav1.ObjectMetaArgs{ Name: pulumi.String("chall-manager-deployment"), @@ -283,11 +371,11 @@ done`, endpoint, username, password), Labels: labels, }, Spec: appsv1.DeploymentSpecArgs{ - Replicas: args.Replicas.ToIntPtrOutput().ApplyT(func(replicas *int) int { - if replicas != nil { + Replicas: pulumi.All(args.Replicas).ApplyT(func(all []any) int { + if replicas, ok := all[0].(*int); ok { return *replicas } - return 1 + return 1 // default replicas to 1 }).(pulumi.IntOutput), Selector: metav1.LabelSelectorArgs{ MatchLabels: labels, @@ -299,54 +387,14 @@ done`, endpoint, username, password), }, Spec: corev1.PodSpecArgs{ ServiceAccountName: pulumi.String("chall-manager-account"), - InitContainers: corev1.ContainerArray{ - etcdInitContainer, - }, + InitContainers: initCts, Containers: corev1.ContainerArray{ corev1.ContainerArgs{ Name: pulumi.String("chall-manager"), Image: pulumi.String("registry.dev1.ctfer-io.lab/ctferio/chall-manager:dev"), // TODO set proper image ctferio/chall-manager ImagePullPolicy: pulumi.String("Always"), - Env: corev1.EnvVarArray{ - corev1.EnvVarArgs{ - Name: pulumi.String("PORT"), - Value: pulumi.Sprintf("%d", port), - }, - corev1.EnvVarArgs{ - Name: pulumi.String("GATEWAY"), - Value: pulumi.Sprintf("%t", args.Gateway), - }, - corev1.EnvVarArgs{ - Name: pulumi.String("GATEWAY_PORT"), - Value: pulumi.Sprintf("%d", gwPort), - }, - corev1.EnvVarArgs{ - Name: pulumi.String("DIR"), - Value: pulumi.String(directory), - }, - corev1.EnvVarArgs{ - Name: pulumi.String("SALT"), - ValueFrom: corev1.EnvVarSourceArgs{ - SecretKeyRef: corev1.SecretKeySelectorArgs{ - Name: cm.saltSec.Metadata.Name(), - Key: pulumi.String("salt"), - }, - }, - }, - corev1.EnvVarArgs{ - Name: pulumi.String("LOCK_ETCD_ENDPOINTS"), - Value: cm.etcd.Endpoint, - }, - corev1.EnvVarArgs{ - Name: pulumi.String("LOCK_ETCD_USERNAME"), - Value: cm.etcd.Username, - }, - corev1.EnvVarArgs{ - Name: pulumi.String("LOCK_ETCD_PASSWORD"), - Value: cm.etcd.Password, - }, - }, - Ports: dpar, + Env: envs, + Ports: dpar, VolumeMounts: corev1.VolumeMountArray{ corev1.VolumeMountArgs{ Name: pulumi.String("dir"), @@ -395,9 +443,7 @@ done`, endpoint, username, password), }, Spec: corev1.PodSpecArgs{ ServiceAccountName: pulumi.String("chall-manager-account"), - InitContainers: corev1.ContainerArray{ - etcdInitContainer, - }, + InitContainers: initCts, Containers: corev1.ContainerArray{ corev1.ContainerArgs{ Name: pulumi.String("chall-manager-janitor"), @@ -405,35 +451,9 @@ done`, endpoint, username, password), ImagePullPolicy: pulumi.String("Always"), Env: corev1.EnvVarArray{ corev1.EnvVarArgs{ - Name: pulumi.String("DIR"), - Value: pulumi.String(directory), - }, - corev1.EnvVarArgs{ - Name: pulumi.String("LOCK_ETCD_ENDPOINTS"), - Value: cm.etcd.Endpoint, + Name: pulumi.String("URL"), + Value: pulumi.Sprintf("chall-manager-service:%d", port), }, - corev1.EnvVarArgs{ - Name: pulumi.String("LOCK_ETCD_USERNAME"), - Value: cm.etcd.Username, - }, - corev1.EnvVarArgs{ - Name: pulumi.String("LOCK_ETCD_PASSWORD"), - Value: cm.etcd.Password, - }, - }, - VolumeMounts: corev1.VolumeMountArray{ - corev1.VolumeMountArgs{ - Name: pulumi.String("dir"), - MountPath: pulumi.String(directory), - }, - }, - }, - }, - Volumes: corev1.VolumeArray{ - corev1.VolumeArgs{ - Name: pulumi.String("dir"), - PersistentVolumeClaim: corev1.PersistentVolumeClaimVolumeSourceArgs{ - ClaimName: cm.pvc.Metadata.Name().Elem().ToStringOutput(), }, }, }, diff --git a/deploy/main.go b/deploy/main.go index 562d962..7f57ab3 100644 --- a/deploy/main.go +++ b/deploy/main.go @@ -1,6 +1,8 @@ package main import ( + "strconv" + "github.com/ctfer-io/chall-manager/deploy/components" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" "github.com/pulumi/pulumi/sdk/v3/go/pulumi/config" @@ -11,12 +13,14 @@ func main() { cfg := config.New(ctx, "chall-manager") cm, err := components.NewChallManager(ctx, &components.ChallManagerArgs{ - Namespace: toStr(cfg, "namespace"), - ServiceType: toStr(cfg, "service-type"), - EtcdReplicas: pulumi.IntPtr(1), // XXX does not work properly, nil pointer dereference - Replicas: pulumi.IntPtr(1), // XXX does not work properly, nil pointer dereference + Namespace: pulumi.String(cfg.Get("namespace")), + ServiceType: pulumi.String(cfg.Get("service-type")), + Replicas: toIntPtr(cfg.Get("replicas")), JanitorCron: toStr(cfg, "janitor-cron"), Gateway: toBool(cfg.Get("gateway")), + Swagger: toBool(cfg.Get("swagger")), + LockKind: cfg.Get("lock-kind"), + EtcdReplicas: toIntPtr(cfg.Get("etcd-replicas")), }) if err != nil { return err @@ -33,12 +37,23 @@ func toBool(str string) bool { switch str { case "true": return true - case "false", "": + case "", "false": return false } panic("invalid bool value: " + str) } +func toIntPtr(str string) pulumi.IntPtrInput { + if str == "" { + return nil + } + n, err := strconv.Atoi(str) + if err != nil { + panic(err) + } + return pulumi.IntPtr(n) +} + func toStr(cfg *config.Config, key string) pulumi.StringInput { if _, err := cfg.Try(key); err != nil { return nil diff --git a/go.work b/go.work index 10c45fa..72dbf2f 100644 --- a/go.work +++ b/go.work @@ -3,4 +3,6 @@ go 1.22.4 use ( . ./deploy + ./examples/kubernetes + ./examples/teeworlds ) diff --git a/go.work.sum b/go.work.sum index e7c8646..c18303b 100644 --- a/go.work.sum +++ b/go.work.sum @@ -313,6 +313,8 @@ github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcP github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Code-Hex/go-generics-cache v1.3.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= github.com/DataDog/datadog-go v4.8.3+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -402,7 +404,6 @@ github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f h1:JOrtw2xFKzlg+ github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= @@ -414,7 +415,6 @@ github.com/digitalocean/godo v1.108.0/go.mod h1:R6EmmWI8CT1+fCtjWY9UCB+L5uufuZH1 github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= @@ -645,7 +645,6 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= github.com/ryanuber/columnize v2.1.2+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -662,7 +661,6 @@ github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= github.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67/go.mod h1:tNZjgbYncKL5HxvDULAr/mWDmFz4B7H8yrXEDlnoIiw= github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tilinna/clock v1.0.2/go.mod h1:ZsP7BcY7sEEz7ktc0IVy8Us6boDrK8VradlKRUGfOao= @@ -720,7 +718,6 @@ go.opentelemetry.io/otel/trace v1.23.0/go.mod h1:GSGTbIClEsuZrGIzoEHqsVfxgn5Ukgg go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.pennock.tech/tabular v1.1.3/go.mod h1:UzyxF5itNqTCS1ZGXfwDwbFgYj/lS+e67Fid68QOYZ0= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -865,7 +862,6 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014/go.mod h1:SaPjaZGWb0lPqs6Ittu0spdfrOArqji4ZdeP5IC/9N4= google.golang.org/genproto/googleapis/rpc v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:YUWgXUFRPfoYK1IHMuxH5K6nPEXSCzIMljnQ59lLRCk= google.golang.org/genproto/googleapis/rpc v0.0.0-20240221002015-b0ce06bbee7c/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= google.golang.org/genproto/googleapis/rpc v0.0.0-20240228224816-df926f6c8641/go.mod h1:UCOku4NytXMJuLQE5VuqA5lX3PcHCBo8pxNyvkf4xBs= google.golang.org/genproto/googleapis/rpc v0.0.0-20240304161311-37d4d3c04a78/go.mod h1:UCOku4NytXMJuLQE5VuqA5lX3PcHCBo8pxNyvkf4xBs= google.golang.org/genproto/googleapis/rpc v0.0.0-20240311132316-a219d84964c2/go.mod h1:UCOku4NytXMJuLQE5VuqA5lX3PcHCBo8pxNyvkf4xBs= @@ -910,7 +906,6 @@ mvdan.cc/gofumpt v0.4.0/go.mod h1:PljLOHDeZqgS8opHRKLzp2It2VBuSdteAgqUfzMTxlQ= mvdan.cc/gofumpt v0.5.0/go.mod h1:HBeVDtMKRZpXyxFciAirzdKklDlGu8aAy1wEbH5Y9js= mvdan.cc/sh/v3 v3.7.0/go.mod h1:K2gwkaesF/D7av7Kxl0HbF5kGOd2ArupNTX3X44+8l8= nhooyr.io/websocket v1.8.10/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= -pgregory.net/rapid v0.5.5/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=