Skip to content

Commit

Permalink
Handle object not found error in bindings: S3, Azure Blob Storage, GC…
Browse files Browse the repository at this point in the history
…P Bucket, Huawei OBS (#3223)

Signed-off-by: sadath-12 <[email protected]>
Signed-off-by: Alessandro (Ale) Segala <[email protected]>
Co-authored-by: Alessandro (Ale) Segala <[email protected]>
  • Loading branch information
sadath-12 and ItalyPaleAle authored Nov 13, 2023
1 parent dd8d2ba commit 95690ac
Show file tree
Hide file tree
Showing 6 changed files with 51 additions and 7 deletions.
11 changes: 11 additions & 0 deletions bindings/aws/s3/s3.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"crypto/tls"
b64 "encoding/base64"
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
Expand All @@ -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"

Expand Down Expand Up @@ -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)
}

Expand Down Expand Up @@ -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)
}

Expand Down
8 changes: 8 additions & 0 deletions bindings/azure/blobstorage/blobstorage.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
}

Expand Down
13 changes: 13 additions & 0 deletions bindings/gcp/bucket/bucket.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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
}

Expand Down
10 changes: 10 additions & 0 deletions bindings/huawei/obs/obs.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,10 @@ import (
"bytes"
"context"
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
"reflect"
"strconv"

Expand Down Expand Up @@ -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)
}

Expand Down Expand Up @@ -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)
}

Expand Down
5 changes: 3 additions & 2 deletions tests/certification/bindings/aws/s3/s3_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ import (
const (
sidecarName = "bindings-s3-sidecar"
bindingsMetadataName = "s3-cert-tests"
objNotFound = "object not found"
)

var bucketName = "bucketName"
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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
}
Expand Down

0 comments on commit 95690ac

Please sign in to comment.