mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-21 06:09:39 +08:00
132 lines
3.6 KiB
Go
132 lines
3.6 KiB
Go
// Copyright 2019 Yunion
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package google
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
|
|
"cloud.google.com/go/storage"
|
|
|
|
"yunion.io/x/jsonutils"
|
|
"yunion.io/x/pkg/errors"
|
|
|
|
"yunion.io/x/onecloud/pkg/cloudprovider"
|
|
)
|
|
|
|
type GCSAcl struct {
|
|
Kind string
|
|
Id string
|
|
SelfLink string
|
|
Bucket string
|
|
Entity string
|
|
Role string
|
|
Etag string
|
|
ProjectTeam map[string]string
|
|
}
|
|
|
|
func (region *SRegion) GetBucketAcl(bucket string) ([]GCSAcl, error) {
|
|
resource := fmt.Sprintf("b/%s/acl", bucket)
|
|
acls := []GCSAcl{}
|
|
err := region.StorageListAll(resource, map[string]string{}, &acls)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "StorageListAll(%s)", resource)
|
|
}
|
|
return acls, nil
|
|
}
|
|
|
|
func (region *SRegion) SetObjectAcl(bucket, object string, cannedAcl cloudprovider.TBucketACLType) error {
|
|
resource := fmt.Sprintf("b/%s/o/%s", bucket, url.PathEscape(object))
|
|
acl := map[string]string{}
|
|
switch cannedAcl {
|
|
case cloudprovider.ACLPrivate:
|
|
acls, err := region.GetObjectAcl(bucket, object)
|
|
if err != nil {
|
|
return errors.Wrap(err, "GetObjectAcl")
|
|
}
|
|
for _, _acl := range acls {
|
|
if _acl.Entity == string(storage.AllUsers) || _acl.Entity == string(storage.AllAuthenticatedUsers) {
|
|
resource := fmt.Sprintf("b/%s/o/%s/acl/%s", bucket, url.PathEscape(object), _acl.Entity)
|
|
err = region.StorageDelete(resource)
|
|
if err != nil {
|
|
return errors.Wrapf(err, "StorageDelete(%s)", resource)
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
case cloudprovider.ACLAuthRead:
|
|
acl["entity"] = "allAuthenticatedUsers"
|
|
acl["role"] = "READER"
|
|
case cloudprovider.ACLPublicRead:
|
|
acl["entity"] = "allUsers"
|
|
acl["role"] = "READER"
|
|
case cloudprovider.ACLPublicReadWrite:
|
|
acl["entity"] = "allUsers"
|
|
acl["role"] = "OWNER"
|
|
}
|
|
body := jsonutils.Marshal(acl)
|
|
return region.StorageDo(resource, "acl", nil, body)
|
|
}
|
|
|
|
type BindingCondition struct {
|
|
Title string
|
|
Description string
|
|
Expression string
|
|
}
|
|
|
|
type SBucketBinding struct {
|
|
Role string
|
|
Members []string
|
|
Condition BindingCondition
|
|
}
|
|
|
|
type SBucketIam struct {
|
|
Version int
|
|
Kind string
|
|
ResourceId string
|
|
Bindings []SBucketBinding
|
|
Etag string
|
|
}
|
|
|
|
func (region *SRegion) GetBucketIam(bucket string) (*SBucketIam, error) {
|
|
resource := fmt.Sprintf("b/%s/iam", bucket)
|
|
iam := SBucketIam{}
|
|
err := region.StorageGet(resource, &iam)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "StorageListAll(%s)", resource)
|
|
}
|
|
return &iam, nil
|
|
}
|
|
|
|
func (region *SRegion) SetBucketIam(bucket string, iam *SBucketIam) (*SBucketIam, error) {
|
|
resource := fmt.Sprintf("b/%s/iam", bucket)
|
|
ret := SBucketIam{}
|
|
err := region.StoragePut(resource, jsonutils.Marshal(iam), &ret)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "StoragePut(%s)", resource)
|
|
}
|
|
return &ret, nil
|
|
}
|
|
|
|
func (region *SRegion) GetObjectAcl(bucket string, object string) ([]GCSAcl, error) {
|
|
resource := fmt.Sprintf("b/%s/o/%s/acl", bucket, url.PathEscape(object))
|
|
acls := []GCSAcl{}
|
|
err := region.StorageListAll(resource, map[string]string{}, &acls)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "StorageListAll(%s)", resource)
|
|
}
|
|
return acls, nil
|
|
}
|