diff --git a/bindings/aws/s3/s3.go b/bindings/aws/s3/s3.go index 12b0d0517..30aa1f704 100644 --- a/bindings/aws/s3/s3.go +++ b/bindings/aws/s3/s3.go @@ -18,6 +18,7 @@ import ( "crypto/tls" b64 "encoding/base64" "encoding/json" + "errors" "fmt" "io" "net/http" @@ -27,8 +28,10 @@ import ( "time" "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" + "github.com/aws/aws-sdk-go/service/s3/s3manager" "github.com/google/uuid" @@ -300,6 +303,10 @@ func (s *AWSS3) get(ctx context.Context, req *bindings.InvokeRequest) (*bindings }, ) if err != nil { + var awsErr awserr.Error + if errors.As(err, &awsErr) && awsErr.Code() == s3.ErrCodeNoSuchKey { + return nil, fmt.Errorf("object not found") + } return nil, fmt.Errorf("s3 binding error: error downloading S3 object: %w", err) } @@ -331,6 +338,10 @@ func (s *AWSS3) delete(ctx context.Context, req *bindings.InvokeRequest) (*bindi }, ) if err != nil { + var awsErr awserr.Error + if errors.As(err, &awsErr) && awsErr.Code() == s3.ErrCodeNoSuchKey { + return nil, fmt.Errorf("object not found") + } return nil, fmt.Errorf("s3 binding error: delete operation failed: %w", err) } diff --git a/bindings/azure/blobstorage/blobstorage.go b/bindings/azure/blobstorage/blobstorage.go index 07b045901..c223072f7 100644 --- a/bindings/azure/blobstorage/blobstorage.go +++ b/bindings/azure/blobstorage/blobstorage.go @@ -25,6 +25,7 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" + "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/bloberror" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container" "github.com/google/uuid" @@ -190,6 +191,9 @@ func (a *AzureBlobStorage) get(ctx context.Context, req *bindings.InvokeRequest) blobDownloadResponse, err := blockBlobClient.DownloadStream(ctx, &downloadOptions) if err != nil { + if bloberror.HasCode(err, bloberror.BlobNotFound) { + return nil, fmt.Errorf("blob not found") + } return nil, fmt.Errorf("error downloading az blob: %w", err) } reader := blobDownloadResponse.Body @@ -256,6 +260,10 @@ func (a *AzureBlobStorage) delete(ctx context.Context, req *bindings.InvokeReque blockBlobClient = a.containerClient.NewBlockBlobClient(val) _, err := blockBlobClient.Delete(ctx, &deleteOptions) + if bloberror.HasCode(err, bloberror.BlobNotFound) { + return nil, fmt.Errorf("blob not found") + } + return nil, err } diff --git a/bindings/gcp/bucket/bucket.go b/bindings/gcp/bucket/bucket.go index 7d5943864..5fc9e7dec 100644 --- a/bindings/gcp/bucket/bucket.go +++ b/bindings/gcp/bucket/bucket.go @@ -18,14 +18,17 @@ import ( "context" b64 "encoding/base64" "encoding/json" + "errors" "fmt" "io" + "net/http" "net/url" "reflect" "strconv" "cloud.google.com/go/storage" "github.com/google/uuid" + "google.golang.org/api/googleapi" "google.golang.org/api/iterator" "google.golang.org/api/option" @@ -213,6 +216,11 @@ func (g *GCPStorage) get(ctx context.Context, req *bindings.InvokeRequest) (*bin var rc io.ReadCloser rc, err = g.client.Bucket(g.metadata.Bucket).Object(key).NewReader(ctx) if err != nil { + var apiErr *googleapi.Error + if errors.As(err, &apiErr) && apiErr.Code == http.StatusNotFound { + return nil, errors.New("object not found") + } + return nil, fmt.Errorf("gcp bucketgcp bucket binding error: error downloading bucket object: %w", err) } defer rc.Close() @@ -245,6 +253,11 @@ func (g *GCPStorage) delete(ctx context.Context, req *bindings.InvokeRequest) (* err := object.Delete(ctx) + var apiErr *googleapi.Error + if errors.As(err, &apiErr) && apiErr.Code == http.StatusNotFound { + return nil, errors.New("object not found") + } + return nil, err } diff --git a/bindings/huawei/obs/obs.go b/bindings/huawei/obs/obs.go index 0f1028466..d247970cb 100644 --- a/bindings/huawei/obs/obs.go +++ b/bindings/huawei/obs/obs.go @@ -17,8 +17,10 @@ import ( "bytes" "context" "encoding/json" + "errors" "fmt" "io" + "net/http" "reflect" "strconv" @@ -219,6 +221,10 @@ func (o *HuaweiOBS) get(ctx context.Context, req *bindings.InvokeRequest) (*bind out, err := o.service.GetObject(ctx, input) if err != nil { + var obsErr obs.ObsError + if errors.As(err, &obsErr) && obsErr.StatusCode == http.StatusNotFound { + return nil, errors.New("object not found") + } return nil, fmt.Errorf("obs binding error. error getting obs object: %w", err) } @@ -255,6 +261,10 @@ func (o *HuaweiOBS) delete(ctx context.Context, req *bindings.InvokeRequest) (*b out, err := o.service.DeleteObject(ctx, input) if err != nil { + var obsErr obs.ObsError + if errors.As(err, &obsErr) && obsErr.StatusCode == http.StatusNotFound { + return nil, errors.New("object not found") + } return nil, fmt.Errorf("obs binding error. error deleting obs object: %w", err) } diff --git a/tests/certification/bindings/aws/s3/s3_test.go b/tests/certification/bindings/aws/s3/s3_test.go index 0f52c96f2..77460f8e7 100644 --- a/tests/certification/bindings/aws/s3/s3_test.go +++ b/tests/certification/bindings/aws/s3/s3_test.go @@ -43,6 +43,7 @@ import ( const ( sidecarName = "bindings-s3-sidecar" bindingsMetadataName = "s3-cert-tests" + objNotFound = "object not found" ) var bucketName = "bucketName" @@ -207,7 +208,7 @@ func S3SBasic(t *testing.T) { // confirm the deletion. _, invokeSecondGetErr := getObjectRequest(ctx, client, objectName, false) assert.Error(t, invokeSecondGetErr) - assert.Contains(t, invokeSecondGetErr.Error(), "error downloading S3 object") + assert.Contains(t, invokeSecondGetErr.Error(), objNotFound) return nil } @@ -270,7 +271,7 @@ func S3SForcePathStyle(t *testing.T) { // confirm the deletion. _, invokeSecondGetErr := getObjectRequest(ctx, client, objectName, false) assert.Error(t, invokeSecondGetErr) - assert.Contains(t, invokeSecondGetErr.Error(), "error downloading S3 object") + assert.Contains(t, invokeSecondGetErr.Error(), objNotFound) return nil } diff --git a/tests/certification/bindings/azure/blobstorage/blobstorage_test.go b/tests/certification/bindings/azure/blobstorage/blobstorage_test.go index c04054441..520bea99a 100644 --- a/tests/certification/bindings/azure/blobstorage/blobstorage_test.go +++ b/tests/certification/bindings/azure/blobstorage/blobstorage_test.go @@ -46,7 +46,8 @@ import ( ) const ( - sidecarName = "blobstorage-sidecar" + sidecarName = "blobstorage-sidecar" + blobNotFound = "blob not found" ) // getBlobRequest is used to make a common binding request for the get operation. @@ -198,12 +199,12 @@ func TestBlobStorage(t *testing.T) { // confirm the deletion. _, invokeSecondGetErr := getBlobRequest(ctx, client, blobName, false) assert.Error(t, invokeSecondGetErr) - assert.Contains(t, invokeSecondGetErr.Error(), bloberror.BlobNotFound) + assert.Contains(t, invokeSecondGetErr.Error(), blobNotFound) // deleting the key again should fail. _, invokeDeleteErr2 := deleteBlobRequest(ctx, client, blobName, nil) assert.Error(t, invokeDeleteErr2) - assert.Contains(t, invokeDeleteErr2.Error(), bloberror.BlobNotFound) + assert.Contains(t, invokeDeleteErr2.Error(), blobNotFound) return nil } @@ -285,7 +286,7 @@ func TestBlobStorage(t *testing.T) { // confirm the deletion. _, invokeSecondGetErr := getBlobRequest(ctx, client, blobName, false) assert.Error(t, invokeSecondGetErr) - assert.Contains(t, invokeSecondGetErr.Error(), bloberror.BlobNotFound) + assert.Contains(t, invokeSecondGetErr.Error(), blobNotFound) return nil } @@ -425,7 +426,7 @@ func TestBlobStorage(t *testing.T) { // confirm the deletion. _, invokeSecondGetErr := getBlobRequest(ctx, client, "filename.txt", false) assert.Error(t, invokeSecondGetErr) - assert.Contains(t, invokeSecondGetErr.Error(), bloberror.BlobNotFound) + assert.Contains(t, invokeSecondGetErr.Error(), blobNotFound) return nil }