From e82e42935964675b6e0065d9b88953984b6bc974 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Thu, 29 Aug 2019 18:34:57 +0800 Subject: [PATCH] fix: compatible with minio s3 --- pkg/cloudprovider/objectstore.go | 17 ++++++++++++----- pkg/compute/models/buckets.go | 2 +- pkg/multicloud/objectstore/buckets.go | 4 ++-- pkg/multicloud/objectstore/object.go | 10 ++++++++-- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/pkg/cloudprovider/objectstore.go b/pkg/cloudprovider/objectstore.go index 17cbf069c1..f240f23bd6 100644 --- a/pkg/cloudprovider/objectstore.go +++ b/pkg/cloudprovider/objectstore.go @@ -242,12 +242,19 @@ func GetIObjects(bucket ICloudBucket, objectPrefix string, isRecursive bool) ([] } func GetIObject(bucket ICloudBucket, objectPrefix string) (ICloudObject, error) { - objects, err := GetIObjects(bucket, objectPrefix, true) - if err != nil { - return nil, errors.Wrap(err, "GetIObjects") + tryPrefix := []string{objectPrefix} + if strings.HasSuffix(objectPrefix, "/") { + tryPrefix = append(tryPrefix, objectPrefix[:len(objectPrefix)-1]) } - if len(objects) > 0 && objects[0].GetKey() == objectPrefix { - return objects[0], nil + for _, pref := range tryPrefix { + result, err := bucket.ListObjects(pref, "", "", 1) + if err != nil { + return nil, errors.Wrap(err, "bucket.ListObjects") + } + objects := result.Objects + if len(objects) > 0 && objects[0].GetKey() == objectPrefix { + return objects[0], nil + } } return nil, ErrNotFound } diff --git a/pkg/compute/models/buckets.go b/pkg/compute/models/buckets.go index cd9d2457d7..0fd5bfdd10 100644 --- a/pkg/compute/models/buckets.go +++ b/pkg/compute/models/buckets.go @@ -68,7 +68,7 @@ type SBucket struct { SManagedResourceBase - CloudregionId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"admin_required"` + CloudregionId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required"` StorageClass string `width:"36" charset:"ascii" nullable:"false" list:"user"` Location string `width:"36" charset:"ascii" nullable:"false" list:"user"` diff --git a/pkg/multicloud/objectstore/buckets.go b/pkg/multicloud/objectstore/buckets.go index f6f2506683..6f3820995c 100644 --- a/pkg/multicloud/objectstore/buckets.go +++ b/pkg/multicloud/objectstore/buckets.go @@ -168,10 +168,10 @@ func (bucket *SBucket) PutObject(ctx context.Context, key string, input io.Reade } obj, err := cloudprovider.GetIObject(bucket, key) if err != nil { - return errors.Wrap(err, "GetIObject") + return errors.Wrap(err, "cloudprovider.GetIObject") } err = obj.SetAcl(cannedAcl) - if err != nil { + if err != nil && errors.Cause(err) != cloudprovider.ErrNotImplemented { return errors.Wrap(err, "obj.SetAcl") } return nil diff --git a/pkg/multicloud/objectstore/object.go b/pkg/multicloud/objectstore/object.go index d740f52f9d..a3a35610f0 100644 --- a/pkg/multicloud/objectstore/object.go +++ b/pkg/multicloud/objectstore/object.go @@ -15,9 +15,11 @@ package objectstore import ( - "github.com/pkg/errors" + "strings" + "yunion.io/x/log" "yunion.io/x/onecloud/pkg/cloudprovider" + "yunion.io/x/pkg/errors" ) type SObject struct { @@ -42,7 +44,11 @@ func (o *SObject) GetAcl() cloudprovider.TBucketACLType { func (o *SObject) SetAcl(aclStr cloudprovider.TBucketACLType) error { err := o.bucket.client.SetObjectAcl(o.bucket.Name, o.Key, aclStr) if err != nil { - return errors.Wrap(err, "o.bucket.client.SetObjectAcl") + if strings.Contains(err.Error(), "not implemented") { + return cloudprovider.ErrNotImplemented + } else { + return errors.Wrap(err, "o.bucket.client.SetObjectAcl") + } } return nil }