Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
}
11 changes: 10 additions & 1 deletion providers/s3/s3.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,9 @@ const (

// Storage class header.
amzStorageClass = "X-Amz-Storage-Class"

// amzKmsKeyAccessDeniedErrorMessage is the error message returned by s3 when the permissions to the KMS key is revoked.
amzKmsKeyAccessDeniedErrorMessage = "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."
)

var DefaultConfig = Config{
Expand Down Expand Up @@ -144,7 +147,7 @@ type Config struct {
}

// SSEConfig deals with the configuration of SSE for Minio. The following options are valid:
// kmsencryptioncontext == https://docs.aws.amazon.com/kms/latest/developerguide/services-s3.html#s3-encryption-context
// KMSEncryptionContext == https://docs.aws.amazon.com/kms/latest/developerguide/services-s3.html#s3-encryption-context
type SSEConfig struct {
Type string `yaml:"type"`
KMSKeyID string `yaml:"kms_key_id"`
Expand Down Expand Up @@ -538,6 +541,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 == amzKmsKeyAccessDeniedErrorMessage
}

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