From 8cd2e4a27175ca997e86eb000d2153cc9a60afd2 Mon Sep 17 00:00:00 2001 From: Shivam Date: Wed, 18 Feb 2026 15:23:22 +0530 Subject: [PATCH 1/3] fix(nebius): add create-instance error handling for ResourceExhausted --- v1/providers/nebius/errors.go | 15 +++++++++++++++ v1/providers/nebius/instance.go | 7 ++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/v1/providers/nebius/errors.go b/v1/providers/nebius/errors.go index fd4b311d..01119333 100644 --- a/v1/providers/nebius/errors.go +++ b/v1/providers/nebius/errors.go @@ -30,6 +30,21 @@ func isNotFoundError(err error) bool { return false } +func handleErrToCloudErr(e error) error { + if e == nil { + return nil + } + + // Check for gRPC ResourceExhausted status code + if grpcStatus, ok := status.FromError(e); ok { + if grpcStatus.Code() == codes.ResourceExhausted { + return v1.ErrOutOfQuota + } + } + return e +} + + // isAlreadyExistsError checks if an error is an "already exists" error // //nolint:unused // Reserved for future error handling improvements diff --git a/v1/providers/nebius/instance.go b/v1/providers/nebius/instance.go index 3460efdb..abeeaee7 100644 --- a/v1/providers/nebius/instance.go +++ b/v1/providers/nebius/instance.go @@ -143,17 +143,18 @@ func (c *NebiusClient) CreateInstance(ctx context.Context, attrs v1.CreateInstan operation, err := c.sdk.Services().Compute().V1().Instance().Create(ctx, createReq) if err != nil { - return nil, errors.WrapAndTrace(err) + return nil, errors.WrapAndTrace(handleErrToCloudErr(err)) } // Wait for the operation to complete and get the actual instance ID finalOp, err := operation.Wait(ctx) if err != nil { - return nil, errors.WrapAndTrace(err) + return nil, errors.WrapAndTrace(handleErrToCloudErr(err)) } if !finalOp.Successful() { - return nil, fmt.Errorf("instance creation failed: %v", finalOp.Status()) + statusErr := fmt.Errorf("instance creation failed: %v", finalOp.Status()) + return nil, handleErrToCloudErr(statusErr) } // Get the actual instance ID from the completed operation From e29a50561a0d2923233df4d787c53d29edc7f791 Mon Sep 17 00:00:00 2001 From: Shivam Date: Wed, 18 Feb 2026 15:53:23 +0530 Subject: [PATCH 2/3] chore:package added --- v1/providers/nebius/errors.go | 1 + 1 file changed, 1 insertion(+) diff --git a/v1/providers/nebius/errors.go b/v1/providers/nebius/errors.go index 01119333..f0d6929c 100644 --- a/v1/providers/nebius/errors.go +++ b/v1/providers/nebius/errors.go @@ -3,6 +3,7 @@ package v1 import ( "fmt" + v1 "github.com/brevdev/cloud/v1" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) From ed882ed73fae0f85c979050dd85213e965193118 Mon Sep 17 00:00:00 2001 From: Shivam Date: Wed, 18 Feb 2026 17:22:48 +0530 Subject: [PATCH 3/3] fix: lint error --- v1/providers/nebius/errors.go | 21 ++++++++++----------- v1/providers/nebius/instance.go | 4 ++-- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/v1/providers/nebius/errors.go b/v1/providers/nebius/errors.go index f0d6929c..49a87d80 100644 --- a/v1/providers/nebius/errors.go +++ b/v1/providers/nebius/errors.go @@ -32,20 +32,19 @@ func isNotFoundError(err error) bool { } func handleErrToCloudErr(e error) error { - if e == nil { - return nil - } + if e == nil { + return nil + } - // Check for gRPC ResourceExhausted status code - if grpcStatus, ok := status.FromError(e); ok { - if grpcStatus.Code() == codes.ResourceExhausted { - return v1.ErrOutOfQuota - } - } - return e + // Check for gRPC ResourceExhausted status code + if grpcStatus, ok := status.FromError(e); ok { + if grpcStatus.Code() == codes.ResourceExhausted { + return v1.ErrOutOfQuota + } + } + return e } - // isAlreadyExistsError checks if an error is an "already exists" error // //nolint:unused // Reserved for future error handling improvements diff --git a/v1/providers/nebius/instance.go b/v1/providers/nebius/instance.go index abeeaee7..40c569ee 100644 --- a/v1/providers/nebius/instance.go +++ b/v1/providers/nebius/instance.go @@ -153,8 +153,8 @@ func (c *NebiusClient) CreateInstance(ctx context.Context, attrs v1.CreateInstan } if !finalOp.Successful() { - statusErr := fmt.Errorf("instance creation failed: %v", finalOp.Status()) - return nil, handleErrToCloudErr(statusErr) + statusErr := fmt.Errorf("instance creation failed: %v", finalOp.Status()) + return nil, handleErrToCloudErr(statusErr) } // Get the actual instance ID from the completed operation