diff --git a/pkg/multicloud/huawei/region.go b/pkg/multicloud/huawei/region.go index d45ba9da6f..e69a53365b 100644 --- a/pkg/multicloud/huawei/region.go +++ b/pkg/multicloud/huawei/region.go @@ -971,6 +971,16 @@ func (region *SRegion) CreateIBucket(name string, storageClassStr string, aclStr return nil } +func obsHttpCode(err error) int { + switch httpErr := err.(type) { + case obs.ObsError: + return httpErr.StatusCode + case *obs.ObsError: + return httpErr.StatusCode + } + return -1 +} + func (region *SRegion) DeleteIBucket(name string) error { obsClient, err := region.getOBSClient() if err != nil { @@ -978,9 +988,10 @@ func (region *SRegion) DeleteIBucket(name string) error { } _, err = obsClient.DeleteBucket(name) if err != nil { - if strings.Index(err.Error(), "Code=NoSuchBucket") >= 0 { + if obsHttpCode(err) == 404 { return nil } + log.Debugf("%#v %s", err, err) return errors.Wrap(err, "DeleteBucket") } region.client.invalidateIBuckets() @@ -994,7 +1005,12 @@ func (region *SRegion) IBucketExist(name string) (bool, error) { } _, err = obsClient.HeadBucket(name) if err != nil { - return false, errors.Wrap(err, "HeadBucket") + if obsHttpCode(err) == 404 { + return false, nil + } else { + log.Debugf("%#v %s", err, err) + return false, errors.Wrap(err, "HeadBucket") + } } return true, nil } diff --git a/pkg/multicloud/huawei/storagecache.go b/pkg/multicloud/huawei/storagecache.go index 3867874dac..8b0b934980 100644 --- a/pkg/multicloud/huawei/storagecache.go +++ b/pkg/multicloud/huawei/storagecache.go @@ -163,12 +163,9 @@ func (self *SStoragecache) UploadImage(ctx context.Context, userCred mcclient.To func (self *SStoragecache) uploadImage(ctx context.Context, userCred mcclient.TokenCredential, image *cloudprovider.SImageCreateOption, isForce bool) (string, error) { bucketName := GetBucketName(self.region.GetId(), image.ImageId) - exist, err := self.region.IBucketExist(bucketName) - if err != nil { - return "", errors.Wrap(err, "self.region.IBucketExist") - } + exist, _ := self.region.IBucketExist(bucketName) if !exist { - err = self.region.CreateIBucket(bucketName, "", "") + err := self.region.CreateIBucket(bucketName, "", "") if err != nil { return "", errors.Wrap(err, "CreateIBucket") } diff --git a/pkg/multicloud/qcloud/region.go b/pkg/multicloud/qcloud/region.go index 81b5c9b0bd..eb17ee169c 100644 --- a/pkg/multicloud/qcloud/region.go +++ b/pkg/multicloud/qcloud/region.go @@ -905,6 +905,9 @@ func (region *SRegion) IBucketExist(name string) (bool, error) { } _, err = coscli.Bucket.Head(context.Background()) if err != nil { + if cosHttpCode(err) == 404 { + return false, nil + } return false, errors.Wrap(err, "BucketExists") } return true, nil diff --git a/pkg/multicloud/qcloud/storagecache.go b/pkg/multicloud/qcloud/storagecache.go index 0a56493fa6..220e66ee09 100644 --- a/pkg/multicloud/qcloud/storagecache.go +++ b/pkg/multicloud/qcloud/storagecache.go @@ -22,8 +22,8 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" - "github.com/pkg/errors" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/compute/options"