Source File
bucket.go
Belonging Package
cloud.google.com/go/storage
package storage
import (
raw
)
type BucketHandle struct {
c *Client
name string
acl ACLHandle
defaultObjectACL ACLHandle
conds *BucketConditions
userProject string // project for Requester Pays buckets
}
if .Location == "" && .Lifecycle != nil {
.Location = "US"
}
:= .c.raw.Buckets.Insert(, )
setClientHeader(.Header())
if != nil && .PredefinedACL != "" {
.PredefinedAcl(.PredefinedACL)
}
if != nil && .PredefinedDefaultObjectACL != "" {
.PredefinedDefaultObjectAcl(.PredefinedDefaultObjectACL)
}
return runWithRetry(, func() error { , := .Context().Do(); return })
}
func ( *BucketHandle) ( context.Context) ( error) {
= trace.StartSpan(, "cloud.google.com/go/storage.Bucket.Delete")
defer func() { trace.EndSpan(, ) }()
, := .newDeleteCall()
if != nil {
return
}
return runWithRetry(, func() error { return .Context().Do() })
}
func ( *BucketHandle) () (*raw.BucketsDeleteCall, error) {
:= .c.raw.Buckets.Delete(.name)
setClientHeader(.Header())
if := applyBucketConds("BucketHandle.Delete", .conds, ); != nil {
return nil,
}
if .userProject != "" {
.UserProject(.userProject)
}
return , nil
}
func ( *BucketHandle) () *ACLHandle {
return &.acl
}
func ( *BucketHandle) () *ACLHandle {
return &.defaultObjectACL
}
func ( *BucketHandle) ( string) *ObjectHandle {
return &ObjectHandle{
c: .c,
bucket: .name,
object: ,
acl: ACLHandle{
c: .c,
bucket: .name,
object: ,
userProject: .userProject,
},
gen: -1,
userProject: .userProject,
}
}
func ( *BucketHandle) ( context.Context) ( *BucketAttrs, error) {
= trace.StartSpan(, "cloud.google.com/go/storage.Bucket.Attrs")
defer func() { trace.EndSpan(, ) }()
, := .newGetCall()
if != nil {
return nil,
}
var *raw.Bucket
= runWithRetry(, func() error {
, = .Context().Do()
return
})
if , := .(*googleapi.Error); && .Code == http.StatusNotFound {
return nil, ErrBucketNotExist
}
if != nil {
return nil,
}
return newBucket()
}
func ( *BucketHandle) () (*raw.BucketsGetCall, error) {
:= .c.raw.Buckets.Get(.name).Projection("full")
setClientHeader(.Header())
if := applyBucketConds("BucketHandle.Attrs", .conds, ); != nil {
return nil,
}
if .userProject != "" {
.UserProject(.userProject)
}
return , nil
}
func ( *BucketHandle) ( context.Context, BucketAttrsToUpdate) ( *BucketAttrs, error) {
= trace.StartSpan(, "cloud.google.com/go/storage.Bucket.Create")
defer func() { trace.EndSpan(, ) }()
, := .newPatchCall(&)
if != nil {
return nil,
}
if .PredefinedACL != "" {
.PredefinedAcl(.PredefinedACL)
}
if .PredefinedDefaultObjectACL != "" {
.PredefinedDefaultObjectAcl(.PredefinedDefaultObjectACL)
, := .Context().Do()
if != nil {
return nil,
}
return newBucket()
}
func ( *BucketHandle) ( *BucketAttrsToUpdate) (*raw.BucketsPatchCall, error) {
:= .toRawBucket()
:= .c.raw.Buckets.Patch(.name, ).Projection("full")
setClientHeader(.Header())
if := applyBucketConds("BucketHandle.Update", .conds, ); != nil {
return nil,
}
if .userProject != "" {
.UserProject(.userProject)
}
return , nil
}
type Lifecycle struct {
Rules []LifecycleRule
}
rfc3339Date = "2006-01-02"
DeleteAction = "Delete"
SetStorageClassAction = "SetStorageClass"
)
Archived
)
NotFoundPage string
}
func ( *raw.Bucket) (*BucketAttrs, error) {
if == nil {
return nil, nil
}
, := toRetentionPolicy(.RetentionPolicy)
if != nil {
return nil,
}
return &BucketAttrs{
Name: .Name,
Location: .Location,
MetaGeneration: .Metageneration,
DefaultEventBasedHold: .DefaultEventBasedHold,
StorageClass: .StorageClass,
Created: convertTime(.TimeCreated),
VersioningEnabled: .Versioning != nil && .Versioning.Enabled,
ACL: toBucketACLRules(.Acl),
DefaultObjectACL: toObjectACLRules(.DefaultObjectAcl),
Labels: .Labels,
RequesterPays: .Billing != nil && .Billing.RequesterPays,
Lifecycle: toLifecycle(.Lifecycle),
RetentionPolicy: ,
CORS: toCORS(.Cors),
Encryption: toBucketEncryption(.Encryption),
Logging: toBucketLogging(.Logging),
Website: toBucketWebsite(.Website),
BucketPolicyOnly: toBucketPolicyOnly(.IamConfiguration),
UniformBucketLevelAccess: toUniformBucketLevelAccess(.IamConfiguration),
Etag: .Etag,
LocationType: .LocationType,
}, nil
}
var *raw.BucketVersioning
if .VersioningEnabled {
= &raw.BucketVersioning{Enabled: true}
}
var *raw.BucketBilling
if .RequesterPays {
= &raw.BucketBilling{RequesterPays: true}
}
var *raw.BucketIamConfiguration
if .UniformBucketLevelAccess.Enabled || .BucketPolicyOnly.Enabled {
= &raw.BucketIamConfiguration{
UniformBucketLevelAccess: &raw.BucketIamConfigurationUniformBucketLevelAccess{
Enabled: true,
},
}
}
return &raw.Bucket{
Name: .Name,
Location: .Location,
StorageClass: .StorageClass,
Acl: toRawBucketACL(.ACL),
DefaultObjectAcl: toRawObjectACL(.DefaultObjectACL),
Versioning: ,
Labels: ,
Billing: ,
Lifecycle: toRawLifecycle(.Lifecycle),
RetentionPolicy: .RetentionPolicy.toRawRetentionPolicy(),
Cors: toRawCORS(.CORS),
Encryption: .Encryption.toRawBucketEncryption(),
Logging: .Logging.toRawBucketLogging(),
Website: .Website.toRawBucketWebsite(),
IamConfiguration: ,
}
}
func ( *BucketAttrsToUpdate) ( string) {
if .deleteLabels == nil {
.deleteLabels = map[string]bool{}
}
.deleteLabels[] = true
}
func ( *BucketAttrsToUpdate) () *raw.Bucket {
:= &raw.Bucket{}
if .CORS != nil {
.Cors = toRawCORS(.CORS)
.ForceSendFields = append(.ForceSendFields, "Cors")
}
if .DefaultEventBasedHold != nil {
.DefaultEventBasedHold = optional.ToBool(.DefaultEventBasedHold)
.ForceSendFields = append(.ForceSendFields, "DefaultEventBasedHold")
}
if .RetentionPolicy != nil {
if .RetentionPolicy.RetentionPeriod == 0 {
.NullFields = append(.NullFields, "RetentionPolicy")
.RetentionPolicy = nil
} else {
.RetentionPolicy = .RetentionPolicy.toRawRetentionPolicy()
}
}
if .VersioningEnabled != nil {
.Versioning = &raw.BucketVersioning{
Enabled: optional.ToBool(.VersioningEnabled),
ForceSendFields: []string{"Enabled"},
}
}
if .RequesterPays != nil {
.Billing = &raw.BucketBilling{
RequesterPays: optional.ToBool(.RequesterPays),
ForceSendFields: []string{"RequesterPays"},
}
}
if .BucketPolicyOnly != nil {
.IamConfiguration = &raw.BucketIamConfiguration{
UniformBucketLevelAccess: &raw.BucketIamConfigurationUniformBucketLevelAccess{
Enabled: .BucketPolicyOnly.Enabled,
ForceSendFields: []string{"Enabled"},
},
}
}
if .UniformBucketLevelAccess != nil {
.IamConfiguration = &raw.BucketIamConfiguration{
UniformBucketLevelAccess: &raw.BucketIamConfigurationUniformBucketLevelAccess{
Enabled: .UniformBucketLevelAccess.Enabled,
ForceSendFields: []string{"Enabled"},
},
}
}
if .Encryption != nil {
if .Encryption.DefaultKMSKeyName == "" {
.NullFields = append(.NullFields, "Encryption")
.Encryption = nil
} else {
.Encryption = .Encryption.toRawBucketEncryption()
}
}
if .Lifecycle != nil {
.Lifecycle = toRawLifecycle(*.Lifecycle)
.ForceSendFields = append(.ForceSendFields, "Lifecycle")
}
if .Logging != nil {
if *.Logging == (BucketLogging{}) {
.NullFields = append(.NullFields, "Logging")
.Logging = nil
} else {
.Logging = .Logging.toRawBucketLogging()
}
}
if .Website != nil {
if *.Website == (BucketWebsite{}) {
.NullFields = append(.NullFields, "Website")
.Website = nil
} else {
.Website = .Website.toRawBucketWebsite()
}
}
.Acl = nil
.ForceSendFields = append(.ForceSendFields, "Acl")
}
.DefaultObjectAcl = nil
.ForceSendFields = append(.ForceSendFields, "DefaultObjectAcl")
}
if .setLabels != nil || .deleteLabels != nil {
.Labels = map[string]string{}
for , := range .setLabels {
.Labels[] =
}
if len(.Labels) == 0 && len(.deleteLabels) > 0 {
.ForceSendFields = append(.ForceSendFields, "Labels")
}
for := range .deleteLabels {
.NullFields = append(.NullFields, "Labels."+)
}
}
return
}
func ( *BucketHandle) ( BucketConditions) *BucketHandle {
:= *
.conds = &
return &
}
MetagenerationNotMatch int64
}
func ( *BucketConditions) ( string) error {
if * == (BucketConditions{}) {
return fmt.Errorf("storage: %s: empty conditions", )
}
if .MetagenerationMatch != 0 && .MetagenerationNotMatch != 0 {
return fmt.Errorf("storage: %s: multiple conditions specified for metageneration", )
}
return nil
}
func ( *BucketHandle) ( string) *BucketHandle {
:= *
.userProject =
.acl.userProject =
.defaultObjectACL.userProject =
return &
}
func ( string, *BucketConditions, interface{}) error {
if == nil {
return nil
}
if := .validate(); != nil {
return
}
:= reflect.ValueOf()
switch {
case .MetagenerationMatch != 0:
if !setConditionField(, "IfMetagenerationMatch", .MetagenerationMatch) {
return fmt.Errorf("storage: %s: ifMetagenerationMatch not supported", )
}
case .MetagenerationNotMatch != 0:
if !setConditionField(, "IfMetagenerationNotMatch", .MetagenerationNotMatch) {
return fmt.Errorf("storage: %s: ifMetagenerationNotMatch not supported", )
}
}
return nil
}
func ( *RetentionPolicy) () *raw.BucketRetentionPolicy {
if == nil {
return nil
}
return &raw.BucketRetentionPolicy{
RetentionPeriod: int64(.RetentionPeriod / time.Second),
}
}
func ( *raw.BucketRetentionPolicy) (*RetentionPolicy, error) {
if == nil {
return nil, nil
}
, := time.Parse(time.RFC3339, .EffectiveTime)
if != nil {
return nil,
}
return &RetentionPolicy{
RetentionPeriod: time.Duration(.RetentionPeriod) * time.Second,
EffectiveTime: ,
IsLocked: .IsLocked,
}, nil
}
func ( []CORS) []*raw.BucketCors {
var []*raw.BucketCors
for , := range {
= append(, &raw.BucketCors{
MaxAgeSeconds: int64(.MaxAge / time.Second),
Method: .Methods,
Origin: .Origins,
ResponseHeader: .ResponseHeaders,
})
}
return
}
func ( []*raw.BucketCors) []CORS {
var []CORS
for , := range {
= append(, CORS{
MaxAge: time.Duration(.MaxAgeSeconds) * time.Second,
Methods: .Method,
Origins: .Origin,
ResponseHeaders: .ResponseHeader,
})
}
return
}
func ( Lifecycle) *raw.BucketLifecycle {
var raw.BucketLifecycle
if len(.Rules) == 0 {
.ForceSendFields = []string{"Rule"}
}
for , := range .Rules {
:= &raw.BucketLifecycleRule{
Action: &raw.BucketLifecycleRuleAction{
Type: .Action.Type,
StorageClass: .Action.StorageClass,
},
Condition: &raw.BucketLifecycleRuleCondition{
Age: .Condition.AgeInDays,
MatchesStorageClass: .Condition.MatchesStorageClasses,
NumNewerVersions: .Condition.NumNewerVersions,
},
}
switch .Condition.Liveness {
case LiveAndArchived:
.Condition.IsLive = nil
case Live:
.Condition.IsLive = googleapi.Bool(true)
case Archived:
.Condition.IsLive = googleapi.Bool(false)
}
if !.Condition.CreatedBefore.IsZero() {
.Condition.CreatedBefore = .Condition.CreatedBefore.Format(rfc3339Date)
}
.Rule = append(.Rule, )
}
return &
}
func ( *raw.BucketLifecycle) Lifecycle {
var Lifecycle
if == nil {
return
}
for , := range .Rule {
:= LifecycleRule{
Action: LifecycleAction{
Type: .Action.Type,
StorageClass: .Action.StorageClass,
},
Condition: LifecycleCondition{
AgeInDays: .Condition.Age,
MatchesStorageClasses: .Condition.MatchesStorageClass,
NumNewerVersions: .Condition.NumNewerVersions,
},
}
if .Condition.IsLive == nil {
.Condition.Liveness = LiveAndArchived
} else if *.Condition.IsLive {
.Condition.Liveness = Live
} else {
.Condition.Liveness = Archived
}
if .Condition.CreatedBefore != "" {
.Condition.CreatedBefore, _ = time.Parse(rfc3339Date, .Condition.CreatedBefore)
}
.Rules = append(.Rules, )
}
return
}
func ( *BucketEncryption) () *raw.BucketEncryption {
if == nil {
return nil
}
return &raw.BucketEncryption{
DefaultKmsKeyName: .DefaultKMSKeyName,
}
}
func ( *raw.BucketEncryption) *BucketEncryption {
if == nil {
return nil
}
return &BucketEncryption{DefaultKMSKeyName: .DefaultKmsKeyName}
}
func ( *BucketLogging) () *raw.BucketLogging {
if == nil {
return nil
}
return &raw.BucketLogging{
LogBucket: .LogBucket,
LogObjectPrefix: .LogObjectPrefix,
}
}
func ( *raw.BucketLogging) *BucketLogging {
if == nil {
return nil
}
return &BucketLogging{
LogBucket: .LogBucket,
LogObjectPrefix: .LogObjectPrefix,
}
}
func ( *BucketWebsite) () *raw.BucketWebsite {
if == nil {
return nil
}
return &raw.BucketWebsite{
MainPageSuffix: .MainPageSuffix,
NotFoundPage: .NotFoundPage,
}
}
func ( *raw.BucketWebsite) *BucketWebsite {
if == nil {
return nil
}
return &BucketWebsite{
MainPageSuffix: .MainPageSuffix,
NotFoundPage: .NotFoundPage,
}
}
func ( *raw.BucketIamConfiguration) BucketPolicyOnly {
if == nil || .BucketPolicyOnly == nil || !.BucketPolicyOnly.Enabled {
return BucketPolicyOnly{}
}
, := time.Parse(time.RFC3339, .BucketPolicyOnly.LockedTime)
if != nil {
return BucketPolicyOnly{
Enabled: true,
}
}
return BucketPolicyOnly{
Enabled: true,
LockedTime: ,
}
}
func ( *raw.BucketIamConfiguration) UniformBucketLevelAccess {
if == nil || .UniformBucketLevelAccess == nil || !.UniformBucketLevelAccess.Enabled {
return UniformBucketLevelAccess{}
}
, := time.Parse(time.RFC3339, .UniformBucketLevelAccess.LockedTime)
if != nil {
return UniformBucketLevelAccess{
Enabled: true,
}
}
return UniformBucketLevelAccess{
Enabled: true,
LockedTime: ,
}
}
type ObjectIterator struct {
ctx context.Context
bucket *BucketHandle
query Query
pageInfo *iterator.PageInfo
nextFunc func() error
items []*ObjectAttrs
}
func ( *ObjectIterator) () *iterator.PageInfo { return .pageInfo }
func ( *ObjectIterator) () (*ObjectAttrs, error) {
if := .nextFunc(); != nil {
return nil,
}
:= .items[0]
.items = .items[1:]
return , nil
}
func ( *ObjectIterator) ( int, string) (string, error) {
:= .bucket.c.raw.Objects.List(.bucket.name)
setClientHeader(.Header())
.Projection("full")
.Delimiter(.query.Delimiter)
.Prefix(.query.Prefix)
.Versions(.query.Versions)
if len(.query.fieldSelection) > 0 {
.Fields("nextPageToken", googleapi.Field(.query.fieldSelection))
}
.PageToken()
if .bucket.userProject != "" {
.UserProject(.bucket.userProject)
}
if > 0 {
.MaxResults(int64())
}
var *raw.Objects
var error
= runWithRetry(.ctx, func() error {
, = .Context(.ctx).Do()
return
})
if != nil {
if , := .(*googleapi.Error); && .Code == http.StatusNotFound {
= ErrBucketNotExist
}
return "",
}
for , := range .Items {
.items = append(.items, newObject())
}
for , := range .Prefixes {
.items = append(.items, &ObjectAttrs{Prefix: })
}
return .NextPageToken, nil
}
func ( *BucketIterator) () (*BucketAttrs, error) {
if := .nextFunc(); != nil {
return nil,
}
:= .buckets[0]
.buckets = .buckets[1:]
return , nil
}
func ( *BucketIterator) () *iterator.PageInfo { return .pageInfo }
func ( *BucketIterator) ( int, string) ( string, error) {
:= .client.raw.Buckets.List(.projectID)
setClientHeader(.Header())
.Projection("full")
.Prefix(.Prefix)
.PageToken()
if > 0 {
.MaxResults(int64())
}
var *raw.Buckets
= runWithRetry(.ctx, func() error {
, = .Context(.ctx).Do()
return
})
if != nil {
return "",
}
for , := range .Items {
, := newBucket()
if != nil {
return "",
}
.buckets = append(.buckets, )
}
return .NextPageToken, nil
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |