From 7c37d9f8c5266da6d22d7f02b062786a85536a39 Mon Sep 17 00:00:00 2001 From: Pratik Patel Date: Fri, 17 Oct 2025 12:38:10 -0700 Subject: [PATCH 1/5] feat(BREV-1938): add logging options for Shadeform Client --- v1/providers/shadeform/client.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/v1/providers/shadeform/client.go b/v1/providers/shadeform/client.go index de736def..63cdf5cd 100644 --- a/v1/providers/shadeform/client.go +++ b/v1/providers/shadeform/client.go @@ -62,6 +62,10 @@ func (c *ShadeformCredential) MakeClient(_ context.Context, _ string) (v1.CloudC return NewShadeformClient(c.RefID, c.APIKey), nil } +func (c *ShadeformCredential) MakeClientWithOptions(_ context.Context, _ string, opts ...ShadeformClientOption) (v1.CloudClient, error) { + return NewShadeformClient(c.RefID, c.APIKey, opts...), nil +} + // Shadeform implements the CloudClient interface for Shadeform // It embeds NotImplCloudClient to handle unsupported features type ShadeformClient struct { From 942394a29f2dd798cafd7a60fe02c98b39ece744 Mon Sep 17 00:00:00 2001 From: Pratik Patel Date: Fri, 17 Oct 2025 17:10:58 -0700 Subject: [PATCH 2/5] feat(BREV-1938): adding wrapped errors and some debugging --- v1/providers/shadeform/instance.go | 93 +++++++++++++++----------- v1/providers/shadeform/instancetype.go | 21 +++--- 2 files changed, 66 insertions(+), 48 deletions(-) diff --git a/v1/providers/shadeform/instance.go b/v1/providers/shadeform/instance.go index b16bfcf4..3446c8fc 100644 --- a/v1/providers/shadeform/instance.go +++ b/v1/providers/shadeform/instance.go @@ -2,12 +2,12 @@ package v1 import ( "context" - "errors" "fmt" "io" "strings" "github.com/alecthomas/units" + "github.com/brevdev/cloud/internal/errors" v1 "github.com/brevdev/cloud/v1" openapi "github.com/brevdev/cloud/v1/providers/shadeform/gen/shadeform" "github.com/google/uuid" @@ -24,9 +24,11 @@ const ( func (c *ShadeformClient) CreateInstance(ctx context.Context, attrs v1.CreateInstanceAttrs) (*v1.Instance, error) { //nolint:gocyclo,funlen // ok authCtx := c.makeAuthContext(ctx) + c.logger.Debug(ctx, "Creating instance", v1.LogField("instanceAttrs", attrs)) + // Check if the instance type is allowed by configuration if !c.isInstanceTypeAllowed(attrs.InstanceType) { - return nil, fmt.Errorf("instance type: %v is not deployable", attrs.InstanceType) + return nil, errors.WrapAndTrace(fmt.Errorf("instance type: %v is not deployable", attrs.InstanceType)) } sshKeyID := "" @@ -38,37 +40,38 @@ func (c *ShadeformClient) CreateInstance(ctx context.Context, attrs v1.CreateIns if keyPairName == "" { keyPairName = uuid.New().String() + c.logger.Debug(ctx, "No key pair name provided, generating new one", v1.LogField("keyPairName", keyPairName)) } if attrs.PublicKey != "" { var err error sshKeyID, err = c.addSSHKey(ctx, keyPairName, attrs.PublicKey) if err != nil && !strings.Contains(err.Error(), "name must be unique") { - return nil, fmt.Errorf("failed to add SSH key: %w", err) + return nil, errors.WrapAndTrace(fmt.Errorf("failed to add SSH key: %w", err)) } } region := attrs.Location cloud, shadeInstanceType, err := c.getShadeformCloudAndInstanceType(attrs.InstanceType) if err != nil { - return nil, err + return nil, errors.WrapAndTrace(err) } cloudEnum, err := openapi.NewCloudFromValue(cloud) if err != nil { - return nil, err + return nil, errors.WrapAndTrace(err) } // Add refID tag refIDTag, err := c.createTag(refIDTagName, attrs.RefID) if err != nil { - return nil, err + return nil, errors.WrapAndTrace(err) } // Add cloudRefID tag cloudCredRefIDTag, err := c.createTag(cloudCredRefIDTagName, c.GetReferenceID()) if err != nil { - return nil, err + return nil, errors.WrapAndTrace(err) } tags := []string{refIDTag, cloudCredRefIDTag} @@ -76,14 +79,14 @@ func (c *ShadeformClient) CreateInstance(ctx context.Context, attrs v1.CreateIns for key, value := range attrs.Tags { createdTag, err := c.createTag(key, value) if err != nil { - return nil, err + return nil, errors.WrapAndTrace(err) } tags = append(tags, createdTag) } base64Script, err := c.GenerateFirewallScript(attrs.FirewallRules) if err != nil { - return nil, err + return nil, errors.WrapAndTrace(err) } req := openapi.CreateRequest{ @@ -108,18 +111,18 @@ func (c *ShadeformClient) CreateInstance(ctx context.Context, attrs v1.CreateIns } if err != nil { httpMessage, _ := io.ReadAll(httpResp.Body) - return nil, fmt.Errorf("failed to create instance: %w, %s", err, string(httpMessage)) + return nil, errors.WrapAndTrace(fmt.Errorf("failed to create instance: %w, %s", err, string(httpMessage))) } if resp == nil { - return nil, fmt.Errorf("no instance returned from create request") + return nil, errors.WrapAndTrace(fmt.Errorf("no instance returned from create request")) } // Since Shadeform doesn't return the full instance that's created, we need to make a second API call to get // the created instance after we call create createdInstance, err := c.GetInstance(authCtx, v1.CloudProviderInstanceID(resp.Id)) if err != nil { - return nil, err + return nil, errors.WrapAndTrace(err) } return createdInstance, nil @@ -152,11 +155,11 @@ func (c *ShadeformClient) addSSHKey(ctx context.Context, keyPairName string, pub } if err != nil { httpMessage, _ := io.ReadAll(httpResp.Body) - return "", fmt.Errorf("failed to add SSH Key: %w, %s", err, string(httpMessage)) + return "", errors.WrapAndTrace(fmt.Errorf("failed to add SSH Key: %w, %s", err, string(httpMessage))) } if resp == nil { - return "", fmt.Errorf("no instance returned from post request") + return "", errors.WrapAndTrace(fmt.Errorf("no instance returned from post request")) } return resp.Id, nil @@ -170,16 +173,16 @@ func (c *ShadeformClient) GetInstance(ctx context.Context, instanceID v1.CloudPr defer func() { _ = httpResp.Body.Close() }() } if err != nil { - return nil, fmt.Errorf("failed to get instance: %w", err) + return nil, errors.WrapAndTrace(fmt.Errorf("failed to get instance: %w", err)) } if resp == nil { - return nil, fmt.Errorf("no instance returned from get request") + return nil, errors.WrapAndTrace(fmt.Errorf("no instance returned from get request")) } - instance, err := c.convertInstanceInfoResponseToV1Instance(*resp) + instance, err := c.convertInstanceInfoResponseToV1Instance(ctx, *resp) if err != nil { - return nil, err + return nil, errors.WrapAndTrace(err) } return instance, nil @@ -193,7 +196,7 @@ func (c *ShadeformClient) TerminateInstance(ctx context.Context, instanceID v1.C defer func() { _ = httpResp.Body.Close() }() } if err != nil { - return fmt.Errorf("failed to terminate instance: %w", err) + return errors.WrapAndTrace(fmt.Errorf("failed to terminate instance: %w", err)) } return nil @@ -207,14 +210,14 @@ func (c *ShadeformClient) ListInstances(ctx context.Context, _ v1.ListInstancesA defer func() { _ = httpResp.Body.Close() }() } if err != nil { - return nil, fmt.Errorf("failed to list instances: %w", err) + return nil, errors.WrapAndTrace(fmt.Errorf("failed to list instances: %w", err)) } var instances []v1.Instance for _, instance := range resp.Instances { - singleInstance, err := c.convertShadeformInstanceToV1Instance(instance) + singleInstance, err := c.convertShadeformInstanceToV1Instance(ctx, instance) if err != nil { - return nil, err + return nil, errors.WrapAndTrace(err) } instances = append(instances, *singleInstance) } @@ -254,27 +257,33 @@ func (c *ShadeformClient) getLifecycleStatus(status string) v1.LifecycleStatus { } // convertInstanceInfoResponseToV1Instance - converts Instance Info to v1 instance -func (c *ShadeformClient) convertInstanceInfoResponseToV1Instance(instanceInfo openapi.InstanceInfoResponse) (*v1.Instance, error) { +func (c *ShadeformClient) convertInstanceInfoResponseToV1Instance(ctx context.Context, instanceInfo openapi.InstanceInfoResponse) (*v1.Instance, error) { + c.logger.Debug(ctx, "converting instance info response to v1 instance", v1.LogField("instanceInfo", instanceInfo)) instanceType := c.getInstanceType(string(instanceInfo.Cloud), instanceInfo.ShadeInstanceType) lifeCycleStatus := c.getLifecycleStatus(string(instanceInfo.Status)) tags, err := c.convertShadeformTagToV1Tag(instanceInfo.Tags) if err != nil { - return nil, err + return nil, errors.WrapAndTrace(err) } refID, found := tags[refIDTagName] if !found { - return nil, errors.New("could not find refID tag") + return nil, errors.WrapAndTrace(errors.New("could not find refID tag")) } + c.logger.Debug(ctx, "refID found, deleting from tags", v1.LogField("refID", refID)) delete(tags, refIDTagName) - cloudCredRefID := tags[cloudCredRefIDTagName] - if err != nil { - return nil, errors.New("could not find cloudCredRefID tag") + cloudCredRefID, found := tags[cloudCredRefIDTagName] + if !found { + return nil, errors.WrapAndTrace(errors.New("could not find cloudCredRefID tag")) } + c.logger.Debug(ctx, "cloudCredRefID found, deleting from tags", v1.LogField("cloudCredRefID", cloudCredRefID)) delete(tags, cloudCredRefIDTagName) + diskSize := units.Base2Bytes(instanceInfo.Configuration.StorageInGb) * units.GiB + c.logger.Debug(ctx, "calculated diskSize", v1.LogField("diskSize", diskSize), v1.LogField("storageInGb", instanceInfo.Configuration.StorageInGb)) + instance := &v1.Instance{ Name: c.getProvidedInstanceName(instanceInfo.Name), CreatedAt: instanceInfo.CreatedAt, @@ -285,7 +294,7 @@ func (c *ShadeformClient) convertInstanceInfoResponseToV1Instance(instanceInfo o ImageID: instanceInfo.Configuration.Os, InstanceType: instanceType, InstanceTypeID: v1.InstanceTypeID(c.getInstanceTypeID(instanceType, instanceInfo.Region)), - DiskSize: units.Base2Bytes(instanceInfo.Configuration.StorageInGb) * units.GiB, + DiskSize: diskSize, SSHUser: instanceInfo.SshUser, SSHPort: int(instanceInfo.SshPort), Status: v1.Status{ @@ -304,27 +313,33 @@ func (c *ShadeformClient) convertInstanceInfoResponseToV1Instance(instanceInfo o // convertInstanceInfoResponseToV1Instance - converts /instances response to v1 instance; the api struct is slightly // different from instance info response and expected to diverge so keeping it as a separate function for now -func (c *ShadeformClient) convertShadeformInstanceToV1Instance(shadeformInstance openapi.Instance) (*v1.Instance, error) { +func (c *ShadeformClient) convertShadeformInstanceToV1Instance(ctx context.Context, shadeformInstance openapi.Instance) (*v1.Instance, error) { + c.logger.Debug(ctx, "converting shadeform instance to v1 instance", v1.LogField("shadeformInstance", shadeformInstance)) instanceType := c.getInstanceType(string(shadeformInstance.Cloud), shadeformInstance.ShadeInstanceType) lifeCycleStatus := c.getLifecycleStatus(string(shadeformInstance.Status)) tags, err := c.convertShadeformTagToV1Tag(shadeformInstance.Tags) if err != nil { - return nil, err + return nil, errors.WrapAndTrace(err) } refID, found := tags[refIDTagName] if !found { - return nil, errors.New("could not find refID tag") + return nil, errors.WrapAndTrace(errors.New("could not find refID tag")) } + c.logger.Debug(ctx, "refID found, deleting from tags", v1.LogField("refID", refID)) delete(tags, refIDTagName) - cloudCredRefID := tags[cloudCredRefIDTagName] - if err != nil { - return nil, errors.New("could not find cloudCredRefID tag") + cloudCredRefID, found := tags[cloudCredRefIDTagName] + if !found { + return nil, errors.WrapAndTrace(errors.New("could not find cloudCredRefID tag")) } + c.logger.Debug(ctx, "cloudCredRefID found, deleting from tags", v1.LogField("cloudCredRefID", cloudCredRefID)) delete(tags, cloudCredRefIDTagName) + diskSize := units.Base2Bytes(shadeformInstance.Configuration.StorageInGb) * units.GiB + c.logger.Debug(ctx, "calculated diskSize", v1.LogField("diskSize", diskSize), v1.LogField("storageInGb", shadeformInstance.Configuration.StorageInGb)) + instance := &v1.Instance{ Name: shadeformInstance.Name, CreatedAt: shadeformInstance.CreatedAt, @@ -334,7 +349,7 @@ func (c *ShadeformClient) convertShadeformInstanceToV1Instance(shadeformInstance Hostname: hostname, ImageID: shadeformInstance.Configuration.Os, InstanceType: instanceType, - DiskSize: units.Base2Bytes(shadeformInstance.Configuration.StorageInGb) * units.GiB, + DiskSize: diskSize, SSHUser: shadeformInstance.SshUser, SSHPort: int(shadeformInstance.SshPort), Status: v1.Status{ @@ -357,7 +372,7 @@ func (c *ShadeformClient) convertShadeformTagToV1Tag(shadeformTags []string) (v1 for _, tag := range shadeformTags { key, value, err := c.getTag(tag) if err != nil { - return nil, err + return nil, errors.WrapAndTrace(err) } tags[key] = value } @@ -366,7 +381,7 @@ func (c *ShadeformClient) convertShadeformTagToV1Tag(shadeformTags []string) (v1 func (c *ShadeformClient) createTag(key string, value string) (string, error) { if strings.Contains(key, "=") { - return "", errors.New("tags cannot contain the '=' character") + return "", errors.WrapAndTrace(errors.New("tags cannot contain the '=' character")) } return fmt.Sprintf("%v=%v", key, value), nil @@ -375,7 +390,7 @@ func (c *ShadeformClient) createTag(key string, value string) (string, error) { func (c *ShadeformClient) getTag(shadeformTag string) (string, string, error) { key, value, found := strings.Cut(shadeformTag, "=") if !found { - return "", "", fmt.Errorf("tag %v does not conform to the key value tag format", shadeformTag) + return "", "", errors.WrapAndTrace(fmt.Errorf("tag %v does not conform to the key value tag format", shadeformTag)) } return key, value, nil } diff --git a/v1/providers/shadeform/instancetype.go b/v1/providers/shadeform/instancetype.go index b01218ec..f8582931 100644 --- a/v1/providers/shadeform/instancetype.go +++ b/v1/providers/shadeform/instancetype.go @@ -2,7 +2,6 @@ package v1 import ( "context" - "errors" "fmt" "strings" "time" @@ -10,6 +9,7 @@ import ( "github.com/alecthomas/units" "github.com/bojanz/currency" + "github.com/brevdev/cloud/internal/errors" v1 "github.com/brevdev/cloud/v1" openapi "github.com/brevdev/cloud/v1/providers/shadeform/gen/shadeform" ) @@ -27,6 +27,7 @@ func (c *ShadeformClient) GetInstanceTypes(ctx context.Context, args v1.GetInsta request := c.client.DefaultAPI.InstancesTypes(authCtx) if len(args.Locations) > 0 && args.Locations[0] != AllRegions { regionFilter := args.Locations[0] + c.logger.Debug(ctx, "filtering by region", v1.LogField("regionFilter", regionFilter)) request = request.Region(regionFilter) } @@ -35,18 +36,19 @@ func (c *ShadeformClient) GetInstanceTypes(ctx context.Context, args v1.GetInsta defer func() { _ = httpResp.Body.Close() }() } if err != nil { - return nil, fmt.Errorf("failed to get instance types: %w", err) + return nil, errors.WrapAndTrace(fmt.Errorf("failed to get instance types: %w", err)) } var instanceTypes []v1.InstanceType for _, sfInstanceType := range resp.InstanceTypes { - instanceTypesFromShadeformInstanceType, err := c.convertShadeformInstanceTypeToV1InstanceType(sfInstanceType) + instanceTypesFromShadeformInstanceType, err := c.convertShadeformInstanceTypeToV1InstanceType(ctx, sfInstanceType) if err != nil { - return nil, err + return nil, errors.WrapAndTrace(err) } // Filter the list down to the instance types that are allowed by the configuration filter and the args for _, singleInstanceType := range instanceTypesFromShadeformInstanceType { if !isSelectedByArgs(singleInstanceType, args) { + c.logger.Debug(ctx, "instance type not selected by args", v1.LogField("instanceType", singleInstanceType.Type)) continue } if c.isInstanceTypeAllowed(singleInstanceType.Type) { @@ -97,7 +99,7 @@ func (c *ShadeformClient) GetLocations(ctx context.Context, _ v1.GetLocationsArg } if err != nil { - return nil, fmt.Errorf("failed to get locations: %w", err) + return nil, errors.WrapAndTrace(fmt.Errorf("failed to get locations: %w", err)) } // Shadeform doesn't have a dedicated locations API but we can get the same result from using the @@ -165,7 +167,7 @@ func (c *ShadeformClient) getInstanceTypeID(instanceType string, region string) func (c *ShadeformClient) getShadeformCloudAndInstanceType(instanceType string) (string, string, error) { shadeformCloud, shadeformInstanceType, found := strings.Cut(instanceType, "_") if !found { - return "", "", errors.New("could not determine shadeform cloud and instance type from instance type") + return "", "", errors.WrapAndTrace(errors.New("could not determine shadeform cloud and instance type from instance type")) } return shadeformCloud, shadeformInstanceType, nil } @@ -195,14 +197,15 @@ func (c *ShadeformClient) getEstimatedDeployTime(shadeformInstanceType openapi.I } // convertShadeformInstanceTypeToV1InstanceTypes - converts a shadeform returned instance type to a specific instance type and region of availability -func (c *ShadeformClient) convertShadeformInstanceTypeToV1InstanceType(shadeformInstanceType openapi.InstanceType) ([]v1.InstanceType, error) { +func (c *ShadeformClient) convertShadeformInstanceTypeToV1InstanceType(ctx context.Context, shadeformInstanceType openapi.InstanceType) ([]v1.InstanceType, error) { + c.logger.Debug(ctx, "converting shadeform instance type to v1 instance type", v1.LogField("shadeformInstanceType", shadeformInstanceType)) instanceType := c.getInstanceType(string(shadeformInstanceType.Cloud), shadeformInstanceType.ShadeInstanceType) instanceTypes := []v1.InstanceType{} basePrice, err := convertHourlyPriceToAmount(shadeformInstanceType.HourlyPrice) if err != nil { - return nil, err + return nil, errors.WrapAndTrace(err) } gpuName := shadeformGPUTypeToBrevGPUName(shadeformInstanceType.Configuration.GpuType) @@ -254,7 +257,7 @@ func convertHourlyPriceToAmount(hourlyPrice int32) (*currency.Amount, error) { amount, err := currency.NewAmount(number, UsdCurrentCode) if err != nil { - return nil, err + return nil, errors.WrapAndTrace(err) } return &amount, nil } From 026780271580f16a24b1f78632b00c9b43a1d634 Mon Sep 17 00:00:00 2001 From: Pratik Patel Date: Fri, 17 Oct 2025 18:22:15 -0700 Subject: [PATCH 3/5] feat(BREV-1938): don't log loops, expose some swalloed errors --- v1/providers/shadeform/instance.go | 4 ++-- v1/providers/shadeform/instancetype.go | 26 +++++++++++++++++--------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/v1/providers/shadeform/instance.go b/v1/providers/shadeform/instance.go index 3446c8fc..8175cd6c 100644 --- a/v1/providers/shadeform/instance.go +++ b/v1/providers/shadeform/instance.go @@ -25,9 +25,9 @@ func (c *ShadeformClient) CreateInstance(ctx context.Context, attrs v1.CreateIns authCtx := c.makeAuthContext(ctx) c.logger.Debug(ctx, "Creating instance", v1.LogField("instanceAttrs", attrs)) - // Check if the instance type is allowed by configuration - if !c.isInstanceTypeAllowed(attrs.InstanceType) { + allowed, _ := c.isInstanceTypeAllowed(attrs.InstanceType) + if !allowed { return nil, errors.WrapAndTrace(fmt.Errorf("instance type: %v is not deployable", attrs.InstanceType)) } diff --git a/v1/providers/shadeform/instancetype.go b/v1/providers/shadeform/instancetype.go index f8582931..7be4ae63 100644 --- a/v1/providers/shadeform/instancetype.go +++ b/v1/providers/shadeform/instancetype.go @@ -40,8 +40,10 @@ func (c *ShadeformClient) GetInstanceTypes(ctx context.Context, args v1.GetInsta } var instanceTypes []v1.InstanceType + c.logger.Debug(ctx, "converting shadeform instance types to v1 instance types", v1.LogField("countToConvert", len(resp.InstanceTypes)), v1.LogField("shadeformInstanceTypes", resp.InstanceTypes)) + var errCount int for _, sfInstanceType := range resp.InstanceTypes { - instanceTypesFromShadeformInstanceType, err := c.convertShadeformInstanceTypeToV1InstanceType(ctx, sfInstanceType) + instanceTypesFromShadeformInstanceType, err := c.convertShadeformInstanceTypeToV1InstanceType(sfInstanceType) if err != nil { return nil, errors.WrapAndTrace(err) } @@ -51,11 +53,18 @@ func (c *ShadeformClient) GetInstanceTypes(ctx context.Context, args v1.GetInsta c.logger.Debug(ctx, "instance type not selected by args", v1.LogField("instanceType", singleInstanceType.Type)) continue } - if c.isInstanceTypeAllowed(singleInstanceType.Type) { + allowed, err := c.isInstanceTypeAllowed(singleInstanceType.Type) + if err != nil { + errCount++ + } + if allowed { instanceTypes = append(instanceTypes, singleInstanceType) } } } + if errCount > 0 { + c.logger.Warn(ctx, "error converting instance types", v1.LogField("errCount", errCount)) + } return instanceTypes, nil } @@ -132,25 +141,25 @@ func (c *ShadeformClient) GetLocations(ctx context.Context, _ v1.GetLocationsArg } // isInstanceTypeAllowed - determines if an instance type is allowed based on configuration -func (c *ShadeformClient) isInstanceTypeAllowed(instanceType string) bool { +func (c *ShadeformClient) isInstanceTypeAllowed(instanceType string) (bool, error) { // By default, everything is allowed if c.config == nil || c.config.AllowedInstanceTypes == nil { - return true + return true, nil } // Convert to Cloud and Instance Type cloud, shadeInstanceType, err := c.getShadeformCloudAndInstanceType(instanceType) if err != nil { - return false + return false, errors.WrapAndTrace(err) } // Convert to API Cloud Enum cloudEnum, err := openapi.NewCloudFromValue(cloud) if err != nil { - return false + return false, errors.WrapAndTrace(err) } - return c.config.isAllowed(*cloudEnum, shadeInstanceType) + return c.config.isAllowed(*cloudEnum, shadeInstanceType), nil } // getInstanceType - gets the Brev instance type from the shadeform cloud and shade instance type @@ -197,8 +206,7 @@ func (c *ShadeformClient) getEstimatedDeployTime(shadeformInstanceType openapi.I } // convertShadeformInstanceTypeToV1InstanceTypes - converts a shadeform returned instance type to a specific instance type and region of availability -func (c *ShadeformClient) convertShadeformInstanceTypeToV1InstanceType(ctx context.Context, shadeformInstanceType openapi.InstanceType) ([]v1.InstanceType, error) { - c.logger.Debug(ctx, "converting shadeform instance type to v1 instance type", v1.LogField("shadeformInstanceType", shadeformInstanceType)) +func (c *ShadeformClient) convertShadeformInstanceTypeToV1InstanceType(shadeformInstanceType openapi.InstanceType) ([]v1.InstanceType, error) { instanceType := c.getInstanceType(string(shadeformInstanceType.Cloud), shadeformInstanceType.ShadeInstanceType) instanceTypes := []v1.InstanceType{} From d453811da31c994c8a34ab06cc146f087ec55d0a Mon Sep 17 00:00:00 2001 From: Pratik Patel Date: Tue, 28 Oct 2025 09:03:50 -0700 Subject: [PATCH 4/5] fix(BREV-1983): review feedback --- Makefile | 2 ++ go.mod | 28 +++++++-------- go.sum | 60 ++++++++++++++++---------------- v1/providers/shadeform/client.go | 4 +-- 4 files changed, 48 insertions(+), 46 deletions(-) diff --git a/Makefile b/Makefile index 8cffa63b..9d3b31c7 100644 --- a/Makefile +++ b/Makefile @@ -29,6 +29,7 @@ GOSEC=gosec # Third party tools ARTIFACT_GOLINT=github.com/golangci/golangci-lint/cmd/golangci-lint@v1.64.8 ARTIFACT_GOSEC=github.com/securego/gosec/v2/cmd/gosec@v2.22.8 +ARTIFACT_GOFUMPT=mvdan.cc/gofumpt@v0.9.2 # Build flags LDFLAGS=-ldflags "-X main.Version=$(shell git describe --tags --always --dirty) -X main.BuildTime=$(shell date -u '+%Y-%m-%d_%H:%M:%S')" @@ -194,6 +195,7 @@ install-tools: @echo "Installing development tools..." $(GOINSTALL) $(ARTIFACT_GOLINT) $(GOINSTALL) $(ARTIFACT_GOSEC) + $(GOINSTALL) $(ARTIFACT_GOFUMPT) # Show help .PHONY: help diff --git a/go.mod b/go.mod index 652a2535..e3e62a55 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ toolchain go1.24.6 require ( github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b - github.com/bojanz/currency v1.3.1 + github.com/bojanz/currency v1.4.0 github.com/cenkalti/backoff v2.2.1+incompatible github.com/cenkalti/backoff/v4 v4.3.0 github.com/gliderlabs/ssh v0.3.8 @@ -14,30 +14,30 @@ require ( github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 github.com/jarcoal/httpmock v1.4.0 - github.com/nebius/gosdk v0.0.0-20250826102719-940ad1dfb5de + github.com/nebius/gosdk v0.0.0-20251027103638-3d8d8840cff3 github.com/pkg/errors v0.9.1 - github.com/stretchr/testify v1.11.0 - golang.org/x/crypto v0.41.0 + github.com/stretchr/testify v1.11.1 + golang.org/x/crypto v0.43.0 gopkg.in/validator.v2 v2.0.1 ) require ( - buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.8-20250717185734-6c6e0d3c608e.1 // indirect + buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.10-20250912141014-52f32327d4b0.1 // indirect github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect github.com/cockroachdb/apd/v3 v3.2.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/gofrs/flock v0.12.1 // indirect + github.com/gofrs/flock v0.13.0 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 // indirect github.com/kr/text v0.2.0 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b // indirect - golang.org/x/net v0.43.0 // indirect - golang.org/x/sync v0.16.0 // indirect - golang.org/x/sys v0.35.0 // indirect - golang.org/x/text v0.28.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect - google.golang.org/grpc v1.75.0 // indirect - google.golang.org/protobuf v1.36.8 // indirect + golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251022142026-3a174f9686a8 // indirect + google.golang.org/grpc v1.76.0 // indirect + google.golang.org/protobuf v1.36.10 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 64dd1293..550c472e 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,13 @@ -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.8-20250717185734-6c6e0d3c608e.1 h1:sjY1k5uszbIZfv11HO2keV4SLhNA47SabPO886v7Rvo= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.8-20250717185734-6c6e0d3c608e.1/go.mod h1:8EQ5GzyGJQ5tEIwMSxCl8RKJYsjCpAwkdcENoioXT6g= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.10-20250912141014-52f32327d4b0.1 h1:31on4W/yPcV4nZHL4+UCiCvLPsMqe/vJcNg8Rci0scc= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.10-20250912141014-52f32327d4b0.1/go.mod h1:fUl8CEN/6ZAMk6bP8ahBJPUJw7rbp+j4x+wCcYi2IG4= github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0= github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 h1:zV3ejI06GQ59hwDQAvmK1qxOQGB3WuVTRoY0okPTAv0= github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= -github.com/bojanz/currency v1.3.1 h1:3BUAvy/5hU/Pzqg5nrQslVihV50QG+A2xKPoQw1RKH4= -github.com/bojanz/currency v1.3.1/go.mod h1:jNoZiJyRTqoU5DFoa+n+9lputxPUDa8Fz8BdDrW06Go= +github.com/bojanz/currency v1.4.0 h1:sPLts/Qx3u0+FfYx+31NLYYOiOdPiH8mBWdJCAZHj3g= +github.com/bojanz/currency v1.4.0/go.mod h1:hv7AAJ5jNRvE/SXaJe74uBPg6syV21imy4yKP7fi9GM= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= @@ -26,8 +26,8 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ozzo/ozzo-validation/v4 v4.3.0 h1:byhDUpfEwjsVQb1vBunvIjh2BHQ9ead57VkAEY4V+Es= github.com/go-ozzo/ozzo-validation/v4 v4.3.0/go.mod h1:2NKgrcHl3z6cJs+3Oo940FPRiTzuqKbvfrL2RxCj6Ew= -github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= -github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= +github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw= +github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0= github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= @@ -48,8 +48,8 @@ github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/maxatome/go-testdeep v1.14.0 h1:rRlLv1+kI8eOI3OaBXZwb3O7xY3exRzdW5QyX48g9wI= github.com/maxatome/go-testdeep v1.14.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= -github.com/nebius/gosdk v0.0.0-20250826102719-940ad1dfb5de h1:7GbDUDyH22dvN7ata8HuNVuDlcyaDzUs/s+03Y3pDqU= -github.com/nebius/gosdk v0.0.0-20250826102719-940ad1dfb5de/go.mod h1:eVbm4Qc4GPzBn3EL4rLvy1WS9zqJDw+giksOA2NZERY= +github.com/nebius/gosdk v0.0.0-20251027103638-3d8d8840cff3 h1:Tn+MBlZmtJ+jAerv+WLkg7LO3bG/OBZthjsYtf1dwmk= +github.com/nebius/gosdk v0.0.0-20251027103638-3d8d8840cff3/go.mod h1:8r4EhhGJ+RMUfdiVVpZ8pEb0b+O7hLG8JXDAgGyu89o= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -66,8 +66,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/stretchr/testify v1.11.0 h1:ib4sjIrwZKxE5u/Japgo/7SJV3PvgjGiRNAvTVGqQl8= -github.com/stretchr/testify v1.11.0/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= @@ -80,28 +80,28 @@ go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFh go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= -golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= -golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= -golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b h1:DXr+pvt3nC887026GRP39Ej11UATqWDmWuS99x26cD0= -golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4= -golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= -golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= -golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= -golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 h1:mgKeJMpvi0yx/sU5GsxQ7p6s2wtOnGAHZWCHUM4KGzY= +golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5/go.mod h1:M4/wBTSeyLxupu3W3tJtOgB14jILAS/XWPSSa3TAlJc= -google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= -google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= -google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= -google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251022142026-3a174f9686a8 h1:M1rk8KBnUsBDg1oPGHNCxG4vc1f49epmTO7xscSajMk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251022142026-3a174f9686a8/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= +google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A= +google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/v1/providers/shadeform/client.go b/v1/providers/shadeform/client.go index 63cdf5cd..3258d840 100644 --- a/v1/providers/shadeform/client.go +++ b/v1/providers/shadeform/client.go @@ -58,8 +58,8 @@ func (c *ShadeformCredential) GetCapabilities(ctx context.Context) (v1.Capabilit } // MakeClient creates a new Shadeform client from this credential -func (c *ShadeformCredential) MakeClient(_ context.Context, _ string) (v1.CloudClient, error) { - return NewShadeformClient(c.RefID, c.APIKey), nil +func (c *ShadeformCredential) MakeClient(ctx context.Context, location string) (v1.CloudClient, error) { + return c.MakeClientWithOptions(ctx, location) } func (c *ShadeformCredential) MakeClientWithOptions(_ context.Context, _ string, opts ...ShadeformClientOption) (v1.CloudClient, error) { From 80742360a252caef13a7c59d748e2d7f27c855b1 Mon Sep 17 00:00:00 2001 From: Pratik Patel Date: Tue, 28 Oct 2025 09:47:23 -0700 Subject: [PATCH 5/5] feat(BREV-2049): undoing update --- go.mod | 28 +++++++++++++-------------- go.sum | 60 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/go.mod b/go.mod index e3e62a55..652a2535 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ toolchain go1.24.6 require ( github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b - github.com/bojanz/currency v1.4.0 + github.com/bojanz/currency v1.3.1 github.com/cenkalti/backoff v2.2.1+incompatible github.com/cenkalti/backoff/v4 v4.3.0 github.com/gliderlabs/ssh v0.3.8 @@ -14,30 +14,30 @@ require ( github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 github.com/jarcoal/httpmock v1.4.0 - github.com/nebius/gosdk v0.0.0-20251027103638-3d8d8840cff3 + github.com/nebius/gosdk v0.0.0-20250826102719-940ad1dfb5de github.com/pkg/errors v0.9.1 - github.com/stretchr/testify v1.11.1 - golang.org/x/crypto v0.43.0 + github.com/stretchr/testify v1.11.0 + golang.org/x/crypto v0.41.0 gopkg.in/validator.v2 v2.0.1 ) require ( - buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.10-20250912141014-52f32327d4b0.1 // indirect + buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.8-20250717185734-6c6e0d3c608e.1 // indirect github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect github.com/cockroachdb/apd/v3 v3.2.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/gofrs/flock v0.13.0 // indirect + github.com/gofrs/flock v0.12.1 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 // indirect github.com/kr/text v0.2.0 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 // indirect - golang.org/x/net v0.46.0 // indirect - golang.org/x/sync v0.17.0 // indirect - golang.org/x/sys v0.37.0 // indirect - golang.org/x/text v0.30.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20251022142026-3a174f9686a8 // indirect - google.golang.org/grpc v1.76.0 // indirect - google.golang.org/protobuf v1.36.10 // indirect + golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b // indirect + golang.org/x/net v0.43.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.35.0 // indirect + golang.org/x/text v0.28.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.8 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 550c472e..64dd1293 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,13 @@ -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.10-20250912141014-52f32327d4b0.1 h1:31on4W/yPcV4nZHL4+UCiCvLPsMqe/vJcNg8Rci0scc= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.10-20250912141014-52f32327d4b0.1/go.mod h1:fUl8CEN/6ZAMk6bP8ahBJPUJw7rbp+j4x+wCcYi2IG4= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.8-20250717185734-6c6e0d3c608e.1 h1:sjY1k5uszbIZfv11HO2keV4SLhNA47SabPO886v7Rvo= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.8-20250717185734-6c6e0d3c608e.1/go.mod h1:8EQ5GzyGJQ5tEIwMSxCl8RKJYsjCpAwkdcENoioXT6g= github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0= github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 h1:zV3ejI06GQ59hwDQAvmK1qxOQGB3WuVTRoY0okPTAv0= github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= -github.com/bojanz/currency v1.4.0 h1:sPLts/Qx3u0+FfYx+31NLYYOiOdPiH8mBWdJCAZHj3g= -github.com/bojanz/currency v1.4.0/go.mod h1:hv7AAJ5jNRvE/SXaJe74uBPg6syV21imy4yKP7fi9GM= +github.com/bojanz/currency v1.3.1 h1:3BUAvy/5hU/Pzqg5nrQslVihV50QG+A2xKPoQw1RKH4= +github.com/bojanz/currency v1.3.1/go.mod h1:jNoZiJyRTqoU5DFoa+n+9lputxPUDa8Fz8BdDrW06Go= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= @@ -26,8 +26,8 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ozzo/ozzo-validation/v4 v4.3.0 h1:byhDUpfEwjsVQb1vBunvIjh2BHQ9ead57VkAEY4V+Es= github.com/go-ozzo/ozzo-validation/v4 v4.3.0/go.mod h1:2NKgrcHl3z6cJs+3Oo940FPRiTzuqKbvfrL2RxCj6Ew= -github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw= -github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0= +github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= +github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= @@ -48,8 +48,8 @@ github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/maxatome/go-testdeep v1.14.0 h1:rRlLv1+kI8eOI3OaBXZwb3O7xY3exRzdW5QyX48g9wI= github.com/maxatome/go-testdeep v1.14.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= -github.com/nebius/gosdk v0.0.0-20251027103638-3d8d8840cff3 h1:Tn+MBlZmtJ+jAerv+WLkg7LO3bG/OBZthjsYtf1dwmk= -github.com/nebius/gosdk v0.0.0-20251027103638-3d8d8840cff3/go.mod h1:8r4EhhGJ+RMUfdiVVpZ8pEb0b+O7hLG8JXDAgGyu89o= +github.com/nebius/gosdk v0.0.0-20250826102719-940ad1dfb5de h1:7GbDUDyH22dvN7ata8HuNVuDlcyaDzUs/s+03Y3pDqU= +github.com/nebius/gosdk v0.0.0-20250826102719-940ad1dfb5de/go.mod h1:eVbm4Qc4GPzBn3EL4rLvy1WS9zqJDw+giksOA2NZERY= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -66,8 +66,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/stretchr/testify v1.11.0 h1:ib4sjIrwZKxE5u/Japgo/7SJV3PvgjGiRNAvTVGqQl8= +github.com/stretchr/testify v1.11.0/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= @@ -80,28 +80,28 @@ go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFh go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= -golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= -golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= -golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 h1:mgKeJMpvi0yx/sU5GsxQ7p6s2wtOnGAHZWCHUM4KGzY= -golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70= -golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= -golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= -golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= -golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= -golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= -golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= -golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= -golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= -golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= +golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b h1:DXr+pvt3nC887026GRP39Ej11UATqWDmWuS99x26cD0= +golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4= +golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= +golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251022142026-3a174f9686a8 h1:M1rk8KBnUsBDg1oPGHNCxG4vc1f49epmTO7xscSajMk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251022142026-3a174f9686a8/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= -google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A= -google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c= -google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= -google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5/go.mod h1:M4/wBTSeyLxupu3W3tJtOgB14jILAS/XWPSSa3TAlJc= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=