Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ We use *breaking :warning:* to mark changes that are not backward compatible (re
- [#43](https://github.com/thanos-io/objstore/pull/43) filesystem: abort filesystem bucket operations if the context has been cancelled
- [#44](https://github.com/thanos-io/objstore/pull/44) Add new metric to count total number of fetched bytes from bucket
- [#50](https://github.com/thanos-io/objstore/pull/50) Add Huawei Cloud OBS Object Storage Support
- [#59](https://github.com/thanos-io/objstore/pull/59) Adding method `IsCustomerManagedKeyError` on the bucket interface.

### Changed
- [#38](https://github.com/thanos-io/objstore/pull/38) *: Upgrade minio-go version to `v7.0.45`.
Expand Down
5 changes: 5 additions & 0 deletions inmem.go
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,11 @@ func (b *InMemBucket) IsObjNotFoundErr(err error) bool {
return errors.Is(err, errNotFound)
}

// IsCustomerManagedKeyError returns true if the permissions for key used to encrypt the object was revoked.
func (b *InMemBucket) IsCustomerManagedKeyError(_ error) bool {
return false
}

func (b *InMemBucket) Close() error { return nil }

// Name returns the bucket name.
Expand Down
7 changes: 7 additions & 0 deletions objstore.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,9 @@ type BucketReader interface {
// IsObjNotFoundErr returns true if error means that object is not found. Relevant to Get operations.
IsObjNotFoundErr(err error) bool

// IsCustomerManagedKeyError returns true if the permissions for key used to encrypt the object was revoked.
IsCustomerManagedKeyError(err error) bool
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we return a newly defined ErrInvalidCustomerManagedKey error and use errors.Cause to identify it? This way a client does not need an instance of the bucket in order to distinguish between error types.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I missed that we already have IsObjNotFoundErr, so I guess this should also be fine.


// Attributes returns information about the specified object.
Attributes(ctx context.Context, name string) (ObjectAttributes, error)
}
Expand Down Expand Up @@ -603,6 +606,10 @@ func (b *metricBucket) IsObjNotFoundErr(err error) bool {
return b.bkt.IsObjNotFoundErr(err)
}

func (b *metricBucket) IsCustomerManagedKeyError(err error) bool {
return b.bkt.IsCustomerManagedKeyError(err)
}

func (b *metricBucket) Close() error {
return b.bkt.Close()
}
Expand Down
5 changes: 5 additions & 0 deletions prefixed_bucket.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,11 @@ func (p *PrefixedBucket) IsObjNotFoundErr(err error) bool {
return p.bkt.IsObjNotFoundErr(err)
}

// IsCustomerManagedKeyError returns true if the permissions for key used to encrypt the object was revoked.
func (p *PrefixedBucket) IsCustomerManagedKeyError(err error) bool {
return p.bkt.IsCustomerManagedKeyError(err)
}

// Attributes returns information about the specified object.
func (p PrefixedBucket) Attributes(ctx context.Context, name string) (ObjectAttributes, error) {
return p.bkt.Attributes(ctx, conditionalPrefix(p.prefix, name))
Expand Down
5 changes: 5 additions & 0 deletions providers/azure/azure.go
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,11 @@ func (b *Bucket) IsObjNotFoundErr(err error) bool {
return bloberror.HasCode(err, bloberror.BlobNotFound) || bloberror.HasCode(err, bloberror.InvalidURI)
}

// IsCustomerManagedKeyError returns true if the permissions for key used to encrypt the object was revoked.
func (b *Bucket) IsCustomerManagedKeyError(_ error) bool {
return false
}

func (b *Bucket) getBlobReader(ctx context.Context, name string, httpRange blob.HTTPRange) (io.ReadCloser, error) {
level.Debug(b.logger).Log("msg", "getting blob", "blob", name, "offset", httpRange.Offset, "length", httpRange.Count)
if name == "" {
Expand Down
5 changes: 5 additions & 0 deletions providers/bos/bos.go
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,11 @@ func (b *Bucket) IsObjNotFoundErr(err error) bool {
return false
}

// IsCustomerManagedKeyError returns true if the permissions for key used to encrypt the object was revoked.
func (b *Bucket) IsCustomerManagedKeyError(_ error) bool {
return false
}

func (b *Bucket) getRange(_ context.Context, bucketName, objectKey string, off, length int64) (io.ReadCloser, error) {
if len(objectKey) == 0 {
return nil, errors.Errorf("given object name should not empty")
Expand Down
5 changes: 5 additions & 0 deletions providers/cos/cos.go
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,11 @@ func (b *Bucket) IsObjNotFoundErr(err error) bool {
}
}

// IsCustomerManagedKeyError returns true if the permissions for key used to encrypt the object was revoked.
func (b *Bucket) IsCustomerManagedKeyError(_ error) bool {
return false
}

func (b *Bucket) Close() error { return nil }

type objectInfo struct {
Expand Down
5 changes: 5 additions & 0 deletions providers/filesystem/filesystem.go
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,11 @@ func (b *Bucket) IsObjNotFoundErr(err error) bool {
return os.IsNotExist(errors.Cause(err))
}

// IsCustomerManagedKeyError returns true if the permissions for key used to encrypt the object was revoked.
func (b *Bucket) IsCustomerManagedKeyError(_ error) bool {
return false
}

func (b *Bucket) Close() error { return nil }

// Name returns the bucket name.
Expand Down
5 changes: 5 additions & 0 deletions providers/gcs/gcs.go
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,11 @@ func (b *Bucket) IsObjNotFoundErr(err error) bool {
return errors.Is(err, storage.ErrObjectNotExist)
}

// IsCustomerManagedKeyError returns true if the permissions for key used to encrypt the object was revoked.
func (b *Bucket) IsCustomerManagedKeyError(_ error) bool {
return false
}

func (b *Bucket) Close() error {
return b.closer.Close()
}
Expand Down
5 changes: 5 additions & 0 deletions providers/obs/obs.go
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,11 @@ func (b *Bucket) IsObjNotFoundErr(err error) bool {
return false
}

// IsCustomerManagedKeyError returns true if the permissions for key used to encrypt the object was revoked.
func (b *Bucket) IsCustomerManagedKeyError(_ error) bool {
return false
}

// Attributes returns information about the specified object.
func (b *Bucket) Attributes(ctx context.Context, name string) (objstore.ObjectAttributes, error) {
output, err := b.client.GetObjectMetadata(&obs.GetObjectMetadataInput{
Expand Down
5 changes: 5 additions & 0 deletions providers/oci/oci.go
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,11 @@ func (b *Bucket) IsObjNotFoundErr(err error) bool {
return false
}

// IsCustomerManagedKeyError returns true if the permissions for key used to encrypt the object was revoked.
func (b *Bucket) IsCustomerManagedKeyError(_ error) bool {
return false
}

// ObjectSize returns the size of the specified object.
func (b *Bucket) ObjectSize(ctx context.Context, name string) (uint64, error) {
response, err := getObject(ctx, *b, name, "")
Expand Down
5 changes: 5 additions & 0 deletions providers/oss/oss.go
Original file line number Diff line number Diff line change
Expand Up @@ -378,3 +378,8 @@ func (b *Bucket) IsObjNotFoundErr(err error) bool {
}
return false
}

// IsCustomerManagedKeyError returns true if the permissions for key used to encrypt the object was revoked.
func (b *Bucket) IsCustomerManagedKeyError(_ error) bool {
return false
}
6 changes: 6 additions & 0 deletions providers/s3/s3.go
Original file line number Diff line number Diff line change
Expand Up @@ -538,6 +538,12 @@ func (b *Bucket) IsObjNotFoundErr(err error) bool {
return minio.ToErrorResponse(errors.Cause(err)).Code == "NoSuchKey"
}

// IsCustomerManagedKeyError returns true if the permissions for key used to encrypt the object was revoked.
func (b *Bucket) IsCustomerManagedKeyError(err error) bool {
errResponse := minio.ToErrorResponse(errors.Cause(err))
return errResponse.Code == "AccessDenied" && errResponse.Message == "The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access."
}

func (b *Bucket) Close() error { return nil }

// getServerSideEncryption returns the SSE to use.
Expand Down
5 changes: 5 additions & 0 deletions providers/swift/swift.go
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,11 @@ func (c *Container) IsObjNotFoundErr(err error) bool {
return errors.Is(err, swift.ObjectNotFound)
}

// IsCustomerManagedKeyError returns true if the permissions for key used to encrypt the object was revoked.
func (b *Container) IsCustomerManagedKeyError(_ error) bool {
return false
}

// Upload writes the contents of the reader as an object into the container.
func (c *Container) Upload(_ context.Context, name string, r io.Reader) (err error) {
size, err := objstore.TryToGetSize(r)
Expand Down
4 changes: 4 additions & 0 deletions testing.go
Original file line number Diff line number Diff line change
Expand Up @@ -308,3 +308,7 @@ func (d *delayingBucket) IsObjNotFoundErr(err error) bool {
// No delay for a local operation.
return d.bkt.IsObjNotFoundErr(err)
}

func (d *delayingBucket) IsCustomerManagedKeyError(err error) bool {
return d.bkt.IsCustomerManagedKeyError(err)
}
4 changes: 4 additions & 0 deletions tracing.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,10 @@ func (t TracingBucket) IsObjNotFoundErr(err error) bool {
return t.bkt.IsObjNotFoundErr(err)
}

func (t TracingBucket) IsCustomerManagedKeyError(err error) bool {
return t.bkt.IsCustomerManagedKeyError(err)
}

func (t TracingBucket) WithExpectedErrs(expectedFunc IsOpFailureExpectedFunc) Bucket {
if ib, ok := t.bkt.(InstrumentedBucket); ok {
return TracingBucket{bkt: ib.WithExpectedErrs(expectedFunc)}
Expand Down