mirror of
https://github.com/restic/restic.git
synced 2025-12-15 18:22:28 +00:00
Update dependencies
This commit is contained in:
170
vendor/cloud.google.com/go/storage/bucket.go
generated
vendored
170
vendor/cloud.google.com/go/storage/bucket.go
generated
vendored
@@ -1,4 +1,4 @@
|
||||
// Copyright 2014 Google Inc. All Rights Reserved.
|
||||
// Copyright 2014 Google Inc. LiveAndArchived Rights Reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
@@ -71,6 +71,11 @@ func (b *BucketHandle) Create(ctx context.Context, projectID string, attrs *Buck
|
||||
bkt = &raw.Bucket{}
|
||||
}
|
||||
bkt.Name = b.name
|
||||
// If there is lifecycle information but no location, explicitly set
|
||||
// the location. This is a GCS quirk/bug.
|
||||
if bkt.Location == "" && bkt.Lifecycle != nil {
|
||||
bkt.Location = "US"
|
||||
}
|
||||
req := b.c.raw.Buckets.Insert(projectID, bkt)
|
||||
setClientHeader(req.Header())
|
||||
return runWithRetry(ctx, func() error { _, err := req.Context(ctx).Do(); return err })
|
||||
@@ -230,6 +235,98 @@ type BucketAttrs struct {
|
||||
|
||||
// RequesterPays reports whether the bucket is a Requester Pays bucket.
|
||||
RequesterPays bool
|
||||
// Lifecycle is the lifecycle configuration for objects in the bucket.
|
||||
Lifecycle Lifecycle
|
||||
}
|
||||
|
||||
// Lifecycle is the lifecycle configuration for objects in the bucket.
|
||||
type Lifecycle struct {
|
||||
Rules []LifecycleRule
|
||||
}
|
||||
|
||||
const (
|
||||
// RFC3339 date with only the date segment, used for CreatedBefore in LifecycleRule.
|
||||
rfc3339Date = "2006-01-02"
|
||||
|
||||
// DeleteAction is a lifecycle action that deletes a live and/or archived
|
||||
// objects. Takes precendence over SetStorageClass actions.
|
||||
DeleteAction = "Delete"
|
||||
|
||||
// SetStorageClassAction changes the storage class of live and/or archived
|
||||
// objects.
|
||||
SetStorageClassAction = "SetStorageClass"
|
||||
)
|
||||
|
||||
// LifecycleRule is a lifecycle configuration rule.
|
||||
//
|
||||
// When all the configured conditions are met by an object in the bucket, the
|
||||
// configured action will automatically be taken on that object.
|
||||
type LifecycleRule struct {
|
||||
// Action is the action to take when all of the associated conditions are
|
||||
// met.
|
||||
Action LifecycleAction
|
||||
|
||||
// Condition is the set of conditions that must be met for the associated
|
||||
// action to be taken.
|
||||
Condition LifecycleCondition
|
||||
}
|
||||
|
||||
// LifecycleAction is a lifecycle configuration action.
|
||||
type LifecycleAction struct {
|
||||
// Type is the type of action to take on matching objects.
|
||||
//
|
||||
// Acceptable values are "Delete" to delete matching objects and
|
||||
// "SetStorageClass" to set the storage class defined in StorageClass on
|
||||
// matching objects.
|
||||
Type string
|
||||
|
||||
// StorageClass is the storage class to set on matching objects if the Action
|
||||
// is "SetStorageClass".
|
||||
StorageClass string
|
||||
}
|
||||
|
||||
// Liveness specifies whether the object is live or not.
|
||||
type Liveness int
|
||||
|
||||
const (
|
||||
// LiveAndArchived includes both live and archived objects.
|
||||
LiveAndArchived Liveness = iota
|
||||
// Live specifies that the object is still live.
|
||||
Live
|
||||
// Archived specifies that the object is archived.
|
||||
Archived
|
||||
)
|
||||
|
||||
// LifecycleCondition is a set of conditions used to match objects and take an
|
||||
// action automatically.
|
||||
//
|
||||
// All configured conditions must be met for the associated action to be taken.
|
||||
type LifecycleCondition struct {
|
||||
// AgeInDays is the age of the object in days.
|
||||
AgeInDays int64
|
||||
|
||||
// CreatedBefore is the time the object was created.
|
||||
//
|
||||
// This condition is satisfied when an object is created before midnight of
|
||||
// the specified date in UTC.
|
||||
CreatedBefore time.Time
|
||||
|
||||
// Liveness specifies the object's liveness. Relevant only for versioned objects
|
||||
Liveness Liveness
|
||||
|
||||
// MatchesStorageClasses is the condition matching the object's storage
|
||||
// class.
|
||||
//
|
||||
// Values include "MULTI_REGIONAL", "REGIONAL", "NEARLINE", "COLDLINE",
|
||||
// "STANDARD", and "DURABLE_REDUCED_AVAILABILITY".
|
||||
MatchesStorageClasses []string
|
||||
|
||||
// NumNewerVersions is the condition matching objects with a number of newer versions.
|
||||
//
|
||||
// If the value is N, this condition is satisfied when there are at least N
|
||||
// versions (including the live version) newer than this version of the
|
||||
// object.
|
||||
NumNewerVersions int64
|
||||
}
|
||||
|
||||
func newBucket(b *raw.Bucket) *BucketAttrs {
|
||||
@@ -245,6 +342,7 @@ func newBucket(b *raw.Bucket) *BucketAttrs {
|
||||
VersioningEnabled: b.Versioning != nil && b.Versioning.Enabled,
|
||||
Labels: b.Labels,
|
||||
RequesterPays: b.Billing != nil && b.Billing.RequesterPays,
|
||||
Lifecycle: toLifecycle(b.Lifecycle),
|
||||
}
|
||||
acl := make([]ACLRule, len(b.Acl))
|
||||
for i, rule := range b.Acl {
|
||||
@@ -306,6 +404,7 @@ func (b *BucketAttrs) toRawBucket() *raw.Bucket {
|
||||
Versioning: v,
|
||||
Labels: labels,
|
||||
Billing: bb,
|
||||
Lifecycle: toRawLifecycle(b.Lifecycle),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -437,6 +536,75 @@ func applyBucketConds(method string, conds *BucketConditions, call interface{})
|
||||
return nil
|
||||
}
|
||||
|
||||
func toRawLifecycle(l Lifecycle) *raw.BucketLifecycle {
|
||||
var rl raw.BucketLifecycle
|
||||
if len(l.Rules) == 0 {
|
||||
return nil
|
||||
}
|
||||
for _, r := range l.Rules {
|
||||
rr := &raw.BucketLifecycleRule{
|
||||
Action: &raw.BucketLifecycleRuleAction{
|
||||
Type: r.Action.Type,
|
||||
StorageClass: r.Action.StorageClass,
|
||||
},
|
||||
Condition: &raw.BucketLifecycleRuleCondition{
|
||||
Age: r.Condition.AgeInDays,
|
||||
MatchesStorageClass: r.Condition.MatchesStorageClasses,
|
||||
NumNewerVersions: r.Condition.NumNewerVersions,
|
||||
},
|
||||
}
|
||||
|
||||
switch r.Condition.Liveness {
|
||||
case LiveAndArchived:
|
||||
rr.Condition.IsLive = nil
|
||||
case Live:
|
||||
rr.Condition.IsLive = googleapi.Bool(true)
|
||||
case Archived:
|
||||
rr.Condition.IsLive = googleapi.Bool(false)
|
||||
}
|
||||
|
||||
if !r.Condition.CreatedBefore.IsZero() {
|
||||
rr.Condition.CreatedBefore = r.Condition.CreatedBefore.Format(rfc3339Date)
|
||||
}
|
||||
rl.Rule = append(rl.Rule, rr)
|
||||
}
|
||||
return &rl
|
||||
}
|
||||
|
||||
func toLifecycle(rl *raw.BucketLifecycle) Lifecycle {
|
||||
var l Lifecycle
|
||||
if rl == nil {
|
||||
return l
|
||||
}
|
||||
for _, rr := range rl.Rule {
|
||||
r := LifecycleRule{
|
||||
Action: LifecycleAction{
|
||||
Type: rr.Action.Type,
|
||||
StorageClass: rr.Action.StorageClass,
|
||||
},
|
||||
Condition: LifecycleCondition{
|
||||
AgeInDays: rr.Condition.Age,
|
||||
MatchesStorageClasses: rr.Condition.MatchesStorageClass,
|
||||
NumNewerVersions: rr.Condition.NumNewerVersions,
|
||||
},
|
||||
}
|
||||
|
||||
switch {
|
||||
case rr.Condition.IsLive == nil:
|
||||
r.Condition.Liveness = LiveAndArchived
|
||||
case *rr.Condition.IsLive == true:
|
||||
r.Condition.Liveness = Live
|
||||
case *rr.Condition.IsLive == false:
|
||||
r.Condition.Liveness = Archived
|
||||
}
|
||||
|
||||
if rr.Condition.CreatedBefore != "" {
|
||||
r.Condition.CreatedBefore, _ = time.Parse(rfc3339Date, rr.Condition.CreatedBefore)
|
||||
}
|
||||
}
|
||||
return l
|
||||
}
|
||||
|
||||
// Objects returns an iterator over the objects in the bucket that match the Query q.
|
||||
// If q is nil, no filtering is done.
|
||||
func (b *BucketHandle) Objects(ctx context.Context, q *Query) *ObjectIterator {
|
||||
|
||||
26
vendor/cloud.google.com/go/storage/example_test.go
generated
vendored
26
vendor/cloud.google.com/go/storage/example_test.go
generated
vendored
@@ -16,6 +16,7 @@ package storage_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"hash/crc32"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
@@ -321,6 +322,31 @@ func ExampleWriter_Write() {
|
||||
wc.ACL = []storage.ACLRule{{storage.AllUsers, storage.RoleReader}}
|
||||
if _, err := wc.Write([]byte("hello world")); err != nil {
|
||||
// TODO: handle error.
|
||||
// Note that Write may return nil in some error situations,
|
||||
// so always check the error from Close.
|
||||
}
|
||||
if err := wc.Close(); err != nil {
|
||||
// TODO: handle error.
|
||||
}
|
||||
fmt.Println("updated object:", wc.Attrs())
|
||||
}
|
||||
|
||||
// To make sure the data you write is uncorrupted, use an MD5 or CRC32c
|
||||
// checksum. This example illustrates CRC32c.
|
||||
func ExampleWriter_Write_checksum() {
|
||||
ctx := context.Background()
|
||||
client, err := storage.NewClient(ctx)
|
||||
if err != nil {
|
||||
// TODO: handle error.
|
||||
}
|
||||
data := []byte("verify me")
|
||||
wc := client.Bucket("bucketname").Object("filename1").NewWriter(ctx)
|
||||
wc.CRC32C = crc32.Checksum(data, crc32.MakeTable(crc32.Castagnoli))
|
||||
wc.SendCRC32C = true
|
||||
if _, err := wc.Write([]byte("hello world")); err != nil {
|
||||
// TODO: handle error.
|
||||
// Note that Write may return nil in some error situations,
|
||||
// so always check the error from Close.
|
||||
}
|
||||
if err := wc.Close(); err != nil {
|
||||
// TODO: handle error.
|
||||
|
||||
30
vendor/cloud.google.com/go/storage/go110.go.pending
generated
vendored
Normal file
30
vendor/cloud.google.com/go/storage/go110.go.pending
generated
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
// Copyright 2017 Google Inc. All Rights Reserved.
|
||||
//
|
||||
// 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.
|
||||
|
||||
// +build go1.10
|
||||
|
||||
package storage
|
||||
|
||||
import "google.golang.org/api/googleapi"
|
||||
|
||||
func shouldRetry(err error) bool {
|
||||
switch e := err.(type) {
|
||||
case *googleapi.Error:
|
||||
// Retry on 429 and 5xx, according to
|
||||
// https://cloud.google.com/storage/docs/exponential-backoff.
|
||||
return e.Code == 429 || (e.Code >= 500 && e.Code < 600)
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
36
vendor/cloud.google.com/go/storage/integration_test.go
generated
vendored
36
vendor/cloud.google.com/go/storage/integration_test.go
generated
vendored
@@ -45,7 +45,7 @@ import (
|
||||
"google.golang.org/api/option"
|
||||
)
|
||||
|
||||
const testPrefix = "-go-cloud-storage-test"
|
||||
const testPrefix = "-go-test"
|
||||
|
||||
// suffix is a timestamp-based suffix which is added to all buckets created by
|
||||
// tests. This reduces flakiness when the tests are run in parallel and allows
|
||||
@@ -124,7 +124,7 @@ func TestBucketMethods(t *testing.T) {
|
||||
b := client.Bucket(newBucket)
|
||||
// Test Create and Delete.
|
||||
if err := b.Create(ctx, projectID, nil); err != nil {
|
||||
t.Errorf("Bucket(%v).Create(%v, %v) failed: %v", newBucket, projectID, nil, err)
|
||||
t.Fatalf("Bucket(%v).Create(%v, %v) failed: %v", newBucket, projectID, nil, err)
|
||||
}
|
||||
attrs, err := b.Attrs(ctx)
|
||||
if err != nil {
|
||||
@@ -153,9 +153,35 @@ func TestBucketMethods(t *testing.T) {
|
||||
StorageClass: "NEARLINE",
|
||||
VersioningEnabled: true,
|
||||
Labels: labels,
|
||||
Lifecycle: Lifecycle{
|
||||
Rules: []LifecycleRule{{
|
||||
Action: LifecycleAction{
|
||||
Type: SetStorageClassAction,
|
||||
StorageClass: "NEARLINE",
|
||||
},
|
||||
Condition: LifecycleCondition{
|
||||
AgeInDays: 10,
|
||||
Liveness: Archived,
|
||||
CreatedBefore: time.Date(2017, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
MatchesStorageClasses: []string{"MULTI_REGIONAL", "STANDARD"},
|
||||
NumNewerVersions: 3,
|
||||
},
|
||||
}, {
|
||||
Action: LifecycleAction{
|
||||
Type: DeleteAction,
|
||||
},
|
||||
Condition: LifecycleCondition{
|
||||
AgeInDays: 30,
|
||||
Liveness: Live,
|
||||
CreatedBefore: time.Date(2017, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
MatchesStorageClasses: []string{"NEARLINE"},
|
||||
NumNewerVersions: 10,
|
||||
},
|
||||
}},
|
||||
},
|
||||
}
|
||||
if err := client.Bucket(newBucket).Create(ctx, projectID, attrs); err != nil {
|
||||
t.Errorf("Bucket(%v).Create(%v, %v) failed: %v", newBucket, projectID, attrs, err)
|
||||
t.Fatalf("Bucket(%v).Create(%v, %+v) failed: %v", newBucket, projectID, attrs, err)
|
||||
}
|
||||
attrs, err = b.Attrs(ctx)
|
||||
if err != nil {
|
||||
@@ -338,6 +364,9 @@ func TestObjects(t *testing.T) {
|
||||
if got, want := rc.ContentType(), "text/plain"; got != want {
|
||||
t.Errorf("ContentType (%q) = %q; want %q", obj, got, want)
|
||||
}
|
||||
if got, want := rc.CacheControl(), "public, max-age=60"; got != want {
|
||||
t.Errorf("CacheControl (%q) = %q; want %q", obj, got, want)
|
||||
}
|
||||
rc.Close()
|
||||
|
||||
// Check early close.
|
||||
@@ -1422,6 +1451,7 @@ func TestIntegration_RequesterPays(t *testing.T) {
|
||||
func writeObject(ctx context.Context, obj *ObjectHandle, contentType string, contents []byte) error {
|
||||
w := obj.NewWriter(ctx)
|
||||
w.ContentType = contentType
|
||||
w.CacheControl = "public, max-age=60"
|
||||
if contents != nil {
|
||||
if _, err := w.Write(contents); err != nil {
|
||||
_ = w.Close()
|
||||
|
||||
9
vendor/cloud.google.com/go/storage/invoke.go
generated
vendored
9
vendor/cloud.google.com/go/storage/invoke.go
generated
vendored
@@ -18,7 +18,6 @@ import (
|
||||
"cloud.google.com/go/internal"
|
||||
gax "github.com/googleapis/gax-go"
|
||||
"golang.org/x/net/context"
|
||||
"google.golang.org/api/googleapi"
|
||||
)
|
||||
|
||||
// runWithRetry calls the function until it returns nil or a non-retryable error, or
|
||||
@@ -29,13 +28,7 @@ func runWithRetry(ctx context.Context, call func() error) error {
|
||||
if err == nil {
|
||||
return true, nil
|
||||
}
|
||||
e, ok := err.(*googleapi.Error)
|
||||
if !ok {
|
||||
return true, err
|
||||
}
|
||||
// Retry on 429 and 5xx, according to
|
||||
// https://cloud.google.com/storage/docs/exponential-backoff.
|
||||
if e.Code == 429 || (e.Code >= 500 && e.Code < 600) {
|
||||
if shouldRetry(err) {
|
||||
return false, nil
|
||||
}
|
||||
return true, err
|
||||
|
||||
40
vendor/cloud.google.com/go/storage/not_go110.go
generated
vendored
Normal file
40
vendor/cloud.google.com/go/storage/not_go110.go
generated
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
// Copyright 2017 Google Inc. All Rights Reserved.
|
||||
//
|
||||
// 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.
|
||||
|
||||
// +build !go1.10
|
||||
|
||||
package storage
|
||||
|
||||
import (
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"google.golang.org/api/googleapi"
|
||||
)
|
||||
|
||||
func shouldRetry(err error) bool {
|
||||
switch e := err.(type) {
|
||||
case *googleapi.Error:
|
||||
// Retry on 429 and 5xx, according to
|
||||
// https://cloud.google.com/storage/docs/exponential-backoff.
|
||||
return e.Code == 429 || (e.Code >= 500 && e.Code < 600)
|
||||
case *url.Error:
|
||||
// Retry on REFUSED_STREAM.
|
||||
// Unfortunately the error type is unexported, so we resort to string
|
||||
// matching.
|
||||
return strings.Contains(e.Error(), "REFUSED_STREAM")
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
6
vendor/cloud.google.com/go/storage/reader.go
generated
vendored
6
vendor/cloud.google.com/go/storage/reader.go
generated
vendored
@@ -28,6 +28,7 @@ type Reader struct {
|
||||
body io.ReadCloser
|
||||
remain, size int64
|
||||
contentType string
|
||||
cacheControl string
|
||||
checkCRC bool // should we check the CRC?
|
||||
wantCRC uint32 // the CRC32c value the server sent in the header
|
||||
gotCRC uint32 // running crc
|
||||
@@ -72,3 +73,8 @@ func (r *Reader) Remain() int64 {
|
||||
func (r *Reader) ContentType() string {
|
||||
return r.contentType
|
||||
}
|
||||
|
||||
// CacheControl returns the cache control of the object.
|
||||
func (r *Reader) CacheControl() string {
|
||||
return r.cacheControl
|
||||
}
|
||||
|
||||
22
vendor/cloud.google.com/go/storage/storage.go
generated
vendored
22
vendor/cloud.google.com/go/storage/storage.go
generated
vendored
@@ -567,12 +567,13 @@ func (o *ObjectHandle) NewRangeReader(ctx context.Context, offset, length int64)
|
||||
crc, checkCRC = parseCRC32c(res)
|
||||
}
|
||||
return &Reader{
|
||||
body: body,
|
||||
size: size,
|
||||
remain: remain,
|
||||
contentType: res.Header.Get("Content-Type"),
|
||||
wantCRC: crc,
|
||||
checkCRC: checkCRC,
|
||||
body: body,
|
||||
size: size,
|
||||
remain: remain,
|
||||
contentType: res.Header.Get("Content-Type"),
|
||||
cacheControl: res.Header.Get("Cache-Control"),
|
||||
wantCRC: crc,
|
||||
checkCRC: checkCRC,
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -720,11 +721,16 @@ type ObjectAttrs struct {
|
||||
// sent in the response headers.
|
||||
ContentDisposition string
|
||||
|
||||
// MD5 is the MD5 hash of the object's content. This field is read-only.
|
||||
// MD5 is the MD5 hash of the object's content. This field is read-only,
|
||||
// except when used from a Writer. If set on a Writer, the uploaded
|
||||
// data is rejected if its MD5 hash does not match this field.
|
||||
MD5 []byte
|
||||
|
||||
// CRC32C is the CRC32 checksum of the object's content using
|
||||
// the Castagnoli93 polynomial. This field is read-only.
|
||||
// the Castagnoli93 polynomial. This field is read-only, except when
|
||||
// used from a Writer. If set on a Writer and Writer.SendCRC32C
|
||||
// is true, the uploaded data is rejected if its CRC32c hash does not
|
||||
// match this field.
|
||||
CRC32C uint32
|
||||
|
||||
// MediaLink is an URL to the object's content. This field is read-only.
|
||||
|
||||
83
vendor/cloud.google.com/go/storage/storage_test.go
generated
vendored
83
vendor/cloud.google.com/go/storage/storage_test.go
generated
vendored
@@ -31,6 +31,7 @@ import (
|
||||
"cloud.google.com/go/internal/testutil"
|
||||
|
||||
"golang.org/x/net/context"
|
||||
"google.golang.org/api/googleapi"
|
||||
"google.golang.org/api/iterator"
|
||||
"google.golang.org/api/option"
|
||||
raw "google.golang.org/api/storage/v1"
|
||||
@@ -686,6 +687,88 @@ func TestCodecUint32(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestBucketAttrs(t *testing.T) {
|
||||
for _, c := range []struct {
|
||||
attrs BucketAttrs
|
||||
raw raw.Bucket
|
||||
}{{
|
||||
attrs: BucketAttrs{
|
||||
Lifecycle: Lifecycle{
|
||||
Rules: []LifecycleRule{{
|
||||
Action: LifecycleAction{
|
||||
Type: SetStorageClassAction,
|
||||
StorageClass: "NEARLINE",
|
||||
},
|
||||
Condition: LifecycleCondition{
|
||||
AgeInDays: 10,
|
||||
Liveness: Live,
|
||||
CreatedBefore: time.Date(2017, 1, 2, 3, 4, 5, 6, time.UTC),
|
||||
MatchesStorageClasses: []string{"MULTI_REGIONAL", "REGIONAL", "STANDARD"},
|
||||
NumNewerVersions: 3,
|
||||
},
|
||||
}, {
|
||||
Action: LifecycleAction{
|
||||
Type: DeleteAction,
|
||||
},
|
||||
Condition: LifecycleCondition{
|
||||
AgeInDays: 30,
|
||||
Liveness: Live,
|
||||
CreatedBefore: time.Date(2017, 1, 2, 3, 4, 5, 6, time.UTC),
|
||||
MatchesStorageClasses: []string{"NEARLINE"},
|
||||
NumNewerVersions: 10,
|
||||
},
|
||||
}, {
|
||||
Action: LifecycleAction{
|
||||
Type: DeleteAction,
|
||||
},
|
||||
Condition: LifecycleCondition{
|
||||
Liveness: Archived,
|
||||
},
|
||||
}},
|
||||
},
|
||||
},
|
||||
raw: raw.Bucket{
|
||||
Lifecycle: &raw.BucketLifecycle{
|
||||
Rule: []*raw.BucketLifecycleRule{{
|
||||
Action: &raw.BucketLifecycleRuleAction{
|
||||
Type: SetStorageClassAction,
|
||||
StorageClass: "NEARLINE",
|
||||
},
|
||||
Condition: &raw.BucketLifecycleRuleCondition{
|
||||
Age: 10,
|
||||
IsLive: googleapi.Bool(true),
|
||||
CreatedBefore: "2017-01-02",
|
||||
MatchesStorageClass: []string{"MULTI_REGIONAL", "REGIONAL", "STANDARD"},
|
||||
NumNewerVersions: 3,
|
||||
},
|
||||
}, {
|
||||
Action: &raw.BucketLifecycleRuleAction{
|
||||
Type: DeleteAction,
|
||||
},
|
||||
Condition: &raw.BucketLifecycleRuleCondition{
|
||||
Age: 30,
|
||||
IsLive: googleapi.Bool(true),
|
||||
CreatedBefore: "2017-01-02",
|
||||
MatchesStorageClass: []string{"NEARLINE"},
|
||||
NumNewerVersions: 10,
|
||||
},
|
||||
}, {
|
||||
Action: &raw.BucketLifecycleRuleAction{
|
||||
Type: DeleteAction,
|
||||
},
|
||||
Condition: &raw.BucketLifecycleRuleCondition{
|
||||
IsLive: googleapi.Bool(false),
|
||||
},
|
||||
}},
|
||||
},
|
||||
},
|
||||
}} {
|
||||
if got := c.attrs.toRawBucket(); !testutil.Equal(*got, c.raw) {
|
||||
t.Errorf("toRawBucket: got %v, want %v", *got, c.raw)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func newTestServer(handler func(w http.ResponseWriter, r *http.Request)) (*http.Client, func()) {
|
||||
ts := httptest.NewTLSServer(http.HandlerFunc(handler))
|
||||
tlsConf := &tls.Config{InsecureSkipVerify: true}
|
||||
|
||||
2
vendor/cloud.google.com/go/storage/writer.go
generated
vendored
2
vendor/cloud.google.com/go/storage/writer.go
generated
vendored
@@ -36,6 +36,8 @@ type Writer struct {
|
||||
// SendCRC specifies whether to transmit a CRC32C field. It should be set
|
||||
// to true in addition to setting the Writer's CRC32C field, because zero
|
||||
// is a valid CRC and normally a zero would not be transmitted.
|
||||
// If a CRC32C is sent, and the data written does not match the checksum,
|
||||
// the write will be rejected.
|
||||
SendCRC32C bool
|
||||
|
||||
// ChunkSize controls the maximum number of bytes of the object that the
|
||||
|
||||
Reference in New Issue
Block a user