Handle object not found error in bindings: S3, Azure Blob Storage, GCP Bucket, Huawei OBS (#3223)

Signed-off-by: sadath-12 <sadathsadu2002@gmail.com>
Signed-off-by: Alessandro (Ale) Segala <43508+ItalyPaleAle@users.noreply.github.com>
Co-authored-by: Alessandro (Ale) Segala <43508+ItalyPaleAle@users.noreply.github.com>
This commit is contained in:
syedsadath-17 2023-11-14 02:15:05 +05:30 committed by GitHub
parent dd8d2ba185
commit 95690ac052
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 51 additions and 7 deletions

View File

@ -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)
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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)
}

View File

@ -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
}

View File

@ -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
}