From 01a29e78f998758346c45d658efbf35474cc2ab2 Mon Sep 17 00:00:00 2001 From: Brad Sickles Date: Wed, 2 Aug 2023 09:38:30 -0400 Subject: [PATCH 01/11] Initial setup for eks apps --- app/all/providers.go | 2 + app/container/aws-eks/provider.go | 23 +++++++++++ aws/eks/create_kube_client.go | 30 +++++++++++++++ aws/eks/iam_user_auth.go | 43 +++++++++++++++++++++ aws/eks/outputs.go | 64 +++++++++++++++++++++++++++++++ go.sum | 1 - 6 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 app/container/aws-eks/provider.go create mode 100644 aws/eks/create_kube_client.go create mode 100644 aws/eks/iam_user_auth.go create mode 100644 aws/eks/outputs.go diff --git a/app/all/providers.go b/app/all/providers.go index 441f239..5653f7f 100644 --- a/app/all/providers.go +++ b/app/all/providers.go @@ -5,6 +5,7 @@ import ( aws_batch_fargate "github.com/nullstone-io/deployment-sdk/app/container/aws-batch-fargate" "github.com/nullstone-io/deployment-sdk/app/container/aws-ecs-ec2" "github.com/nullstone-io/deployment-sdk/app/container/aws-ecs-fargate" + aws_eks "github.com/nullstone-io/deployment-sdk/app/container/aws-eks" gcp_gke_service "github.com/nullstone-io/deployment-sdk/app/container/gcp-gke-service" "github.com/nullstone-io/deployment-sdk/app/server/aws-beanstalk" "github.com/nullstone-io/deployment-sdk/app/serverless/aws-lambda-container" @@ -18,6 +19,7 @@ var ( aws_batch_fargate.ModuleContractName: aws_batch_fargate.Provider, aws_ecs_fargate.ModuleContractName: aws_ecs_fargate.Provider, aws_ecs_ec2.ModuleContractName: aws_ecs_ec2.Provider, + aws_eks.ModuleContractName: aws_eks.Provider, aws_s3.ModuleContractName: aws_s3.Provider, aws_lambda_zip.ModuleContractName: aws_lambda_zip.Provider, aws_lambda_container.ModuleContractName: aws_lambda_container.Provider, diff --git a/app/container/aws-eks/provider.go b/app/container/aws-eks/provider.go new file mode 100644 index 0000000..af38ccf --- /dev/null +++ b/app/container/aws-eks/provider.go @@ -0,0 +1,23 @@ +package aws_eks + +import ( + "github.com/nullstone-io/deployment-sdk/app" + "github.com/nullstone-io/deployment-sdk/aws/ecr" + "gopkg.in/nullstone-io/go-api-client.v0/types" +) + +var ModuleContractName = types.ModuleContractName{ + Category: string(types.CategoryApp), + Subcategory: string(types.SubcategoryAppContainer), + Provider: "aws", + Platform: "k8s", + Subplatform: "eks", +} + +var Provider = app.Provider{ + CanDeployImmediate: false, + NewPusher: ecr.NewPusher, + NewDeployer: nil, + NewDeployWatcher: nil, + NewStatuser: nil, +} diff --git a/aws/eks/create_kube_client.go b/aws/eks/create_kube_client.go new file mode 100644 index 0000000..a0a3569 --- /dev/null +++ b/aws/eks/create_kube_client.go @@ -0,0 +1,30 @@ +package eks + +import ( + "context" + "fmt" + nsaws "github.com/nullstone-io/deployment-sdk/aws" + "github.com/nullstone-io/deployment-sdk/k8s" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" +) + +func CreateKubeConfig(ctx context.Context, region string, cluster ClusterInfoer, user nsaws.User) (*rest.Config, error) { + configCreator := &k8s.ConfigCreator{ + ClusterInfoer: cluster, + AuthInfoer: IamUserAuth{ + User: user, + Region: region, + ClusterId: cluster.GetClusterName(), + }, + } + return configCreator.Create(ctx) +} + +func CreateKubeClient(ctx context.Context, region string, cluster ClusterInfoer, user nsaws.User) (*kubernetes.Clientset, error) { + cfg, err := CreateKubeConfig(ctx, region, cluster, user) + if err != nil { + return nil, fmt.Errorf("error creating kube config: %w", err) + } + return kubernetes.NewForConfig(cfg) +} diff --git a/aws/eks/iam_user_auth.go b/aws/eks/iam_user_auth.go new file mode 100644 index 0000000..19e60f4 --- /dev/null +++ b/aws/eks/iam_user_auth.go @@ -0,0 +1,43 @@ +package eks + +import ( + "context" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/session" + nsaws "github.com/nullstone-io/deployment-sdk/aws" + "github.com/nullstone-io/deployment-sdk/k8s" + clientcmdapi "k8s.io/client-go/tools/clientcmd/api" + "sigs.k8s.io/aws-iam-authenticator/pkg/token" +) + +var _ k8s.AuthInfoer = IamUserAuth{} + +type IamUserAuth struct { + nsaws.User + Region string + ClusterId string +} + +func (i IamUserAuth) AuthInfo(ctx context.Context) (clientcmdapi.AuthInfo, error) { + gen, err := token.NewGenerator(true, false) + if err != nil { + return clientcmdapi.AuthInfo{}, err + } + ses, err := session.NewSession(&aws.Config{ + Credentials: credentials.NewStaticCredentials(i.User.AccessKeyId, i.User.SecretAccessKey, ""), + Region: aws.String(i.Region), + }) + opts := &token.GetTokenOptions{ + ClusterID: i.ClusterId, + Session: ses, + } + tok, err := gen.GetWithOptions(opts) + if err != nil { + return clientcmdapi.AuthInfo{}, err + } + + return clientcmdapi.AuthInfo{ + Token: tok.Token, + }, nil +} diff --git a/aws/eks/outputs.go b/aws/eks/outputs.go new file mode 100644 index 0000000..023822b --- /dev/null +++ b/aws/eks/outputs.go @@ -0,0 +1,64 @@ +package eks + +import ( + "encoding/base64" + "fmt" + "github.com/nullstone-io/deployment-sdk/aws" + "github.com/nullstone-io/deployment-sdk/docker" + "github.com/nullstone-io/deployment-sdk/k8s" + apimachineryschema "k8s.io/apimachinery/pkg/runtime/schema" + restclient "k8s.io/client-go/rest" + clientcmdapi "k8s.io/client-go/tools/clientcmd/api" +) + +type Outputs struct { + ServiceNamespace string `ns:"service_namespace"` + ServiceName string `ns:"service_name"` + ImageRepoUrl docker.ImageUrl `ns:"image_repo_url,optional"` + ImagePusher nsaws.User `ns:"image_pusher,optional"` + Deployer nsaws.User `ns:"deployer,optional"` + MainContainerName string `ns:"main_container_name,optional"` + + Region string `ns:"region"` + ClusterNamespace ClusterNamespaceOutputs `ns:",connectionContract:cluster-namespace/aws/kubernetes:eks,optional"` +} + +func (o Outputs) ClusterArn() string { + return o.ClusterNamespace.ClusterArn +} + +type ClusterInfoer interface { + k8s.ClusterInfoer + GetClusterName() string +} + +var _ ClusterInfoer = ClusterNamespaceOutputs{} + +type ClusterNamespaceOutputs struct { + ClusterName string `ns:"cluster_name"` + ClusterArn string `ns:"cluster_arn"` + ClusterEndpoint string `ns:"cluster_endpoint"` + ClusterCACertificate string `ns:"cluster_ca_certificate"` +} + +func (o ClusterNamespaceOutputs) GetClusterName() string { + return o.ClusterName +} + +func (o ClusterNamespaceOutputs) ClusterInfo() (clientcmdapi.Cluster, error) { + endpoint, caCertificate := o.ClusterEndpoint, o.ClusterCACertificate + decodedCACert, err := base64.StdEncoding.DecodeString(caCertificate) + if err != nil { + return clientcmdapi.Cluster{}, fmt.Errorf("invalid cluster CA certificate: %w", err) + } + + host, _, err := restclient.DefaultServerURL(endpoint, "", apimachineryschema.GroupVersion{Group: "", Version: "v1"}, true) + if err != nil { + return clientcmdapi.Cluster{}, fmt.Errorf("failed to parse GKE cluster host %q: %w", endpoint, err) + } + + return clientcmdapi.Cluster{ + Server: host.String(), + CertificateAuthorityData: decodedCACert, + }, nil +} diff --git a/go.sum b/go.sum index 63f4432..222ff27 100644 --- a/go.sum +++ b/go.sum @@ -253,7 +253,6 @@ github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYF github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fvbommel/sortorder v1.0.2 h1:mV4o8B2hKboCdkJm+a7uX/SIpZob4JzUpc5GGnM45eo= github.com/fvbommel/sortorder v1.0.2/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= From 7d14bc90341b7ee0b403562614339718fb40ec61 Mon Sep 17 00:00:00 2001 From: Brad Sickles Date: Wed, 2 Aug 2023 09:42:15 -0400 Subject: [PATCH 02/11] Implement eks deployer, deploy status getter --- app/container/aws-eks/provider.go | 5 +- aws/eks/deploy_status_getter.go | 134 ++++++++++++++++++++++++++++++ aws/eks/deployer.go | 101 ++++++++++++++++++++++ 3 files changed, 238 insertions(+), 2 deletions(-) create mode 100644 aws/eks/deploy_status_getter.go create mode 100644 aws/eks/deployer.go diff --git a/app/container/aws-eks/provider.go b/app/container/aws-eks/provider.go index af38ccf..6986b1d 100644 --- a/app/container/aws-eks/provider.go +++ b/app/container/aws-eks/provider.go @@ -3,6 +3,7 @@ package aws_eks import ( "github.com/nullstone-io/deployment-sdk/app" "github.com/nullstone-io/deployment-sdk/aws/ecr" + "github.com/nullstone-io/deployment-sdk/aws/eks" "gopkg.in/nullstone-io/go-api-client.v0/types" ) @@ -17,7 +18,7 @@ var ModuleContractName = types.ModuleContractName{ var Provider = app.Provider{ CanDeployImmediate: false, NewPusher: ecr.NewPusher, - NewDeployer: nil, - NewDeployWatcher: nil, + NewDeployer: eks.NewDeployer, + NewDeployWatcher: app.NewPollingDeployWatcher(eks.NewDeployStatusGetter), NewStatuser: nil, } diff --git a/aws/eks/deploy_status_getter.go b/aws/eks/deploy_status_getter.go new file mode 100644 index 0000000..ebb62f7 --- /dev/null +++ b/aws/eks/deploy_status_getter.go @@ -0,0 +1,134 @@ +package eks + +import ( + "context" + "fmt" + "github.com/nullstone-io/deployment-sdk/app" + "github.com/nullstone-io/deployment-sdk/k8s" + "github.com/nullstone-io/deployment-sdk/logging" + "github.com/nullstone-io/deployment-sdk/outputs" + "gopkg.in/nullstone-io/go-api-client.v0" + "io" + v1 "k8s.io/api/apps/v1" + meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "strconv" + "strings" + "sync" +) + +func NewDeployStatusGetter(osWriters logging.OsWriters, nsConfig api.Config, appDetails app.Details) (app.DeployStatusGetter, error) { + outs, err := outputs.Retrieve[Outputs](nsConfig, appDetails.Workspace) + if err != nil { + return nil, err + } + + return &DeployStatusGetter{ + OsWriters: osWriters, + Details: appDetails, + Infra: outs, + }, nil +} + +type DeployStatusGetter struct { + OsWriters logging.OsWriters + Details app.Details + Infra Outputs + + startDeployment sync.Once + numDesired int +} + +func (d *DeployStatusGetter) initialize(ctx context.Context, reference string) error { + return nil +} + +// GetDeployStatus resolves the current status of the gke deployment +// A Kubernetes Deployment allows for declarative updates for Pods and ReplicaSets +// A Deployment is a desired state and is not versioned +// However, a Deployment has a revision which we will track +// Note: Scaling deployments does not trigger rollouts +// Reference: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#deployment-status +func (d *DeployStatusGetter) GetDeployStatus(ctx context.Context, reference string) (app.RolloutStatus, error) { + stdout, stderr := d.OsWriters.Stdout(), d.OsWriters.Stderr() + + if d.Infra.ServiceName == "" { + fmt.Fprintf(stdout, "No app name in infra module. Skipping check for healthy.\n") + return app.RolloutStatusComplete, nil + } + + kubeClient, err := CreateKubeClient(ctx, d.Infra.Region, d.Infra.ClusterNamespace, d.Infra.Deployer) + if err != nil { + return "", err + } + + deployment, err := kubeClient.AppsV1().Deployments(d.Infra.ServiceNamespace).Get(ctx, d.Infra.ServiceName, meta_v1.GetOptions{}) + if err != nil { + return app.RolloutStatusUnknown, err + } + d.startDeployment.Do(func() { + d.numDesired = 1 + if deployment.Spec.Replicas != nil { + d.numDesired = int(*deployment.Spec.Replicas) + } + fmt.Fprintf(stdout, "Deploying %d replicas\n", d.numDesired) + }) + + switch reference { + case DeployReferenceNoop: + fmt.Fprintln(stdout, "Deployment was not changed. Skipping.") + return app.RolloutStatusComplete, nil + default: + if ok, status := d.verifyRevision(deployment, reference, stdout); !ok { + return status, nil + } + } + + rolloutStatus, err := k8s.MapRolloutStatus(*deployment) + if err != nil { + fmt.Fprintln(stderr, err.Error()) + return rolloutStatus, nil + } + if rolloutStatus == app.RolloutStatusUnknown || rolloutStatus == app.RolloutStatusComplete { + // We don't want to spit out information about replicas if the rollout is completed or unknown + return rolloutStatus, nil + } + + summaries := make([]string, 0) + status := deployment.Status + summaries = append(summaries, fmt.Sprintf("%d ready", status.AvailableReplicas)) + if status.UpdatedReplicas > 0 { + summaries = append(summaries, fmt.Sprintf("%d up-to-date", status.UpdatedReplicas)) + } + if status.AvailableReplicas > 0 { + summaries = append(summaries, fmt.Sprintf("%d available", status.AvailableReplicas)) + } + + fmt.Fprintf(stdout, "%d replicas to rollout (%s)\n", d.numDesired, strings.Join(summaries, ", ")) + return rolloutStatus, nil +} + +func (d *DeployStatusGetter) verifyRevision(deployment *v1.Deployment, reference string, stdout io.Writer) (bool, app.RolloutStatus) { + latestRevision, err := k8s.Revision(deployment) + if err != nil { + fmt.Fprintf(stdout, "Unable to identify revision on the kubernetes deployment: %s\n", err) + return false, app.RolloutStatusFailed + } + + expectedRevision, err := strconv.ParseInt(reference, 10, 64) + if err != nil { + fmt.Fprintln(stdout, "Invalid deployment reference. Expected a deployment revision number.") + return false, app.RolloutStatusFailed + } + + if latestRevision < expectedRevision { + // If the deployment has a revision smaller than the expected, it must not be in the k8s cluster yet + fmt.Fprintln(stdout, "Waiting for deployment to start.") + return false, app.RolloutStatusInProgress + } else if latestRevision > expectedRevision { + // If the deployment has a revision larger than the expected, there must be a new deployment that invalidates this one + fmt.Fprintf(stdout, "A new deployment (revision = %d) was triggered which invalidates this deployment.\n", latestRevision) + return false, app.RolloutStatusFailed + } + + return true, app.RolloutStatusInProgress +} diff --git a/aws/eks/deployer.go b/aws/eks/deployer.go new file mode 100644 index 0000000..f6a76de --- /dev/null +++ b/aws/eks/deployer.go @@ -0,0 +1,101 @@ +package eks + +import ( + "context" + "fmt" + "github.com/nullstone-io/deployment-sdk/app" + env_vars "github.com/nullstone-io/deployment-sdk/env-vars" + "github.com/nullstone-io/deployment-sdk/k8s" + "github.com/nullstone-io/deployment-sdk/logging" + "github.com/nullstone-io/deployment-sdk/outputs" + "gopkg.in/nullstone-io/go-api-client.v0" + meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +const ( + DeployReferenceNoop = "no-updated-revision" +) + +func NewDeployer(osWriters logging.OsWriters, nsConfig api.Config, appDetails app.Details) (app.Deployer, error) { + outs, err := outputs.Retrieve[Outputs](nsConfig, appDetails.Workspace) + if err != nil { + return nil, err + } + + return Deployer{ + OsWriters: osWriters, + Details: appDetails, + Infra: outs, + }, nil +} + +type Deployer struct { + OsWriters logging.OsWriters + Details app.Details + Infra Outputs +} + +func (d Deployer) Print() { + stdout, _ := d.OsWriters.Stdout(), d.OsWriters.Stderr() + fmt.Fprintf(stdout, "eks endpoint: %q\n", d.Infra.ClusterNamespace.ClusterEndpoint) + fmt.Fprintf(stdout, "eks service: %q\n", d.Infra.ServiceName) + fmt.Fprintf(stdout, "repository image url: %q\n", d.Infra.ImageRepoUrl) +} + +func (d Deployer) Deploy(ctx context.Context, meta app.DeployMetadata) (string, error) { + stdout, _ := d.OsWriters.Stdout(), d.OsWriters.Stderr() + d.Print() + + if meta.Version == "" { + return "", fmt.Errorf("no version specified, version is required to deploy") + } + + fmt.Fprintf(stdout, "Deploying app %q\n", d.Details.App.Name) + + if d.Infra.ServiceName == "" { + fmt.Fprintf(stdout, "No service name in app module. Skipping update service.\n") + fmt.Fprintf(stdout, "Deployed app %q\n", d.Details.App.Name) + fmt.Fprintln(stdout, "") + return "", nil + } + + kubeClient, err := CreateKubeClient(ctx, d.Infra.Region, d.Infra.ClusterNamespace, d.Infra.Deployer) + if err != nil { + return "", err + } + + deployment, err := kubeClient.AppsV1().Deployments(d.Infra.ServiceNamespace).Get(ctx, d.Infra.ServiceName, meta_v1.GetOptions{}) + if err != nil { + return "", err + } + curRevisionNum := deployment.Generation + + k8s.UpdateVersionLabel(deployment, meta.Version) + + mainContainerIndex, mainContainer := k8s.GetContainerByName(*deployment, d.Infra.MainContainerName) + if mainContainerIndex < 0 { + return "", fmt.Errorf("cannot find main container %q in spec", d.Infra.MainContainerName) + } + k8s.SetContainerImageTag(mainContainer, meta.Version) + k8s.ReplaceEnvVars(mainContainer, env_vars.GetStandard(meta)) + deployment.Spec.Template.Spec.Containers[mainContainerIndex] = *mainContainer + + updated, err := kubeClient.AppsV1().Deployments(d.Infra.ServiceNamespace).Update(ctx, deployment, meta_v1.UpdateOptions{}) + if err != nil { + return "", fmt.Errorf("error deploying app: %w", err) + } + + revision := "" + updatedRevNum := updated.Generation + if updatedRevNum == curRevisionNum { + revision = DeployReferenceNoop + fmt.Fprintln(stdout, "No changes made to deployment.") + } else { + revision = fmt.Sprintf("%d", updatedRevNum) + fmt.Fprintf(stdout, "Created new deployment revision %s.\n", revision) + } + + fmt.Fprintf(stdout, "Deployed app %q\n", d.Details.App.Name) + fmt.Fprintln(stdout, "") + return revision, nil +} From 76f818972fbf1d4b6c3284546e8d7d429cd7dee6 Mon Sep 17 00:00:00 2001 From: Brad Sickles Date: Wed, 2 Aug 2023 09:49:08 -0400 Subject: [PATCH 03/11] helper func --- aws/eks/outputs.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/aws/eks/outputs.go b/aws/eks/outputs.go index 023822b..7b39696 100644 --- a/aws/eks/outputs.go +++ b/aws/eks/outputs.go @@ -46,7 +46,10 @@ func (o ClusterNamespaceOutputs) GetClusterName() string { } func (o ClusterNamespaceOutputs) ClusterInfo() (clientcmdapi.Cluster, error) { - endpoint, caCertificate := o.ClusterEndpoint, o.ClusterCACertificate + return GetClusterInfo(o.ClusterEndpoint, o.ClusterCACertificate) +} + +func GetClusterInfo(endpoint, caCertificate string) (clientcmdapi.Cluster, error) { decodedCACert, err := base64.StdEncoding.DecodeString(caCertificate) if err != nil { return clientcmdapi.Cluster{}, fmt.Errorf("invalid cluster CA certificate: %w", err) From 1b842d9c164edfd5df387f8a20eabad984dd889a Mon Sep 17 00:00:00 2001 From: Brad Sickles Date: Mon, 18 Dec 2023 18:21:07 -0500 Subject: [PATCH 04/11] update go mod --- aws/eks/deploy_status_getter.go | 2 +- go.mod | 1 + go.sum | 5 +++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/aws/eks/deploy_status_getter.go b/aws/eks/deploy_status_getter.go index ebb62f7..4487cd7 100644 --- a/aws/eks/deploy_status_getter.go +++ b/aws/eks/deploy_status_getter.go @@ -42,7 +42,7 @@ func (d *DeployStatusGetter) initialize(ctx context.Context, reference string) e return nil } -// GetDeployStatus resolves the current status of the gke deployment +// GetDeployStatus resolves the current status of the eks deployment // A Kubernetes Deployment allows for declarative updates for Pods and ReplicaSets // A Deployment is a desired state and is not versioned // However, a Deployment has a revision which we will track diff --git a/go.mod b/go.mod index a7941e0..e1a5acb 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( cloud.google.com/go/compute v1.32.0 cloud.google.com/go/logging v1.13.0 cloud.google.com/go/storage v1.47.0 + github.com/aws/aws-sdk-go v1.44.332 github.com/aws/aws-sdk-go-v2 v1.26.0 github.com/aws/aws-sdk-go-v2/credentials v1.16.16 github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.15.13 diff --git a/go.sum b/go.sum index 222ff27..db86686 100644 --- a/go.sum +++ b/go.sum @@ -457,7 +457,6 @@ github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9 github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/magiconair/properties v1.5.3/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= @@ -608,7 +607,6 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v0.0.0-20150530192845-be5ff3e4840c/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= -github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -753,6 +751,9 @@ 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.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= From 77d266b0e672fe048c64ae2244569e47845e5e24 Mon Sep 17 00:00:00 2001 From: Brad Sickles Date: Mon, 18 Dec 2023 18:29:06 -0500 Subject: [PATCH 05/11] Added log streamer --- app/container/aws-eks/provider.go | 1 + aws/eks/log_streamer.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 aws/eks/log_streamer.go diff --git a/app/container/aws-eks/provider.go b/app/container/aws-eks/provider.go index 6986b1d..7816d01 100644 --- a/app/container/aws-eks/provider.go +++ b/app/container/aws-eks/provider.go @@ -21,4 +21,5 @@ var Provider = app.Provider{ NewDeployer: eks.NewDeployer, NewDeployWatcher: app.NewPollingDeployWatcher(eks.NewDeployStatusGetter), NewStatuser: nil, + NewLogStreamer: eks.NewLogStreamer, } diff --git a/aws/eks/log_streamer.go b/aws/eks/log_streamer.go new file mode 100644 index 0000000..0e32a2f --- /dev/null +++ b/aws/eks/log_streamer.go @@ -0,0 +1,28 @@ +package eks + +import ( + "context" + "github.com/nullstone-io/deployment-sdk/app" + "github.com/nullstone-io/deployment-sdk/k8s" + "github.com/nullstone-io/deployment-sdk/logging" + "github.com/nullstone-io/deployment-sdk/outputs" + "gopkg.in/nullstone-io/go-api-client.v0" + "k8s.io/client-go/rest" +) + +func NewLogStreamer(osWriters logging.OsWriters, nsConfig api.Config, appDetails app.Details) (app.LogStreamer, error) { + outs, err := outputs.Retrieve[Outputs](nsConfig, appDetails.Workspace) + if err != nil { + return nil, err + } + + return k8s.LogStreamer{ + OsWriters: osWriters, + Details: appDetails, + AppNamespace: outs.ServiceNamespace, + AppName: outs.ServiceName, + NewConfigFn: func(ctx context.Context) (*rest.Config, error) { + return CreateKubeConfig(ctx, outs.Region, outs.ClusterNamespace, outs.Deployer) + }, + }, nil +} From b38dd0ada8305f595a6a43e44606b8a810826393 Mon Sep 17 00:00:00 2001 From: Brad Sickles Date: Thu, 14 Mar 2024 15:09:28 -0400 Subject: [PATCH 06/11] update go-api-client usage in k8s --- aws/eks/deploy_status_getter.go | 5 ++--- aws/eks/deployer.go | 5 ++--- aws/eks/log_streamer.go | 5 ++--- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/aws/eks/deploy_status_getter.go b/aws/eks/deploy_status_getter.go index 4487cd7..1d53b70 100644 --- a/aws/eks/deploy_status_getter.go +++ b/aws/eks/deploy_status_getter.go @@ -7,7 +7,6 @@ import ( "github.com/nullstone-io/deployment-sdk/k8s" "github.com/nullstone-io/deployment-sdk/logging" "github.com/nullstone-io/deployment-sdk/outputs" - "gopkg.in/nullstone-io/go-api-client.v0" "io" v1 "k8s.io/api/apps/v1" meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -16,8 +15,8 @@ import ( "sync" ) -func NewDeployStatusGetter(osWriters logging.OsWriters, nsConfig api.Config, appDetails app.Details) (app.DeployStatusGetter, error) { - outs, err := outputs.Retrieve[Outputs](nsConfig, appDetails.Workspace) +func NewDeployStatusGetter(ctx context.Context, osWriters logging.OsWriters, source outputs.RetrieverSource, appDetails app.Details) (app.DeployStatusGetter, error) { + outs, err := outputs.Retrieve[Outputs](ctx, source, appDetails.Workspace) if err != nil { return nil, err } diff --git a/aws/eks/deployer.go b/aws/eks/deployer.go index f6a76de..4a01c58 100644 --- a/aws/eks/deployer.go +++ b/aws/eks/deployer.go @@ -8,7 +8,6 @@ import ( "github.com/nullstone-io/deployment-sdk/k8s" "github.com/nullstone-io/deployment-sdk/logging" "github.com/nullstone-io/deployment-sdk/outputs" - "gopkg.in/nullstone-io/go-api-client.v0" meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -16,8 +15,8 @@ const ( DeployReferenceNoop = "no-updated-revision" ) -func NewDeployer(osWriters logging.OsWriters, nsConfig api.Config, appDetails app.Details) (app.Deployer, error) { - outs, err := outputs.Retrieve[Outputs](nsConfig, appDetails.Workspace) +func NewDeployer(ctx context.Context, osWriters logging.OsWriters, source outputs.RetrieverSource, appDetails app.Details) (app.Deployer, error) { + outs, err := outputs.Retrieve[Outputs](ctx, source, appDetails.Workspace) if err != nil { return nil, err } diff --git a/aws/eks/log_streamer.go b/aws/eks/log_streamer.go index 0e32a2f..17691f4 100644 --- a/aws/eks/log_streamer.go +++ b/aws/eks/log_streamer.go @@ -6,12 +6,11 @@ import ( "github.com/nullstone-io/deployment-sdk/k8s" "github.com/nullstone-io/deployment-sdk/logging" "github.com/nullstone-io/deployment-sdk/outputs" - "gopkg.in/nullstone-io/go-api-client.v0" "k8s.io/client-go/rest" ) -func NewLogStreamer(osWriters logging.OsWriters, nsConfig api.Config, appDetails app.Details) (app.LogStreamer, error) { - outs, err := outputs.Retrieve[Outputs](nsConfig, appDetails.Workspace) +func NewLogStreamer(ctx context.Context, osWriters logging.OsWriters, source outputs.RetrieverSource, appDetails app.Details) (app.LogStreamer, error) { + outs, err := outputs.Retrieve[Outputs](ctx, source, appDetails.Workspace) if err != nil { return nil, err } From f17d7d01a033d0c73c5a15fb0d29f7285ca16d12 Mon Sep 17 00:00:00 2001 From: Brad Sickles Date: Fri, 22 Nov 2024 11:14:18 -0500 Subject: [PATCH 07/11] rebase --- app/all/providers.go | 4 ++-- .../{aws-eks => aws-eks-service}/provider.go | 2 +- aws/eks/deploy_status_getter.go | 2 +- aws/eks/deployer.go | 13 ++++++++----- aws/eks/iam_user_auth.go | 1 + aws/eks/log_streamer.go | 2 +- go.mod | 5 +++-- go.sum | 7 ++----- 8 files changed, 19 insertions(+), 17 deletions(-) rename app/container/{aws-eks => aws-eks-service}/provider.go (96%) diff --git a/app/all/providers.go b/app/all/providers.go index 5653f7f..bc200d9 100644 --- a/app/all/providers.go +++ b/app/all/providers.go @@ -5,7 +5,7 @@ import ( aws_batch_fargate "github.com/nullstone-io/deployment-sdk/app/container/aws-batch-fargate" "github.com/nullstone-io/deployment-sdk/app/container/aws-ecs-ec2" "github.com/nullstone-io/deployment-sdk/app/container/aws-ecs-fargate" - aws_eks "github.com/nullstone-io/deployment-sdk/app/container/aws-eks" + aws_eks_service "github.com/nullstone-io/deployment-sdk/app/container/aws-eks-service" gcp_gke_service "github.com/nullstone-io/deployment-sdk/app/container/gcp-gke-service" "github.com/nullstone-io/deployment-sdk/app/server/aws-beanstalk" "github.com/nullstone-io/deployment-sdk/app/serverless/aws-lambda-container" @@ -19,7 +19,7 @@ var ( aws_batch_fargate.ModuleContractName: aws_batch_fargate.Provider, aws_ecs_fargate.ModuleContractName: aws_ecs_fargate.Provider, aws_ecs_ec2.ModuleContractName: aws_ecs_ec2.Provider, - aws_eks.ModuleContractName: aws_eks.Provider, + aws_eks_service.ModuleContractName: aws_eks_service.Provider, aws_s3.ModuleContractName: aws_s3.Provider, aws_lambda_zip.ModuleContractName: aws_lambda_zip.Provider, aws_lambda_container.ModuleContractName: aws_lambda_container.Provider, diff --git a/app/container/aws-eks/provider.go b/app/container/aws-eks-service/provider.go similarity index 96% rename from app/container/aws-eks/provider.go rename to app/container/aws-eks-service/provider.go index 7816d01..5366c98 100644 --- a/app/container/aws-eks/provider.go +++ b/app/container/aws-eks-service/provider.go @@ -1,4 +1,4 @@ -package aws_eks +package aws_eks_service import ( "github.com/nullstone-io/deployment-sdk/app" diff --git a/aws/eks/deploy_status_getter.go b/aws/eks/deploy_status_getter.go index 1d53b70..6295b1e 100644 --- a/aws/eks/deploy_status_getter.go +++ b/aws/eks/deploy_status_getter.go @@ -16,7 +16,7 @@ import ( ) func NewDeployStatusGetter(ctx context.Context, osWriters logging.OsWriters, source outputs.RetrieverSource, appDetails app.Details) (app.DeployStatusGetter, error) { - outs, err := outputs.Retrieve[Outputs](ctx, source, appDetails.Workspace) + outs, err := outputs.Retrieve[Outputs](ctx, source, appDetails.Workspace, appDetails.WorkspaceConfig) if err != nil { return nil, err } diff --git a/aws/eks/deployer.go b/aws/eks/deployer.go index 4a01c58..72946ab 100644 --- a/aws/eks/deployer.go +++ b/aws/eks/deployer.go @@ -3,6 +3,7 @@ package eks import ( "context" "fmt" + "github.com/mitchellh/colorstring" "github.com/nullstone-io/deployment-sdk/app" env_vars "github.com/nullstone-io/deployment-sdk/env-vars" "github.com/nullstone-io/deployment-sdk/k8s" @@ -16,7 +17,7 @@ const ( ) func NewDeployer(ctx context.Context, osWriters logging.OsWriters, source outputs.RetrieverSource, appDetails app.Details) (app.Deployer, error) { - outs, err := outputs.Retrieve[Outputs](ctx, source, appDetails.Workspace) + outs, err := outputs.Retrieve[Outputs](ctx, source, appDetails.Workspace, appDetails.WorkspaceConfig) if err != nil { return nil, err } @@ -36,9 +37,11 @@ type Deployer struct { func (d Deployer) Print() { stdout, _ := d.OsWriters.Stdout(), d.OsWriters.Stderr() - fmt.Fprintf(stdout, "eks endpoint: %q\n", d.Infra.ClusterNamespace.ClusterEndpoint) - fmt.Fprintf(stdout, "eks service: %q\n", d.Infra.ServiceName) - fmt.Fprintf(stdout, "repository image url: %q\n", d.Infra.ImageRepoUrl) + colorstring.Fprintln(stdout, "[bold]Retrieved GKE service outputs") + fmt.Fprintf(stdout, " cluster_endpoint: %s\n", d.Infra.ClusterNamespace.ClusterEndpoint) + fmt.Fprintf(stdout, " service_namespace: %s\n", d.Infra.ServiceNamespace) + fmt.Fprintf(stdout, " service_name: %s\n", d.Infra.ServiceName) + fmt.Fprintf(stdout, " image_repo_url: %s\n", d.Infra.ImageRepoUrl) } func (d Deployer) Deploy(ctx context.Context, meta app.DeployMetadata) (string, error) { @@ -49,6 +52,7 @@ func (d Deployer) Deploy(ctx context.Context, meta app.DeployMetadata) (string, return "", fmt.Errorf("no version specified, version is required to deploy") } + fmt.Fprintln(stdout) fmt.Fprintf(stdout, "Deploying app %q\n", d.Details.App.Name) if d.Infra.ServiceName == "" { @@ -95,6 +99,5 @@ func (d Deployer) Deploy(ctx context.Context, meta app.DeployMetadata) (string, } fmt.Fprintf(stdout, "Deployed app %q\n", d.Details.App.Name) - fmt.Fprintln(stdout, "") return revision, nil } diff --git a/aws/eks/iam_user_auth.go b/aws/eks/iam_user_auth.go index 19e60f4..29940e1 100644 --- a/aws/eks/iam_user_auth.go +++ b/aws/eks/iam_user_auth.go @@ -29,6 +29,7 @@ func (i IamUserAuth) AuthInfo(ctx context.Context) (clientcmdapi.AuthInfo, error Region: aws.String(i.Region), }) opts := &token.GetTokenOptions{ + Region: i.Region, ClusterID: i.ClusterId, Session: ses, } diff --git a/aws/eks/log_streamer.go b/aws/eks/log_streamer.go index 17691f4..0f3e6f5 100644 --- a/aws/eks/log_streamer.go +++ b/aws/eks/log_streamer.go @@ -10,7 +10,7 @@ import ( ) func NewLogStreamer(ctx context.Context, osWriters logging.OsWriters, source outputs.RetrieverSource, appDetails app.Details) (app.LogStreamer, error) { - outs, err := outputs.Retrieve[Outputs](ctx, source, appDetails.Workspace) + outs, err := outputs.Retrieve[Outputs](ctx, source, appDetails.Workspace, appDetails.WorkspaceConfig) if err != nil { return nil, err } diff --git a/go.mod b/go.mod index e1a5acb..c23d71c 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,8 @@ require ( cloud.google.com/go/compute v1.32.0 cloud.google.com/go/logging v1.13.0 cloud.google.com/go/storage v1.47.0 - github.com/aws/aws-sdk-go v1.44.332 - github.com/aws/aws-sdk-go-v2 v1.26.0 + github.com/aws/aws-sdk-go v1.54.6 + github.com/aws/aws-sdk-go-v2 v1.30.4 github.com/aws/aws-sdk-go-v2/credentials v1.16.16 github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.15.13 github.com/aws/aws-sdk-go-v2/service/batch v1.35.1 @@ -41,6 +41,7 @@ require ( k8s.io/apimachinery v0.32.1 k8s.io/client-go v0.32.1 k8s.io/kubectl v0.32.1 + sigs.k8s.io/aws-iam-authenticator v0.6.16 ) require ( diff --git a/go.sum b/go.sum index db86686..dc02da6 100644 --- a/go.sum +++ b/go.sum @@ -147,8 +147,8 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 h1:QPMJf+Jw8E1l7zqhZmMlFw6w github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7/go.mod h1:ykf3COxYI0UJmxcfcxcVuz7b6uADi1FkiUz6Eb7AgM8= github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 h1:NzO4Vrau795RkUdSHKEwiR01FaGzGOH1EETJ+5QHnm0= github.com/aws/aws-sdk-go-v2/service/sts v1.26.7/go.mod h1:6h2YuIoxaMSCFf5fi1EgZAwdfkGMgDY+DVfa61uLe4U= -github.com/aws/smithy-go v1.20.1 h1:4SZlSlMr36UEqC7XOyRVb27XMeZubNcBNN+9IgEPIQw= -github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= +github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= +github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/beorn7/perks v0.0.0-20150223135152-b965b613227f/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -751,9 +751,6 @@ 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.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= From c0c7f8b2500981a323ec66b0ee227c41e0b00219 Mon Sep 17 00:00:00 2001 From: Brad Sickles Date: Wed, 18 Dec 2024 13:39:50 -0500 Subject: [PATCH 08/11] use new k8s deploy watcher --- app/container/aws-eks-service/provider.go | 2 +- aws/eks/deploy_status_getter.go | 2 ++ aws/eks/deploy_watcher.go | 27 +++++++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 aws/eks/deploy_watcher.go diff --git a/app/container/aws-eks-service/provider.go b/app/container/aws-eks-service/provider.go index 5366c98..42cbc30 100644 --- a/app/container/aws-eks-service/provider.go +++ b/app/container/aws-eks-service/provider.go @@ -19,7 +19,7 @@ var Provider = app.Provider{ CanDeployImmediate: false, NewPusher: ecr.NewPusher, NewDeployer: eks.NewDeployer, - NewDeployWatcher: app.NewPollingDeployWatcher(eks.NewDeployStatusGetter), + NewDeployWatcher: eks.NewDeployWatcher, NewStatuser: nil, NewLogStreamer: eks.NewLogStreamer, } diff --git a/aws/eks/deploy_status_getter.go b/aws/eks/deploy_status_getter.go index 6295b1e..16d4d0f 100644 --- a/aws/eks/deploy_status_getter.go +++ b/aws/eks/deploy_status_getter.go @@ -37,6 +37,8 @@ type DeployStatusGetter struct { numDesired int } +func (d *DeployStatusGetter) Close() {} + func (d *DeployStatusGetter) initialize(ctx context.Context, reference string) error { return nil } diff --git a/aws/eks/deploy_watcher.go b/aws/eks/deploy_watcher.go new file mode 100644 index 0000000..c031721 --- /dev/null +++ b/aws/eks/deploy_watcher.go @@ -0,0 +1,27 @@ +package eks + +import ( + "context" + "github.com/nullstone-io/deployment-sdk/app" + "github.com/nullstone-io/deployment-sdk/k8s" + "github.com/nullstone-io/deployment-sdk/logging" + "github.com/nullstone-io/deployment-sdk/outputs" + "k8s.io/client-go/rest" +) + +func NewDeployWatcher(ctx context.Context, osWriters logging.OsWriters, source outputs.RetrieverSource, appDetails app.Details) (app.DeployWatcher, error) { + outs, err := outputs.Retrieve[Outputs](ctx, source, appDetails.Workspace, appDetails.WorkspaceConfig) + if err != nil { + return nil, err + } + + return &k8s.DeployWatcher{ + OsWriters: osWriters, + Details: appDetails, + AppNamespace: outs.ServiceNamespace, + AppName: outs.ServiceName, + NewConfigFn: func(ctx context.Context) (*rest.Config, error) { + return CreateKubeConfig(ctx, outs.Region, outs.ClusterNamespace, outs.Deployer) + }, + }, nil +} From 5595a1c745a8cdc1d1052006aabf80b45bd99ed7 Mon Sep 17 00:00:00 2001 From: Brad Sickles Date: Wed, 12 Feb 2025 09:56:36 -0500 Subject: [PATCH 09/11] rebase --- aws/eks/deploy_status_getter.go | 135 -------------------------------- go.mod | 8 +- go.sum | 82 ++++++++----------- 3 files changed, 35 insertions(+), 190 deletions(-) delete mode 100644 aws/eks/deploy_status_getter.go diff --git a/aws/eks/deploy_status_getter.go b/aws/eks/deploy_status_getter.go deleted file mode 100644 index 16d4d0f..0000000 --- a/aws/eks/deploy_status_getter.go +++ /dev/null @@ -1,135 +0,0 @@ -package eks - -import ( - "context" - "fmt" - "github.com/nullstone-io/deployment-sdk/app" - "github.com/nullstone-io/deployment-sdk/k8s" - "github.com/nullstone-io/deployment-sdk/logging" - "github.com/nullstone-io/deployment-sdk/outputs" - "io" - v1 "k8s.io/api/apps/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "strconv" - "strings" - "sync" -) - -func NewDeployStatusGetter(ctx context.Context, osWriters logging.OsWriters, source outputs.RetrieverSource, appDetails app.Details) (app.DeployStatusGetter, error) { - outs, err := outputs.Retrieve[Outputs](ctx, source, appDetails.Workspace, appDetails.WorkspaceConfig) - if err != nil { - return nil, err - } - - return &DeployStatusGetter{ - OsWriters: osWriters, - Details: appDetails, - Infra: outs, - }, nil -} - -type DeployStatusGetter struct { - OsWriters logging.OsWriters - Details app.Details - Infra Outputs - - startDeployment sync.Once - numDesired int -} - -func (d *DeployStatusGetter) Close() {} - -func (d *DeployStatusGetter) initialize(ctx context.Context, reference string) error { - return nil -} - -// GetDeployStatus resolves the current status of the eks deployment -// A Kubernetes Deployment allows for declarative updates for Pods and ReplicaSets -// A Deployment is a desired state and is not versioned -// However, a Deployment has a revision which we will track -// Note: Scaling deployments does not trigger rollouts -// Reference: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#deployment-status -func (d *DeployStatusGetter) GetDeployStatus(ctx context.Context, reference string) (app.RolloutStatus, error) { - stdout, stderr := d.OsWriters.Stdout(), d.OsWriters.Stderr() - - if d.Infra.ServiceName == "" { - fmt.Fprintf(stdout, "No app name in infra module. Skipping check for healthy.\n") - return app.RolloutStatusComplete, nil - } - - kubeClient, err := CreateKubeClient(ctx, d.Infra.Region, d.Infra.ClusterNamespace, d.Infra.Deployer) - if err != nil { - return "", err - } - - deployment, err := kubeClient.AppsV1().Deployments(d.Infra.ServiceNamespace).Get(ctx, d.Infra.ServiceName, meta_v1.GetOptions{}) - if err != nil { - return app.RolloutStatusUnknown, err - } - d.startDeployment.Do(func() { - d.numDesired = 1 - if deployment.Spec.Replicas != nil { - d.numDesired = int(*deployment.Spec.Replicas) - } - fmt.Fprintf(stdout, "Deploying %d replicas\n", d.numDesired) - }) - - switch reference { - case DeployReferenceNoop: - fmt.Fprintln(stdout, "Deployment was not changed. Skipping.") - return app.RolloutStatusComplete, nil - default: - if ok, status := d.verifyRevision(deployment, reference, stdout); !ok { - return status, nil - } - } - - rolloutStatus, err := k8s.MapRolloutStatus(*deployment) - if err != nil { - fmt.Fprintln(stderr, err.Error()) - return rolloutStatus, nil - } - if rolloutStatus == app.RolloutStatusUnknown || rolloutStatus == app.RolloutStatusComplete { - // We don't want to spit out information about replicas if the rollout is completed or unknown - return rolloutStatus, nil - } - - summaries := make([]string, 0) - status := deployment.Status - summaries = append(summaries, fmt.Sprintf("%d ready", status.AvailableReplicas)) - if status.UpdatedReplicas > 0 { - summaries = append(summaries, fmt.Sprintf("%d up-to-date", status.UpdatedReplicas)) - } - if status.AvailableReplicas > 0 { - summaries = append(summaries, fmt.Sprintf("%d available", status.AvailableReplicas)) - } - - fmt.Fprintf(stdout, "%d replicas to rollout (%s)\n", d.numDesired, strings.Join(summaries, ", ")) - return rolloutStatus, nil -} - -func (d *DeployStatusGetter) verifyRevision(deployment *v1.Deployment, reference string, stdout io.Writer) (bool, app.RolloutStatus) { - latestRevision, err := k8s.Revision(deployment) - if err != nil { - fmt.Fprintf(stdout, "Unable to identify revision on the kubernetes deployment: %s\n", err) - return false, app.RolloutStatusFailed - } - - expectedRevision, err := strconv.ParseInt(reference, 10, 64) - if err != nil { - fmt.Fprintln(stdout, "Invalid deployment reference. Expected a deployment revision number.") - return false, app.RolloutStatusFailed - } - - if latestRevision < expectedRevision { - // If the deployment has a revision smaller than the expected, it must not be in the k8s cluster yet - fmt.Fprintln(stdout, "Waiting for deployment to start.") - return false, app.RolloutStatusInProgress - } else if latestRevision > expectedRevision { - // If the deployment has a revision larger than the expected, there must be a new deployment that invalidates this one - fmt.Fprintf(stdout, "A new deployment (revision = %d) was triggered which invalidates this deployment.\n", latestRevision) - return false, app.RolloutStatusFailed - } - - return true, app.RolloutStatusInProgress -} diff --git a/go.mod b/go.mod index c23d71c..554d0ae 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( cloud.google.com/go/compute v1.32.0 cloud.google.com/go/logging v1.13.0 cloud.google.com/go/storage v1.47.0 - github.com/aws/aws-sdk-go v1.54.6 + github.com/aws/aws-sdk-go v1.44.332 github.com/aws/aws-sdk-go-v2 v1.30.4 github.com/aws/aws-sdk-go-v2/credentials v1.16.16 github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.15.13 @@ -20,7 +20,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.7 github.com/aws/aws-sdk-go-v2/service/lambda v1.49.7 github.com/aws/aws-sdk-go-v2/service/s3 v1.48.0 - github.com/aws/smithy-go v1.20.1 + github.com/aws/smithy-go v1.20.4 github.com/docker/cli v27.5.1+incompatible github.com/docker/docker v27.5.1+incompatible github.com/fatih/color v1.13.0 @@ -93,7 +93,6 @@ require ( github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect github.com/fatih/camelcase v1.0.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/fvbommel/sortorder v1.0.2 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/go-errors/errors v1.4.2 // indirect @@ -102,6 +101,7 @@ require ( github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.23.0 // indirect + github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/btree v1.0.1 // indirect @@ -153,7 +153,6 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/afero v1.10.0 // indirect github.com/spf13/cobra v1.8.1 // indirect - github.com/spf13/viper v1.4.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/theupdateframework/notary v0.7.0 // indirect github.com/tmccombs/hcl2json v0.3.4 // indirect @@ -188,6 +187,7 @@ require ( google.golang.org/protobuf v1.36.4 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.0.3 // indirect k8s.io/cli-runtime v0.32.1 // indirect diff --git a/go.sum b/go.sum index dc02da6..64d464c 100644 --- a/go.sum +++ b/go.sum @@ -76,7 +76,6 @@ github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Microsoft/go-winio v0.4.17 h1:iT12IBVClFevaf8PuVyi3UmZOVh4OqnaLxDTW2O6j3w= github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/Shopify/logrus-bugsnag v0.0.0-20170309145241-6dbc35f2c30d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= @@ -90,11 +89,12 @@ github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/ github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec= github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aws/aws-sdk-go-v2 v1.26.0 h1:/Ce4OCiM3EkpW7Y+xUnfAFpchU78K7/Ug01sZni9PgA= -github.com/aws/aws-sdk-go-v2 v1.26.0/go.mod h1:35hUlJVYd+M++iLI3ALmVwMOyRYMmRqUXpTtRGW+K9I= +github.com/aws/aws-sdk-go v1.44.332 h1:Ze+98F41+LxoJUdsisAFThV+0yYYLYw17/Vt0++nFYM= +github.com/aws/aws-sdk-go v1.44.332/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go-v2 v1.30.4 h1:frhcagrVNrzmT95RJImMHgabt99vkXGslubDaDagTk8= +github.com/aws/aws-sdk-go-v2 v1.30.4/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 h1:OCs21ST2LrepDfD3lwlQiOqIGp6JiEUqG84GzTDoyJs= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4/go.mod h1:usURWEKSNNAcAZuzRn/9ZYPT8aZQkR7xcCtunK/LkJo= github.com/aws/aws-sdk-go-v2/config v1.26.5 h1:lodGSevz7d+kkFJodfauThRxK9mdJbyutUxGq1NNhvw= @@ -170,7 +170,6 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk= @@ -188,11 +187,6 @@ github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8E github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -206,8 +200,6 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/docker/cli v27.5.1+incompatible h1:JB9cieUT9YNiMITtIsguaN55PLOHhBSz3LKVc6cqWaY= @@ -253,12 +245,12 @@ github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYF github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fvbommel/sortorder v1.0.2 h1:mV4o8B2hKboCdkJm+a7uX/SIpZob4JzUpc5GGnM45eo= github.com/fvbommel/sortorder v1.0.2/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -288,14 +280,14 @@ github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZ github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -385,14 +377,10 @@ github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 h1:VNqngBF40hVlDloBruUehVYC3ArSgIyScOAyMRqBxRg= github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1/go.mod h1:RBRO7fro65R6tjKzYgLAFo0t1QEXY1Dp+i/bvpRiqiQ= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= @@ -422,7 +410,6 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -433,7 +420,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/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= 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= @@ -457,7 +443,8 @@ github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9 github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/magiconair/properties v1.5.3/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U= @@ -476,7 +463,6 @@ github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZX github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/mapstructure v0.0.0-20150613213606-2caf8efc9366/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= @@ -506,7 +492,6 @@ github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nullstone-io/module v0.2.9 h1:PcYhPEemBbc+RdP+Q/DF0+XlwJkkNb5R17Hfv8qaYyc= github.com/nullstone-io/module v0.2.9/go.mod h1:btQiO0giVWDvvaQ7CLnPmuPPakJc55lAr8OlE1LK6hg= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= @@ -524,7 +509,6 @@ github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrB github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= @@ -541,7 +525,6 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v0.9.0-pre1.0.20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= @@ -553,21 +536,16 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= @@ -586,9 +564,6 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= @@ -607,7 +582,8 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v0.0.0-20150530192845-be5ff3e4840c/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -626,15 +602,15 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/theupdateframework/notary v0.7.0 h1:QyagRZ7wlSpjT5N2qQAh/pN+DVqgekv4DzbAiAiEL3c= github.com/theupdateframework/notary v0.7.0/go.mod h1:c9DRxcmhHmVLDay4/2fUYdISnHqbFDGRSlXPO0AhYWw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmccombs/hcl2json v0.3.2-0.20201111174327-c96737926b76/go.mod h1:ljY0/prd2IFUF3cagQjV3cpPEEQKzqyGqnKI7m5DBVY= github.com/tmccombs/hcl2json v0.3.4 h1:pYzRaHVTJu6TfFumACORClRtsK431eeuv7WjNNLjT90= github.com/tmccombs/hcl2json v0.3.4/go.mod h1:l3Aq9eUyhC+0v26BH08BZHeyWEtOYcFtbu2i5Ryywig= github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 h1:nrZ3ySNYwJbSpD6ce9duiP+QkD3JuLCcWkdaehUS/3Y= github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80/go.mod h1:iFyPdL66DjUD96XmzVL3ZntbzcflLnznH0fr99w5VqE= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= @@ -643,14 +619,13 @@ github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vb github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 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.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= github.com/zclconf/go-cty v1.6.1/go.mod h1:VDR4+I79ubFBGm1uJac1226K5yANQFHeauxPBoP54+o= github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= @@ -658,7 +633,6 @@ github.com/zclconf/go-cty v1.10.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uU github.com/zclconf/go-cty v1.12.0 h1:F5E/vbilcrCtat9sYcEjlwwg1mDqbRTjyXR57nnx5sc= github.com/zclconf/go-cty v1.12.0/go.mod h1:s9IfD1LK5ccNMSWCVFCE2rJfHiZgi7JijgeWIMfhLvA= github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= 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= @@ -697,11 +671,8 @@ go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -713,6 +684,7 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= @@ -749,6 +721,7 @@ 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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -756,14 +729,12 @@ golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -789,6 +760,8 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -812,12 +785,12 @@ 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-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -830,7 +803,6 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -862,11 +834,16 @@ golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7w 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-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -878,6 +855,7 @@ 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/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -885,7 +863,6 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -936,6 +913,7 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1015,7 +993,6 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go. google.golang.org/grpc v1.0.5/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= 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.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= @@ -1060,13 +1037,14 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/nullstone-io/go-api-client.v0 v0.0.0-20250219013947-90a0ced3236b h1:F/X+BMqVbLh3Q43+iPWsbcKN+zpRq4Gj4kCA5tzTt2w= gopkg.in/nullstone-io/go-api-client.v0 v0.0.0-20250219013947-90a0ced3236b/go.mod h1:m/JNiW4XSXjRLAedd7LYOO0l/FfCiKffRFolkKpfpgA= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1 h1:d4KQkxAaAiRY2h5Zqis161Pv91A37uZyJOx73duwUwM= gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1/go.mod h1:WbjuEoo1oadwzQ4apSDU+JTvmllEHtsNHS6y7vFc7iw= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= 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.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1106,6 +1084,8 @@ k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/aws-iam-authenticator v0.6.16 h1:lC9G5R6+Ls8PwvbONHLEEdbBzB6a648V+dr+cBKNklg= +sigs.k8s.io/aws-iam-authenticator v0.6.16/go.mod h1:CnvFyzR/xeLHmUY/BD0qW6q0wp6KIwXmFp4eTfrHdP8= sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= sigs.k8s.io/kustomize/api v0.18.0 h1:hTzp67k+3NEVInwz5BHyzc9rGxIauoXferXyjv5lWPo= From 9547b39679eab311cee541f6b835d5278c9a2c6e Mon Sep 17 00:00:00 2001 From: Brad Sickles Date: Wed, 12 Feb 2025 09:59:48 -0500 Subject: [PATCH 10/11] align changes with gke updates --- aws/eks/deployer.go | 90 +++++++++++++++++++++++++++++++++------------ aws/eks/outputs.go | 1 + gcp/gke/deployer.go | 4 +- 3 files changed, 69 insertions(+), 26 deletions(-) diff --git a/aws/eks/deployer.go b/aws/eks/deployer.go index 72946ab..fff560b 100644 --- a/aws/eks/deployer.go +++ b/aws/eks/deployer.go @@ -9,7 +9,8 @@ import ( "github.com/nullstone-io/deployment-sdk/k8s" "github.com/nullstone-io/deployment-sdk/logging" "github.com/nullstone-io/deployment-sdk/outputs" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) const ( @@ -54,50 +55,91 @@ func (d Deployer) Deploy(ctx context.Context, meta app.DeployMetadata) (string, fmt.Fprintln(stdout) fmt.Fprintf(stdout, "Deploying app %q\n", d.Details.App.Name) - if d.Infra.ServiceName == "" { - fmt.Fprintf(stdout, "No service name in app module. Skipping update service.\n") - fmt.Fprintf(stdout, "Deployed app %q\n", d.Details.App.Name) - fmt.Fprintln(stdout, "") - return "", nil + if d.Infra.JobDefinitionName == "" { + fmt.Fprintf(stdout, "No service_name or job_definition_name in app module. Skipping update service.\n") + fmt.Fprintf(stdout, "Deployed app %q\n", d.Details.App.Name) + fmt.Fprintln(stdout, "") + return "", nil + } + + return d.deployJobTemplate(ctx, meta) } + return d.deployService(ctx, meta) +} + +func (d Deployer) deployService(ctx context.Context, meta app.DeployMetadata) (string, error) { + stdout, _ := d.OsWriters.Stdout(), d.OsWriters.Stderr() kubeClient, err := CreateKubeClient(ctx, d.Infra.Region, d.Infra.ClusterNamespace, d.Infra.Deployer) if err != nil { return "", err } - deployment, err := kubeClient.AppsV1().Deployments(d.Infra.ServiceNamespace).Get(ctx, d.Infra.ServiceName, meta_v1.GetOptions{}) + deployment, err := kubeClient.AppsV1().Deployments(d.Infra.ServiceNamespace).Get(ctx, d.Infra.ServiceName, metav1.GetOptions{}) if err != nil { return "", err } - curRevisionNum := deployment.Generation - - k8s.UpdateVersionLabel(deployment, meta.Version) + curGeneration := deployment.Generation - mainContainerIndex, mainContainer := k8s.GetContainerByName(*deployment, d.Infra.MainContainerName) - if mainContainerIndex < 0 { - return "", fmt.Errorf("cannot find main container %q in spec", d.Infra.MainContainerName) + // Update deployment definition + deployment.ObjectMeta = k8s.UpdateVersionLabel(deployment.ObjectMeta, meta.Version) + deployment.Spec.Template, err = d.updatePodTemplate(deployment.Spec.Template, meta) + if err != nil { + return "", err } - k8s.SetContainerImageTag(mainContainer, meta.Version) - k8s.ReplaceEnvVars(mainContainer, env_vars.GetStandard(meta)) - deployment.Spec.Template.Spec.Containers[mainContainerIndex] = *mainContainer - updated, err := kubeClient.AppsV1().Deployments(d.Infra.ServiceNamespace).Update(ctx, deployment, meta_v1.UpdateOptions{}) + updated, err := kubeClient.AppsV1().Deployments(d.Infra.ServiceNamespace).Update(ctx, deployment, metav1.UpdateOptions{}) if err != nil { return "", fmt.Errorf("error deploying app: %w", err) } + updGeneration := updated.Generation + reference := fmt.Sprintf("%d", updGeneration) - revision := "" - updatedRevNum := updated.Generation - if updatedRevNum == curRevisionNum { - revision = DeployReferenceNoop + if curGeneration == updGeneration { + reference = DeployReferenceNoop fmt.Fprintln(stdout, "No changes made to deployment.") } else { - revision = fmt.Sprintf("%d", updatedRevNum) - fmt.Fprintf(stdout, "Created new deployment revision %s.\n", revision) + fmt.Fprintf(stdout, "Created new deployment (generation = %s).\n", reference) } fmt.Fprintf(stdout, "Deployed app %q\n", d.Details.App.Name) - return revision, nil + return reference, nil +} + +func (d Deployer) deployJobTemplate(ctx context.Context, meta app.DeployMetadata) (string, error) { + stdout, _ := d.OsWriters.Stdout(), d.OsWriters.Stderr() + + kubeClient, err := CreateKubeClient(ctx, d.Infra.Region, d.Infra.ClusterNamespace, d.Infra.Deployer) + if err != nil { + return "", err + } + + // Retrieve and update job definition + jobDef, configMap, err := k8s.GetJobDefinition(ctx, kubeClient, d.Infra.ServiceNamespace, d.Infra.JobDefinitionName) + if err != nil { + return "", err + } + jobDef.ObjectMeta = k8s.UpdateVersionLabel(jobDef.ObjectMeta, meta.Version) + jobDef.Spec.Template, err = d.updatePodTemplate(jobDef.Spec.Template, meta) + if err != nil { + return "", fmt.Errorf("cannot find main container %q in spec", d.Infra.MainContainerName) + } + if err := k8s.UpdateJobDefinition(ctx, kubeClient, d.Infra.ServiceNamespace, jobDef, configMap); err != nil { + return "", err + } + + fmt.Fprintf(stdout, "Updated job template with new application version (%s) and environment variables\n", meta.Version) + return "", nil +} + +func (d Deployer) updatePodTemplate(template corev1.PodTemplateSpec, meta app.DeployMetadata) (corev1.PodTemplateSpec, error) { + mainContainerIndex, mainContainer := k8s.GetContainerByName(template, d.Infra.MainContainerName) + if mainContainerIndex < 0 { + return template, fmt.Errorf("cannot find main container %q in spec", d.Infra.MainContainerName) + } + k8s.SetContainerImageTag(mainContainer, meta.Version) + k8s.ReplaceEnvVars(mainContainer, env_vars.GetStandard(meta)) + template.Spec.Containers[mainContainerIndex] = *mainContainer + return template, nil } diff --git a/aws/eks/outputs.go b/aws/eks/outputs.go index 7b39696..8bff8c2 100644 --- a/aws/eks/outputs.go +++ b/aws/eks/outputs.go @@ -18,6 +18,7 @@ type Outputs struct { ImagePusher nsaws.User `ns:"image_pusher,optional"` Deployer nsaws.User `ns:"deployer,optional"` MainContainerName string `ns:"main_container_name,optional"` + JobDefinitionName string `ns:"job_definition_name,optional"` Region string `ns:"region"` ClusterNamespace ClusterNamespaceOutputs `ns:",connectionContract:cluster-namespace/aws/kubernetes:eks,optional"` diff --git a/gcp/gke/deployer.go b/gcp/gke/deployer.go index d485112..93f3867 100644 --- a/gcp/gke/deployer.go +++ b/gcp/gke/deployer.go @@ -9,7 +9,7 @@ import ( "github.com/nullstone-io/deployment-sdk/k8s" "github.com/nullstone-io/deployment-sdk/logging" "github.com/nullstone-io/deployment-sdk/outputs" - v1 "k8s.io/api/core/v1" + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -135,7 +135,7 @@ func (d Deployer) deployJobTemplate(ctx context.Context, meta app.DeployMetadata return "", nil } -func (d Deployer) updatePodTemplate(template v1.PodTemplateSpec, meta app.DeployMetadata) (v1.PodTemplateSpec, error) { +func (d Deployer) updatePodTemplate(template corev1.PodTemplateSpec, meta app.DeployMetadata) (corev1.PodTemplateSpec, error) { mainContainerIndex, mainContainer := k8s.GetContainerByName(template, d.Infra.MainContainerName) if mainContainerIndex < 0 { return template, fmt.Errorf("cannot find main container %q in spec", d.Infra.MainContainerName) From 5bf9a77ffbd5e74853276ab76a5bb15c065ef6d1 Mon Sep 17 00:00:00 2001 From: Brad Sickles Date: Wed, 12 Feb 2025 10:00:31 -0500 Subject: [PATCH 11/11] update aws-sdk-go --- go.mod | 2 +- go.sum | 17 ++--------------- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index 554d0ae..ad07fde 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( cloud.google.com/go/compute v1.32.0 cloud.google.com/go/logging v1.13.0 cloud.google.com/go/storage v1.47.0 - github.com/aws/aws-sdk-go v1.44.332 + github.com/aws/aws-sdk-go v1.55.6 github.com/aws/aws-sdk-go-v2 v1.30.4 github.com/aws/aws-sdk-go-v2/credentials v1.16.16 github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.15.13 diff --git a/go.sum b/go.sum index 64d464c..0546655 100644 --- a/go.sum +++ b/go.sum @@ -91,8 +91,8 @@ github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6 github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aws/aws-sdk-go v1.44.332 h1:Ze+98F41+LxoJUdsisAFThV+0yYYLYw17/Vt0++nFYM= -github.com/aws/aws-sdk-go v1.44.332/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.55.6 h1:cSg4pvZ3m8dgYcgqB97MrcdjUmZ1BeMYKUxMMB89IPk= +github.com/aws/aws-sdk-go v1.55.6/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v1.30.4 h1:frhcagrVNrzmT95RJImMHgabt99vkXGslubDaDagTk8= github.com/aws/aws-sdk-go-v2 v1.30.4/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 h1:OCs21ST2LrepDfD3lwlQiOqIGp6JiEUqG84GzTDoyJs= @@ -625,7 +625,6 @@ 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.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= github.com/zclconf/go-cty v1.6.1/go.mod h1:VDR4+I79ubFBGm1uJac1226K5yANQFHeauxPBoP54+o= github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= @@ -684,7 +683,6 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= @@ -721,7 +719,6 @@ 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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -760,8 +757,6 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -785,7 +780,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-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -834,16 +828,11 @@ golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7w 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-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -855,7 +844,6 @@ 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/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -913,7 +901,6 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=