diff --git a/sdk/storage/azblob/.gitignore b/sdk/storage/azblob/.gitignore index 2a57ece17969..b1c8334e59d6 100644 --- a/sdk/storage/azblob/.gitignore +++ b/sdk/storage/azblob/.gitignore @@ -1,3 +1,6 @@ +## Ignore generated bin files +BigFile*.bin + ## ignore .DS_Store on macOS *.DS_Store diff --git a/sdk/storage/azblob/go.mod b/sdk/storage/azblob/go.mod index fd7d35028e3d..67c657445c81 100644 --- a/sdk/storage/azblob/go.mod +++ b/sdk/storage/azblob/go.mod @@ -3,10 +3,15 @@ module github.com/Azure/azure-sdk-for-go/sdk/storage/azblob go 1.13 require ( - github.com/Azure/azure-sdk-for-go/sdk/azcore v0.13.4 - github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.6.0 + github.com/Azure/azure-sdk-for-go/sdk/azcore v0.14.3 + github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.8.0 github.com/Azure/azure-sdk-for-go/sdk/internal v0.5.0 github.com/Azure/azure-sdk-for-go/sdk/to v0.1.3 github.com/google/uuid v1.1.1 + github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 // indirect + golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 // indirect + golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c // indirect + golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54 // indirect + golang.org/x/text v0.3.6 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c ) diff --git a/sdk/storage/azblob/go.sum b/sdk/storage/azblob/go.sum index 4077c721295b..f389580430b1 100644 --- a/sdk/storage/azblob/go.sum +++ b/sdk/storage/azblob/go.sum @@ -1,8 +1,15 @@ github.com/Azure/azure-sdk-for-go/sdk/azcore v0.13.1/go.mod h1:pElNP+u99BvCZD+0jOlhI9OC/NB2IDTOTGZOZH0Qhq8= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.13.4 h1:7MfvHEWKfjZSKQNWERlXpHwCRoceEuQef/fB8CWmnQA= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.13.4/go.mod h1:pElNP+u99BvCZD+0jOlhI9OC/NB2IDTOTGZOZH0Qhq8= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.14.0/go.mod h1:pElNP+u99BvCZD+0jOlhI9OC/NB2IDTOTGZOZH0Qhq8= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.14.2 h1:jBp1eg+iY1S6SEjISakVfHmvDxfj8bg1Mw9JFwpCKag= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.14.2/go.mod h1:pElNP+u99BvCZD+0jOlhI9OC/NB2IDTOTGZOZH0Qhq8= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.14.3 h1:WgQHTcErc4NV3nuMc+OiR16DtpVy7230CjOpjD+FA84= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.14.3/go.mod h1:pElNP+u99BvCZD+0jOlhI9OC/NB2IDTOTGZOZH0Qhq8= github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.6.0 h1:ksvSe0GxLR0H4narxWihjuz2a90JsmrUELJM9qulh+0= github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.6.0/go.mod h1:BfjVb0eeNKsOveaOBnAgUv6nSq5hwScOz7mCm9lqUx8= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.8.0 h1:wb00szFWtKeIef2Q5X8gdd0mYp8oSHmJOYUh/QXD8sw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.8.0/go.mod h1:acANgl9stsT5xflESXKjZx4rhZJSr0TGgTDYY0xJPIE= github.com/Azure/azure-sdk-for-go/sdk/internal v0.5.0 h1:HG1ggl8L3ZkV/Ydanf7lKr5kkhhPGCpWdnr1J6v7cO4= github.com/Azure/azure-sdk-for-go/sdk/internal v0.5.0/go.mod h1:k4KbFSunV/+0hOHL1vyFaPsiYQ1Vmvy1TBpmtvCDLZM= github.com/Azure/azure-sdk-for-go/sdk/to v0.1.3 h1:5p7WsYlB8FqcpXdi0rOpppjV8xN3yonEZr1ArSetzZo= @@ -16,21 +23,36 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4 h1:49lOXmGaUpV9Fz3gd7TFZY106KVlPVa5jcYD1gaQf98= github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 h1:Qj1ukM4GlMWXNdMBuXcXfz/Kw9s1qm0CLY32QxuSImI= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20201010224723-4f7140c49acb h1:mUVeFHoDKis5nxCAzoAi7E8Ghb86EXh/RK6wtvJIqRY= golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c h1:KHUzaHIpjWVlVVNh65G3hhuj3KB1HnjY6Cq5cTvRQT8= +golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44 h1:Bli41pIlzTzf3KEY06n+xnzK/BESIg2ze4Pgfh/aI8c= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54 h1:rF3Ohx8DRyl8h2zw9qojyLHLhrJpEMgyPOImREEryf0= +golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/sdk/storage/azblob/highlevel.go b/sdk/storage/azblob/highlevel.go index cc60626fd071..7d4a9eabd48e 100644 --- a/sdk/storage/azblob/highlevel.go +++ b/sdk/storage/azblob/highlevel.go @@ -49,7 +49,7 @@ type HighLevelUploadToBlockBlobOption struct { Progress azcore.ProgressReceiver // BlobHTTPHeaders indicates the HTTP headers to be associated with the blob. - BlobHTTPHeaders *BlobHttpHeaders + BlobHTTPHeaders *BlobHTTPHeaders // Metadata indicates the metadata to be associated with the blob when PutBlockList is called. Metadata *map[string]string @@ -71,9 +71,9 @@ type HighLevelUploadToBlockBlobOption struct { // Parallelism indicates the maximum number of blocks to upload in parallel (0=default) Parallelism uint16 - TransactionalContentCrc64 *[]byte + TransactionalContentCRC64 *[]byte // Specify the transactional md5 for the body, to be validated by the service. - TransactionalContentMd5 *[]byte + TransactionalContentMD5 *[]byte } func (o HighLevelUploadToBlockBlobOption) getStageBlockOptions() *StageBlockOptions { @@ -82,10 +82,10 @@ func (o HighLevelUploadToBlockBlobOption) getStageBlockOptions() *StageBlockOpti CpkScopeInfo: o.CpkScopeInfo, LeaseAccessConditions: o.LeaseAccessCondition, //BlockBlobStageBlockOptions: &BlockBlobStageBlockOptions{ - // RequestId: nil, + // RequestID: nil, // Timeout: nil, - // TransactionalContentMd5: nil, - // TransactionalContentCrc64: nil, + // TransactionalContentMD5: nil, + // TransactionalContentCRC64: nil, //}, } } @@ -95,8 +95,8 @@ func (o HighLevelUploadToBlockBlobOption) getUploadBlockBlobOptions() *UploadBlo BlobTagsMap: o.BlobTagsMap, Metadata: o.Metadata, Tier: o.BlobAccessTier, - //TransactionalContentMd5: - BlobHttpHeaders: o.BlobHTTPHeaders, + //TransactionalContentMD5: + BlobHTTPHeaders: o.BlobHTTPHeaders, LeaseAccessConditions: o.LeaseAccessCondition, ModifiedAccessConditions: o.ModifiedAccessCondition, CpkInfo: o.CpkInfo, @@ -248,7 +248,7 @@ func (o *HighLevelDownloadFromBlobOptions) getBlobPropertiesOptions() *GetBlobPr } } -func (o *HighLevelDownloadFromBlobOptions) getDownloadBlobOptions(offSet, count int64, rangeGetContentMd5 *bool) *DownloadBlobOptions { +func (o *HighLevelDownloadFromBlobOptions) getDownloadBlobOptions(offSet, count int64, rangeGetContentMD5 *bool) *DownloadBlobOptions { return &DownloadBlobOptions{ LeaseAccessConditions: o.LeaseAccessConditions, ModifiedAccessConditions: o.ModifiedAccessConditions, @@ -256,7 +256,7 @@ func (o *HighLevelDownloadFromBlobOptions) getDownloadBlobOptions(offSet, count CpkScopeInfo: o.CpkScopeInfo, Offset: &offSet, Count: &count, - RangeGetContentMd5: rangeGetContentMd5, + RangeGetContentMD5: rangeGetContentMD5, } } @@ -587,7 +587,7 @@ type UploadStreamToBlockBlobOptions struct { BufferSize int // MaxBuffers defines the number of simultaneous uploads will be performed to upload the file. MaxBuffers int - BlobHTTPHeaders *BlobHttpHeaders + BlobHTTPHeaders *BlobHTTPHeaders Metadata *map[string]string AccessConditions *BlobAccessConditions BlobAccessTier *AccessTier diff --git a/sdk/storage/azblob/shared_policy_shared_key_credential.go b/sdk/storage/azblob/shared_policy_shared_key_credential.go index d402d6c496ea..47e1844f081e 100644 --- a/sdk/storage/azblob/shared_policy_shared_key_credential.go +++ b/sdk/storage/azblob/shared_policy_shared_key_credential.go @@ -37,11 +37,6 @@ type SharedKeyCredential struct { accountKey atomic.Value // []byte } -// noop function to satisfy StorageAccountCredential interface -func (c *SharedKeyCredential) GetUDKParams() *UserDelegationKey { - return nil -} - // AccountName returns the Storage account's name. func (c *SharedKeyCredential) AccountName() string { return c.accountName diff --git a/sdk/storage/azblob/shared_storage_account_credential.go b/sdk/storage/azblob/shared_storage_account_credential.go index 0b26fde8a21c..9d78f7894e82 100644 --- a/sdk/storage/azblob/shared_storage_account_credential.go +++ b/sdk/storage/azblob/shared_storage_account_credential.go @@ -7,5 +7,4 @@ package azblob type StorageAccountCredential interface { AccountName() string ComputeHMACSHA256(message string) (base64String string) - GetUDKParams() *UserDelegationKey } diff --git a/sdk/storage/azblob/shared_user_delegation_credential.go b/sdk/storage/azblob/shared_user_delegation_credential.go index 596b9ce3bf2a..408bf7cb568b 100644 --- a/sdk/storage/azblob/shared_user_delegation_credential.go +++ b/sdk/storage/azblob/shared_user_delegation_credential.go @@ -36,6 +36,6 @@ func (f UserDelegationCredential) ComputeHMACSHA256(message string) (base64Strin } // Private method to return important parameters for NewSASQueryParameters -func (f UserDelegationCredential) GetUDKParams() *UserDelegationKey { - return &f.accountKey +func (f UserDelegationCredential) GetUDKParams() UserDelegationKey { + return f.accountKey } diff --git a/sdk/storage/azblob/zc_appendBlobClient.go b/sdk/storage/azblob/zc_appendBlobClient.go index e079bd1be89f..143c6e71d777 100644 --- a/sdk/storage/azblob/zc_appendBlobClient.go +++ b/sdk/storage/azblob/zc_appendBlobClient.go @@ -6,7 +6,7 @@ package azblob import ( "context" "io" - "net/url" + "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore" ) @@ -38,7 +38,8 @@ func (ab AppendBlobClient) URL() string { func (ab AppendBlobClient) WithSnapshot(snapshot string) AppendBlobClient { p := NewBlobURLParts(ab.URL()) p.Snapshot = snapshot - con := newConnectionWithPipeline(p.URL(), ab.client.con.p) + con := &connection{u: p.URL(), p: ab.client.con.p} + return AppendBlobClient{ client: &appendBlobClient{con: con}, BlobClient: BlobClient{client: &blobClient{con: con}}, @@ -50,7 +51,8 @@ func (ab AppendBlobClient) WithSnapshot(snapshot string) AppendBlobClient { func (ab AppendBlobClient) WithVersionID(versionID string) AppendBlobClient { p := NewBlobURLParts(ab.URL()) p.VersionID = versionID - con := newConnectionWithPipeline(p.URL(), ab.client.con.p) + con := &connection{u: p.URL(), p: ab.client.con.p} + return AppendBlobClient{ client: &appendBlobClient{con: con}, BlobClient: BlobClient{client: &blobClient{con: con}}, @@ -85,12 +87,36 @@ func (ab AppendBlobClient) AppendBlock(ctx context.Context, body io.ReadSeeker, // AppendBlockFromURL copies a new block of data from source URL to the end of the existing append blob. // For more information, see https://docs.microsoft.com/rest/api/storageservices/append-block-from-url. -func (ab AppendBlobClient) AppendBlockFromURL(ctx context.Context, source string, contentLength int64, options *AppendBlockURLOptions) (AppendBlobAppendBlockFromURLResponse, error) { +func (ab AppendBlobClient) AppendBlockFromURL(ctx context.Context, source string, options *AppendBlockURLOptions) (AppendBlobAppendBlockFromURLResponse, error) { appendOptions, aac, cpkinfo, cpkscope, mac, lac, smac := options.pointers() - uri, _ := url.Parse(source) - - resp, err := ab.client.AppendBlockFromURL(ctx, *uri, contentLength, appendOptions, cpkinfo, cpkscope, lac, aac, mac, smac) + // content length should be 0 on * from URL. always. It's a 400 if it isn't. + resp, err := ab.client.AppendBlockFromURL(ctx, source, 0, appendOptions, cpkinfo, cpkscope, lac, aac, mac, smac) return resp, handleError(err) } + +// GetBlobSASToken is a convenience method for generating a SAS token for the currently pointed at blob. +// It can only be used if the supplied azcore.Credential during creation was a SharedKeyCredential. +// This validity can be checked with CanGetBlobSASToken(). +func (ab AppendBlobClient) GetBlobSASToken(permissions BlobSASPermissions, validityTime time.Duration) (SASQueryParameters, error) { + urlParts := NewBlobURLParts(ab.URL()) + + t, err := time.Parse(SnapshotTimeFormat, urlParts.Snapshot) + + if err != nil { + t = time.Time{} + } + + return BlobSASSignatureValues{ + ContainerName: urlParts.ContainerName, + BlobName: urlParts.BlobName, + SnapshotTime: t, + Version: SASVersion, + + Permissions: permissions.String(), + + StartTime: time.Now().UTC(), + ExpiryTime: time.Now().UTC().Add(validityTime), + }.NewSASQueryParameters(ab.cred) +} \ No newline at end of file diff --git a/sdk/storage/azblob/zc_appendBlobRequestOptions.go b/sdk/storage/azblob/zc_appendBlobRequestOptions.go index 25da44f49d9c..8128783b6128 100644 --- a/sdk/storage/azblob/zc_appendBlobRequestOptions.go +++ b/sdk/storage/azblob/zc_appendBlobRequestOptions.go @@ -6,7 +6,7 @@ package azblob type CreateAppendBlobOptions struct { BlobAccessConditions - BlobHttpHeaders *BlobHttpHeaders + BlobHTTPHeaders *BlobHTTPHeaders CpkInfo *CpkInfo @@ -20,12 +20,12 @@ type CreateAppendBlobOptions struct { // See Naming and Referencing Containers, Blobs, and Metadata for more information. Metadata *map[string]string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string Timeout *int32 } -func (o *CreateAppendBlobOptions) pointers() (*AppendBlobCreateOptions, *BlobHttpHeaders, *LeaseAccessConditions, *CpkInfo, *CpkScopeInfo, *ModifiedAccessConditions) { +func (o *CreateAppendBlobOptions) pointers() (*AppendBlobCreateOptions, *BlobHTTPHeaders, *LeaseAccessConditions, *CpkInfo, *CpkScopeInfo, *ModifiedAccessConditions) { if o == nil { return nil, nil, nil, nil, nil, nil } @@ -33,17 +33,17 @@ func (o *CreateAppendBlobOptions) pointers() (*AppendBlobCreateOptions, *BlobHtt options := AppendBlobCreateOptions{ BlobTagsString: serializeBlobTagsToStrPtr(o.BlobTagsMap), Metadata: o.Metadata, - RequestId: o.RequestId, + RequestID: o.RequestID, Timeout: o.Timeout, } - return &options, o.BlobHttpHeaders, o.LeaseAccessConditions, o.CpkInfo, o.CpkScopeInfo, o.ModifiedAccessConditions + return &options, o.BlobHTTPHeaders, o.LeaseAccessConditions, o.CpkInfo, o.CpkScopeInfo, o.ModifiedAccessConditions } type AppendBlockOptions struct { // Specify the transactional crc64 for the body, to be validated by the service. - TransactionalContentCrc64 *[]byte + TransactionalContentCRC64 *[]byte // Specify the transactional md5 for the body, to be validated by the service. - TransactionalContentMd5 *[]byte + TransactionalContentMD5 *[]byte AppendPositionAccessConditions *AppendPositionAccessConditions CpkInfo *CpkInfo @@ -57,8 +57,8 @@ func (o *AppendBlockOptions) pointers() (*AppendBlobAppendBlockOptions, *AppendP } options := &AppendBlobAppendBlockOptions{ - TransactionalContentCrc64: o.TransactionalContentCrc64, - TransactionalContentMd5: o.TransactionalContentMd5, + TransactionalContentCRC64: o.TransactionalContentCRC64, + TransactionalContentMD5: o.TransactionalContentMD5, } return options, o.AppendPositionAccessConditions, o.CpkInfo, o.CpkScopeInfo, o.ModifiedAccessConditions, o.LeaseAccessConditions @@ -66,11 +66,11 @@ func (o *AppendBlockOptions) pointers() (*AppendBlobAppendBlockOptions, *AppendP type AppendBlockURLOptions struct { // Specify the md5 calculated for the range of bytes that must be read from the copy source. - SourceContentMd5 *[]byte + SourceContentMD5 *[]byte // Specify the crc64 calculated for the range of bytes that must be read from the copy source. - SourceContentCrc64 *[]byte + SourceContentCRC64 *[]byte // Specify the transactional md5 for the body, to be validated by the service. - TransactionalContentMd5 *[]byte + TransactionalContentMD5 *[]byte AppendPositionAccessConditions *AppendPositionAccessConditions CpkInfo *CpkInfo @@ -89,9 +89,9 @@ func (o *AppendBlockURLOptions) pointers() (*AppendBlobAppendBlockFromURLOptions options := &AppendBlobAppendBlockFromURLOptions{ SourceRange: getSourceRange(o.Offset, o.Count), - SourceContentMd5: o.SourceContentMd5, - SourceContentcrc64: o.SourceContentCrc64, - TransactionalContentMd5: o.TransactionalContentMd5, + SourceContentMD5: o.SourceContentMD5, + SourceContentcrc64: o.SourceContentCRC64, + TransactionalContentMD5: o.TransactionalContentMD5, } return options, o.AppendPositionAccessConditions, o.CpkInfo, o.CpkScopeInfo, o.ModifiedAccessConditions, o.LeaseAccessConditions, o.SourceModifiedAccessConditions diff --git a/sdk/storage/azblob/zc_blobClient.go b/sdk/storage/azblob/zc_blobClient.go index ca9a47f10f3a..33dc3267e39f 100644 --- a/sdk/storage/azblob/zc_blobClient.go +++ b/sdk/storage/azblob/zc_blobClient.go @@ -5,9 +5,9 @@ package azblob import ( "context" - "github.com/Azure/azure-sdk-for-go/sdk/azcore" - "net/url" "time" + + "github.com/Azure/azure-sdk-for-go/sdk/azcore" ) // A BlobClient represents a URL to an Azure Storage blob; the blob may be a block blob, append blob, or page blob. @@ -37,12 +37,22 @@ func (b BlobClient) WithSnapshot(snapshot string) BlobClient { p.Snapshot = snapshot return BlobClient{ client: &blobClient{ - newConnectionWithPipeline(p.URL(), b.client.con.p), + &connection{u: p.URL(), p: b.client.con.p}, b.client.pathRenameMode, }, } } +func (b BlobClient) NewBlobLeaseClient(leaseId string) BlobLeaseClient { + if leaseId == "" { + leaseId = newUUID().String() + } + return BlobLeaseClient{ + BlobClient: b, + LeaseId: leaseId, + } +} + func (b BlobClient) GetAccountInfo(ctx context.Context) (BlobGetAccountInfoResponse, error) { return b.client.GetAccountInfo(ctx, nil) } @@ -67,10 +77,10 @@ func (b BlobClient) Download(ctx context.Context, options *DownloadBlobOptions) count = *options.Count } return &DownloadResponse{ - b: b, - BlobDownloadResponse: dr, - ctx: ctx, - getInfo: HTTPGetterInfo{Offset: offset, Count: count, ETag: *dr.ETag}, + b: b, + BlobDownloadResponse: dr, + ctx: ctx, + getInfo: HTTPGetterInfo{Offset: offset, Count: count, ETag: *dr.ETag}, }, err } @@ -116,7 +126,7 @@ func (b BlobClient) GetProperties(ctx context.Context, options *GetBlobPropertie // SetBlobHTTPHeaders changes a blob's HTTP headers. // For more information, see https://docs.microsoft.com/rest/api/storageservices/set-blob-properties. -func (b BlobClient) SetHTTPHeaders(ctx context.Context, blobHttpHeaders BlobHttpHeaders, options *SetBlobHTTPHeadersOptions) (BlobSetHTTPHeadersResponse, error) { +func (b BlobClient) SetHTTPHeaders(ctx context.Context, blobHttpHeaders BlobHTTPHeaders, options *SetBlobHTTPHeadersOptions) (BlobSetHTTPHeadersResponse, error) { basics, lease, access := options.pointers() resp, err := b.client.SetHTTPHeaders(ctx, basics, &blobHttpHeaders, lease, access) @@ -147,57 +157,11 @@ func (b BlobClient) CreateSnapshot(ctx context.Context, options *CreateBlobSnaps return resp, handleError(err) } -// AcquireLease acquires a lease on the blob for write and delete operations. The lease duration must be between -// 15 to 60 seconds, or infinite (-1). -// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob. -func (b BlobClient) AcquireLease(ctx context.Context, options *AcquireBlobLeaseOptions) (BlobAcquireLeaseResponse, error) { - basics, access := options.pointers() - resp, err := b.client.AcquireLease(ctx, basics, access) - - return resp, handleError(err) -} - -// RenewLease renews the blob's previously-acquired lease. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob. -func (b BlobClient) RenewLease(ctx context.Context, leaseID string, options *RenewBlobLeaseOptions) (BlobRenewLeaseResponse, error) { - basics, access := options.pointers() - return b.client.RenewLease(ctx, leaseID, basics, access) -} - -// ReleaseLease releases the blob's previously-acquired lease. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob. -func (b BlobClient) ReleaseLease(ctx context.Context, leaseID string, options *ReleaseBlobLeaseOptions) (BlobReleaseLeaseResponse, error) { - basics, access := options.pointers() - resp, err := b.client.ReleaseLease(ctx, leaseID, basics, access) - - return resp, handleError(err) -} - -// BreakLease breaks the blob's previously-acquired lease (if it exists). Pass the LeaseBreakDefault (-1) -// constant to break a fixed-duration lease when it expires or an infinite lease immediately. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob. -func (b BlobClient) BreakLease(ctx context.Context, options *BreakBlobLeaseOptions) (BlobBreakLeaseResponse, error) { - basics, access := options.pointers() - resp, err := b.client.BreakLease(ctx, basics, access) - - return resp, handleError(err) -} - -// ChangeLease changes the blob's lease ID. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob. -func (b BlobClient) ChangeLease(ctx context.Context, leaseID string, proposedID string, options *ChangeBlobLeaseOptions) (BlobChangeLeaseResponse, error) { - basics, access := options.pointers() - resp, err := b.client.ChangeLease(ctx, leaseID, proposedID, basics, access) - - return resp, handleError(err) -} - // StartCopyFromURL copies the data at the source URL to a blob. // For more information, see https://docs.microsoft.com/rest/api/storageservices/copy-blob. func (b BlobClient) StartCopyFromURL(ctx context.Context, copySource string, options *StartCopyBlobOptions) (BlobStartCopyFromURLResponse, error) { basics, srcAccess, destAccess, lease := options.pointers() - uri, _ := url.Parse(copySource) // for some reason generated code does not use strings here. - resp, err := b.client.StartCopyFromURL(ctx, *uri, basics, srcAccess, destAccess, lease) + resp, err := b.client.StartCopyFromURL(ctx, copySource, basics, srcAccess, destAccess, lease) return resp, handleError(err) } @@ -250,13 +214,13 @@ func (b BlobClient) GetBlobSASToken(permissions BlobSASPermissions, validityTime return BlobSASSignatureValues{ ContainerName: urlParts.ContainerName, - BlobName: urlParts.BlobName, - SnapshotTime: t, - Version: SASVersion, + BlobName: urlParts.BlobName, + SnapshotTime: t, + Version: SASVersion, Permissions: permissions.String(), - StartTime: time.Now(), - ExpiryTime: time.Now().Add(validityTime), + StartTime: time.Now().UTC(), + ExpiryTime: time.Now().UTC().Add(validityTime), }.NewSASQueryParameters(b.cred) } diff --git a/sdk/storage/azblob/zc_blobRequestOptions.go b/sdk/storage/azblob/zc_blobRequestOptions.go index 975f9b5f99d5..c2b5ab577d0d 100644 --- a/sdk/storage/azblob/zc_blobRequestOptions.go +++ b/sdk/storage/azblob/zc_blobRequestOptions.go @@ -32,7 +32,7 @@ func (o *DeleteBlobOptions) pointers() (*BlobDeleteOptions, *LeaseAccessConditio type DownloadBlobOptions struct { // When set to true and specified together with the Range, the service returns the MD5 hash for the range, as long as the // range is less than or equal to 4 MB in size. - RangeGetContentMd5 *bool + RangeGetContentMD5 *bool // Optional, you can specify whether a particular range of the blob is read Offset *int64 @@ -61,8 +61,8 @@ func (o *DownloadBlobOptions) pointers() (blobDownloadOptions *BlobDownloadOptio } basics := BlobDownloadOptions{ - RangeGetContentMd5: o.RangeGetContentMd5, - RangeParameter: httpRange{ + RangeGetContentMD5: o.RangeGetContentMD5, + Range: HttpRange{ offset: offset, count: count, }.pointers(), @@ -150,103 +150,6 @@ func (o *CreateBlobSnapshotOptions) pointers() (blobSetMetadataOptions *BlobCrea return &basics, o.CpkInfo, o.CpkScopeInfo, o.ModifiedAccessConditions, o.LeaseAccessConditions } -type AcquireBlobLeaseOptions struct { - // Specifies the duration of the lease, in seconds, or negative one (-1) for a lease that never expires. A non-infinite lease - // can be between 15 and 60 seconds. A lease duration cannot be changed using renew or change. - Duration int32 - - // Proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the proposed lease ID is - // not in the correct format. See Guid Constructor (String) for a list of valid GUID string formats. - ProposedLeaseID *string - - ModifiedAccessConditions *ModifiedAccessConditions -} - -func (o *AcquireBlobLeaseOptions) pointers() (blobAcquireLeaseOptions *BlobAcquireLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) { - if o == nil { - return nil, nil - } - - basics := BlobAcquireLeaseOptions{ - Duration: &o.Duration, - ProposedLeaseId: o.ProposedLeaseID, - } - - return &basics, o.ModifiedAccessConditions -} - -type RenewBlobLeaseOptions struct { - ModifiedAccessConditions *ModifiedAccessConditions -} - -func (o *RenewBlobLeaseOptions) pointers() (blobRenewLeaseOptions *BlobRenewLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) { - if o == nil { - return nil, nil - } - - return nil, o.ModifiedAccessConditions -} - -type ReleaseBlobLeaseOptions struct { - ModifiedAccessConditions *ModifiedAccessConditions -} - -func (o *ReleaseBlobLeaseOptions) pointers() (blobReleaseLeaseOptions *BlobReleaseLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) { - if o == nil { - return nil, nil - } - - return nil, o.ModifiedAccessConditions -} - -type BreakBlobLeaseOptions struct { - // For a break operation, proposed duration the lease should continue before it is broken, in seconds, between 0 and 60. This - // break period is only used if it is shorter than the time remaining on the lease. If longer, the time remaining on the lease - // is used. A new lease will not be available before the break period has expired, but the lease may be held for longer than - // the break period. If this header does not appear with a break operation, a fixed-duration lease breaks after the remaining - // lease period elapses, and an infinite lease breaks immediately. - BreakPeriod *int32 - ModifiedAccessConditions *ModifiedAccessConditions -} - -func (o *BreakBlobLeaseOptions) pointers() (blobBreakLeaseOptions *BlobBreakLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) { - if o == nil { - return nil, nil - } - - if o.BreakPeriod != nil { - period := leasePeriodPointer(*o.BreakPeriod) - basics := BlobBreakLeaseOptions{ - BreakPeriod: period, - } - return &basics, o.ModifiedAccessConditions - } - - return nil, o.ModifiedAccessConditions -} - -// LeaseBreakNaturally tells ContainerURL's or BlobClient's BreakLease method to break the lease using service semantics. -const LeaseBreakNaturally = -1 - -func leasePeriodPointer(period int32) (p *int32) { - if period != LeaseBreakNaturally { - p = &period - } - return nil -} - -type ChangeBlobLeaseOptions struct { - ModifiedAccessConditions *ModifiedAccessConditions -} - -func (o *ChangeBlobLeaseOptions) pointers() (blobChangeLeaseOptions *BlobChangeLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) { - if o == nil { - return nil, nil - } - - return nil, o.ModifiedAccessConditions -} - type StartCopyBlobOptions struct { // Optional. Used to set blob tags in various blob operations. BlobTagsMap *map[string]string @@ -312,26 +215,26 @@ func serializeBlobTags(blobTagsMap *map[string]string) *BlobTags { if blobTagsMap == nil { return nil } - blobTagSet := make([]BlobTag, 0) + blobTagSet := make([]*BlobTag, 0) for key, val := range *blobTagsMap { newKey, newVal := key, val - blobTagSet = append(blobTagSet, BlobTag{Key: &newKey, Value: &newVal}) + blobTagSet = append(blobTagSet, &BlobTag{Key: &newKey, Value: &newVal}) } return &BlobTags{BlobTagSet: &blobTagSet} } type SetTagsBlobOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. Timeout *int32 // The version id parameter is an opaque DateTime value that, when present, // specifies the version of the blob to operate on. It's for service version 2019-10-10 and newer. - VersionId *string + VersionID *string // Optional header, Specifies the transactional crc64 for the body, to be validated by the service. - TransactionalContentCrc64 *[]byte + TransactionalContentCRC64 *[]byte // Optional header, Specifies the transactional md5 for the body, to be validated by the service. - TransactionalContentMd5 *[]byte + TransactionalContentMD5 *[]byte BlobTagsMap *map[string]string @@ -344,12 +247,12 @@ func (o *SetTagsBlobOptions) pointers() (*BlobSetTagsOptions, *ModifiedAccessCon } options := &BlobSetTagsOptions{ - RequestId: o.RequestId, + RequestID: o.RequestID, Tags: serializeBlobTags(o.BlobTagsMap), Timeout: o.Timeout, - TransactionalContentMd5: o.TransactionalContentMd5, - TransactionalContentCrc64: o.TransactionalContentCrc64, - VersionId: o.VersionId, + TransactionalContentMD5: o.TransactionalContentMD5, + TransactionalContentCRC64: o.TransactionalContentCRC64, + VersionID: o.VersionID, } return options, o.ModifiedAccessConditions @@ -357,14 +260,14 @@ func (o *SetTagsBlobOptions) pointers() (*BlobSetTagsOptions, *ModifiedAccessCon type GetTagsBlobOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. Snapshot *string // The timeout parameter is expressed in seconds. Timeout *int32 // The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on. // It's for service version 2019-10-10 and newer. - VersionId *string + VersionID *string ModifiedAccessConditions *ModifiedAccessConditions } @@ -375,10 +278,10 @@ func (o *GetTagsBlobOptions) pointers() (*BlobGetTagsOptions, *ModifiedAccessCon } options := &BlobGetTagsOptions{ - RequestId: o.RequestId, + RequestID: o.RequestID, Snapshot: o.Snapshot, Timeout: o.Timeout, - VersionId: o.VersionId, + VersionID: o.VersionID, } return options, o.ModifiedAccessConditions diff --git a/sdk/storage/azblob/zc_blockBlobClient.go b/sdk/storage/azblob/zc_blockBlobClient.go index 5dde012fe25b..fabf6fc9867b 100644 --- a/sdk/storage/azblob/zc_blockBlobClient.go +++ b/sdk/storage/azblob/zc_blockBlobClient.go @@ -6,9 +6,10 @@ package azblob import ( "context" "io" - "net/url" + "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore" + "github.com/Azure/azure-sdk-for-go/sdk/to" ) const ( @@ -48,7 +49,7 @@ func (bb BlockBlobClient) URL() string { func (bb BlockBlobClient) WithSnapshot(snapshot string) BlockBlobClient { p := NewBlobURLParts(bb.URL()) p.Snapshot = snapshot - con := newConnectionWithPipeline(p.URL(), bb.client.con.p) + con := &connection{u: p.URL(), p: bb.client.con.p} return BlockBlobClient{ client: &blockBlobClient{ con: con, @@ -62,7 +63,7 @@ func (bb BlockBlobClient) WithSnapshot(snapshot string) BlockBlobClient { func (ab BlockBlobClient) WithVersionID(versionID string) BlockBlobClient { p := NewBlobURLParts(ab.URL()) p.VersionID = versionID - con := newConnectionWithPipeline(p.URL(), ab.client.con.p) + con := &connection{u: p.URL(), p: ab.client.con.p} return BlockBlobClient{ client: &blockBlobClient{con: con}, BlobClient: BlobClient{client: &blobClient{con: con}}, @@ -110,9 +111,7 @@ func (bb BlockBlobClient) StageBlock(ctx context.Context, base64BlockID string, func (bb BlockBlobClient) StageBlockFromURL(ctx context.Context, base64BlockID string, sourceURL string, contentLength int64, options *StageBlockFromURLOptions) (BlockBlobStageBlockFromURLResponse, error) { ac, smac, stageOptions, cpkInfo, cpkScope := options.pointers() - uri, _ := url.Parse(sourceURL) - - resp, err := bb.client.StageBlockFromURL(ctx, base64BlockID, contentLength, *uri, stageOptions, cpkInfo, cpkScope, ac, smac) + resp, err := bb.client.StageBlockFromURL(ctx, base64BlockID, contentLength, sourceURL, stageOptions, cpkInfo, cpkScope, ac, smac) return resp, handleError(err) } @@ -126,8 +125,14 @@ func (bb BlockBlobClient) StageBlockFromURL(ctx context.Context, base64BlockID s func (bb BlockBlobClient) CommitBlockList(ctx context.Context, base64BlockIDs []string, options *CommitBlockListOptions) (BlockBlobCommitBlockListResponse, error) { commitOptions, headers, cpkInfo, cpkScope, modifiedAccess, leaseAccess := options.pointers() + // this is a code smell in the generated code + blockIds := make([]*string, len(base64BlockIDs)) + for k,v := range base64BlockIDs { + blockIds[k] = to.StringPtr(v) + } + resp, err := bb.client.CommitBlockList(ctx, BlockLookupList{ - Latest: &base64BlockIDs, + Latest: &blockIds, }, commitOptions, headers, leaseAccess, cpkInfo, cpkScope, modifiedAccess) return resp, handleError(err) @@ -152,9 +157,33 @@ func (bb BlockBlobClient) CopyFromURL(ctx context.Context, source string, option con: bb.client.con, } - uri, _ := url.Parse(source) - - resp, err := bClient.CopyFromURL(ctx, *uri, copyOptions, smac, mac, lac) + resp, err := bClient.CopyFromURL(ctx, source, copyOptions, smac, mac, lac) return resp, handleError(err) } + +// GetBlobSASToken is a convenience method for generating a SAS token for the currently pointed at blob. +// It can only be used if the supplied azcore.Credential during creation was a SharedKeyCredential. +// This validity can be checked with CanGetBlobSASToken(). +func (bb BlockBlobClient) GetBlobSASToken(permissions BlobSASPermissions, validityTime time.Duration) (SASQueryParameters, error) { + urlParts := NewBlobURLParts(bb.URL()) + + t, err := time.Parse(SnapshotTimeFormat, urlParts.Snapshot) + + if err != nil { + t = time.Time{} + } + + return BlobSASSignatureValues{ + ContainerName: urlParts.ContainerName, + BlobName: urlParts.BlobName, + SnapshotTime: t, + Version: SASVersion, + + Permissions: permissions.String(), + + StartTime: time.Now().UTC(), + ExpiryTime: time.Now().UTC().Add(validityTime), + }.NewSASQueryParameters(bb.cred) +} + diff --git a/sdk/storage/azblob/zc_blockBlobRequestOptions.go b/sdk/storage/azblob/zc_blockBlobRequestOptions.go index 63faaca7d0fb..b148c6c3409c 100644 --- a/sdk/storage/azblob/zc_blockBlobRequestOptions.go +++ b/sdk/storage/azblob/zc_blockBlobRequestOptions.go @@ -14,16 +14,16 @@ type UploadBlockBlobOptions struct { Tier *AccessTier // Specify the transactional md5 for the body, to be validated by the service. - TransactionalContentMd5 *[]byte + TransactionalContentMD5 *[]byte - BlobHttpHeaders *BlobHttpHeaders + BlobHTTPHeaders *BlobHTTPHeaders LeaseAccessConditions *LeaseAccessConditions CpkInfo *CpkInfo CpkScopeInfo *CpkScopeInfo ModifiedAccessConditions *ModifiedAccessConditions } -func (o *UploadBlockBlobOptions) pointers() (*BlockBlobUploadOptions, *BlobHttpHeaders, *LeaseAccessConditions, +func (o *UploadBlockBlobOptions) pointers() (*BlockBlobUploadOptions, *BlobHTTPHeaders, *LeaseAccessConditions, *CpkInfo, *CpkScopeInfo, *ModifiedAccessConditions) { if o == nil { return nil, nil, nil, nil, nil, nil @@ -33,10 +33,10 @@ func (o *UploadBlockBlobOptions) pointers() (*BlockBlobUploadOptions, *BlobHttpH BlobTagsString: serializeBlobTagsToStrPtr(o.BlobTagsMap), Metadata: o.Metadata, Tier: o.Tier, - TransactionalContentMd5: o.TransactionalContentMd5, + TransactionalContentMD5: o.TransactionalContentMD5, } - return &basics, o.BlobHttpHeaders, o.LeaseAccessConditions, o.CpkInfo, o.CpkScopeInfo, o.ModifiedAccessConditions + return &basics, o.BlobHTTPHeaders, o.LeaseAccessConditions, o.CpkInfo, o.CpkScopeInfo, o.ModifiedAccessConditions } type StageBlockOptions struct { @@ -58,9 +58,9 @@ type StageBlockFromURLOptions struct { LeaseAccessConditions *LeaseAccessConditions SourceModifiedAccessConditions *SourceModifiedAccessConditions // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // Specify the md5 calculated for the range of bytes that must be read from the copy source. - SourceContentMd5 *[]byte + SourceContentMD5 *[]byte // Specify the crc64 calculated for the range of bytes that must be read from the copy source. SourceContentcrc64 *[]byte @@ -80,8 +80,8 @@ func (o *StageBlockFromURLOptions) pointers() (*LeaseAccessConditions, *SourceMo } options := &BlockBlobStageBlockFromURLOptions{ - RequestId: o.RequestId, - SourceContentMd5: o.SourceContentMd5, + RequestID: o.RequestID, + SourceContentMD5: o.SourceContentMD5, SourceContentcrc64: o.SourceContentcrc64, SourceRange: getSourceRange(o.Offset, o.Count), Timeout: o.Timeout, @@ -93,18 +93,18 @@ func (o *StageBlockFromURLOptions) pointers() (*LeaseAccessConditions, *SourceMo type CommitBlockListOptions struct { BlobTagsMap *map[string]string Metadata *map[string]string - RequestId *string + RequestID *string Tier *AccessTier Timeout *int32 - TransactionalContentCrc64 *[]byte - TransactionalContentMd5 *[]byte - BlobHTTPHeaders *BlobHttpHeaders + TransactionalContentCRC64 *[]byte + TransactionalContentMD5 *[]byte + BlobHTTPHeaders *BlobHTTPHeaders CpkInfo *CpkInfo CpkScopeInfo *CpkScopeInfo BlobAccessConditions } -func (o *CommitBlockListOptions) pointers() (*BlockBlobCommitBlockListOptions, *BlobHttpHeaders, *CpkInfo, *CpkScopeInfo, *ModifiedAccessConditions, *LeaseAccessConditions) { +func (o *CommitBlockListOptions) pointers() (*BlockBlobCommitBlockListOptions, *BlobHTTPHeaders, *CpkInfo, *CpkScopeInfo, *ModifiedAccessConditions, *LeaseAccessConditions) { if o == nil { return nil, nil, nil, nil, nil, nil } @@ -112,11 +112,11 @@ func (o *CommitBlockListOptions) pointers() (*BlockBlobCommitBlockListOptions, * options := &BlockBlobCommitBlockListOptions{ BlobTagsString: serializeBlobTagsToStrPtr(o.BlobTagsMap), Metadata: o.Metadata, - RequestId: o.RequestId, + RequestID: o.RequestID, Tier: o.Tier, Timeout: o.Timeout, - TransactionalContentCrc64: o.TransactionalContentCrc64, - TransactionalContentMd5: o.TransactionalContentMd5, + TransactionalContentCRC64: o.TransactionalContentCRC64, + TransactionalContentMD5: o.TransactionalContentMD5, } return options, o.BlobHTTPHeaders, o.CpkInfo, o.CpkScopeInfo, o.ModifiedAccessConditions, o.LeaseAccessConditions @@ -138,8 +138,8 @@ func (o *GetBlockListOptions) pointers() (*BlockBlobGetBlockListOptions, *Modifi type CopyBlockBlobFromURLOptions struct { BlobTagsMap *map[string]string Metadata *map[string]string - RequestId *string - SourceContentMd5 *[]byte + RequestID *string + SourceContentMD5 *[]byte Tier *AccessTier Timeout *int32 SourceModifiedAccessConditions *SourceModifiedAccessConditions @@ -154,8 +154,8 @@ func (o *CopyBlockBlobFromURLOptions) pointers() (*BlobCopyFromURLOptions, *Sour options := &BlobCopyFromURLOptions{ BlobTagsString: serializeBlobTagsToStrPtr(o.BlobTagsMap), Metadata: o.Metadata, - RequestId: o.RequestId, - SourceContentMd5: o.SourceContentMd5, + RequestID: o.RequestID, + SourceContentMD5: o.SourceContentMD5, Tier: o.Tier, Timeout: o.Timeout, } diff --git a/sdk/storage/azblob/zc_client_options.go b/sdk/storage/azblob/zc_client_options.go index e701d90f2ded..d474737e7833 100644 --- a/sdk/storage/azblob/zc_client_options.go +++ b/sdk/storage/azblob/zc_client_options.go @@ -1,3 +1,6 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + package azblob import ( @@ -20,7 +23,7 @@ func (o *ClientOptions) getConnectionOptions() *connectionOptions { return &connectionOptions{ HTTPClient: o.HTTPClient, - Retry: o.Retry, - Telemetry: o.Telemetry, + Retry: o.Retry, + Telemetry: o.Telemetry, } -} \ No newline at end of file +} diff --git a/sdk/storage/azblob/zc_containerClient.go b/sdk/storage/azblob/zc_containerClient.go index a9302e6b7f46..810cd3d27a93 100644 --- a/sdk/storage/azblob/zc_containerClient.go +++ b/sdk/storage/azblob/zc_containerClient.go @@ -5,7 +5,6 @@ package azblob import ( "context" - "errors" "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore" @@ -38,7 +37,7 @@ func (c ContainerClient) URL() string { // NewBlobClient method. func (c ContainerClient) NewBlobClient(blobName string) BlobClient { blobURL := appendToURLPath(c.URL(), blobName) - newCon := newConnectionWithPipeline(blobURL, c.client.con.p) + newCon := &connection{u: blobURL, p: c.client.con.p} return BlobClient{ client: &blobClient{newCon, nil}, @@ -52,7 +51,7 @@ func (c ContainerClient) NewBlobClient(blobName string) BlobClient { // NewAppendBlobURL method. func (c ContainerClient) NewAppendBlobURL(blobName string) AppendBlobClient { blobURL := appendToURLPath(c.URL(), blobName) - newCon := newConnectionWithPipeline(blobURL, c.client.con.p) + newCon := &connection{blobURL, c.client.con.p} return AppendBlobClient{ client: &appendBlobClient{newCon}, @@ -67,7 +66,7 @@ func (c ContainerClient) NewAppendBlobURL(blobName string) AppendBlobClient { // NewBlockBlobClient method. func (c ContainerClient) NewBlockBlobClient(blobName string) BlockBlobClient { blobURL := appendToURLPath(c.URL(), blobName) - newCon := newConnectionWithPipeline(blobURL, c.client.con.p) + newCon := &connection{blobURL, c.client.con.p} return BlockBlobClient{ client: &blockBlobClient{newCon}, @@ -82,7 +81,7 @@ func (c ContainerClient) NewBlockBlobClient(blobName string) BlockBlobClient { // NewPageBlobURL method. func (c ContainerClient) NewPageBlobClient(blobName string) PageBlobClient { blobURL := appendToURLPath(c.URL(), blobName) - newCon := newConnectionWithPipeline(blobURL, c.client.con.p) + newCon := &connection{blobURL, c.client.con.p} return PageBlobClient{ client: &pageBlobClient{newCon}, @@ -90,6 +89,13 @@ func (c ContainerClient) NewPageBlobClient(blobName string) PageBlobClient { } } +func (c ContainerClient) NewContainerLeaseClient() ContainerLeaseClient { + return ContainerLeaseClient{ + ContainerClient: c, + LeaseId: newUUID().String(), + } +} + func (c ContainerClient) GetAccountInfo(ctx context.Context) (ContainerGetAccountInfoResponse, error) { resp, err := c.client.GetAccountInfo(ctx, nil) @@ -121,7 +127,7 @@ func (c ContainerClient) GetMetadata(ctx context.Context, gpo *GetPropertiesOpti return nil, handleError(err) } - return *resp.Metadata, nil + return resp.Metadata, nil } // @@ -159,7 +165,7 @@ func (c ContainerClient) SetMetadata(ctx context.Context, options *SetMetadataCo // GetAccessPolicy returns the container's access policy. The access policy indicates whether container's blobs may be accessed publicly. // For more information, see https://docs.microsoft.com/rest/api/storageservices/get-container-acl. -func (c ContainerClient) GetAccessPolicy(ctx context.Context, options *GetAccessPolicyOptions) (SignedIDentifierArrayResponse, error) { +func (c ContainerClient) GetAccessPolicy(ctx context.Context, options *GetAccessPolicyOptions) (SignedIdentifierArrayResponse, error) { o, ac := options.pointers() resp, err := c.client.GetAccessPolicy(ctx, o, ac) @@ -172,8 +178,8 @@ func (c ContainerClient) GetAccessPolicy(ctx context.Context, options *GetAccess func (c ContainerClient) SetAccessPolicy(ctx context.Context, options *SetAccessPolicyOptions) (ContainerSetAccessPolicyResponse, error) { //accessPolicy := options.ContainerAcquireLeaseOptions // TODO: Ask Ze/Adele: Why we introduced this check. Service returned "200 OK" without this. And we should let service do this kind of validations. - //if accessPolicy.Access == nil || accessPolicy.ContainerAcl == nil { - // return ContainerSetAccessPolicyResponse{}, errors.New("ContainerSetAccess must be specified with AT LEAST Access and ContainerAcl") + //if accessPolicy.Access == nil || accessPolicy.ContainerACL == nil { + // return ContainerSetAccessPolicyResponse{}, errors.New("ContainerSetAccess must be specified with AT LEAST Access and ContainerACL") //} //ac := options.ContainerAccessConditions @@ -188,64 +194,22 @@ func (c ContainerClient) SetAccessPolicy(ctx context.Context, options *SetAccess return resp, handleError(err) } -// AcquireLease acquires a lease on the container for delete operations. The lease duration must be between 15 to 60 seconds, or infinite (-1). -// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container. -func (c ContainerClient) AcquireLease(ctx context.Context, leaseOptions *AcquireLeaseOptionsContainer) (ContainerAcquireLeaseResponse, error) { - - if leaseOptions == nil || leaseOptions.ContainerAcquireLeaseOptions == nil || leaseOptions.ContainerAcquireLeaseOptions.Duration == nil || leaseOptions.ContainerAcquireLeaseOptions.ProposedLeaseId == nil { - return ContainerAcquireLeaseResponse{}, errors.New("leaseOptions must be specified, with at least ProposedLeaseID and Duration specified under ContainerAcquireLeaseOptions") - } - - resp, err := c.client.AcquireLease(ctx, leaseOptions.ContainerAcquireLeaseOptions, leaseOptions.ModifiedAccessConditions) - - return resp, handleError(err) -} - -// RenewLease renews the container's previously-acquired lease. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container. -func (c ContainerClient) RenewLease(ctx context.Context, leaseId string, leaseOptions *RenewLeaseOptionsContainer) (ContainerRenewLeaseResponse, error) { - renewOptions, accessConditions := leaseOptions.pointers() - - resp, err := c.client.RenewLease(ctx, leaseId, renewOptions, accessConditions) - - return resp, handleError(err) -} - -// ReleaseLease releases the container's previously-acquired lease. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container. -func (c ContainerClient) ReleaseLease(ctx context.Context, leaseID string, leaseOptions *ReleaseLeaseOptionsContainer) (ContainerReleaseLeaseResponse, error) { - options, ac := leaseOptions.pointers() - - resp, err := c.client.ReleaseLease(ctx, leaseID, options, ac) - - return resp, handleError(err) -} - -// BreakLease breaks the container's previously-acquired lease (if it exists). -// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container. -func (c ContainerClient) BreakLease(ctx context.Context, container *BreakLeaseOptionsContainer) (ContainerBreakLeaseResponse, error) { - options, ac := container.pointers() - - resp, err := c.client.BreakLease(ctx, options, ac) - - return resp, handleError(err) -} - -// ChangeLease changes the container's lease ID. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container. -func (c ContainerClient) ChangeLease(ctx context.Context, leaseID string, proposedID string, options *ChangeLeaseOptionsContainer) (ContainerChangeLeaseResponse, error) { - clo, ac := options.pointers() - - resp, err := c.client.ChangeLease(ctx, leaseID, proposedID, clo, ac) - - return resp, handleError(err) -} - // ListBlobsFlatSegment returns a pager for blobs starting from the specified Marker. Use an empty // Marker to start enumeration from the beginning. Blob names are returned in lexicographic order. // For more information, see https://docs.microsoft.com/rest/api/storageservices/list-blobs. func (c ContainerClient) ListBlobsFlatSegment(listOptions *ContainerListBlobFlatSegmentOptions) ListBlobsFlatSegmentResponsePager { - return c.client.ListBlobFlatSegment(listOptions) + pager := c.client.ListBlobFlatSegment(listOptions) + // override the generated pager to insert our handleError(error) + if pager.Err() != nil { + return pager + } + + p := pager.(*listBlobsFlatSegmentResponsePager) + p.errorer = func(response *azcore.Response) error { + return handleError(c.client.listBlobFlatSegmentHandleError(response)) + } + + return p } // ListBlobsHierarchySegment returns a channel of blobs starting from the specified Marker. Use an empty @@ -257,7 +221,18 @@ func (c ContainerClient) ListBlobsFlatSegment(listOptions *ContainerListBlobFlat // AutoPagerBufferSize specifies the channel's buffer size. // Both the blob item channel and error channel should be watched. Only one error will be released via this channel (or a nil error, to register a clean exit.) func (c ContainerClient) ListBlobsHierarchySegment(delimiter string, listOptions *ContainerListBlobHierarchySegmentOptions) ListBlobsHierarchySegmentResponsePager { - return c.client.ListBlobHierarchySegment(delimiter, listOptions) + pager := c.client.ListBlobHierarchySegment(delimiter, listOptions) + // override the generated pager to insert our handleError(error) + if pager.Err() != nil { + return pager + } + + p := pager.(*listBlobsHierarchySegmentResponsePager) + p.errorer = func(response *azcore.Response) error { + return handleError(c.client.listBlobHierarchySegmentHandleError(response)) + } + + return p } func (c ContainerClient) CanGetContainerSASToken() bool { @@ -277,7 +252,7 @@ func (c ContainerClient) GetContainerSASToken(permissions BlobSASPermissions, va Permissions: permissions.String(), - StartTime: time.Now(), - ExpiryTime: time.Now().Add(validityTime), + StartTime: time.Now().UTC(), + ExpiryTime: time.Now().UTC().Add(validityTime), }.NewSASQueryParameters(c.cred) } diff --git a/sdk/storage/azblob/zc_containerRequestOptions.go b/sdk/storage/azblob/zc_containerRequestOptions.go index 8cd678e9c227..b08d1c402f97 100644 --- a/sdk/storage/azblob/zc_containerRequestOptions.go +++ b/sdk/storage/azblob/zc_containerRequestOptions.go @@ -67,7 +67,7 @@ func (o *GetAccessPolicyOptions) pointers() (*ContainerGetAccessPolicyOptions, * } type SetAccessPolicyOptions struct { - // At least Access and ContainerAcl must be specified + // At least Access and ContainerACL must be specified ContainerSetAccessPolicyOptions ContainerSetAccessPolicyOptions ContainerAccessConditions *ContainerAccessConditions } @@ -80,64 +80,6 @@ func (o *SetAccessPolicyOptions) pointers() (ContainerSetAccessPolicyOptions, *L return o.ContainerSetAccessPolicyOptions, lac, mac } -type AcquireLeaseOptionsContainer struct { - // At least Access and ContainerAcl must be specified - ContainerAcquireLeaseOptions *ContainerAcquireLeaseOptions - ModifiedAccessConditions *ModifiedAccessConditions -} - -type RenewLeaseOptionsContainer struct { - ContainerRenewLeaseOptions *ContainerRenewLeaseOptions - ModifiedAccessConditions *ModifiedAccessConditions -} - -func (o *RenewLeaseOptionsContainer) pointers() (*ContainerRenewLeaseOptions, *ModifiedAccessConditions) { - if o == nil { - return nil, nil - } - - return o.ContainerRenewLeaseOptions, o.ModifiedAccessConditions -} - -type ReleaseLeaseOptionsContainer struct { - ContainerReleaseLeaseOptions *ContainerReleaseLeaseOptions - ModifiedAccessConditions *ModifiedAccessConditions -} - -func (o *ReleaseLeaseOptionsContainer) pointers() (*ContainerReleaseLeaseOptions, *ModifiedAccessConditions) { - if o == nil { - return nil, nil - } - - return o.ContainerReleaseLeaseOptions, o.ModifiedAccessConditions -} - -type BreakLeaseOptionsContainer struct { - ContainerBreakLeaseOptions *ContainerBreakLeaseOptions - ModifiedAccessConditions *ModifiedAccessConditions -} - -func (o *BreakLeaseOptionsContainer) pointers() (*ContainerBreakLeaseOptions, *ModifiedAccessConditions) { - if o == nil { - return nil, nil - } - - return o.ContainerBreakLeaseOptions, o.ModifiedAccessConditions -} - -type ChangeLeaseOptionsContainer struct { - ContainerChangeLeaseOptions *ContainerChangeLeaseOptions - ModifiedAccessConditions *ModifiedAccessConditions -} - -func (o *ChangeLeaseOptionsContainer) pointers() (*ContainerChangeLeaseOptions, *ModifiedAccessConditions) { - if o == nil { - return nil, nil - } - - return o.ContainerChangeLeaseOptions, o.ModifiedAccessConditions -} - type SetMetadataContainerOptions struct { Metadata *map[string]string LeaseAccessConditions *LeaseAccessConditions diff --git a/sdk/storage/azblob/zc_credential_anonymous.go b/sdk/storage/azblob/zc_credential_anonymous.go deleted file mode 100644 index 4d37bf1e1dcc..000000000000 --- a/sdk/storage/azblob/zc_credential_anonymous.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package azblob - -import ( - "github.com/Azure/azure-sdk-for-go/sdk/azcore" -) - -func NewAnonymousCredential() AnonymousCredential { - return AnonymousCredential{} -} - -type AnonymousCredential struct{} - -func (AnonymousCredential) AuthenticationPolicy(options azcore.AuthenticationPolicyOptions) azcore.Policy { - return anonymousCredentialPolicy{} -} - -type anonymousCredentialPolicy struct { -} - -func (p anonymousCredentialPolicy) Do(request *azcore.Request) (*azcore.Response, error) { - return request.Next() -} diff --git a/sdk/storage/azblob/zc_leaseClient.go b/sdk/storage/azblob/zc_leaseClient.go new file mode 100644 index 000000000000..8de36f20d5e7 --- /dev/null +++ b/sdk/storage/azblob/zc_leaseClient.go @@ -0,0 +1,169 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package azblob + +import ( + "context" + "github.com/Azure/azure-sdk-for-go/sdk/azcore" +) + +type BlobLeaseClient struct { + BlobClient + LeaseId string +} + +func NewBlobLeaseClient(blobURL, leaseId string, cred azcore.Credential, options *connectionOptions) (BlobLeaseClient, error) { + con := newConnection(blobURL, cred, options) + c, _ := cred.(*SharedKeyCredential) + + blobClient := BlobClient{ + client: &blobClient{con, nil}, + cred: c, + } + + if leaseId == "" { + leaseId = newUUID().String() + } + + return BlobLeaseClient{ + BlobClient: blobClient, + LeaseId: leaseId, + }, nil +} + +// URL returns the URL endpoint used by the BlobLeaseClient object. +func (blc BlobLeaseClient) URL() string { + return blc.client.con.u +} + +// AcquireLease acquires a lease on the blob for write and delete operations. The lease Duration must be between +// 15 to 60 seconds, or infinite (-1). +// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob. +func (blc *BlobLeaseClient) AcquireLease(ctx context.Context, options *AcquireLeaseBlobOptions) (BlobAcquireLeaseResponse, error) { + blobAcquireLeaseOptions, modifiedAccessConditions := options.pointers() + blobAcquireLeaseOptions.ProposedLeaseID = &blc.LeaseId + + resp, err := blc.client.AcquireLease(ctx, blobAcquireLeaseOptions, modifiedAccessConditions) + return resp, handleError(err) +} + +// BreakLease breaks the blob's previously-acquired lease (if it exists). Pass the LeaseBreakDefault (-1) +// constant to break a fixed-Duration lease when it expires or an infinite lease immediately. +// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob. +func (blc *BlobLeaseClient) BreakLease(ctx context.Context, options *BreakLeaseBlobOptions) (BlobBreakLeaseResponse, error) { + blobBreakLeaseOptions, modifiedAccessConditions := options.pointers() + resp, err := blc.client.BreakLease(ctx, blobBreakLeaseOptions, modifiedAccessConditions) + return resp, handleError(err) +} + +// ChangeLease changes the blob's lease ID. +// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob. +func (blc *BlobLeaseClient) ChangeLease(ctx context.Context, options *ChangeLeaseBlobOptions) (BlobChangeLeaseResponse, error) { + proposedLeaseId, modifiedAccessConditions := options.pointers() + resp, err := blc.client.ChangeLease(ctx, blc.LeaseId, proposedLeaseId, nil, modifiedAccessConditions) + + // If lease has been changed successfully, set the LeaseId in client + if err == nil { + blc.LeaseId = proposedLeaseId + } + + return resp, handleError(err) +} + +// RenewLease renews the blob's previously-acquired lease. +// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob. +func (blc *BlobLeaseClient) RenewLease(ctx context.Context, options *RenewLeaseBlobOptions) (BlobRenewLeaseResponse, error) { + renewLeaseBlobOptions, modifiedAccessConditions := options.pointers() + resp, err := blc.client.RenewLease(ctx, blc.LeaseId, renewLeaseBlobOptions, modifiedAccessConditions) + return resp, handleError(err) +} + +// ReleaseLease releases the blob's previously-acquired lease. +// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob. +func (blc *BlobLeaseClient) ReleaseLease(ctx context.Context, options *ReleaseLeaseBlobOptions) (BlobReleaseLeaseResponse, error) { + renewLeaseBlobOptions, modifiedAccessConditions := options.pointers() + resp, err := blc.client.ReleaseLease(ctx, blc.LeaseId, renewLeaseBlobOptions, modifiedAccessConditions) + return resp, handleError(err) +} + +type ContainerLeaseClient struct { + ContainerClient + LeaseId string +} + +func NewContainerLeaseClient(containerURL, leaseId string, cred azcore.Credential, options *connectionOptions) (ContainerLeaseClient, error) { + c, _ := cred.(*SharedKeyCredential) + + containerClient := ContainerClient{ + client: &containerClient{ + con: newConnection(containerURL, cred, options), + }, cred: c, + } + + if leaseId == "" { + leaseId = newUUID().String() + } + + return ContainerLeaseClient{ + ContainerClient: containerClient, + LeaseId: leaseId, + }, nil +} + +// URL returns the URL endpoint used by the ContainerClient object. +func (clc ContainerLeaseClient) URL() string { + return clc.client.con.u +} + +// AcquireLease acquires a lease on the container for delete operations. The lease Duration must be between 15 to 60 seconds, or infinite (-1). +// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container. +func (clc *ContainerLeaseClient) AcquireLease(ctx context.Context, options *AcquireLeaseContainerOptions) (ContainerAcquireLeaseResponse, error) { + containerAcquireLeaseOptions, modifiedAccessConditions := options.pointers() + containerAcquireLeaseOptions.ProposedLeaseID = &clc.LeaseId + + resp, err := clc.client.AcquireLease(ctx, containerAcquireLeaseOptions, modifiedAccessConditions) + if err == nil && resp.LeaseID != nil { + clc.LeaseId = *resp.LeaseID + } + return resp, handleError(err) +} + +// BreakLease breaks the container's previously-acquired lease (if it exists). +// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container. +func (clc *ContainerLeaseClient) BreakLease(ctx context.Context, options *BreakLeaseContainerOptions) (ContainerBreakLeaseResponse, error) { + containerBreakLeaseOptions, modifiedAccessConditions := options.pointers() + resp, err := clc.client.BreakLease(ctx, containerBreakLeaseOptions, modifiedAccessConditions) + return resp, handleError(err) +} + +// ChangeLease changes the container's lease ID. +// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container. +func (clc *ContainerLeaseClient) ChangeLease(ctx context.Context, options *ChangeLeaseContainerOptions) (ContainerChangeLeaseResponse, error) { + proposedLeaseId, modifiedAccessConditions := options.pointers() + resp, err := clc.client.ChangeLease(ctx, clc.LeaseId, proposedLeaseId, nil, modifiedAccessConditions) + + if err == nil && resp.LeaseID != nil { + clc.LeaseId = *resp.LeaseID + } + return resp, handleError(err) +} + +// ReleaseLease releases the container's previously-acquired lease. +// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container. +func (clc *ContainerLeaseClient) ReleaseLease(ctx context.Context, options *ReleaseLeaseContainerOptions) (ContainerReleaseLeaseResponse, error) { + containerReleaseLeaseOptions, modifiedAccessConditions := options.pointers() + resp, err := clc.client.ReleaseLease(ctx, clc.LeaseId, containerReleaseLeaseOptions, modifiedAccessConditions) + return resp, handleError(err) +} + +// RenewLease renews the container's previously-acquired lease. +// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container. +func (clc *ContainerLeaseClient) RenewLease(ctx context.Context, options *RenewLeaseContainerOptions) (ContainerRenewLeaseResponse, error) { + renewLeaseBlobOptions, modifiedAccessConditions := options.pointers() + resp, err := clc.client.RenewLease(ctx, clc.LeaseId, renewLeaseBlobOptions, modifiedAccessConditions) + if err == nil && resp.LeaseID != nil { + clc.LeaseId = *resp.LeaseID + } + return resp, handleError(err) +} diff --git a/sdk/storage/azblob/zc_leaseRequestOptions.go b/sdk/storage/azblob/zc_leaseRequestOptions.go new file mode 100644 index 000000000000..5238a27265fa --- /dev/null +++ b/sdk/storage/azblob/zc_leaseRequestOptions.go @@ -0,0 +1,165 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package azblob + +type AcquireLeaseBlobOptions struct { + // Specifies the Duration of the lease, in seconds, or negative one (-1) for a lease that never expires. A non-infinite lease + // can be between 15 and 60 seconds. A lease Duration cannot be changed using renew or change. + Duration *int32 + + ModifiedAccessConditions *ModifiedAccessConditions +} + +func (o *AcquireLeaseBlobOptions) pointers() (*BlobAcquireLeaseOptions, *ModifiedAccessConditions) { + if o == nil { + return nil, nil + } + return &BlobAcquireLeaseOptions{ + Duration: o.Duration, + }, o.ModifiedAccessConditions +} + +type BreakLeaseBlobOptions struct { + // For a break operation, proposed Duration the lease should continue before it is broken, in seconds, between 0 and 60. This + // break period is only used if it is shorter than the time remaining on the lease. If longer, the time remaining on the lease + // is used. A new lease will not be available before the break period has expired, but the lease may be held for longer than + // the break period. If this header does not appear with a break operation, a fixed-Duration lease breaks after the remaining + // lease period elapses, and an infinite lease breaks immediately. + BreakPeriod *int32 + ModifiedAccessConditions *ModifiedAccessConditions +} + +func (o *BreakLeaseBlobOptions) pointers() (*BlobBreakLeaseOptions, *ModifiedAccessConditions) { + if o == nil { + return nil, nil + } + + if o.BreakPeriod != nil { + period := leasePeriodPointer(*o.BreakPeriod) + return &BlobBreakLeaseOptions{ + BreakPeriod: period, + }, o.ModifiedAccessConditions + } + + return nil, o.ModifiedAccessConditions +} + +type ChangeLeaseBlobOptions struct { + ProposedLeaseId string + ModifiedAccessConditions *ModifiedAccessConditions +} + +func (o *ChangeLeaseBlobOptions) pointers() (proposedLeaseId string, modifiedAccessConditions *ModifiedAccessConditions) { + if o == nil { + return "", nil + } + + return o.ProposedLeaseId, o.ModifiedAccessConditions +} + +type ReleaseLeaseBlobOptions struct { + ModifiedAccessConditions *ModifiedAccessConditions +} + +func (o *ReleaseLeaseBlobOptions) pointers() (blobReleaseLeaseOptions *BlobReleaseLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) { + if o == nil { + return nil, nil + } + + return nil, o.ModifiedAccessConditions +} + +type RenewLeaseBlobOptions struct { + ModifiedAccessConditions *ModifiedAccessConditions +} + +func (o *RenewLeaseBlobOptions) pointers() (blobRenewLeaseOptions *BlobRenewLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) { + if o == nil { + return nil, nil + } + + return nil, o.ModifiedAccessConditions +} + +type AcquireLeaseContainerOptions struct { + Duration *int32 + ModifiedAccessConditions *ModifiedAccessConditions +} + +func (o *AcquireLeaseContainerOptions) pointers() (*ContainerAcquireLeaseOptions, *ModifiedAccessConditions) { + if o == nil { + return nil, nil + } + containerAcquireLeaseOptions := &ContainerAcquireLeaseOptions{ + Duration: o.Duration, + } + + return containerAcquireLeaseOptions, o.ModifiedAccessConditions +} + +type BreakLeaseContainerOptions struct { + BreakPeriod *int32 + ModifiedAccessConditions *ModifiedAccessConditions +} + +func (o *BreakLeaseContainerOptions) pointers() (*ContainerBreakLeaseOptions, *ModifiedAccessConditions) { + if o == nil { + return nil, nil + } + + containerBreakLeaseOptions := &ContainerBreakLeaseOptions{ + BreakPeriod: o.BreakPeriod, + } + + return containerBreakLeaseOptions, o.ModifiedAccessConditions +} + +type ChangeLeaseContainerOptions struct { + ProposedLeaseId string + ModifiedAccessConditions *ModifiedAccessConditions +} + +func (o *ChangeLeaseContainerOptions) pointers() (proposedLeaseId string, modifiedAccessConditions *ModifiedAccessConditions) { + if o == nil { + return "", nil + } + + return o.ProposedLeaseId, o.ModifiedAccessConditions +} + +type RenewLeaseContainerOptions struct { + ModifiedAccessConditions *ModifiedAccessConditions +} + +func (o *RenewLeaseContainerOptions) pointers() (containerRenewLeaseOptions *ContainerRenewLeaseOptions, + modifiedAccessConditions *ModifiedAccessConditions) { + if o == nil { + return nil, nil + } + + return nil, o.ModifiedAccessConditions +} + +type ReleaseLeaseContainerOptions struct { + ModifiedAccessConditions *ModifiedAccessConditions +} + +func (o *ReleaseLeaseContainerOptions) pointers() (containerReleaseLeaseOptions *ContainerReleaseLeaseOptions, + modifiedAccessConditions *ModifiedAccessConditions) { + if o == nil { + return nil, nil + } + + return nil, o.ModifiedAccessConditions +} + +// LeaseBreakNaturally tells ContainerClient's or BlobClient's BreakLease method to break the lease using service semantics. +const LeaseBreakNaturally = -1 + +func leasePeriodPointer(period int32) (p *int32) { + if period != LeaseBreakNaturally { + p = &period + } + return nil +} diff --git a/sdk/storage/azblob/zc_list_blobs_wrapper.go b/sdk/storage/azblob/zc_list_blobs_wrapper.go index 3ec556606ef5..51860c620f7d 100644 --- a/sdk/storage/azblob/zc_list_blobs_wrapper.go +++ b/sdk/storage/azblob/zc_list_blobs_wrapper.go @@ -3,118 +3,113 @@ package azblob -import ( - "context" - "time" -) - -type listBlobsFlatSegmentAutoPager struct { - pager ListBlobsFlatSegmentResponsePager - channel chan BlobItemInternal - errChan chan error - ctx context.Context - - // Set to 0 for no time-out - timeout time.Duration - timer *time.Timer -} - -type listBlobsHierarchySegmentAutoPager struct { - pager ListBlobsHierarchySegmentResponsePager - channel chan BlobItemInternal - errChan chan error - ctx context.Context - - // Set to 0 for no time-out - timeout time.Duration - timer *time.Timer -} - -func (p listBlobsFlatSegmentAutoPager) Go() { - p.timer = time.NewTimer(p.timeout) - - for { - resp := p.pager.PageResponse() - - if resp.RawResponse != nil { - for _, v := range *resp.EnumerationResults.Segment.BlobItems { - if p.timeout != 0 { - p.timer.Reset(p.timeout) - } else { - p.timer.C = nil - } - - select { - case p.channel <- v: - case <-p.timer.C: - p.errChan <- nil - - close(p.errChan) - close(p.channel) - return // break the queue - } - } - } - - if !p.pager.NextPage(p.ctx) { - err := p.pager.Err() - if err != nil { - p.errChan <- handleError(err) - } else { - p.errChan <- nil - } - - close(p.errChan) - close(p.channel) - return - } - } -} - -func (p listBlobsHierarchySegmentAutoPager) Go() { - p.timer = time.NewTimer(p.timeout) - - // Stop it immediately - // This way, as the user requested, we just don't time out. - if p.timeout == 0 { - p.timer.Stop() - } - - for { - resp := p.pager.PageResponse() - - if resp.RawResponse != nil { - for _, v := range *resp.EnumerationResults.Segment.BlobItems { - if p.timeout != 0 { - p.timer.Reset(p.timeout) - } else { - p.timer.C = nil - } - - select { - case p.channel <- v: - case <-p.timer.C: - p.errChan <- nil - - close(p.errChan) - close(p.channel) - return // break the queue - } - } - } - - if !p.pager.NextPage(p.ctx) { - err := p.pager.Err() - if err != nil { - p.errChan <- handleError(err) - } else { - p.errChan <- nil - } - - // register an exit to listing - close(p.errChan) - close(p.channel) - return - } - } -} +// type listBlobsFlatSegmentAutoPager struct { +// pager ListBlobsFlatSegmentResponsePager +// channel chan BlobItemInternal +// errChan chan error +// ctx context.Context +// +// // Set to 0 for no time-out +// timeout time.Duration +// timer *time.Timer +// } +// +// type listBlobsHierarchySegmentAutoPager struct { +// pager ListBlobsHierarchySegmentResponsePager +// channel chan BlobItemInternal +// errChan chan error +// ctx context.Context +// +// // Set to 0 for no time-out +// timeout time.Duration +// timer *time.Timer +// } +// +// func (p listBlobsFlatSegmentAutoPager) Go() { +// p.timer = time.NewTimer(p.timeout) +// +// for { +// resp := p.pager.PageResponse() +// +// if resp.RawResponse != nil { +// for _, v := range *resp.EnumerationResults.Segment.BlobItems { +// if p.timeout != 0 { +// p.timer.Reset(p.timeout) +// } else { +// p.timer.C = nil +// } +// +// select { +// case p.channel <- v: +// case <-p.timer.C: +// p.errChan <- nil +// +// close(p.errChan) +// close(p.channel) +// return // break the queue +// } +// } +// } +// +// if !p.pager.NextPage(p.ctx) { +// err := p.pager.Err() +// if err != nil { +// p.errChan <- handleError(err) +// } else { +// p.errChan <- nil +// } +// +// close(p.errChan) +// close(p.channel) +// return +// } +// } +// } +// +// func (p listBlobsHierarchySegmentAutoPager) Go() { +// p.timer = time.NewTimer(p.timeout) +// +// // Stop it immediately +// // This way, as the user requested, we just don't time out. +// if p.timeout == 0 { +// p.timer.Stop() +// } +// +// for { +// resp := p.pager.PageResponse() +// +// if resp.RawResponse != nil { +// for _, v := range *resp.EnumerationResults.Segment.BlobItems { +// if p.timeout != 0 { +// p.timer.Reset(p.timeout) +// } else { +// p.timer.C = nil +// } +// +// select { +// case p.channel <- v: +// case <-p.timer.C: +// p.errChan <- nil +// +// close(p.errChan) +// close(p.channel) +// return // break the queue +// } +// } +// } +// +// if !p.pager.NextPage(p.ctx) { +// err := p.pager.Err() +// if err != nil { +// p.errChan <- handleError(err) +// } else { +// p.errChan <- nil +// } +// +// // register an exit to listing +// close(p.errChan) +// close(p.channel) +// return +// } +// } +// } diff --git a/sdk/storage/azblob/zc_list_containers_wrapper.go b/sdk/storage/azblob/zc_list_containers_wrapper.go index dee6054fd8c7..3809d6145d1d 100644 --- a/sdk/storage/azblob/zc_list_containers_wrapper.go +++ b/sdk/storage/azblob/zc_list_containers_wrapper.go @@ -3,58 +3,53 @@ package azblob -import ( - "context" - "time" -) - -type listContainersSegmentAutoPager struct { - pager ListContainersSegmentResponsePager - channel chan ContainerItem - errChan chan error - ctx context.Context - - timeout time.Duration - timer *time.Timer -} - -func (p listContainersSegmentAutoPager) Go() { - p.timer = time.NewTimer(p.timeout) - - for { - resp := p.pager.PageResponse() - - if resp.EnumerationResults != nil && resp.EnumerationResults.ContainerItems != nil { - for _, v := range *resp.EnumerationResults.ContainerItems { - if p.timeout != 0 { - p.timer.Reset(p.timeout) - } else { - p.timer.C = nil - } - - select { - case p.channel <- v: - case <-p.timer.C: - p.errChan <- nil - - close(p.channel) - close(p.errChan) - return // break the queue - } - } - } - - if !p.pager.NextPage(p.ctx) { - err := p.pager.Err() - if err != nil { - p.errChan <- handleError(err) - } else { - p.errChan <- nil - } - - close(p.errChan) - close(p.channel) - return - } - } -} +// type listContainersSegmentAutoPager struct { +// pager ListContainersSegmentResponsePager +// channel chan ContainerItem +// errChan chan error +// ctx context.Context +// +// timeout time.Duration +// timer *time.Timer +// } +// +// func (p listContainersSegmentAutoPager) Go() { +// p.timer = time.NewTimer(p.timeout) +// +// for { +// resp := p.pager.PageResponse() +// +// if resp.EnumerationResults != nil && resp.EnumerationResults.ContainerItems != nil { +// for _, v := range *resp.EnumerationResults.ContainerItems { +// if p.timeout != 0 { +// p.timer.Reset(p.timeout) +// } else { +// p.timer.C = nil +// } +// +// select { +// case p.channel <- v: +// case <-p.timer.C: +// p.errChan <- nil +// +// close(p.channel) +// close(p.errChan) +// return // break the queue +// } +// } +// } +// +// if !p.pager.NextPage(p.ctx) { +// err := p.pager.Err() +// if err != nil { +// p.errChan <- handleError(err) +// } else { +// p.errChan <- nil +// } +// +// close(p.errChan) +// close(p.channel) +// return +// } +// } +// } diff --git a/sdk/storage/azblob/zc_pageBlobClient.go b/sdk/storage/azblob/zc_pageBlobClient.go index 9f38c7de27bb..a128f6f58cb3 100644 --- a/sdk/storage/azblob/zc_pageBlobClient.go +++ b/sdk/storage/azblob/zc_pageBlobClient.go @@ -8,6 +8,7 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore" "io" "net/url" + "time" ) const ( @@ -41,7 +42,7 @@ func (pb PageBlobClient) WithSnapshot(snapshot string) PageBlobClient { p := NewBlobURLParts(pb.URL()) p.Snapshot = snapshot - con := newConnectionWithPipeline(p.URL(), pb.client.con.p) + con := &connection{p.URL(), pb.client.con.p} return PageBlobClient{ client: &pageBlobClient{con: con}, BlobClient: BlobClient{client: &blobClient{con: con}}, @@ -54,7 +55,7 @@ func (pb PageBlobClient) WithVersionID(versionID string) PageBlobClient { p := NewBlobURLParts(pb.URL()) p.VersionID = versionID - con := newConnectionWithPipeline(p.URL(), pb.client.con.p) + con := &connection{p.URL(), pb.client.con.p} return PageBlobClient{ client: &pageBlobClient{con: con}, BlobClient: BlobClient{client: &blobClient{con: con}}, @@ -97,18 +98,16 @@ func (pb PageBlobClient) UploadPages(ctx context.Context, body io.ReadSeeker, op func (pb PageBlobClient) UploadPagesFromURL(ctx context.Context, source string, sourceOffset, destOffset, count int64, options *UploadPagesFromURLOptions) (PageBlobUploadPagesFromURLResponse, error) { uploadOptions, cpkInfo, cpkScope, snac, smac, lac, mac := options.pointers() - uri, _ := url.Parse(source) - - resp, err := pb.client.UploadPagesFromURL(ctx, *uri, rangeToString(sourceOffset, count), 0, rangeToString(destOffset, count), uploadOptions, cpkInfo, cpkScope, lac, snac, mac, smac) + resp, err := pb.client.UploadPagesFromURL(ctx, source, rangeToString(sourceOffset, count), 0, rangeToString(destOffset, count), uploadOptions, cpkInfo, cpkScope, lac, snac, mac, smac) return resp, handleError(err) } // ClearPages frees the specified pages from the page blob. // For more information, see https://docs.microsoft.com/rest/api/storageservices/put-page. -func (pb PageBlobClient) ClearPages(ctx context.Context, offset, count int64, options *ClearPagesOptions) (PageBlobClearPagesResponse, error) { +func (pb PageBlobClient) ClearPages(ctx context.Context, pageRange HttpRange, options *ClearPagesOptions) (PageBlobClearPagesResponse, error) { clearOptions := &PageBlobClearPagesOptions{ - RangeParameter: rangeToStringPtr(offset, count), + Range: pageRange.pointers(), } cpkInfo, cpkScope, snac, lac, mac := options.pointers() @@ -120,11 +119,11 @@ func (pb PageBlobClient) ClearPages(ctx context.Context, offset, count int64, op // GetPageRanges returns the list of valid page ranges for a page blob or snapshot of a page blob. // For more information, see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges. -func (pb PageBlobClient) GetPageRanges(ctx context.Context, offset, count int64, options *GetPageRangesOptions) (PageListResponse, error) { +func (pb PageBlobClient) GetPageRanges(ctx context.Context, pageRange HttpRange, options *GetPageRangesOptions) (PageListResponse, error) { snapshot, lac, mac := options.pointers() getRangesOptions := &PageBlobGetPageRangesOptions{ - RangeParameter: rangeToStringPtr(offset, count), + Range: pageRange.pointers(), Snapshot: snapshot, } @@ -140,7 +139,7 @@ func (pb PageBlobClient) GetPageRanges(ctx context.Context, offset, count int64, // // return pb.pbClient.GetPageRangesDiff(ctx, nil, nil, prevSnapshot, // prevSnapshotURL, // Get managed disk diff -// httpRange{offset: offset, count: count}.pointers(), +// HttpRange{offset: offset, count: count}.pointers(), // ac.LeaseAccessConditions.pointers(), // ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, // nil, // Blob ifTags @@ -149,12 +148,12 @@ func (pb PageBlobClient) GetPageRanges(ctx context.Context, offset, count int64, // GetPageRangesDiff gets the collection of page ranges that differ between a specified snapshot and this page blob. // For more information, see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges. -func (pb PageBlobClient) GetPageRangesDiff(ctx context.Context, offset, count int64, prevSnapshot string, options *GetPageRangesOptions) (PageListResponse, error) { +func (pb PageBlobClient) GetPageRangesDiff(ctx context.Context, pageRange HttpRange, prevSnapshot string, options *GetPageRangesOptions) (PageListResponse, error) { snapshot, lac, mac := options.pointers() diffOptions := &PageBlobGetPageRangesDiffOptions{ Prevsnapshot: &prevSnapshot, - RangeParameter: rangeToStringPtr(offset, count), + Range: pageRange.pointers(), Snapshot: snapshot, } @@ -194,7 +193,33 @@ func (pb PageBlobClient) StartCopyIncremental(ctx context.Context, source string srcURL.RawQuery = queryParams.Encode() pageBlobCopyIncrementalOptions, modifiedAccessConditions := options.pointers() - resp, err := pb.client.CopyIncremental(ctx, *srcURL, pageBlobCopyIncrementalOptions, modifiedAccessConditions) + resp, err := pb.client.CopyIncremental(ctx, srcURL.String(), pageBlobCopyIncrementalOptions, modifiedAccessConditions) return resp, handleError(err) } + + +// GetBlobSASToken is a convenience method for generating a SAS token for the currently pointed at blob. +// It can only be used if the supplied azcore.Credential during creation was a SharedKeyCredential. +// This validity can be checked with CanGetBlobSASToken(). +func (pb PageBlobClient) GetBlobSASToken(permissions BlobSASPermissions, validityTime time.Duration) (SASQueryParameters, error) { + urlParts := NewBlobURLParts(pb.URL()) + + t, err := time.Parse(SnapshotTimeFormat, urlParts.Snapshot) + + if err != nil { + t = time.Time{} + } + + return BlobSASSignatureValues{ + ContainerName: urlParts.ContainerName, + BlobName: urlParts.BlobName, + SnapshotTime: t, + Version: SASVersion, + + Permissions: permissions.String(), + + StartTime: time.Now().UTC(), + ExpiryTime: time.Now().UTC().Add(validityTime), + }.NewSASQueryParameters(pb.cred) +} diff --git a/sdk/storage/azblob/zc_pageBlobRequestOptions.go b/sdk/storage/azblob/zc_pageBlobRequestOptions.go index a547fc2da111..4f045d94ebc4 100644 --- a/sdk/storage/azblob/zc_pageBlobRequestOptions.go +++ b/sdk/storage/azblob/zc_pageBlobRequestOptions.go @@ -39,13 +39,13 @@ type CreatePageBlobOptions struct { // Optional. Indicates the tier to be set on the page blob. Tier *PremiumPageBlobAccessTier - BlobHttpHeaders *BlobHttpHeaders + BlobHTTPHeaders *BlobHTTPHeaders CpkInfo *CpkInfo CpkScopeInfo *CpkScopeInfo BlobAccessConditions } -func (o *CreatePageBlobOptions) pointers() (*PageBlobCreateOptions, *BlobHttpHeaders, *CpkInfo, *CpkScopeInfo, *LeaseAccessConditions, *ModifiedAccessConditions) { +func (o *CreatePageBlobOptions) pointers() (*PageBlobCreateOptions, *BlobHTTPHeaders, *CpkInfo, *CpkScopeInfo, *LeaseAccessConditions, *ModifiedAccessConditions) { if o == nil { return nil, nil, nil, nil, nil, nil } @@ -57,16 +57,15 @@ func (o *CreatePageBlobOptions) pointers() (*PageBlobCreateOptions, *BlobHttpHea Tier: o.Tier, } - return options, o.BlobHttpHeaders, o.CpkInfo, o.CpkScopeInfo, o.LeaseAccessConditions, o.ModifiedAccessConditions + return options, o.BlobHTTPHeaders, o.CpkInfo, o.CpkScopeInfo, o.LeaseAccessConditions, o.ModifiedAccessConditions } type UploadPagesOptions struct { // Specify the transactional crc64 for the body, to be validated by the service. - Offset *int64 - Count *int64 - TransactionalContentCrc64 *[]byte + PageRange *HttpRange + TransactionalContentCRC64 *[]byte // Specify the transactional md5 for the body, to be validated by the service. - TransactionalContentMd5 *[]byte + TransactionalContentMD5 *[]byte CpkInfo *CpkInfo CpkScopeInfo *CpkScopeInfo @@ -80,9 +79,12 @@ func (o *UploadPagesOptions) pointers() (*PageBlobUploadPagesOptions, *CpkInfo, } options := &PageBlobUploadPagesOptions{ - RangeParameter: getSourceRange(o.Offset, o.Count), - TransactionalContentCrc64: o.TransactionalContentCrc64, - TransactionalContentMd5: o.TransactionalContentMd5, + TransactionalContentCRC64: o.TransactionalContentCRC64, + TransactionalContentMD5: o.TransactionalContentMD5, + } + + if o.PageRange != nil { + options.Range = o.PageRange.pointers() } return options, o.CpkInfo, o.CpkScopeInfo, o.SequenceNumberAccessConditions, o.LeaseAccessConditions, o.ModifiedAccessConditions @@ -90,7 +92,7 @@ func (o *UploadPagesOptions) pointers() (*PageBlobUploadPagesOptions, *CpkInfo, type UploadPagesFromURLOptions struct { // Specify the md5 calculated for the range of bytes that must be read from the copy source. - SourceContentMd5 *[]byte + SourceContentMD5 *[]byte // Specify the crc64 calculated for the range of bytes that must be read from the copy source. SourceContentcrc64 *[]byte @@ -107,7 +109,7 @@ func (o *UploadPagesFromURLOptions) pointers() (*PageBlobUploadPagesFromURLOptio } options := &PageBlobUploadPagesFromURLOptions{ - SourceContentMd5: o.SourceContentMd5, + SourceContentMD5: o.SourceContentMD5, SourceContentcrc64: o.SourceContentcrc64, } @@ -183,7 +185,7 @@ func (o *UpdateSequenceNumberPageBlob) pointers() (*PageBlobUpdateSequenceNumber type CopyIncrementalPageBlobOptions struct { ModifiedAccessConditions *ModifiedAccessConditions - RequestId *string + RequestID *string Timeout *int32 } @@ -194,7 +196,7 @@ func (o *CopyIncrementalPageBlobOptions) pointers() (*PageBlobCopyIncrementalOpt } options := PageBlobCopyIncrementalOptions{ - RequestId: o.RequestId, + RequestID: o.RequestID, Timeout: o.Timeout, } diff --git a/sdk/storage/azblob/zc_response_helpers.go b/sdk/storage/azblob/zc_response_helpers.go index ab2c8fdf0c0c..3c29bfbf7ead 100644 --- a/sdk/storage/azblob/zc_response_helpers.go +++ b/sdk/storage/azblob/zc_response_helpers.go @@ -10,28 +10,28 @@ import ( ) // NewHTTPHeaders returns the user-modifiable properties for this blob. -func (bgpr BlobGetPropertiesResponse) NewHTTPHeaders() BlobHttpHeaders { - return BlobHttpHeaders{ +func (bgpr BlobGetPropertiesResponse) NewHTTPHeaders() BlobHTTPHeaders { + return BlobHTTPHeaders{ BlobContentType: bgpr.ContentType, BlobContentEncoding: bgpr.ContentEncoding, BlobContentLanguage: bgpr.ContentLanguage, BlobContentDisposition: bgpr.ContentDisposition, BlobCacheControl: bgpr.CacheControl, - BlobContentMd5: bgpr.ContentMD5, + BlobContentMD5: bgpr.ContentMD5, } } /////////////////////////////////////////////////////////////////////////////// // NewHTTPHeaders returns the user-modifiable properties for this blob. -func (dr BlobDownloadResponse) NewHTTPHeaders() BlobHttpHeaders { - return BlobHttpHeaders{ +func (dr BlobDownloadResponse) NewHTTPHeaders() BlobHTTPHeaders { + return BlobHTTPHeaders{ BlobContentType: dr.ContentType, BlobContentEncoding: dr.ContentEncoding, BlobContentLanguage: dr.ContentLanguage, BlobContentDisposition: dr.ContentDisposition, BlobCacheControl: dr.CacheControl, - BlobContentMd5: dr.ContentMD5, + BlobContentMD5: dr.ContentMD5, } } diff --git a/sdk/storage/azblob/zc_sas_service.go b/sdk/storage/azblob/zc_sas_service.go index d5b21f8791d3..ed911c414ad5 100644 --- a/sdk/storage/azblob/zc_sas_service.go +++ b/sdk/storage/azblob/zc_sas_service.go @@ -78,12 +78,32 @@ func (v BlobSASSignatureValues) NewSASQueryParameters(credential StorageAccountC signedIdentifier := v.Identifier - udk := credential.GetUDKParams() + p := SASQueryParameters{ + // Common SAS parameters + version: v.Version, + protocol: v.Protocol, + startTime: v.StartTime, + expiryTime: v.ExpiryTime, + permissions: v.Permissions, + ipRange: v.IPRange, + + // Container/Blob-specific SAS parameters + resource: resource, + identifier: v.Identifier, + cacheControl: v.CacheControl, + contentDisposition: v.ContentDisposition, + contentEncoding: v.ContentEncoding, + contentLanguage: v.ContentLanguage, + contentType: v.ContentType, + snapshotTime: v.SnapshotTime, + } + + if udc, ok := credential.(UserDelegationCredential); ok { + udk := udc.GetUDKParams() - if udk != nil { udkStart, udkExpiry, _ := FormatTimesForSASSigning(*udk.SignedStart, *udk.SignedExpiry, time.Time{}) - //I don't like this answer to combining the functions - //But because signedIdentifier and the user delegation key strings share a place, this is an _OK_ way to do it. + // I don't like this answer to combining the functions + // But because signedIdentifier and the user delegation key strings share a place, this is an _OK_ way to do it. signedIdentifier = strings.Join([]string{ *udk.SignedOid, *udk.SignedTid, @@ -92,6 +112,13 @@ func (v BlobSASSignatureValues) NewSASQueryParameters(credential StorageAccountC *udk.SignedService, *udk.SignedVersion, }, "\n") + + p.signedOid = *udk.SignedOid + p.signedTid = *udk.SignedTid + p.signedStart = *udk.SignedStart + p.signedExpiry = *udk.SignedExpiry + p.signedService = *udk.SignedService + p.signedVersion = *udk.SignedVersion } // String to sign: http://msdn.microsoft.com/en-us/library/azure/dn140255.aspx @@ -113,41 +140,7 @@ func (v BlobSASSignatureValues) NewSASQueryParameters(credential StorageAccountC v.ContentType}, // rsct "\n") - signature := "" - signature = credential.ComputeHMACSHA256(stringToSign) - - p := SASQueryParameters{ - // Common SAS parameters - version: v.Version, - protocol: v.Protocol, - startTime: v.StartTime, - expiryTime: v.ExpiryTime, - permissions: v.Permissions, - ipRange: v.IPRange, - - // Container/Blob-specific SAS parameters - resource: resource, - identifier: v.Identifier, - cacheControl: v.CacheControl, - contentDisposition: v.ContentDisposition, - contentEncoding: v.ContentEncoding, - contentLanguage: v.ContentLanguage, - contentType: v.ContentType, - snapshotTime: v.SnapshotTime, - - // Calculated SAS signature - signature: signature, - } - - //User delegation SAS specific parameters - if udk != nil { - p.signedOid = *udk.SignedOid - p.signedTid = *udk.SignedTid - p.signedStart = *udk.SignedStart - p.signedExpiry = *udk.SignedExpiry - p.signedService = *udk.SignedService - p.signedVersion = *udk.SignedVersion - } + p.signature = credential.ComputeHMACSHA256(stringToSign) return p, nil } diff --git a/sdk/storage/azblob/zc_serviceClient.go b/sdk/storage/azblob/zc_serviceClient.go index b4f4ae4354db..f99b5319f190 100644 --- a/sdk/storage/azblob/zc_serviceClient.go +++ b/sdk/storage/azblob/zc_serviceClient.go @@ -11,6 +11,7 @@ import ( "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore" + "github.com/Azure/azure-sdk-for-go/sdk/to" ) const ( @@ -55,7 +56,7 @@ func (s ServiceClient) URL() string { // NewContainerClient method. func (s ServiceClient) NewContainerClient(containerName string) ContainerClient { containerURL := appendToURLPath(s.client.con.u, containerName) - containerConnection := newConnectionWithPipeline(containerURL, s.client.con.p) + containerConnection := &connection{containerURL, s.client.con.p} return ContainerClient{ client: &containerClient{ con: containerConnection, @@ -63,6 +64,24 @@ func (s ServiceClient) NewContainerClient(containerName string) ContainerClient } } +func (s ServiceClient) NewContainerLeaseClient(containerName, leaseId string) ContainerLeaseClient { + containerURL := appendToURLPath(s.client.con.u, containerName) + containerConnection := &connection{containerURL, s.client.con.p} + + if leaseId == "" { + leaseId = newUUID().String() + } + + return ContainerLeaseClient{ + ContainerClient: ContainerClient{ + client: &containerClient{ + con: containerConnection, + }, + }, + LeaseId: leaseId, + } +} + // appendToURLPath appends a string to the end of a URL's path (prefixing the string with a '/' if required) func appendToURLPath(u string, name string) string { // e.g. "https://ms.com/a/b/?k1=v1&k2=v2#f" @@ -94,8 +113,15 @@ func (s ServiceClient) GetAccountInfo(ctx context.Context) (ServiceGetAccountInf // GetUserDelegationCredential obtains a UserDelegationKey object using the base ServiceClient object. // OAuth is required for this call, as well as any role that can delegate access to the storage account. // Strings in KeyInfo should be formatted with SASTimeFormat. -func (s ServiceClient) GetUserDelegationCredential(ctx context.Context, info KeyInfo) (UserDelegationCredential, error) { - udk, err := s.client.GetUserDelegationKey(ctx, info, nil) +func (s ServiceClient) GetUserDelegationCredential(ctx context.Context, expiry time.Time, startTime *time.Time) (UserDelegationCredential, error) { + if startTime == nil { + startTime = to.TimePtr(time.Now().UTC()) + } + + udk, err := s.client.GetUserDelegationKey(ctx, KeyInfo{ + Start: to.StringPtr(startTime.UTC().Format(SASTimeFormat)), + Expiry: to.StringPtr(expiry.UTC().Format(SASTimeFormat)), + }, nil) if err != nil { return UserDelegationCredential{}, handleError(err) } @@ -117,11 +143,11 @@ func (s ServiceClient) ListContainersSegment(o *ListContainersSegmentOptions) Li p := pager.(*listContainersSegmentResponsePager) // cast to the internal type first p.advancer = func(cxt context.Context, response ListContainersSegmentResponseResponse) (*azcore.Request, error) { if response.EnumerationResults.NextMarker == nil { - return nil, errors.New("unexpected missing NextMarker") + return nil, handleError(errors.New("unexpected missing NextMarker")) } req, err := s.client.listContainersSegmentCreateRequest(cxt, listOptions) if err != nil { - return nil, err + return nil, handleError(err) } queryValues, _ := url.ParseQuery(req.URL.RawQuery) queryValues.Set("marker", *response.EnumerationResults.NextMarker) @@ -162,11 +188,11 @@ func (s ServiceClient) GetAccountSASToken(services AccountSASServices, resources return AccountSASSignatureValues{ Version: SASVersion, - Permissions: permissions.String(), - Services: services.String(), + Permissions: permissions.String(), + Services: services.String(), ResourceTypes: resources.String(), - StartTime: time.Now(), - ExpiryTime: time.Now().Add(validityTime), + StartTime: time.Now().UTC(), + ExpiryTime: time.Now().UTC().Add(validityTime), }.NewSASQueryParameters(s.cred.(*SharedKeyCredential)) } diff --git a/sdk/storage/azblob/zc_serviceRequestOptions.go b/sdk/storage/azblob/zc_serviceRequestOptions.go index d875de399cea..33ba87b05879 100644 --- a/sdk/storage/azblob/zc_serviceRequestOptions.go +++ b/sdk/storage/azblob/zc_serviceRequestOptions.go @@ -3,6 +3,14 @@ package azblob +import ( + "time" +) + +type GetUserDelegationKeyOptions struct { + startTime *time.Time +} + type ListContainersSegmentOptions struct { Include ListContainersDetail @@ -28,7 +36,7 @@ func (o *ListContainersSegmentOptions) pointers() *ServiceListContainersSegmentO } return &ServiceListContainersSegmentOptions{ - Include: o.Include.pointer(), + Include: o.Include.pointers(), Marker: o.Marker, Maxresults: o.MaxResults, Prefix: o.Prefix, @@ -45,7 +53,7 @@ type ListContainersDetail struct { } // string produces the Include query parameter's value. -func (d *ListContainersDetail) pointer() *[]ListContainersIncludeType { +func (d *ListContainersDetail) pointers() *[]ListContainersIncludeType { if d.Metadata == false && d.Deleted == false { return nil } diff --git a/sdk/storage/azblob/zc_storage_error.go b/sdk/storage/azblob/zc_storage_error.go index 6b8bf94c6069..842a20d04397 100644 --- a/sdk/storage/azblob/zc_storage_error.go +++ b/sdk/storage/azblob/zc_storage_error.go @@ -30,7 +30,7 @@ type InternalError struct { cause error } -func (e InternalError) Error() string { +func (e *InternalError) Error() string { if (errors.Is(e.cause, StorageError{})) { return e.cause.Error() } @@ -38,17 +38,29 @@ func (e InternalError) Error() string { return fmt.Sprintf("===== INTERNAL ERROR =====\n%s", e.cause.Error()) } -func (e InternalError) Is(err error) bool { - _, ok := err.(InternalError) +func (e *InternalError) Is(err error) bool { + _, ok := err.(*InternalError) return ok } +func (e *InternalError) As(target interface{}) bool { + nt, ok := target.(**InternalError) + + if ok { + *nt = e + return ok + } + + //goland:noinspection GoErrorsAs + return errors.As(e.cause, target) +} + // StorageError is the internal struct that replaces the generated StorageError. // TL;DR: This implements xml.Unmarshaler, and when the original StorageError is substituted, this unmarshaler kicks in. // This handles the description and details. defunkifyStorageError handles the response, cause, and service code. type StorageError struct { - response *http.Response + response *http.Response description string ErrorCode StorageErrorCode @@ -57,11 +69,11 @@ type StorageError struct { func handleError(err error) error { if err, ok := err.(*runtime.ResponseError); ok { - return InternalError{defunkifyStorageError(err) } + return &InternalError{defunkifyStorageError(err)} } if err != nil { - return InternalError{err} + return &InternalError{err} } return nil @@ -84,16 +96,11 @@ func defunkifyStorageError(responseError *runtime.ResponseError) error { return err } - return InternalError{ + return &InternalError{ cause: responseError, } } -// ServiceCode returns service-error information. The caller may examine these values but should not modify any of them. -func (e *StorageError) ServiceCode() ServiceCodeType { - return e.serviceCode -} - // ServiceCode returns service-error information. The caller may examine these values but should not modify any of them. func (e *StorageError) StatusCode() int { return e.response.StatusCode @@ -131,8 +138,9 @@ func (e StorageError) Error() string { func (e StorageError) Is(err error) bool { _, ok := err.(StorageError) + _, ok2 := err.(*StorageError) - return ok + return ok || ok2 } func (e StorageError) Response() *http.Response { @@ -179,7 +187,7 @@ func (e *StorageError) Temporary() bool { return true } } - + return false } @@ -204,5 +212,6 @@ func (e *StorageError) UnmarshalXML(d *xml.Decoder, start xml.StartElement) (err } } } + return nil } diff --git a/sdk/storage/azblob/zc_validators.go b/sdk/storage/azblob/zc_validators.go index 4f91d19af353..326aecf8b2b2 100644 --- a/sdk/storage/azblob/zc_validators.go +++ b/sdk/storage/azblob/zc_validators.go @@ -12,15 +12,26 @@ import ( //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// httpRange defines a range of bytes within an HTTP resource, starting at offset and -// ending at offset+count. A zero-value httpRange indicates the entire resource. An httpRange +func (pr *PageRange) Raw() (start, end int64) { + if pr.Start != nil { + start = *pr.Start + } + if pr.End != nil { + end = *pr.End + } + + return +} + +// HttpRange defines a range of bytes within an HTTP resource, starting at offset and +// ending at offset+count. A zero-value HttpRange indicates the entire resource. An HttpRange // which has an offset but na zero value count indicates from the offset to the resource's end. -type httpRange struct { +type HttpRange struct { offset int64 count int64 } -func (r httpRange) pointers() *string { +func (r HttpRange) pointers() *string { if r.offset == 0 && r.count == 0 { // Do common case first for performance return nil // No specified range } @@ -47,7 +58,7 @@ func getSourceRange(offset, count *int64) *string { newCount = *count } - return httpRange{offset: newOffset, count: newCount}.pointers() + return HttpRange{offset: newOffset, count: newCount}.pointers() } func validateSeekableStreamAt0AndGetCount(body io.ReadSeeker) (int64, error) { diff --git a/sdk/storage/azblob/zt_append_blob_client_test.go b/sdk/storage/azblob/zt_append_blob_client_test.go index 195aa26b389b..ef9aafa9a6a2 100644 --- a/sdk/storage/azblob/zt_append_blob_client_test.go +++ b/sdk/storage/azblob/zt_append_blob_client_test.go @@ -60,7 +60,7 @@ func (s *aztestsSuite) TestAppendBlockWithMD5(c *chk.C) { md5Value := md5.Sum(body) contentMD5 := md5Value[:] appendBlockOptions := AppendBlockOptions{ - TransactionalContentMd5: &contentMD5, + TransactionalContentMD5: &contentMD5, } appendResp, err := abClient.AppendBlock(context.Background(), readerToBody, &appendBlockOptions) c.Assert(err, chk.IsNil) @@ -81,7 +81,7 @@ func (s *aztestsSuite) TestAppendBlockWithMD5(c *chk.C) { readerToBody, body = getRandomDataAndReader(1024) _, badMD5 := getRandomDataAndReader(16) appendBlockOptions = AppendBlockOptions{ - TransactionalContentMd5: &badMD5, + TransactionalContentMD5: &badMD5, } appendResp, err = abClient.AppendBlock(context.Background(), readerToBody, &appendBlockOptions) c.Assert(err, chk.NotNil) @@ -152,7 +152,7 @@ func (s *aztestsSuite) TestAppendBlockFromURL(c *chk.C) { Offset: &offset, Count: &count, } - appendFromURLResp, err := destBlob.AppendBlockFromURL(ctx, srcBlobURLWithSAS, 0, &appendBlockURLOptions) + appendFromURLResp, err := destBlob.AppendBlockFromURL(ctx, srcBlobURLWithSAS, &appendBlockURLOptions) c.Assert(err, chk.IsNil) c.Assert(appendFromURLResp.RawResponse.StatusCode, chk.Equals, 201) c.Assert(*appendFromURLResp.BlobAppendOffset, chk.Equals, "0") @@ -239,9 +239,9 @@ func (s *aztestsSuite) TestAppendBlockFromURLWithMD5(c *chk.C) { appendBlockURLOptions := AppendBlockURLOptions{ Offset: &offset, Count: &count, - SourceContentMd5: &contentMD5, + SourceContentMD5: &contentMD5, } - appendFromURLResp, err := destBlob.AppendBlockFromURL(ctx, srcBlobURLWithSAS, 0, &appendBlockURLOptions) + appendFromURLResp, err := destBlob.AppendBlockFromURL(ctx, srcBlobURLWithSAS, &appendBlockURLOptions) c.Assert(err, chk.IsNil) c.Assert(appendFromURLResp.RawResponse.StatusCode, chk.Equals, 201) c.Assert(*appendFromURLResp.BlobAppendOffset, chk.Equals, "0") @@ -268,9 +268,9 @@ func (s *aztestsSuite) TestAppendBlockFromURLWithMD5(c *chk.C) { appendBlockURLOptions = AppendBlockURLOptions{ Offset: &offset, Count: &count, - SourceContentMd5: &badMD5, + SourceContentMD5: &badMD5, } - _, err = destBlob.AppendBlockFromURL(ctx, srcBlobURLWithSAS, int64(contentSize), nil) + _, err = destBlob.AppendBlockFromURL(ctx, srcBlobURLWithSAS, &appendBlockURLOptions) c.Assert(err, chk.NotNil) validateStorageError(c, err, StorageErrorCodeMD5Mismatch) @@ -291,7 +291,7 @@ func (s *aztestsSuite) TestBlobCreateAppendMetadataNonEmpty(c *chk.C) { resp, err := abClient.GetProperties(ctx, nil) c.Assert(err, chk.IsNil) c.Assert(resp.Metadata, chk.NotNil) - c.Assert(*resp.Metadata, chk.DeepEquals, basicMetadata) + c.Assert(resp.Metadata, chk.DeepEquals, basicMetadata) } func (s *aztestsSuite) TestBlobCreateAppendMetadataEmpty(c *chk.C) { @@ -332,7 +332,7 @@ func (s *aztestsSuite) TestBlobCreateAppendHTTPHeaders(c *chk.C) { abClient, _ := getAppendBlobClient(c, containerClient) createAppendBlobOptions := CreateAppendBlobOptions{ - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, } _, err := abClient.Create(ctx, &createAppendBlobOptions) c.Assert(err, chk.IsNil) @@ -347,7 +347,7 @@ func validateAppendBlobPut(c *chk.C, abClient AppendBlobClient) { resp, err := abClient.GetProperties(ctx, nil) c.Assert(err, chk.IsNil) c.Assert(resp.Metadata, chk.NotNil) - c.Assert(*resp.Metadata, chk.DeepEquals, basicMetadata) + c.Assert(resp.Metadata, chk.DeepEquals, basicMetadata) c.Assert(resp.NewHTTPHeaders(), chk.DeepEquals, basicHeaders) } @@ -360,7 +360,7 @@ func (s *aztestsSuite) TestBlobCreateAppendIfModifiedSinceTrue(c *chk.C) { currentTime := getRelativeTimeGMT(-10) createAppendBlobOptions := CreateAppendBlobOptions{ - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, Metadata: &basicMetadata, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ @@ -383,7 +383,7 @@ func (s *aztestsSuite) TestBlobCreateAppendIfModifiedSinceFalse(c *chk.C) { currentTime := getRelativeTimeGMT(10) createAppendBlobOptions := CreateAppendBlobOptions{ - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, Metadata: &basicMetadata, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ @@ -406,7 +406,7 @@ func (s *aztestsSuite) TestBlobCreateAppendIfUnmodifiedSinceTrue(c *chk.C) { currentTime := getRelativeTimeGMT(10) createAppendBlobOptions := CreateAppendBlobOptions{ - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, Metadata: &basicMetadata, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ @@ -429,7 +429,7 @@ func (s *aztestsSuite) TestBlobCreateAppendIfUnmodifiedSinceFalse(c *chk.C) { currentTime := getRelativeTimeGMT(-10) createAppendBlobOptions := CreateAppendBlobOptions{ - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, Metadata: &basicMetadata, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ @@ -452,7 +452,7 @@ func (s *aztestsSuite) TestBlobCreateAppendIfMatchTrue(c *chk.C) { resp, _ := abClient.GetProperties(ctx, nil) createAppendBlobOptions := CreateAppendBlobOptions{ - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, Metadata: &basicMetadata, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ @@ -474,7 +474,7 @@ func (s *aztestsSuite) TestBlobCreateAppendIfMatchFalse(c *chk.C) { eTag := "garbage" createAppendBlobOptions := CreateAppendBlobOptions{ - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, Metadata: &basicMetadata, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ @@ -496,7 +496,7 @@ func (s *aztestsSuite) TestBlobCreateAppendIfNoneMatchTrue(c *chk.C) { eTag := "garbage" createAppendBlobOptions := CreateAppendBlobOptions{ - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, Metadata: &basicMetadata, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ @@ -519,7 +519,7 @@ func (s *aztestsSuite) TestBlobCreateAppendIfNoneMatchFalse(c *chk.C) { resp, _ := abClient.GetProperties(ctx, nil) createAppendBlobOptions := CreateAppendBlobOptions{ - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, Metadata: &basicMetadata, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ diff --git a/sdk/storage/azblob/zt_blob_client_test.go b/sdk/storage/azblob/zt_blob_client_test.go index 6be868964f3c..43670fa2dd8d 100644 --- a/sdk/storage/azblob/zt_blob_client_test.go +++ b/sdk/storage/azblob/zt_blob_client_test.go @@ -122,7 +122,7 @@ func (s *aztestsSuite) TestBlobStartCopyMetadata(c *chk.C) { copyBlobClient, _ := getBlockBlobClient(c, containerClient) metadata := make(map[string]string) - metadata["bla"] = "foo" + metadata["Bla"] = "foo" options := StartCopyBlobOptions{ Metadata: &metadata, } @@ -132,7 +132,7 @@ func (s *aztestsSuite) TestBlobStartCopyMetadata(c *chk.C) { resp2, err := copyBlobClient.GetProperties(ctx, nil) c.Assert(err, chk.IsNil) - c.Assert(*resp2.Metadata, chk.DeepEquals, metadata) + c.Assert(resp2.Metadata, chk.DeepEquals, metadata) } func (s *aztestsSuite) TestBlobStartCopyMetadataNil(c *chk.C) { @@ -153,7 +153,7 @@ func (s *aztestsSuite) TestBlobStartCopyMetadataNil(c *chk.C) { resp2, err := copyBlobClient.GetProperties(ctx, nil) c.Assert(err, chk.IsNil) - c.Assert(*resp2.Metadata, chk.HasLen, 0) + c.Assert(resp2.Metadata, chk.HasLen, 0) } func (s *aztestsSuite) TestBlobStartCopyMetadataEmpty(c *chk.C) { @@ -178,7 +178,7 @@ func (s *aztestsSuite) TestBlobStartCopyMetadataEmpty(c *chk.C) { resp2, err := copyBlobClient.GetProperties(ctx, nil) c.Assert(err, chk.IsNil) - c.Assert(*resp2.Metadata, chk.HasLen, 0) + c.Assert(resp2.Metadata, chk.HasLen, 0) } func (s *aztestsSuite) TestBlobStartCopyMetadataInvalidField(c *chk.C) { @@ -337,7 +337,7 @@ func (s *aztestsSuite) TestBlobStartCopyUsingSASDest(c *chk.C) { // Generate anonymous URL to destination with SAS anonURL := NewBlobURLParts(bsu2.URL()) anonURL.SAS = copyQueryParams - anonymousBSU, err := NewServiceClient(anonURL.URL(), NewAnonymousCredential(), nil) + anonymousBSU, err := NewServiceClient(anonURL.URL(), azcore.AnonymousCredential(), nil) if err != nil { c.Fatal(err) } @@ -802,7 +802,7 @@ func (s *aztestsSuite) TestBlobSnapshotMetadataEmpty(c *chk.C) { snapshotURL := blobClient.WithSnapshot(*resp.Snapshot) resp2, err := snapshotURL.GetProperties(ctx, nil) c.Assert(err, chk.IsNil) - c.Assert(*resp2.Metadata, chk.DeepEquals, basicMetadata) + c.Assert(resp2.Metadata, chk.DeepEquals, basicMetadata) } func (s *aztestsSuite) TestBlobSnapshotMetadataNil(c *chk.C) { @@ -821,7 +821,7 @@ func (s *aztestsSuite) TestBlobSnapshotMetadataNil(c *chk.C) { snapshotURL := blobClient.WithSnapshot(*resp.Snapshot) resp2, err := snapshotURL.GetProperties(ctx, nil) c.Assert(err, chk.IsNil) - c.Assert(*resp2.Metadata, chk.DeepEquals, basicMetadata) + c.Assert(resp2.Metadata, chk.DeepEquals, basicMetadata) } func (s *aztestsSuite) TestBlobSnapshotMetadataInvalid(c *chk.C) { @@ -1144,7 +1144,7 @@ func (s *aztestsSuite) TestBlobDownloadDataContentMD5(c *chk.C) { options := DownloadBlobOptions{ Count: &count, Offset: &offset, - RangeGetContentMd5: &getMD5, + RangeGetContentMD5: &getMD5, } resp, err := blobClient.Download(ctx, &options) c.Assert(err, chk.IsNil) @@ -1399,9 +1399,9 @@ func validateBlobDeleted(c *chk.C, blobClient BlobClient) { _, err := blobClient.GetProperties(ctx, nil) c.Assert(err, chk.NotNil) - // TODO cannot be checked right now - serr := err.(*StorageError) // Delete blob is a HEAD request and does not return a StorageErrorCode in the body - c.Assert(strings.Contains(serr.Error(), "not exist"), chk.Equals, true) + var serr *StorageError + c.Assert(errors.As(err, &serr), chk.Equals, true) + c.Assert(serr.ErrorCode, chk.Equals, StorageErrorCodeBlobNotFound) } func (s *aztestsSuite) TestBlobDeleteIfModifiedSinceTrue(c *chk.C) { @@ -1556,7 +1556,7 @@ func (s *aztestsSuite) TestBlobGetPropsAndMetadataIfModifiedSinceTrue(c *chk.C) } resp, err := blobClient.GetProperties(ctx, &getBlobPropertiesOptions) c.Assert(err, chk.IsNil) - c.Assert(*resp.Metadata, chk.DeepEquals, basicMetadata) + c.Assert(resp.Metadata, chk.DeepEquals, basicMetadata) } func (s *aztestsSuite) TestBlobGetPropsAndMetadataIfModifiedSinceFalse(c *chk.C) { @@ -1575,7 +1575,8 @@ func (s *aztestsSuite) TestBlobGetPropsAndMetadataIfModifiedSinceFalse(c *chk.C) } _, err = blobClient.GetProperties(ctx, &getBlobPropertiesOptions) c.Assert(err, chk.NotNil) - serr := err.(*StorageError) + var serr *StorageError + c.Assert(errors.As(err, &serr), chk.Equals, true) c.Assert(serr.response.StatusCode, chk.Equals, 304) // No service code returned for a HEAD } @@ -1595,7 +1596,7 @@ func (s *aztestsSuite) TestBlobGetPropsAndMetadataIfUnmodifiedSinceTrue(c *chk.C } resp, err := blobClient.GetProperties(ctx, &getBlobPropertiesOptions) c.Assert(err, chk.IsNil) - c.Assert(*resp.Metadata, chk.DeepEquals, basicMetadata) + c.Assert(resp.Metadata, chk.DeepEquals, basicMetadata) } func (s *aztestsSuite) TestBlobGetPropsAndMetadataIfUnmodifiedSinceFalse(c *chk.C) { @@ -1614,7 +1615,8 @@ func (s *aztestsSuite) TestBlobGetPropsAndMetadataIfUnmodifiedSinceFalse(c *chk. } _, err = blobClient.GetProperties(ctx, &getBlobPropertiesOptions) c.Assert(err, chk.NotNil) - serr := err.(*StorageError) + var serr *StorageError + c.Assert(errors.As(err, &serr), chk.Equals, true) c.Assert(serr.response.StatusCode, chk.Equals, 412) } @@ -1632,7 +1634,7 @@ func (s *aztestsSuite) TestBlobGetPropsAndMetadataIfMatchTrue(c *chk.C) { } resp2, err := blobClient.GetProperties(ctx, &getBlobPropertiesOptions) c.Assert(err, chk.IsNil) - c.Assert(*resp2.Metadata, chk.DeepEquals, basicMetadata) + c.Assert(resp2.Metadata, chk.DeepEquals, basicMetadata) } func (s *aztestsSuite) TestBlobGetPropsOnMissingBlob(c *chk.C) { @@ -1643,7 +1645,8 @@ func (s *aztestsSuite) TestBlobGetPropsOnMissingBlob(c *chk.C) { _, err := blobClient.GetProperties(ctx, nil) c.Assert(err, chk.NotNil) - storageError := err.(*StorageError) + var storageError *StorageError + c.Assert(errors.As(err, &storageError), chk.Equals, true) c.Assert(storageError.response.StatusCode, chk.Equals, 404) //c.Assert(storageError.ErrorCode(), chk.Equals, StorageErrorCodeBlobNotFound) c.Assert(storageError.response.Header.Get("x-ms-error-code"), chk.Equals, string(StorageErrorCodeBlobNotFound)) @@ -1661,7 +1664,8 @@ func (s *aztestsSuite) TestBlobGetPropsAndMetadataIfMatchFalse(c *chk.C) { } _, err := blobClient.GetProperties(ctx, &getBlobPropertiesOptions) c.Assert(err, chk.NotNil) - serr := err.(*StorageError) + var serr *StorageError + c.Assert(errors.As(err, &serr), chk.Equals, true) c.Assert(serr.response.StatusCode, chk.Equals, 412) } @@ -1680,7 +1684,7 @@ func (s *aztestsSuite) TestBlobGetPropsAndMetadataIfNoneMatchTrue(c *chk.C) { } resp, err := blobClient.GetProperties(ctx, &getBlobPropertiesOptions) c.Assert(err, chk.IsNil) - c.Assert(*resp.Metadata, chk.DeepEquals, basicMetadata) + c.Assert(resp.Metadata, chk.DeepEquals, basicMetadata) } func (s *aztestsSuite) TestBlobGetPropsAndMetadataIfNoneMatchFalse(c *chk.C) { @@ -1697,7 +1701,8 @@ func (s *aztestsSuite) TestBlobGetPropsAndMetadataIfNoneMatchFalse(c *chk.C) { } _, err = blobClient.GetProperties(ctx, &getBlobPropertiesOptions) c.Assert(err, chk.NotNil) - serr := err.(*StorageError) + var serr *StorageError + c.Assert(errors.As(err, &serr), chk.Equals, true) c.Assert(serr.response.StatusCode, chk.Equals, 304) } @@ -1712,7 +1717,7 @@ func (s *aztestsSuite) TestBlobSetPropertiesBasic(c *chk.C) { cacheControl := "control" contentLanguage := "my_language" contentEncoding := "my_encoding" - headers := BlobHttpHeaders{ + headers := BlobHTTPHeaders{ BlobContentType: &contentType, BlobContentDisposition: &contentDisposition, BlobCacheControl: &cacheControl, @@ -1733,10 +1738,10 @@ func (s *aztestsSuite) TestBlobSetPropertiesEmptyValue(c *chk.C) { blobClient, _ := createNewBlockBlob(c, containerClient) contentType := "my_type" - _, err := blobClient.SetHTTPHeaders(ctx, BlobHttpHeaders{BlobContentType: &contentType}, nil) + _, err := blobClient.SetHTTPHeaders(ctx, BlobHTTPHeaders{BlobContentType: &contentType}, nil) c.Assert(err, chk.IsNil) - _, err = blobClient.SetHTTPHeaders(ctx, BlobHttpHeaders{}, nil) + _, err = blobClient.SetHTTPHeaders(ctx, BlobHTTPHeaders{}, nil) c.Assert(err, chk.IsNil) resp, err := blobClient.GetProperties(ctx, nil) @@ -1758,7 +1763,7 @@ func (s *aztestsSuite) TestBlobSetPropertiesIfModifiedSinceTrue(c *chk.C) { defer deleteContainer(c, containerClient) blobClient, _ := createNewBlockBlob(c, containerClient) - _, err := blobClient.SetHTTPHeaders(ctx, BlobHttpHeaders{BlobContentDisposition: to.StringPtr("my_disposition")}, + _, err := blobClient.SetHTTPHeaders(ctx, BlobHTTPHeaders{BlobContentDisposition: to.StringPtr("my_disposition")}, &SetBlobHTTPHeadersOptions{ModifiedAccessConditions: &ModifiedAccessConditions{IfModifiedSince: ¤tTime}}) c.Assert(err, chk.IsNil) @@ -1773,7 +1778,7 @@ func (s *aztestsSuite) TestBlobSetPropertiesIfModifiedSinceFalse(c *chk.C) { currentTime := getRelativeTimeGMT(10) - _, err := blobClient.SetHTTPHeaders(ctx, BlobHttpHeaders{BlobContentDisposition: to.StringPtr("my_disposition")}, + _, err := blobClient.SetHTTPHeaders(ctx, BlobHTTPHeaders{BlobContentDisposition: to.StringPtr("my_disposition")}, &SetBlobHTTPHeadersOptions{ModifiedAccessConditions: &ModifiedAccessConditions{IfModifiedSince: ¤tTime}}) c.Assert(err, chk.NotNil) } @@ -1786,7 +1791,7 @@ func (s *aztestsSuite) TestBlobSetPropertiesIfUnmodifiedSinceTrue(c *chk.C) { currentTime := getRelativeTimeGMT(10) - _, err := blobClient.SetHTTPHeaders(ctx, BlobHttpHeaders{BlobContentDisposition: to.StringPtr("my_disposition")}, + _, err := blobClient.SetHTTPHeaders(ctx, BlobHTTPHeaders{BlobContentDisposition: to.StringPtr("my_disposition")}, &SetBlobHTTPHeadersOptions{ModifiedAccessConditions: &ModifiedAccessConditions{IfUnmodifiedSince: ¤tTime}}) c.Assert(err, chk.IsNil) @@ -1801,7 +1806,7 @@ func (s *aztestsSuite) TestBlobSetPropertiesIfUnmodifiedSinceFalse(c *chk.C) { defer deleteContainer(c, containerClient) blobClient, _ := createNewBlockBlob(c, containerClient) - _, err := blobClient.SetHTTPHeaders(ctx, BlobHttpHeaders{BlobContentDisposition: to.StringPtr("my_disposition")}, + _, err := blobClient.SetHTTPHeaders(ctx, BlobHTTPHeaders{BlobContentDisposition: to.StringPtr("my_disposition")}, &SetBlobHTTPHeadersOptions{ModifiedAccessConditions: &ModifiedAccessConditions{IfUnmodifiedSince: ¤tTime}}) c.Assert(err, chk.NotNil) } @@ -1815,7 +1820,7 @@ func (s *aztestsSuite) TestBlobSetPropertiesIfMatchTrue(c *chk.C) { resp, err := blobClient.GetProperties(ctx, nil) c.Assert(err, chk.IsNil) - _, err = blobClient.SetHTTPHeaders(ctx, BlobHttpHeaders{BlobContentDisposition: to.StringPtr("my_disposition")}, + _, err = blobClient.SetHTTPHeaders(ctx, BlobHTTPHeaders{BlobContentDisposition: to.StringPtr("my_disposition")}, &SetBlobHTTPHeadersOptions{ModifiedAccessConditions: &ModifiedAccessConditions{IfMatch: resp.ETag}}) c.Assert(err, chk.IsNil) @@ -1828,7 +1833,7 @@ func (s *aztestsSuite) TestBlobSetPropertiesIfMatchFalse(c *chk.C) { defer deleteContainer(c, containerClient) blobClient, _ := createNewBlockBlob(c, containerClient) - _, err := blobClient.SetHTTPHeaders(ctx, BlobHttpHeaders{BlobContentDisposition: to.StringPtr("my_disposition")}, + _, err := blobClient.SetHTTPHeaders(ctx, BlobHTTPHeaders{BlobContentDisposition: to.StringPtr("my_disposition")}, &SetBlobHTTPHeadersOptions{ModifiedAccessConditions: &ModifiedAccessConditions{IfMatch: to.StringPtr("garbage")}}) c.Assert(err, chk.NotNil) } @@ -1839,7 +1844,7 @@ func (s *aztestsSuite) TestBlobSetPropertiesIfNoneMatchTrue(c *chk.C) { defer deleteContainer(c, containerClient) blobClient, _ := createNewBlockBlob(c, containerClient) - _, err := blobClient.SetHTTPHeaders(ctx, BlobHttpHeaders{BlobContentDisposition: to.StringPtr("my_disposition")}, + _, err := blobClient.SetHTTPHeaders(ctx, BlobHTTPHeaders{BlobContentDisposition: to.StringPtr("my_disposition")}, &SetBlobHTTPHeadersOptions{ModifiedAccessConditions: &ModifiedAccessConditions{IfNoneMatch: to.StringPtr("garbage")}}) c.Assert(err, chk.IsNil) @@ -1855,7 +1860,7 @@ func (s *aztestsSuite) TestBlobSetPropertiesIfNoneMatchFalse(c *chk.C) { resp, err := blobClient.GetProperties(ctx, nil) c.Assert(err, chk.IsNil) - _, err = blobClient.SetHTTPHeaders(ctx, BlobHttpHeaders{BlobContentDisposition: to.StringPtr("my_disposition")}, + _, err = blobClient.SetHTTPHeaders(ctx, BlobHTTPHeaders{BlobContentDisposition: to.StringPtr("my_disposition")}, &SetBlobHTTPHeadersOptions{ModifiedAccessConditions: &ModifiedAccessConditions{IfNoneMatch: resp.ETag}}) c.Assert(err, chk.NotNil) } @@ -1874,7 +1879,7 @@ func (s *aztestsSuite) TestBlobSetMetadataNil(c *chk.C) { resp, err := blobClient.GetProperties(ctx, nil) c.Assert(err, chk.IsNil) - c.Assert(*resp.Metadata, chk.HasLen, 0) + c.Assert(resp.Metadata, chk.HasLen, 0) } func (s *aztestsSuite) TestBlobSetMetadataEmpty(c *chk.C) { @@ -1891,7 +1896,7 @@ func (s *aztestsSuite) TestBlobSetMetadataEmpty(c *chk.C) { resp, err := blobClient.GetProperties(ctx, nil) c.Assert(err, chk.IsNil) - c.Assert(*resp.Metadata, chk.HasLen, 0) + c.Assert(resp.Metadata, chk.HasLen, 0) } func (s *aztestsSuite) TestBlobSetMetadataInvalidField(c *chk.C) { @@ -1908,7 +1913,7 @@ func (s *aztestsSuite) TestBlobSetMetadataInvalidField(c *chk.C) { func validateMetadataSet(c *chk.C, blobClient BlockBlobClient) { resp, err := blobClient.GetProperties(ctx, nil) c.Assert(err, chk.IsNil) - c.Assert(*resp.Metadata, chk.DeepEquals, basicMetadata) + c.Assert(resp.Metadata, chk.DeepEquals, basicMetadata) } func (s *aztestsSuite) TestBlobSetMetadataIfModifiedSinceTrue(c *chk.C) { diff --git a/sdk/storage/azblob/zt_blob_tags_test.go b/sdk/storage/azblob/zt_blob_tags_test.go index f2add4e2d69d..518e1f17c5ac 100644 --- a/sdk/storage/azblob/zt_blob_tags_test.go +++ b/sdk/storage/azblob/zt_blob_tags_test.go @@ -74,14 +74,14 @@ func (s *aztestsSuite) TestSetBlobTagsWithVID(c *chk.C) { setTagsBlobOptions := SetTagsBlobOptions{ BlobTagsMap: &blobTagsMap, - VersionId: versionId1, + VersionID: versionId1, } blobSetTagsResponse, err := bbClient.SetTags(ctx, &setTagsBlobOptions) c.Assert(err, chk.IsNil) c.Assert(blobSetTagsResponse.RawResponse.StatusCode, chk.Equals, 204) getTagsBlobOptions1 := GetTagsBlobOptions{ - VersionId: versionId1, + VersionID: versionId1, } blobGetTagsResponse, err := bbClient.GetTags(ctx, &getTagsBlobOptions1) c.Assert(err, chk.IsNil) @@ -93,7 +93,7 @@ func (s *aztestsSuite) TestSetBlobTagsWithVID(c *chk.C) { } getTagsBlobOptions2 := GetTagsBlobOptions{ - VersionId: versionId2, + VersionID: versionId2, } blobGetTagsResponse, err = bbClient.GetTags(ctx, &getTagsBlobOptions2) c.Assert(err, chk.IsNil) @@ -114,7 +114,7 @@ func (s *aztestsSuite) TestUploadBlockBlobWithSpecialCharactersInTags(c *chk.C) uploadBlockBlobOptions := UploadBlockBlobOptions{ Metadata: &basicMetadata, - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, BlobTagsMap: &blobTagsMap, } blockBlobUploadResp, err := bbClient.Upload(ctx, bytes.NewReader([]byte("data")), &uploadBlockBlobOptions) @@ -174,7 +174,7 @@ func (s *aztestsSuite) TestStageBlockWithTags(c *chk.C) { c.Assert(contentData, chk.DeepEquals, []uint8(strings.Join(data, ""))) getTagsBlobOptions := GetTagsBlobOptions{ - VersionId: versionId, + VersionID: versionId, } blobGetTagsResp, err := bbClient.GetTags(ctx, &getTagsBlobOptions) c.Assert(err, chk.IsNil) @@ -340,7 +340,7 @@ func (s *aztestsSuite) TestCopyBlockBlobFromURLWithTags(c *chk.C) { sourceContentMD5 := sourceDataMD5Value[:] copyBlockBlobFromURLOptions1 := CopyBlockBlobFromURLOptions{ BlobTagsMap: &map[string]string{"foo": "bar"}, - SourceContentMd5: &sourceContentMD5, + SourceContentMD5: &sourceContentMD5, } resp, err := destBlob.CopyFromURL(ctx, srcBlobURLWithSAS, ©BlockBlobFromURLOptions1) c.Assert(err, chk.IsNil) @@ -363,7 +363,7 @@ func (s *aztestsSuite) TestCopyBlockBlobFromURLWithTags(c *chk.C) { _, badMD5 := getRandomDataAndReader(16) copyBlockBlobFromURLOptions2 := CopyBlockBlobFromURLOptions{ BlobTagsMap: &blobTagsMap, - SourceContentMd5: &badMD5, + SourceContentMD5: &badMD5, } _, err = destBlob.CopyFromURL(ctx, srcBlobURLWithSAS, ©BlockBlobFromURLOptions2) c.Assert(err, chk.NotNil) @@ -385,7 +385,7 @@ func (s *aztestsSuite) TestGetPropertiesReturnsTagsCount(c *chk.C) { uploadBlockBlobOptions := UploadBlockBlobOptions{ BlobTagsMap: &basicBlobTagsMap, - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, Metadata: &basicMetadata, } blockBlobUploadResp, err := bbClient.Upload(ctx, bytes.NewReader([]byte("data")), &uploadBlockBlobOptions) @@ -571,8 +571,7 @@ func (s *aztestsSuite) TestCreatePageBlobWithTags(c *chk.C) { contentSize := 1 * 1024 offset, count := int64(0), int64(contentSize) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count }, } putResp, err := pbClient.UploadPages(ctx, getReaderToRandomBytes(1024), &uploadPagesOptions) c.Assert(err, chk.IsNil) diff --git a/sdk/storage/azblob/zt_blob_versioning_test.go b/sdk/storage/azblob/zt_blob_versioning_test.go index 7b61645267bc..e595e3a264ad 100644 --- a/sdk/storage/azblob/zt_blob_versioning_test.go +++ b/sdk/storage/azblob/zt_blob_versioning_test.go @@ -75,7 +75,7 @@ func (s *aztestsSuite) TestSetBlobMetadataReturnsVID(c *chk.C) { if !pager.NextPage(ctx) { c.Assert(pager.Err(), chk.IsNil) // check for an error first - c.Fail() // no page was gotten + c.Fail() // no page was gotten } pageResp := pager.PageResponse() @@ -85,8 +85,10 @@ func (s *aztestsSuite) TestSetBlobMetadataReturnsVID(c *chk.C) { c.Assert(len(blobList), chk.Equals, 1) blobResp1 := blobList[0] c.Assert(*blobResp1.Name, chk.Equals, blobName) - c.Assert(*blobResp1.Metadata, chk.HasLen, 2) - c.Assert(*blobResp1.Metadata, chk.DeepEquals, metadata) + c.Assert(*blobResp1.Metadata.AdditionalProperties, chk.NotNil) + c.Assert(*blobResp1.Metadata.AdditionalProperties, chk.HasLen, 2) + // c.Assert(*blobResp1.Metadata, chk.DeepEquals, metadata) + } //func (s *aztestsSuite) TestCreateAndDownloadBlobSpecialCharactersWithVID(c *chk.C) { @@ -310,7 +312,7 @@ func (s *aztestsSuite) TestSetBlobMetadataReturnsVID(c *chk.C) { // resp, err = destBlob.CopyFromURL(ctx, srcBlobURLWithSAS, Metadata{}, ModifiedAccessConditions{}, BlobAccessConditions{}, nil, DefaultAccessTier, nil) // c.Assert(err, chk.IsNil) // c.Assert(resp.Response().StatusCode, chk.Equals, 202) -// c.Assert(resp.XMsContentCrc64(), chk.Not(chk.Equals), "") +// c.Assert(resp.XMsContentCRC64(), chk.Not(chk.Equals), "") // c.Assert(resp.Response().Header.Get("x-ms-version"), chk.Equals, ServiceVersion) // c.Assert(resp.Response().Header.Get("x-ms-version-id"), chk.NotNil) //} @@ -380,7 +382,7 @@ func (s *aztestsSuite) TestPutBlockListReturnsVID(c *chk.C) { commitResp, err := blobClient.CommitBlockList(ctx, base64BlockIDs, nil) c.Assert(err, chk.IsNil) - c.Assert(*commitResp.VersionID, chk.Not(chk.Equals), "") + c.Assert(commitResp.VersionID, chk.NotNil) contentResp, err := blobClient.Download(ctx, nil) c.Assert(err, chk.IsNil) @@ -399,8 +401,7 @@ func (s *aztestsSuite) TestCreatePageBlobReturnsVID(c *chk.C) { r := getReaderToRandomBytes(contentSize) offset, count := int64(0), int64(contentSize) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count }, } putResp, err := blob.UploadPages(context.Background(), r, &uploadPagesOptions) c.Assert(err, chk.IsNil) diff --git a/sdk/storage/azblob/zt_block_blob_client_test.go b/sdk/storage/azblob/zt_block_blob_client_test.go index e346ce80bfe5..f74fa9da072b 100644 --- a/sdk/storage/azblob/zt_block_blob_client_test.go +++ b/sdk/storage/azblob/zt_block_blob_client_test.go @@ -239,7 +239,7 @@ func (s *aztestsSuite) TestCopyBlockBlobFromURL(c *chk.C) { sourceContentMD5 := contentMD5[:] copyBlockBlobFromURLOptions := CopyBlockBlobFromURLOptions{ Metadata: &map[string]string{"foo": "bar"}, - SourceContentMd5: &sourceContentMD5, + SourceContentMD5: &sourceContentMD5, } resp, err := destBlob.CopyFromURL(ctx, srcBlobURLWithSAS, ©BlockBlobFromURLOptions) c.Assert(err, chk.IsNil) @@ -258,8 +258,8 @@ func (s *aztestsSuite) TestCopyBlockBlobFromURL(c *chk.C) { c.Assert(err, chk.IsNil) metadata := getPropResp.Metadata c.Assert(metadata, chk.NotNil) - c.Assert(*metadata, chk.HasLen, 1) - c.Assert(*metadata, chk.DeepEquals, map[string]string{"foo": "bar"}) + c.Assert(metadata, chk.HasLen, 1) + c.Assert(metadata, chk.DeepEquals, map[string]string{"Foo": "bar"}) // Check data integrity through downloading. downloadResp, err := destBlob.Download(ctx, nil) @@ -271,14 +271,14 @@ func (s *aztestsSuite) TestCopyBlockBlobFromURL(c *chk.C) { // Edge case 1: Provide bad MD5 and make sure the copy fails _, badMD5 := getRandomDataAndReader(16) copyBlockBlobFromURLOptions1 := CopyBlockBlobFromURLOptions{ - SourceContentMd5: &badMD5, + SourceContentMD5: &badMD5, } resp, err = destBlob.CopyFromURL(ctx, srcBlobURLWithSAS, ©BlockBlobFromURLOptions1) c.Assert(err, chk.NotNil) // Edge case 2: Not providing any source MD5 should see the CRC getting returned instead copyBlockBlobFromURLOptions2 := CopyBlockBlobFromURLOptions{ - SourceContentMd5: &sourceContentMD5, + SourceContentMD5: &sourceContentMD5, } resp, err = destBlob.CopyFromURL(ctx, srcBlobURLWithSAS, ©BlockBlobFromURLOptions2) c.Assert(err, chk.IsNil) @@ -365,7 +365,7 @@ func (s *aztestsSuite) TestStageBlockWithMD5(c *chk.C) { stageBlockOptions := StageBlockOptions{ BlockBlobStageBlockOptions: &BlockBlobStageBlockOptions{ - TransactionalContentMd5: &contentMD5, + TransactionalContentMD5: &contentMD5, }, } blockID1 := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%6d", 0))) @@ -385,7 +385,7 @@ func (s *aztestsSuite) TestStageBlockWithMD5(c *chk.C) { badStageBlockOptions := StageBlockOptions{ BlockBlobStageBlockOptions: &BlockBlobStageBlockOptions{ - TransactionalContentMd5: &badContentMD5, + TransactionalContentMD5: &badContentMD5, }, } _, _ = rsc.Seek(0, io.SeekStart) @@ -393,7 +393,7 @@ func (s *aztestsSuite) TestStageBlockWithMD5(c *chk.C) { _, err = bbClient.StageBlock(context.Background(), blockID2, rsc, &badStageBlockOptions) c.Assert(err, chk.NotNil) - //c.Assert(err.(StorageError), chk.Equals, StorageErrorCodeMd5Mismatch) + //c.Assert(err.(StorageError), chk.Equals, StorageErrorCodeMD5Mismatch) } func (s *aztestsSuite) TestBlobPutBlobHTTPHeaders(c *chk.C) { @@ -407,7 +407,7 @@ func (s *aztestsSuite) TestBlobPutBlobHTTPHeaders(c *chk.C) { rsc := azcore.NopCloser(body) uploadBlockBlobOptions := UploadBlockBlobOptions{ - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, } _, err := bbClient.Upload(ctx, rsc, &uploadBlockBlobOptions) c.Assert(err, chk.IsNil) @@ -415,7 +415,7 @@ func (s *aztestsSuite) TestBlobPutBlobHTTPHeaders(c *chk.C) { resp, err := bbClient.GetProperties(ctx, nil) c.Assert(err, chk.IsNil) h := resp.NewHTTPHeaders() - h.BlobContentMd5 = nil // the service generates a MD5 value, omit before comparing + h.BlobContentMD5 = nil // the service generates a MD5 value, omit before comparing c.Assert(h, chk.DeepEquals, basicHeaders) } @@ -439,7 +439,7 @@ func (s *aztestsSuite) TestBlobPutBlobMetadataNotEmpty(c *chk.C) { c.Assert(err, chk.IsNil) actualMetadata := resp.Metadata c.Assert(actualMetadata, chk.NotNil) - c.Assert(*actualMetadata, chk.DeepEquals, basicMetadata) + c.Assert(actualMetadata, chk.DeepEquals, basicMetadata) } func (s *aztestsSuite) TestBlobPutBlobMetadataEmpty(c *chk.C) { @@ -457,8 +457,7 @@ func (s *aztestsSuite) TestBlobPutBlobMetadataEmpty(c *chk.C) { resp, err := bbClient.GetProperties(ctx, nil) c.Assert(err, chk.IsNil) - c.Assert(resp.Metadata, chk.NotNil) - c.Assert(*resp.Metadata, chk.HasLen, 0) + c.Assert(resp.Metadata, chk.IsNil) } func (s *aztestsSuite) TestBlobPutBlobMetadataInvalid(c *chk.C) { @@ -681,7 +680,7 @@ func (s *aztestsSuite) TestBlobPutBlockListHTTPHeadersEmpty(c *chk.C) { defer deleteContainer(c, contClient) commitBlockListOptions := CommitBlockListOptions{ - BlobHTTPHeaders: &BlobHttpHeaders{BlobContentDisposition: &blobContentDisposition}, + BlobHTTPHeaders: &BlobHTTPHeaders{BlobContentDisposition: &blobContentDisposition}, } _, err := bbClient.CommitBlockList(ctx, []string{blockId}, &commitBlockListOptions) c.Assert(err, chk.IsNil) @@ -874,7 +873,7 @@ func (s *aztestsSuite) TestSetTierOnBlobUpload(c *chk.C) { bbClient, _ := getBlockBlobClient(c, containerClient) uploadBlockBlobOptions := UploadBlockBlobOptions{ - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, Tier: &tier, } _, err := bbClient.Upload(ctx, strings.NewReader(blockBlobDefaultData), &uploadBlockBlobOptions) diff --git a/sdk/storage/azblob/zt_client_provided_key_test.go b/sdk/storage/azblob/zt_client_provided_key_test.go index 6411fdc3f6c1..c73fa1a56c09 100644 --- a/sdk/storage/azblob/zt_client_provided_key_test.go +++ b/sdk/storage/azblob/zt_client_provided_key_test.go @@ -30,7 +30,7 @@ var testEncryptedHash = "3QFFFpRA5+XANHqwwbT4yXDmrT/2JaLt/FKHjzhOdoE=" var testEncryptionAlgorithm = "AES256" var testCPKByValue = CpkInfo{ EncryptionKey: &testEncryptedKey, - EncryptionKeySha256: &testEncryptedHash, + EncryptionKeySHA256: &testEncryptedHash, EncryptionAlgorithm: &testEncryptionAlgorithm, } @@ -38,7 +38,7 @@ var testInvalidEncryptedKey = "mumbojumbo" var testInvalidEncryptedHash = "mumbojumbohash" var testInvalidCPKByValue = CpkInfo{ EncryptionKey: &testInvalidEncryptedKey, - EncryptionKeySha256: &testInvalidEncryptedHash, + EncryptionKeySHA256: &testInvalidEncryptedHash, EncryptionAlgorithm: &testEncryptionAlgorithm, } @@ -93,7 +93,7 @@ func (s *aztestsSuite) TestPutBlockAndPutBlockListWithCPK(c *chk.C) { c.Assert(resp.ETag, chk.NotNil) c.Assert(resp.LastModified, chk.NotNil) c.Assert(*resp.IsServerEncrypted, chk.Equals, true) - c.Assert(*resp.EncryptionKeySHA256, chk.DeepEquals, *(testCPKByValue.EncryptionKeySha256)) + c.Assert(*resp.EncryptionKeySHA256, chk.DeepEquals, *(testCPKByValue.EncryptionKeySHA256)) // Get blob content without encryption key should fail the request. _, err = bbClient.Download(ctx, nil) @@ -110,8 +110,8 @@ func (s *aztestsSuite) TestPutBlockAndPutBlockListWithCPK(c *chk.C) { _, _ = b.ReadFrom(reader) _ = reader.Close() c.Assert(b.String(), chk.Equals, "AAA BBB CCC ") - c.Assert(*getResp.ETag, chk.DeepEquals, resp.ETag) - c.Assert(*getResp.LastModified, chk.DeepEquals, resp.LastModified) + c.Assert(*getResp.ETag, chk.DeepEquals, *resp.ETag) + c.Assert(*getResp.LastModified, chk.DeepEquals, *resp.LastModified) } func (s *aztestsSuite) TestPutBlockAndPutBlockListWithCPKByScope(c *chk.C) { @@ -163,10 +163,10 @@ func (s *aztestsSuite) TestPutBlockAndPutBlockListWithCPKByScope(c *chk.C) { c.Assert(err, chk.IsNil) _ = reader.Close() // The client must close the response body when finished with it c.Assert(b.String(), chk.Equals, "AAA BBB CCC ") - c.Assert(*getResp.ETag, chk.DeepEquals, resp.ETag) - c.Assert(*getResp.LastModified, chk.DeepEquals, resp.LastModified) + c.Assert(*getResp.ETag, chk.DeepEquals, *resp.ETag) + c.Assert(*getResp.LastModified, chk.DeepEquals, *resp.LastModified) c.Assert(*getResp.IsServerEncrypted, chk.Equals, true) - c.Assert(*getResp.EncryptionScope, chk.DeepEquals, testCPKByScope.EncryptionScope) + c.Assert(*getResp.EncryptionScope, chk.DeepEquals, *testCPKByScope.EncryptionScope) } func (s *aztestsSuite) TestPutBlockFromURLAndCommitWithCPK(c *chk.C) { @@ -277,7 +277,7 @@ func (s *aztestsSuite) TestPutBlockFromURLAndCommitWithCPK(c *chk.C) { destData, err := ioutil.ReadAll(downloadResp.Body(RetryReaderOptions{})) c.Assert(err, chk.IsNil) c.Assert(destData, chk.DeepEquals, content) - c.Assert(*downloadResp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySha256) + c.Assert(*downloadResp.EncryptionKeySHA256, chk.DeepEquals, *testCPKByValue.EncryptionKeySHA256) } func (s *aztestsSuite) TestPutBlockFromURLAndCommitWithCPKWithScope(c *chk.C) { @@ -384,7 +384,7 @@ func (s *aztestsSuite) TestPutBlockFromURLAndCommitWithCPKWithScope(c *chk.C) { destData, err := ioutil.ReadAll(downloadResp.Body(RetryReaderOptions{})) c.Assert(err, chk.IsNil) c.Assert(destData, chk.DeepEquals, content) - c.Assert(*downloadResp.EncryptionScope, chk.DeepEquals, testCPKByScope.EncryptionScope) + c.Assert(*downloadResp.EncryptionScope, chk.DeepEquals, *testCPKByScope.EncryptionScope) } func (s *aztestsSuite) TestUploadBlobWithMD5WithCPK(c *chk.C) { @@ -404,7 +404,7 @@ func (s *aztestsSuite) TestUploadBlobWithMD5WithCPK(c *chk.C) { c.Assert(err, chk.IsNil) c.Assert(uploadSrcResp.RawResponse.StatusCode, chk.Equals, 201) c.Assert(*uploadSrcResp.IsServerEncrypted, chk.Equals, true) - c.Assert(uploadSrcResp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySha256) + c.Assert(uploadSrcResp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySHA256) // Get blob content without encryption key should fail the request. downloadResp, err := bbClient.Download(ctx, nil) @@ -426,7 +426,7 @@ func (s *aztestsSuite) TestUploadBlobWithMD5WithCPK(c *chk.C) { destData, err := ioutil.ReadAll(downloadResp.Body(RetryReaderOptions{CpkInfo: &testCPKByValue})) c.Assert(err, chk.IsNil) c.Assert(destData, chk.DeepEquals, srcData) - c.Assert(downloadResp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySha256) + c.Assert(downloadResp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySHA256) } func (s *aztestsSuite) TestUploadBlobWithMD5WithCPKScope(c *chk.C) { @@ -458,7 +458,7 @@ func (s *aztestsSuite) TestUploadBlobWithMD5WithCPKScope(c *chk.C) { destData, err := ioutil.ReadAll(downloadResp.Body(RetryReaderOptions{CpkInfo: &testCPKByValue})) c.Assert(err, chk.IsNil) c.Assert(destData, chk.DeepEquals, srcData) - c.Assert(*downloadResp.EncryptionScope, chk.DeepEquals, testCPKByScope.EncryptionScope) + c.Assert(*downloadResp.EncryptionScope, chk.DeepEquals, *testCPKByScope.EncryptionScope) } func (s *aztestsSuite) TestAppendBlockWithCPK(c *chk.C) { @@ -494,7 +494,7 @@ func (s *aztestsSuite) TestAppendBlockWithCPK(c *chk.C) { c.Assert(resp.Date, chk.NotNil) c.Assert((*resp.Date).IsZero(), chk.Equals, false) c.Assert(*resp.IsServerEncrypted, chk.Equals, true) - c.Assert(resp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySha256) + c.Assert(resp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySHA256) } // Get blob content without encryption key should fail the request. @@ -511,7 +511,7 @@ func (s *aztestsSuite) TestAppendBlockWithCPK(c *chk.C) { data, err := ioutil.ReadAll(downloadResp.Body(RetryReaderOptions{})) c.Assert(err, chk.IsNil) c.Assert(string(data), chk.DeepEquals, "AAA BBB CCC ") - c.Assert(*downloadResp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySha256) + c.Assert(*downloadResp.EncryptionKeySHA256, chk.DeepEquals, *testCPKByValue.EncryptionKeySHA256) } func (s *aztestsSuite) TestAppendBlockWithCPKScope(c *chk.C) { @@ -560,7 +560,7 @@ func (s *aztestsSuite) TestAppendBlockWithCPKScope(c *chk.C) { data, err := ioutil.ReadAll(downloadResp.Body(RetryReaderOptions{})) c.Assert(err, chk.IsNil) c.Assert(string(data), chk.DeepEquals, "AAA BBB CCC ") - c.Assert(*downloadResp.EncryptionScope, chk.DeepEquals, testCPKByScope.EncryptionScope) + c.Assert(*downloadResp.EncryptionScope, chk.DeepEquals, *testCPKByScope.EncryptionScope) } func (s *aztestsSuite) TestAppendBlockFromURLWithCPK(c *chk.C) { @@ -627,7 +627,7 @@ func (s *aztestsSuite) TestAppendBlockFromURLWithCPK(c *chk.C) { Count: &count, CpkInfo: &testCPKByValue, } - appendFromURLResp, err := destBlob.AppendBlockFromURL(ctx, srcBlobURLWithSAS, 0, &appendBlockURLOptions) + appendFromURLResp, err := destBlob.AppendBlockFromURL(ctx, srcBlobURLWithSAS, &appendBlockURLOptions) c.Assert(err, chk.IsNil) c.Assert(appendFromURLResp.RawResponse.StatusCode, chk.Equals, 201) c.Assert(*appendFromURLResp.BlobAppendOffset, chk.Equals, "0") @@ -662,7 +662,7 @@ func (s *aztestsSuite) TestAppendBlockFromURLWithCPK(c *chk.C) { c.Assert(err, chk.IsNil) c.Assert(*downloadResp.IsServerEncrypted, chk.Equals, true) - c.Assert(*downloadResp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySha256) + c.Assert(*downloadResp.EncryptionKeySHA256, chk.DeepEquals, *testCPKByValue.EncryptionKeySHA256) destData, err := ioutil.ReadAll(downloadResp.Body(RetryReaderOptions{CpkInfo: &testCPKByValue})) c.Assert(err, chk.IsNil) @@ -733,7 +733,7 @@ func (s *aztestsSuite) TestAppendBlockFromURLWithCPKScope(c *chk.C) { Count: &count, CpkScopeInfo: &testCPKByScope, } - appendFromURLResp, err := destBlob.AppendBlockFromURL(ctx, srcBlobURLWithSAS, 0, &appendBlockURLOptions) + appendFromURLResp, err := destBlob.AppendBlockFromURL(ctx, srcBlobURLWithSAS, &appendBlockURLOptions) c.Assert(err, chk.IsNil) c.Assert(appendFromURLResp.RawResponse.StatusCode, chk.Equals, 201) c.Assert(*appendFromURLResp.BlobAppendOffset, chk.Equals, "0") @@ -755,7 +755,7 @@ func (s *aztestsSuite) TestAppendBlockFromURLWithCPKScope(c *chk.C) { downloadResp, err := destBlob.Download(ctx, &downloadBlobOptions) c.Assert(err, chk.IsNil) c.Assert(*downloadResp.IsServerEncrypted, chk.Equals, true) - c.Assert(*downloadResp.EncryptionScope, chk.DeepEquals, testCPKByScope.EncryptionScope) + c.Assert(*downloadResp.EncryptionScope, chk.DeepEquals, *testCPKByScope.EncryptionScope) destData, err := ioutil.ReadAll(downloadResp.Body(RetryReaderOptions{CpkInfo: &testCPKByValue})) c.Assert(err, chk.IsNil) @@ -786,20 +786,21 @@ func (s *aztestsSuite) TestPageBlockWithCPK(c *chk.C) { offset, count := int64(0), int64(contentSize) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, CpkInfo: &testCPKByValue, } uploadResp, err := pbClient.UploadPages(ctx, r, &uploadPagesOptions) c.Assert(err, chk.IsNil) c.Assert(uploadResp.RawResponse.StatusCode, chk.Equals, 201) - c.Assert(uploadResp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySha256) + c.Assert(uploadResp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySHA256) - resp, err := pbClient.GetPageRanges(ctx, 0, CountToEnd, nil) + resp, err := pbClient.GetPageRanges(ctx, HttpRange{0, CountToEnd}, nil) c.Assert(err, chk.IsNil) pageListResp := resp.PageList.PageRange start, end := int64(0), int64(contentSize-1) - c.Assert((*pageListResp)[0], chk.DeepEquals, PageRange{Start: &start, End: &end}) + rawStart, rawEnd := (*pageListResp)[0].Raw() + c.Assert(rawStart, chk.Equals, start) + c.Assert(rawEnd, chk.Equals, end) // Get blob content without encryption key should fail the request. downloadResp, err := pbClient.Download(ctx, nil) @@ -821,7 +822,7 @@ func (s *aztestsSuite) TestPageBlockWithCPK(c *chk.C) { destData, err := ioutil.ReadAll(downloadResp.Body(RetryReaderOptions{})) c.Assert(err, chk.IsNil) c.Assert(destData, chk.DeepEquals, srcData) - c.Assert(*downloadResp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySha256) + c.Assert(*downloadResp.EncryptionKeySHA256, chk.DeepEquals, *testCPKByValue.EncryptionKeySHA256) } func (s *aztestsSuite) TestPageBlockWithCPKScope(c *chk.C) { @@ -835,8 +836,7 @@ func (s *aztestsSuite) TestPageBlockWithCPKScope(c *chk.C) { offset, count := int64(0), int64(contentSize) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, CpkScopeInfo: &testCPKByScope, } uploadResp, err := pbClient.UploadPages(ctx, r, &uploadPagesOptions) @@ -844,11 +844,14 @@ func (s *aztestsSuite) TestPageBlockWithCPKScope(c *chk.C) { c.Assert(uploadResp.RawResponse.StatusCode, chk.Equals, 201) c.Assert(uploadResp.EncryptionScope, chk.DeepEquals, testCPKByScope.EncryptionScope) - resp, err := pbClient.GetPageRanges(ctx, 0, CountToEnd, nil) + resp, err := pbClient.GetPageRanges(ctx, HttpRange{0, CountToEnd}, nil) c.Assert(err, chk.IsNil) pageListResp := resp.PageList.PageRange start, end := int64(0), int64(contentSize-1) - c.Assert((*pageListResp)[0], chk.DeepEquals, PageRange{Start: &start, End: &end}) + // c.Assert((*pageListResp)[0], chk.DeepEquals, PageRange{Start: &start, End: &end}) + rawStart, rawEnd := (*pageListResp)[0].Raw() + c.Assert(rawStart, chk.Equals, start) + c.Assert(rawEnd, chk.Equals, end) // Download blob to do data integrity check. downloadBlobOptions := DownloadBlobOptions{ @@ -860,7 +863,7 @@ func (s *aztestsSuite) TestPageBlockWithCPKScope(c *chk.C) { destData, err := ioutil.ReadAll(downloadResp.Body(RetryReaderOptions{})) c.Assert(err, chk.IsNil) c.Assert(destData, chk.DeepEquals, srcData) - c.Assert(*downloadResp.EncryptionScope, chk.DeepEquals, testCPKByScope.EncryptionScope) + c.Assert(*downloadResp.EncryptionScope, chk.DeepEquals, *testCPKByScope.EncryptionScope) } func (s *aztestsSuite) TestPageBlockFromURLWithCPK(c *chk.C) { @@ -882,8 +885,7 @@ func (s *aztestsSuite) TestPageBlockFromURLWithCPK(c *chk.C) { offset, count := int64(0), int64(contentSize) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, } uploadResp, err := bbClient.UploadPages(ctx, r, &uploadPagesOptions) c.Assert(err, chk.IsNil) @@ -903,7 +905,7 @@ func (s *aztestsSuite) TestPageBlockFromURLWithCPK(c *chk.C) { srcBlobURLWithSAS := srcBlobParts.URL() uploadPagesFromURLOptions := UploadPagesFromURLOptions{ - SourceContentMd5: &contentMD5, + SourceContentMD5: &contentMD5, CpkInfo: &testCPKByValue, } resp, err := destBlob.UploadPagesFromURL(ctx, srcBlobURLWithSAS, 0, 0, int64(contentSize), &uploadPagesFromURLOptions) @@ -919,7 +921,7 @@ func (s *aztestsSuite) TestPageBlockFromURLWithCPK(c *chk.C) { c.Assert((*resp.Date).IsZero(), chk.Equals, false) c.Assert(*resp.BlobSequenceNumber, chk.Equals, int64(0)) c.Assert(*resp.IsServerEncrypted, chk.Equals, true) - c.Assert(resp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySha256) + c.Assert(resp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySHA256) downloadResp, err := destBlob.Download(ctx, nil) c.Assert(err, chk.NotNil) @@ -936,7 +938,7 @@ func (s *aztestsSuite) TestPageBlockFromURLWithCPK(c *chk.C) { } downloadResp, err = destBlob.Download(ctx, &downloadBlobOptions) c.Assert(err, chk.IsNil) - c.Assert(*downloadResp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySha256) + c.Assert(*downloadResp.EncryptionKeySHA256, chk.DeepEquals, *testCPKByValue.EncryptionKeySHA256) destData, err := ioutil.ReadAll(downloadResp.Body(RetryReaderOptions{CpkInfo: &testCPKByValue})) c.Assert(err, chk.IsNil) @@ -962,8 +964,7 @@ func (s *aztestsSuite) TestPageBlockFromURLWithCPKScope(c *chk.C) { offset, count := int64(0), int64(contentSize) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, } uploadResp, err := bbClient.UploadPages(ctx, r, &uploadPagesOptions) c.Assert(err, chk.IsNil) @@ -983,7 +984,7 @@ func (s *aztestsSuite) TestPageBlockFromURLWithCPKScope(c *chk.C) { srcBlobURLWithSAS := srcBlobParts.URL() uploadPagesFromURLOptions := UploadPagesFromURLOptions{ - SourceContentMd5: &contentMD5, + SourceContentMD5: &contentMD5, CpkScopeInfo: &testCPKByScope, } resp, err := destBlob.UploadPagesFromURL(ctx, srcBlobURLWithSAS, 0, 0, int64(contentSize), &uploadPagesFromURLOptions) @@ -1007,7 +1008,7 @@ func (s *aztestsSuite) TestPageBlockFromURLWithCPKScope(c *chk.C) { } downloadResp, err := destBlob.Download(ctx, &downloadBlobOptions) c.Assert(err, chk.IsNil) - c.Assert(*downloadResp.EncryptionScope, chk.DeepEquals, testCPKByScope.EncryptionScope) + c.Assert(*downloadResp.EncryptionScope, chk.DeepEquals, *testCPKByScope.EncryptionScope) destData, err := ioutil.ReadAll(downloadResp.Body(RetryReaderOptions{CpkInfo: &testCPKByValue})) c.Assert(err, chk.IsNil) @@ -1031,8 +1032,7 @@ func (s *aztestsSuite) TestUploadPagesFromURLWithMD5WithCPK(c *chk.C) { offset, count := int64(0), int64(contentSize) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, } uploadSrcResp1, err := srcBlob.UploadPages(ctx, r, &uploadPagesOptions) c.Assert(err, chk.IsNil) @@ -1054,7 +1054,7 @@ func (s *aztestsSuite) TestUploadPagesFromURLWithMD5WithCPK(c *chk.C) { srcBlobURLWithSAS := srcBlobParts.URL() destBlob, _ := createNewPageBlobWithCPK(c, containerClient, int64(contentSize), &testCPKByValue, nil) uploadPagesFromURLOptions := UploadPagesFromURLOptions{ - SourceContentMd5: &contentMD5, + SourceContentMD5: &contentMD5, CpkInfo: &testCPKByValue, } resp, err := destBlob.UploadPagesFromURL(ctx, srcBlobURLWithSAS, 0, 0, int64(contentSize), &uploadPagesFromURLOptions) @@ -1070,7 +1070,7 @@ func (s *aztestsSuite) TestUploadPagesFromURLWithMD5WithCPK(c *chk.C) { c.Assert((*resp.Date).IsZero(), chk.Equals, false) c.Assert(*resp.BlobSequenceNumber, chk.Equals, int64(0)) c.Assert(*resp.IsServerEncrypted, chk.Equals, true) - c.Assert(resp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySha256) + c.Assert(resp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySHA256) downloadResp, err := destBlob.Download(ctx, nil) c.Assert(err, chk.NotNil) @@ -1087,7 +1087,7 @@ func (s *aztestsSuite) TestUploadPagesFromURLWithMD5WithCPK(c *chk.C) { } downloadResp, err = destBlob.Download(ctx, &downloadBlobOptions) c.Assert(err, chk.IsNil) - c.Assert(*downloadResp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySha256) + c.Assert(*downloadResp.EncryptionKeySHA256, chk.DeepEquals, *testCPKByValue.EncryptionKeySHA256) destData, err := ioutil.ReadAll(downloadResp.Body(RetryReaderOptions{CpkInfo: &testCPKByValue})) c.Assert(err, chk.IsNil) @@ -1096,7 +1096,7 @@ func (s *aztestsSuite) TestUploadPagesFromURLWithMD5WithCPK(c *chk.C) { _, badMD5 := getRandomDataAndReader(16) badContentMD5 := badMD5[:] uploadPagesFromURLOptions1 := UploadPagesFromURLOptions{ - SourceContentMd5: &badContentMD5, + SourceContentMD5: &badContentMD5, } _, err = destBlob.UploadPagesFromURL(ctx, srcBlobURLWithSAS, 0, 0, int64(contentSize), &uploadPagesFromURLOptions1) c.Assert(err, chk.NotNil) @@ -1114,7 +1114,7 @@ func (s *aztestsSuite) TestClearDiffPagesWithCPK(c *chk.C) { contentSize := 2 * 1024 r := getReaderToRandomBytes(contentSize) offset, _, count := int64(0), int64(contentSize-1), int64(contentSize) - uploadPagesOptions := UploadPagesOptions{Offset: &offset, Count: &count, CpkInfo: &testCPKByValue} + uploadPagesOptions := UploadPagesOptions{PageRange: &HttpRange{offset, count}, CpkInfo: &testCPKByValue} _, err := pbClient.UploadPages(context.Background(), r, &uploadPagesOptions) c.Assert(err, chk.IsNil) @@ -1125,25 +1125,27 @@ func (s *aztestsSuite) TestClearDiffPagesWithCPK(c *chk.C) { c.Assert(err, chk.IsNil) offset1, end1, count1 := int64(contentSize), int64(2*contentSize-1), int64(contentSize) - uploadPagesOptions1 := UploadPagesOptions{Offset: &offset1, Count: &count1, CpkInfo: &testCPKByValue} + uploadPagesOptions1 := UploadPagesOptions{PageRange: &HttpRange{offset1, count1}, CpkInfo: &testCPKByValue} _, err = pbClient.UploadPages(context.Background(), getReaderToRandomBytes(2048), &uploadPagesOptions1) c.Assert(err, chk.IsNil) - pageListResp, err := pbClient.GetPageRangesDiff(context.Background(), 0, 4096, *snapshotResp.Snapshot, nil) + pageListResp, err := pbClient.GetPageRangesDiff(context.Background(), HttpRange{0, 4096}, *snapshotResp.Snapshot, nil) c.Assert(err, chk.IsNil) pageRangeResp := pageListResp.PageList.PageRange c.Assert(pageRangeResp, chk.NotNil) c.Assert(*pageRangeResp, chk.HasLen, 1) - c.Assert((*pageRangeResp)[0], chk.DeepEquals, PageRange{Start: &offset1, End: &end1}) + rawStart, rawEnd := (*pageRangeResp)[0].Raw() + c.Assert(rawStart, chk.Equals, offset1) + c.Assert(rawEnd, chk.Equals, end1) clearPagesOptions := ClearPagesOptions{ CpkInfo: &testCPKByValue, } - clearResp, err := pbClient.ClearPages(context.Background(), 2048, 2048, &clearPagesOptions) + clearResp, err := pbClient.ClearPages(context.Background(), HttpRange{2048, 2048}, &clearPagesOptions) c.Assert(err, chk.IsNil) c.Assert(clearResp.RawResponse.StatusCode, chk.Equals, 201) - pageListResp, err = pbClient.GetPageRangesDiff(context.Background(), 0, 4095, *snapshotResp.Snapshot, nil) + pageListResp, err = pbClient.GetPageRangesDiff(context.Background(), HttpRange{0, 4095}, *snapshotResp.Snapshot, nil) c.Assert(err, chk.IsNil) c.Assert(pageListResp.PageList.PageRange, chk.IsNil) } @@ -1179,7 +1181,7 @@ func createNewBlockBlobWithCPK(c *chk.C, container ContainerClient, cpkInfo *Cpk c.Assert(cResp.RawResponse.StatusCode, chk.Equals, 201) c.Assert(*cResp.IsServerEncrypted, chk.Equals, true) if cpkInfo != nil { - c.Assert(cResp.EncryptionKeySHA256, chk.DeepEquals, cpkInfo.EncryptionKeySha256) + c.Assert(cResp.EncryptionKeySHA256, chk.DeepEquals, cpkInfo.EncryptionKeySHA256) } if cpkScopeInfo != nil { c.Assert(cResp.EncryptionScope, chk.DeepEquals, cpkScopeInfo.EncryptionScope) @@ -1202,7 +1204,7 @@ func (s *aztestsSuite) TestGetSetBlobMetadataWithCPK(c *chk.C) { } resp, err := bbClient.SetMetadata(ctx, basicMetadata, &setBlobMetadataOptions) c.Assert(err, chk.IsNil) - c.Assert(resp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySha256) + c.Assert(resp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySHA256) // Get blob properties without encryption key should fail the request. getResp, err := bbClient.GetProperties(ctx, nil) @@ -1214,16 +1216,15 @@ func (s *aztestsSuite) TestGetSetBlobMetadataWithCPK(c *chk.C) { getResp, err = bbClient.GetProperties(ctx, &getBlobPropertiesOptions) c.Assert(err, chk.IsNil) c.Assert(getResp.Metadata, chk.NotNil) - c.Assert(*getResp.Metadata, chk.HasLen, len(basicMetadata)) - c.Assert(*getResp.Metadata, chk.DeepEquals, basicMetadata) + c.Assert(getResp.Metadata, chk.HasLen, len(basicMetadata)) + c.Assert(getResp.Metadata, chk.DeepEquals, basicMetadata) _, err = bbClient.SetMetadata(ctx, map[string]string{}, &setBlobMetadataOptions) c.Assert(err, chk.IsNil) getResp, err = bbClient.GetProperties(ctx, &getBlobPropertiesOptions) c.Assert(err, chk.IsNil) - c.Assert(getResp.Metadata, chk.NotNil) - c.Assert(*getResp.Metadata, chk.HasLen, 0) + c.Assert(getResp.Metadata, chk.IsNil) } func (s *aztestsSuite) TestGetSetBlobMetadataWithCPKScope(c *chk.C) { @@ -1246,8 +1247,8 @@ func (s *aztestsSuite) TestGetSetBlobMetadataWithCPKScope(c *chk.C) { getResp, err := bbClient.GetProperties(ctx, nil) c.Assert(err, chk.IsNil) c.Assert(getResp.Metadata, chk.NotNil) - c.Assert(*getResp.Metadata, chk.HasLen, len(basicMetadata)) - c.Assert(*getResp.Metadata, chk.DeepEquals, basicMetadata) + c.Assert(getResp.Metadata, chk.HasLen, len(basicMetadata)) + c.Assert(getResp.Metadata, chk.DeepEquals, basicMetadata) _, err = bbClient.SetMetadata(ctx, map[string]string{}, &setBlobMetadataOptions) c.Assert(err, chk.IsNil) @@ -1286,7 +1287,7 @@ func (s *aztestsSuite) TestBlobSnapshotWithCPK(c *chk.C) { } dResp, err := snapshotURL.Download(ctx, &downloadBlobOptions) c.Assert(err, chk.IsNil) - c.Assert(*dResp.EncryptionKeySHA256, chk.DeepEquals, testCPKByValue.EncryptionKeySha256) + c.Assert(*dResp.EncryptionKeySHA256, chk.DeepEquals, *testCPKByValue.EncryptionKeySHA256) _, err = snapshotURL.Delete(ctx, nil) c.Assert(err, chk.IsNil) @@ -1327,7 +1328,7 @@ func (s *aztestsSuite) TestBlobSnapshotWithCPKScope(c *chk.C) { } dResp, err := snapshotURL.Download(ctx, &downloadBlobOptions) c.Assert(err, chk.IsNil) - c.Assert(*dResp.EncryptionScope, chk.DeepEquals, testCPKByScope.EncryptionScope) + c.Assert(*dResp.EncryptionScope, chk.DeepEquals, *testCPKByScope.EncryptionScope) _, err = snapshotURL.Delete(ctx, nil) c.Assert(err, chk.IsNil) diff --git a/sdk/storage/azblob/zt_container_client_test.go b/sdk/storage/azblob/zt_container_client_test.go index 8eb949165a00..7bc1d6500aa0 100644 --- a/sdk/storage/azblob/zt_container_client_test.go +++ b/sdk/storage/azblob/zt_container_client_test.go @@ -12,7 +12,6 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore" chk "gopkg.in/check.v1" // go get gopkg.in/check.v1 - ) func (s *aztestsSuite) TestNewContainerClientValidName(c *chk.C) { @@ -433,7 +432,7 @@ func (s *aztestsSuite) TestContainerListBlobsValidDelimiter(c *chk.C) { for pager.NextPage(ctx) { resp := pager.PageResponse() - for _,blob := range *resp.EnumerationResults.Segment.BlobItems { + for _, blob := range *resp.EnumerationResults.Segment.BlobItems { count++ c.Assert(*blob.Name, chk.Equals, blobNames[3]) } @@ -456,13 +455,31 @@ func (s *aztestsSuite) TestContainerListBlobsWithSnapshots(c *chk.C) { containerClient, _ := createNewContainer(c, bsu) defer deleteContainer(c, containerClient) - containerListBlobHierarchySegmentOptions := ContainerListBlobHierarchySegmentOptions{ - Include: &[]ListBlobsIncludeItem{}, + // initialize a blob and create a snapshot of it + snapBlob, snapBlobName := createNewBlockBlob(c, containerClient) + snap, err := snapBlob.CreateSnapshot(ctx, nil) + // snap. + c.Assert(err, chk.IsNil) + + listBlobFlatSegmentOptions := ContainerListBlobFlatSegmentOptions{ + Include: &[]ListBlobsIncludeItem{ ListBlobsIncludeItemSnapshots }, } - pager := containerClient.ListBlobsHierarchySegment("/", &containerListBlobHierarchySegmentOptions) + pager := containerClient.ListBlobsFlatSegment(&listBlobFlatSegmentOptions) - pager.NextPage(ctx) - c.Assert(pager.Err(), chk.NotNil) + wasFound := false // hold the for loop accountable for finding the blob and it's snapshot + for pager.NextPage(ctx) { + c.Assert(pager.Err(), chk.IsNil) + + resp := pager.PageResponse() + + for _, blob := range *resp.EnumerationResults.Segment.BlobItems { + if *blob.Name == snapBlobName && blob.Snapshot != nil { + wasFound = true + c.Assert(*blob.Snapshot, chk.Equals, *snap.Snapshot) + } + } + } + c.Assert(wasFound, chk.Equals, true) } func (s *aztestsSuite) TestContainerListBlobsInvalidDelimiter(c *chk.C) { @@ -478,7 +495,7 @@ func (s *aztestsSuite) TestContainerListBlobsInvalidDelimiter(c *chk.C) { pager.NextPage(ctx) c.Assert(pager.Err(), chk.IsNil) - c.Assert(*pager.PageResponse().EnumerationResults.Segment.BlobPrefixes, chk.HasLen, len(prefixes)) + c.Assert(pager.PageResponse().EnumerationResults.Segment.BlobPrefixes, chk.IsNil) } //func (s *aztestsSuite) TestContainerListBlobsIncludeTypeMetadata(c *chk.C) { @@ -681,7 +698,6 @@ func (s *aztestsSuite) TestContainerListBlobsMaxResultsExact(c *chk.C) { for pager.NextPage(ctx) { resp := pager.PageResponse() - c.Assert(len(*resp.EnumerationResults.Segment.BlobItems), chk.Equals, blobNames) for _, blob := range *resp.EnumerationResults.Segment.BlobItems { c.Assert(nameMap[*blob.Name], chk.Equals, true) } @@ -740,7 +756,7 @@ func (s *aztestsSuite) TestContainerGetSetPermissionsMultiplePolicies(c *chk.C) readWrite := AccessPolicyPermission{Read: true, Write: true}.String() readOnly := AccessPolicyPermission{Read: true}.String() id1, id2 := "0000", "0001" - permissions := []SignedIDentifier{ + permissions := []*SignedIdentifier{ {ID: &id1, AccessPolicy: &AccessPolicy{ Start: &start, @@ -759,7 +775,7 @@ func (s *aztestsSuite) TestContainerGetSetPermissionsMultiplePolicies(c *chk.C) setAccessPolicyOptions := SetAccessPolicyOptions{ ContainerSetAccessPolicyOptions: ContainerSetAccessPolicyOptions{ - ContainerAcl: &permissions, + ContainerACL: &permissions, }, } _, err := containerClient.SetAccessPolicy(ctx, &setAccessPolicyOptions) @@ -768,7 +784,7 @@ func (s *aztestsSuite) TestContainerGetSetPermissionsMultiplePolicies(c *chk.C) resp, err := containerClient.GetAccessPolicy(ctx, nil) c.Assert(err, chk.IsNil) - c.Assert(*resp.SignedIdentifiers, chk.DeepEquals, permissions) + c.Assert(resp.SignedIdentifiers, chk.DeepEquals, permissions) } func (s *aztestsSuite) TestContainerGetPermissionsPublicAccessNotNone(c *chk.C) { @@ -801,24 +817,25 @@ func (s *aztestsSuite) TestContainerSetPermissionsPublicAccessNone(c *chk.C) { _, err := containerClient.SetAccessPolicy(ctx, nil) c.Assert(err, chk.IsNil) - //pipeline := NewPipeline(NewAnonymousCredential(), PipelineOptions{}) - credential, err := getGenericCredential("") c.Assert(err, chk.IsNil) - bsu2, err := NewServiceClient(bsu.URL(), credential, nil) + bsu2, err := NewServiceClient(bsu.URL(), azcore.AnonymousCredential(), nil) c.Assert(err, chk.IsNil) containerClient2 := bsu2.NewContainerClient(containerName) blobURL2 := containerClient2.NewBlockBlobClient(blobName) - _, err = blobURL2.Download(ctx, nil) // Get permissions via the original container URL so the request succeeds resp, err := containerClient.GetAccessPolicy(ctx, nil) c.Assert(resp.BlobPublicAccess, chk.IsNil) - c.Assert(err, chk.NotNil) - // If we cannot access a blob's data, we will also not be able to enumerate blobs + c.Assert(err, chk.IsNil) + // If we cannot access a blob's data, we will also not be able to enumerate blobs + p := containerClient2.ListBlobsFlatSegment(nil) + p.NextPage(ctx); err = p.Err() // grab the next page validateStorageError(c, err, StorageErrorCodeNoAuthenticationInformation) + _, err = blobURL2.Download(ctx, nil) + validateStorageError(c, err, StorageErrorCodeNoAuthenticationInformation) } func (s *aztestsSuite) TestContainerSetPermissionsPublicAccessBlob(c *chk.C) { @@ -876,7 +893,7 @@ func (s *aztestsSuite) TestContainerSetPermissionsPublicAccessContainer(c *chk.C // expiry := start.Add(5 * time.Minute).UTC() // listOnly := AccessPolicyPermission{List: true}.String() // id := "0000" -// permissions := []SignedIDentifier{{ +// permissions := []SignedIdentifier{{ // ID: &id, // AccessPolicy: &AccessPolicy{ // Start: &start, @@ -887,7 +904,7 @@ func (s *aztestsSuite) TestContainerSetPermissionsPublicAccessContainer(c *chk.C // // setAccessPolicyOptions := SetAccessPolicyOptions{ // ContainerAcquireLeaseOptions: ContainerAcquireLeaseOptions{ -// ContainerAcl: &permissions, +// ContainerACL: &permissions, // }, // } // _, err = containerClient.SetAccessPolicy(ctx, &setAccessPolicyOptions) @@ -925,11 +942,11 @@ func (s *aztestsSuite) TestContainerSetPermissionsACLMoreThanFive(c *chk.C) { start := time.Now().UTC() expiry := start.Add(5 * time.Minute).UTC() - permissions := make([]SignedIDentifier, 6, 6) + permissions := make([]*SignedIdentifier, 6, 6) listOnly := AccessPolicyPermission{Read: true}.String() for i := 0; i < 6; i++ { id := "000" + strconv.Itoa(i) - permissions[i] = SignedIDentifier{ + permissions[i] = &SignedIdentifier{ ID: &id, AccessPolicy: &AccessPolicy{ Start: &start, @@ -943,7 +960,7 @@ func (s *aztestsSuite) TestContainerSetPermissionsACLMoreThanFive(c *chk.C) { setAccessPolicyOptions := SetAccessPolicyOptions{ ContainerSetAccessPolicyOptions: ContainerSetAccessPolicyOptions{ Access: &access, - ContainerAcl: &permissions, + ContainerACL: &permissions, }, } _, err := containerClient.SetAccessPolicy(ctx, &setAccessPolicyOptions) @@ -961,10 +978,10 @@ func (s *aztestsSuite) TestContainerSetPermissionsDeleteAndModifyACL(c *chk.C) { start := generateCurrentTimeWithModerateResolution() expiry := start.Add(5 * time.Minute).UTC() listOnly := AccessPolicyPermission{Read: true}.String() - permissions := make([]SignedIDentifier, 2, 2) + permissions := make([]*SignedIdentifier, 2, 2) for i := 0; i < 2; i++ { id := "000" + strconv.Itoa(i) - permissions[i] = SignedIDentifier{ + permissions[i] = &SignedIdentifier{ ID: &id, AccessPolicy: &AccessPolicy{ Start: &start, @@ -978,7 +995,7 @@ func (s *aztestsSuite) TestContainerSetPermissionsDeleteAndModifyACL(c *chk.C) { setAccessPolicyOptions := SetAccessPolicyOptions{ ContainerSetAccessPolicyOptions: ContainerSetAccessPolicyOptions{ Access: &access, - ContainerAcl: &permissions, + ContainerACL: &permissions, }, } _, err := containerClient.SetAccessPolicy(ctx, &setAccessPolicyOptions) @@ -986,23 +1003,23 @@ func (s *aztestsSuite) TestContainerSetPermissionsDeleteAndModifyACL(c *chk.C) { resp, err := containerClient.GetAccessPolicy(ctx, nil) c.Assert(err, chk.IsNil) - c.Assert(*resp.SignedIdentifiers, chk.DeepEquals, permissions) + c.Assert(resp.SignedIdentifiers, chk.DeepEquals, permissions) - permissions = (*resp.SignedIdentifiers)[:1] // Delete the first policy by removing it from the slice + permissions = resp.SignedIdentifiers[:1] // Delete the first policy by removing it from the slice newId := "0004" permissions[0].ID = &newId // Modify the remaining policy which is at index 0 in the new slice setAccessPolicyOptions1 := SetAccessPolicyOptions{ ContainerSetAccessPolicyOptions: ContainerSetAccessPolicyOptions{ Access: &access, - ContainerAcl: &permissions, + ContainerACL: &permissions, }, } _, err = containerClient.SetAccessPolicy(ctx, &setAccessPolicyOptions1) resp, err = containerClient.GetAccessPolicy(ctx, nil) c.Assert(err, chk.IsNil) - c.Assert(*resp.SignedIdentifiers, chk.HasLen, 1) - c.Assert(*resp.SignedIdentifiers, chk.DeepEquals, permissions) + c.Assert(resp.SignedIdentifiers, chk.HasLen, 1) + c.Assert(resp.SignedIdentifiers, chk.DeepEquals, permissions) } func (s *aztestsSuite) TestContainerSetPermissionsDeleteAllPolicies(c *chk.C) { @@ -1013,11 +1030,11 @@ func (s *aztestsSuite) TestContainerSetPermissionsDeleteAllPolicies(c *chk.C) { start := time.Now().UTC() expiry := start.Add(5 * time.Minute).UTC() - permissions := make([]SignedIDentifier, 2, 2) + permissions := make([]*SignedIdentifier, 2, 2) listOnly := AccessPolicyPermission{Read: true}.String() for i := 0; i < 2; i++ { id := "000" + strconv.Itoa(i) - permissions[i] = SignedIDentifier{ + permissions[i] = &SignedIdentifier{ ID: &id, AccessPolicy: &AccessPolicy{ Start: &start, @@ -1031,7 +1048,7 @@ func (s *aztestsSuite) TestContainerSetPermissionsDeleteAllPolicies(c *chk.C) { setAccessPolicyOptions := SetAccessPolicyOptions{ ContainerSetAccessPolicyOptions: ContainerSetAccessPolicyOptions{ Access: &access, - ContainerAcl: &permissions, + ContainerACL: &permissions, }, } _, err := containerClient.SetAccessPolicy(ctx, &setAccessPolicyOptions) @@ -1039,13 +1056,13 @@ func (s *aztestsSuite) TestContainerSetPermissionsDeleteAllPolicies(c *chk.C) { resp, err := containerClient.GetAccessPolicy(ctx, nil) c.Assert(err, chk.IsNil) - c.Assert(*resp.SignedIdentifiers, chk.HasLen, len(permissions)) - c.Assert(*resp.SignedIdentifiers, chk.DeepEquals, permissions) + c.Assert(resp.SignedIdentifiers, chk.HasLen, len(permissions)) + c.Assert(resp.SignedIdentifiers, chk.DeepEquals, permissions) setAccessPolicyOptions = SetAccessPolicyOptions{ ContainerSetAccessPolicyOptions: ContainerSetAccessPolicyOptions{ Access: &access, - ContainerAcl: &[]SignedIDentifier{}, + ContainerACL: &[]*SignedIdentifier{}, }, } _, err = containerClient.SetAccessPolicy(ctx, &setAccessPolicyOptions) @@ -1065,11 +1082,11 @@ func (s *aztestsSuite) TestContainerSetPermissionsDeleteAllPolicies(c *chk.C) { // // Swap start and expiry // expiry := time.Now().UTC() // start := expiry.Add(5 * time.Minute).UTC() -// permissions := make([]SignedIDentifier, 2, 2) +// permissions := make([]SignedIdentifier, 2, 2) // listOnly := AccessPolicyPermission{Read: true}.String() // for i := 0; i < 2; i++ { // id := "000" + strconv.Itoa(i) -// permissions[i] = SignedIDentifier{ +// permissions[i] = SignedIdentifier{ // ID: &id, // AccessPolicy: &AccessPolicy{ // Start: &start, @@ -1083,7 +1100,7 @@ func (s *aztestsSuite) TestContainerSetPermissionsDeleteAllPolicies(c *chk.C) { // setAccessPolicyOptions := SetAccessPolicyOptions{ // ContainerSetAccessPolicyOptions: ContainerSetAccessPolicyOptions{ // Access: &access, -// ContainerAcl: &permissions, +// ContainerACL: &permissions, // }, // } // _, err := containerClient.SetAccessPolicy(ctx, &setAccessPolicyOptions) @@ -1112,10 +1129,10 @@ func (s *aztestsSuite) TestContainerSetPermissionsSignedIdentifierTooLong(c *chk } expiry := time.Now().UTC() start := expiry.Add(5 * time.Minute).UTC() - permissions := make([]SignedIDentifier, 2, 2) + permissions := make([]*SignedIdentifier, 2, 2) listOnly := AccessPolicyPermission{Read: true}.String() for i := 0; i < 2; i++ { - permissions[i] = SignedIDentifier{ + permissions[i] = &SignedIdentifier{ ID: &id, AccessPolicy: &AccessPolicy{ Start: &start, @@ -1129,7 +1146,7 @@ func (s *aztestsSuite) TestContainerSetPermissionsSignedIdentifierTooLong(c *chk setAccessPolicyOptions := SetAccessPolicyOptions{ ContainerSetAccessPolicyOptions: ContainerSetAccessPolicyOptions{ Access: &access, - ContainerAcl: &permissions, + ContainerACL: &permissions, }, } _, err := containerClient.SetAccessPolicy(ctx, &setAccessPolicyOptions) @@ -1326,7 +1343,7 @@ func (s *aztestsSuite) TestContainerSetMetadataIfModifiedSinceTrue(c *chk.C) { resp, err := containerClient.GetProperties(ctx, nil) c.Assert(err, chk.IsNil) c.Assert(resp.Metadata, chk.NotNil) - c.Assert(*resp.Metadata, chk.DeepEquals, basicMetadata) + c.Assert(resp.Metadata, chk.DeepEquals, basicMetadata) } diff --git a/sdk/storage/azblob/zt_examples_test.go b/sdk/storage/azblob/zt_examples_test.go index e0b087df606f..91f747151849 100644 --- a/sdk/storage/azblob/zt_examples_test.go +++ b/sdk/storage/azblob/zt_examples_test.go @@ -38,7 +38,7 @@ func Example() { // Open up a service client. // You'll need to specify a service URL, which for blob endpoints usually makes up the syntax http(s)://.blob.core.windows.net/ - service, err := NewServiceClient("https://" + accountName + ".blob.core.windows.net/", cred, nil) + service, err := NewServiceClient("https://"+accountName+".blob.core.windows.net/", cred, nil) if err != nil { log.Fatal(err) } @@ -94,7 +94,6 @@ func Example() { // The AutoPagerTimeout defines how long it will wait to place into the items channel before it exits & cleans itself up. A zero time will result in no timeout. pager := container.ListBlobsFlatSegment(nil) - // TODO: fix me for the pager (why wasn't I fixed?) for pager.NextPage(ctx) { resp := pager.PageResponse() @@ -106,7 +105,7 @@ func Example() { if err = pager.Err(); err != nil { log.Fatal(err) } - + // Delete the blob we created earlier. _, err = blockBlob.Delete(ctx, nil) if err != nil { @@ -145,9 +144,9 @@ func ExampleStorageError() { you would most likely ignore the Timeout/Temporary methods. However, the StorageError interface exposes richer information such as a service error code, an error description, details data, and the service-returned http.Response. And, from the http.Response, you can get the initiating http.Request. - */ + */ - container, err := NewContainerClient("http://myaccount.blob.core.windows.net/mycontainer", NewAnonymousCredential(), nil) + container, err := NewContainerClient("http://myaccount.blob.core.windows.net/mycontainer", azcore.AnonymousCredential(), nil) if err != nil { log.Fatal(err) } @@ -160,7 +159,7 @@ func ExampleStorageError() { switch stgErr.ErrorCode { case StorageErrorCodeContainerAlreadyExists: // You can also look at the *http.Response that's attached to the error as well. - if resp := stgErr.Response(); resp != nil { + if resp := stgErr.Response(); resp != nil { failedRequest := resp.Request _ = failedRequest // avoid compiler's declared but not used error } @@ -201,6 +200,38 @@ func ExampleBlobURLParts() { fmt.Print(parts.URL()) } +// This example demonstrates how to use the SAS token convenience generators. +// Though this example focuses on account SAS, these generators exist across all clients (Service, Container, Blob, and specialized Blob clients) +func ExampleSASConvenienceGenerators() { + // Initialize a service client + accountName, accountKey := accountInfo() + credential, err := NewSharedKeyCredential(accountName, accountKey) + if err != nil { + log.Fatal(err) + } + serviceURL, err := NewServiceClient(fmt.Sprintf("https://%s.blob.core.windows.net/", accountName), credential, nil) + + // Provide the convenience function with relevant info (services, resource types, permissions, and duration) + // The SAS token will be valid from this moment onwards. + accountSAS, err := serviceURL.GetAccountSASToken(AccountSASServices{Blob: true}, AccountSASResourceTypes{Object: true, Service: true, Container: true}, AccountSASPermissions{Read: true, List: true}, time.Hour * 48) + + qp := accountSAS.Encode() + urlToSend := fmt.Sprintf("https://%s.blob.core.windows.net/?%s", accountName, qp) + // You can hand off this URL to someone else via any mechanism you choose. + + // ****************************************** + + // When someone receives the URL, they can access the resource using it in code like this, or a tool of some variety. + serviceURL, err = NewServiceClient(urlToSend, azcore.AnonymousCredential(), nil) + if err != nil { + log.Fatal(err) + } + + // You can also break a blob URL up into it's constituent parts + blobURLParts := NewBlobURLParts(serviceURL.URL()) + fmt.Printf("SAS expiry time = %s\n", blobURLParts.SAS.ExpiryTime()) +} + // This example shows how to create and use an Azure Storage account Shared Access Signature (SAS). func ExampleAccountSASSignatureValues() { accountName, accountKey := accountInfo() @@ -211,10 +242,10 @@ func ExampleAccountSASSignatureValues() { } sasQueryParams, err := AccountSASSignatureValues{ - Protocol: SASProtocolHTTPS, - ExpiryTime: time.Now().UTC().Add(48 * time.Hour), - Permissions: AccountSASPermissions{Read: true, List: true}.String(), - Services: AccountSASServices{Blob: true}.String(), + Protocol: SASProtocolHTTPS, + ExpiryTime: time.Now().UTC().Add(48 * time.Hour), + Permissions: AccountSASPermissions{Read: true, List: true}.String(), + Services: AccountSASServices{Blob: true}.String(), ResourceTypes: AccountSASResourceTypes{Container: true, Object: true}.String(), }.NewSASQueryParameters(credential) if err != nil { @@ -254,10 +285,10 @@ func ExampleBlobSASSignatureValues() { blobName := "HelloWorld.txt" sasQueryParams, err := BlobSASSignatureValues{ - Protocol: SASProtocolHTTPS, - ExpiryTime: time.Now().UTC().Add(48*time.Hour), + Protocol: SASProtocolHTTPS, + ExpiryTime: time.Now().UTC().Add(48 * time.Hour), ContainerName: containerName, - BlobName: blobName, + BlobName: blobName, // To produce a container SAS, as opposed to a blob SAS, assign to permissions using ContainerSASPermissions // and make sure the BlobName field is "" @@ -394,14 +425,14 @@ func ExampleBlobAccessConditions() { showResult(blockBlob.Download(ctx, &DownloadBlobOptions{ModifiedAccessConditions: &ModifiedAccessConditions{IfUnmodifiedSince: to.TimePtr(time.Now().UTC().Add(time.Hour * -24))}})) // Upload new content if the blob hasn't changed since the version identified by ETag (succeeds): - upload, err = blockBlob.Upload(ctx, strings.NewReader("Text-2"), &UploadBlockBlobOptions{ ModifiedAccessConditions: &ModifiedAccessConditions{IfMatch: upload.ETag}}) + upload, err = blockBlob.Upload(ctx, strings.NewReader("Text-2"), &UploadBlockBlobOptions{ModifiedAccessConditions: &ModifiedAccessConditions{IfMatch: upload.ETag}}) showResultUpload(upload, err) // Download content if it has changed since the version identified by ETag (fails): showResult(blockBlob.Download(ctx, &DownloadBlobOptions{ModifiedAccessConditions: &ModifiedAccessConditions{IfNoneMatch: upload.ETag}})) // Upload content if the blob doesn't already exist (fails): - showResultUpload(blockBlob.Upload(ctx, strings.NewReader("Text-3"), &UploadBlockBlobOptions{ ModifiedAccessConditions: &ModifiedAccessConditions{IfNoneMatch: to.StringPtr(ETagAny)}})) + showResultUpload(blockBlob.Upload(ctx, strings.NewReader("Text-3"), &UploadBlockBlobOptions{ModifiedAccessConditions: &ModifiedAccessConditions{IfNoneMatch: to.StringPtr(ETagAny)}})) } // This examples shows how to create a container with metadata and then how to read & update the metadata. @@ -442,7 +473,7 @@ func ExampleMetadata_containers() { log.Fatal("metadata is empty!") } - metadata := *get.Metadata + metadata := get.Metadata for k, v := range metadata { fmt.Print(k + "=" + v + "\n") } @@ -499,7 +530,7 @@ func ExampleMetadata_blobs() { log.Fatal("No metadata returned") } - metadata := *get.Metadata + metadata := get.Metadata for k, v := range metadata { fmt.Print(k + "=" + v + "\n") } @@ -535,7 +566,7 @@ func ExampleBlobHTTPHeaders() { // Create a blob with HTTP headers _, err = blobClient.Upload(ctx, strings.NewReader("Some text"), - &UploadBlockBlobOptions{BlobHttpHeaders: &BlobHttpHeaders{ + &UploadBlockBlobOptions{BlobHTTPHeaders: &BlobHTTPHeaders{ BlobContentType: to.StringPtr("text/html; charset=utf-8"), BlobContentDisposition: to.StringPtr("attachment"), }}) @@ -722,12 +753,12 @@ func ExamplePageBlobClient() { } copy(page[:], "Page 1") - _, err = blobClient.UploadPages(ctx, bytes.NewReader(page[:]), &UploadPagesOptions{Offset: to.Int64Ptr(2*PageBlobPageBytes)}) + _, err = blobClient.UploadPages(ctx, bytes.NewReader(page[:]), &UploadPagesOptions{PageRange: &HttpRange{0, 2*PageBlobPageBytes}}) if err != nil { log.Fatal(err) } - getPages, err := blobClient.GetPageRanges(ctx, 0*PageBlobPageBytes, 10*PageBlobPageBytes, nil) + getPages, err := blobClient.GetPageRanges(ctx, HttpRange{0*PageBlobPageBytes, 10*PageBlobPageBytes}, nil) if err != nil { log.Fatal(err) } @@ -735,12 +766,12 @@ func ExamplePageBlobClient() { fmt.Printf("Start=%d, End=%d\n", pr.Start, pr.End) } - _, err = blobClient.ClearPages(ctx, 0*PageBlobPageBytes, 1*PageBlobPageBytes, nil) + _, err = blobClient.ClearPages(ctx, HttpRange{0*PageBlobPageBytes, 1*PageBlobPageBytes}, nil) if err != nil { log.Fatal(err) } - getPages, err = blobClient.GetPageRanges(ctx, 0*PageBlobPageBytes, 10*PageBlobPageBytes, nil) + getPages, err = blobClient.GetPageRanges(ctx, HttpRange{0*PageBlobPageBytes, 10*PageBlobPageBytes}, nil) if err != nil { log.Fatal(err) } @@ -876,7 +907,7 @@ func Example_progressUploadDownload() { // Wrap the request body in a RequestBodyProgress and pass a callback function for progress reporting. _, err = blobClient.Upload(ctx, azcore.NewRequestBodyProgress(azcore.NopCloser(requestBody), func(bytesTransferred int64) { fmt.Printf("Wrote %d of %d bytes.", bytesTransferred, requestBody.Size()) - }), &UploadBlockBlobOptions{ BlobHttpHeaders: &BlobHttpHeaders{ + }), &UploadBlockBlobOptions{ BlobHTTPHeaders: &BlobHTTPHeaders{ BlobContentType: to.StringPtr("text/html; charset=utf-8"), BlobContentDisposition: to.StringPtr("attachment"), }}) @@ -1096,7 +1127,8 @@ func ExampleLeaseContainer() { // Create an containerClient object that wraps the container's URL and a default pipeline. u := fmt.Sprintf("https://%s.blob.core.windows.net/mycontainer", accountName) - containerClient, err := NewContainerClient(u, credential, nil) + leaseId := newUUID().String() + containerLeaseClient, err := NewContainerLeaseClient(u, leaseId, credential, nil) if err != nil { log.Fatal(err) } @@ -1106,29 +1138,30 @@ func ExampleLeaseContainer() { // Now acquire a lease on the container. // You can choose to pass an empty string for proposed ID so that the service automatically assigns one for you. - acquireLeaseResponse, err := containerClient.AcquireLease(ctx, &AcquireLeaseOptionsContainer{ ContainerAcquireLeaseOptions: &ContainerAcquireLeaseOptions{ Duration: to.Int32Ptr(60) }}) + duration := int32(60) + acquireLeaseResponse, err := containerLeaseClient.AcquireLease(ctx, &AcquireLeaseContainerOptions{Duration: &duration}) if err != nil { log.Fatal(err) } fmt.Println("The container is leased for delete operations with lease ID", *acquireLeaseResponse.LeaseID) // The container cannot be deleted without providing the lease ID. - _, err = containerClient.Delete(ctx, nil) + _, err = containerLeaseClient.Delete(ctx, nil) if err == nil { log.Fatal("delete should have failed") } fmt.Println("The container cannot be deleted while there is an active lease") // We can release the lease now and the container can be deleted. - _, err = containerClient.ReleaseLease(ctx, *acquireLeaseResponse.LeaseID, nil) + _, err = containerLeaseClient.ReleaseLease(ctx, nil) if err != nil { log.Fatal(err) } fmt.Println("The lease on the container is now released") // Acquire a lease again to perform other operations. - // duration is still 60 - acquireLeaseResponse, err = containerClient.AcquireLease(ctx, &AcquireLeaseOptionsContainer{ContainerAcquireLeaseOptions: &ContainerAcquireLeaseOptions{Duration: to.Int32Ptr(60)}}) + // Duration is still 60 + acquireLeaseResponse, err = containerLeaseClient.AcquireLease(ctx, &AcquireLeaseContainerOptions{Duration: &duration}) if err != nil { log.Fatal(err) } @@ -1138,23 +1171,24 @@ func ExampleLeaseContainer() { // A lease ID can be any valid GUID string format. newLeaseID := newUUID() newLeaseID[0] = 1 - changeLeaseResponse, err := containerClient.ChangeLease(ctx, *acquireLeaseResponse.LeaseID, newLeaseID.String(), nil) + changeLeaseResponse, err := containerLeaseClient.ChangeLease(ctx, &ChangeLeaseContainerOptions{ProposedLeaseId: newLeaseID.String()}) if err != nil { log.Fatal(err) } fmt.Println("The lease ID was changed to", *changeLeaseResponse.LeaseID) // The lease can be renewed. - renewLeaseResponse, err := containerClient.RenewLease(ctx, *changeLeaseResponse.LeaseID, nil) + renewLeaseResponse, err := containerLeaseClient.RenewLease(ctx, nil) if err != nil { log.Fatal(err) } fmt.Println("The lease was renewed with the same ID", *renewLeaseResponse.LeaseID) // Finally, the lease can be broken and we could prevent others from acquiring a lease for a period of time - _, err = containerClient.BreakLease(ctx, &BreakLeaseOptionsContainer{ContainerBreakLeaseOptions: &ContainerBreakLeaseOptions{BreakPeriod: to.Int32Ptr(60)}}) + duration = 60 + _, err = containerLeaseClient.BreakLease(ctx, &BreakLeaseContainerOptions{BreakPeriod: &duration}) if err != nil { log.Fatal(err) } - fmt.Println("The lease was borken, and nobody can acquire a lease for 60 seconds") + fmt.Println("The lease was broken, and nobody can acquire a lease for 60 seconds") } diff --git a/sdk/storage/azblob/zt_lease_client_test.go b/sdk/storage/azblob/zt_lease_client_test.go new file mode 100644 index 000000000000..1eaa42fe3e08 --- /dev/null +++ b/sdk/storage/azblob/zt_lease_client_test.go @@ -0,0 +1,241 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package azblob + +import ( + "context" + "github.com/Azure/azure-sdk-for-go/sdk/to" + chk "gopkg.in/check.v1" +) + +func (s *aztestsSuite) TestContainerAcquireLease(c *chk.C) { + bsu := getBSU() + containerClient, containerName := createNewContainer(c, bsu) + defer deleteContainer(c, containerClient) + + containerLeaseClient := bsu.NewContainerLeaseClient(containerName, "") + + ctx := context.Background() + acquireLeaseResponse, err := containerLeaseClient.AcquireLease(ctx, &AcquireLeaseContainerOptions{Duration: to.Int32Ptr(60)}) + c.Assert(err, chk.IsNil) + c.Assert(acquireLeaseResponse.LeaseID, chk.NotNil) + c.Assert(*acquireLeaseResponse.LeaseID, chk.Equals, containerLeaseClient.LeaseId) + + _, err = containerLeaseClient.ReleaseLease(ctx, nil) + c.Assert(err, chk.IsNil) +} + +func (s *aztestsSuite) TestContainerDeleteContainerWithoutLeaseId(c *chk.C) { + bsu := getBSU() + containerClient, containerName := createNewContainer(c, bsu) + defer deleteContainer(c, containerClient) + + containerLeaseClient := bsu.NewContainerLeaseClient(containerName, "") + + ctx := context.Background() + acquireLeaseResponse, err := containerLeaseClient.AcquireLease(ctx, &AcquireLeaseContainerOptions{Duration: to.Int32Ptr(60)}) + c.Assert(err, chk.IsNil) + c.Assert(acquireLeaseResponse.LeaseID, chk.NotNil) + c.Assert(*acquireLeaseResponse.LeaseID, chk.Equals, containerLeaseClient.LeaseId) + + _, err = containerClient.Delete(ctx, nil) + c.Assert(err, chk.NotNil) + + leaseId := containerLeaseClient.LeaseId + _, err = containerClient.Delete(ctx, &DeleteContainerOptions{ + LeaseAccessConditions: &LeaseAccessConditions{ + LeaseId: &leaseId, + }, + }) + c.Assert(err, chk.IsNil) +} + +func (s *aztestsSuite) TestContainerReleaseLease(c *chk.C) { + bsu := getBSU() + containerClient, containerName := createNewContainer(c, bsu) + defer deleteContainer(c, containerClient) + + containerLeaseClient := bsu.NewContainerLeaseClient(containerName, "") + + ctx := context.Background() + acquireLeaseResponse, err := containerLeaseClient.AcquireLease(ctx, &AcquireLeaseContainerOptions{Duration: to.Int32Ptr(60)}) + c.Assert(err, chk.IsNil) + c.Assert(acquireLeaseResponse.LeaseID, chk.NotNil) + c.Assert(*acquireLeaseResponse.LeaseID, chk.Equals, containerLeaseClient.LeaseId) + + _, err = containerClient.Delete(ctx, nil) + c.Assert(err, chk.NotNil) + + _, err = containerLeaseClient.ReleaseLease(ctx, nil) + c.Assert(err, chk.IsNil) + + _, err = containerClient.Delete(ctx, nil) + c.Assert(err, chk.IsNil) +} + +func (s *aztestsSuite) TestContainerRenewLease(c *chk.C) { + bsu := getBSU() + containerClient, containerName := createNewContainer(c, bsu) + defer deleteContainer(c, containerClient) + + containerLeaseClient := bsu.NewContainerLeaseClient(containerName, "") + + ctx := context.Background() + acquireLeaseResponse, err := containerLeaseClient.AcquireLease(ctx, &AcquireLeaseContainerOptions{Duration: to.Int32Ptr(15)}) + c.Assert(err, chk.IsNil) + c.Assert(acquireLeaseResponse.LeaseID, chk.NotNil) + c.Assert(*acquireLeaseResponse.LeaseID, chk.Equals, containerLeaseClient.LeaseId) + + _, err = containerLeaseClient.RenewLease(ctx, nil) + c.Assert(err, chk.IsNil) + + _, err = containerLeaseClient.ReleaseLease(ctx, nil) + c.Assert(err, chk.IsNil) +} + +func (s *aztestsSuite) TestContainerChangeLease(c *chk.C) { + bsu := getBSU() + containerClient, containerName := createNewContainer(c, bsu) + defer deleteContainer(c, containerClient) + + containerLeaseClient := bsu.NewContainerLeaseClient(containerName, "") + + ctx := context.Background() + acquireLeaseResponse, err := containerLeaseClient.AcquireLease(ctx, &AcquireLeaseContainerOptions{Duration: to.Int32Ptr(15)}) + c.Assert(err, chk.IsNil) + c.Assert(acquireLeaseResponse.LeaseID, chk.NotNil) + c.Assert(*acquireLeaseResponse.LeaseID, chk.Equals, containerLeaseClient.LeaseId) + + proposedLeaseId := newUUID().String() + changeLeaseResp, err := containerLeaseClient.ChangeLease(ctx, &ChangeLeaseContainerOptions{ + ProposedLeaseId: proposedLeaseId, + }) + c.Assert(err, chk.IsNil) + c.Assert(*changeLeaseResp.LeaseID, chk.Equals, proposedLeaseId) + c.Assert(containerLeaseClient.LeaseId, chk.Equals, proposedLeaseId) + + _, err = containerLeaseClient.RenewLease(ctx, nil) + c.Assert(err, chk.IsNil) + + _, err = containerLeaseClient.ReleaseLease(ctx, nil) + c.Assert(err, chk.IsNil) +} + +func (s *aztestsSuite) TestBlobAcquireLease(c *chk.C) { + bsu := getBSU() + containerClient, _ := createNewContainer(c, bsu) + defer deleteContainer(c, containerClient) + + bbClient, _ := createNewBlockBlob(c, containerClient) + blobLeaseClient := bbClient.NewBlobLeaseClient("") + + ctx := context.Background() + acquireLeaseResponse, err := blobLeaseClient.AcquireLease(ctx, &AcquireLeaseBlobOptions{Duration: to.Int32Ptr(60)}) + c.Assert(err, chk.IsNil) + c.Assert(acquireLeaseResponse.LeaseID, chk.NotNil) + c.Assert(*acquireLeaseResponse.LeaseID, chk.Equals, blobLeaseClient.LeaseId) + + _, err = blobLeaseClient.ReleaseLease(ctx, nil) + c.Assert(err, chk.IsNil) +} + +func (s *aztestsSuite) TestDeleteBlobWithoutLeaseId(c *chk.C) { + bsu := getBSU() + containerClient, _ := createNewContainer(c, bsu) + defer deleteContainer(c, containerClient) + + bbClient, _ := createNewBlockBlob(c, containerClient) + blobLeaseClient := bbClient.NewBlobLeaseClient("") + + ctx := context.Background() + acquireLeaseResponse, err := blobLeaseClient.AcquireLease(ctx, &AcquireLeaseBlobOptions{Duration: to.Int32Ptr(60)}) + c.Assert(err, chk.IsNil) + c.Assert(acquireLeaseResponse.LeaseID, chk.NotNil) + c.Assert(*acquireLeaseResponse.LeaseID, chk.Equals, blobLeaseClient.LeaseId) + + _, err = blobLeaseClient.Delete(ctx, nil) + c.Assert(err, chk.NotNil) + + leaseId := blobLeaseClient.LeaseId + _, err = blobLeaseClient.Delete(ctx, &DeleteBlobOptions{ + LeaseAccessConditions: &LeaseAccessConditions{ + LeaseId: &leaseId, + }, + }) + c.Assert(err, chk.IsNil) +} + +func (s *aztestsSuite) TestBlobReleaseLease(c *chk.C) { + bsu := getBSU() + containerClient, _ := createNewContainer(c, bsu) + defer deleteContainer(c, containerClient) + + bbClient, _ := createNewBlockBlob(c, containerClient) + blobLeaseClient := bbClient.NewBlobLeaseClient("") + + ctx := context.Background() + acquireLeaseResponse, err := blobLeaseClient.AcquireLease(ctx, &AcquireLeaseBlobOptions{Duration: to.Int32Ptr(60)}) + c.Assert(err, chk.IsNil) + c.Assert(acquireLeaseResponse.LeaseID, chk.NotNil) + c.Assert(*acquireLeaseResponse.LeaseID, chk.Equals, blobLeaseClient.LeaseId) + + _, err = blobLeaseClient.Delete(ctx, nil) + c.Assert(err, chk.NotNil) + + _, err = blobLeaseClient.ReleaseLease(ctx, nil) + c.Assert(err, chk.IsNil) + + _, err = blobLeaseClient.Delete(ctx, nil) + c.Assert(err, chk.IsNil) +} + +func (s *aztestsSuite) TestBlobRenewLease(c *chk.C) { + bsu := getBSU() + containerClient, _ := createNewContainer(c, bsu) + defer deleteContainer(c, containerClient) + + bbClient, _ := createNewBlockBlob(c, containerClient) + blobLeaseClient := bbClient.NewBlobLeaseClient("") + + ctx := context.Background() + acquireLeaseResponse, err := blobLeaseClient.AcquireLease(ctx, &AcquireLeaseBlobOptions{Duration: to.Int32Ptr(15)}) + c.Assert(err, chk.IsNil) + c.Assert(acquireLeaseResponse.LeaseID, chk.NotNil) + c.Assert(*acquireLeaseResponse.LeaseID, chk.Equals, blobLeaseClient.LeaseId) + + _, err = blobLeaseClient.RenewLease(ctx, nil) + c.Assert(err, chk.IsNil) + + _, err = blobLeaseClient.ReleaseLease(ctx, nil) + c.Assert(err, chk.IsNil) +} + +func (s *aztestsSuite) TestBlobChangeLease(c *chk.C) { + bsu := getBSU() + containerClient, _ := createNewContainer(c, bsu) + defer deleteContainer(c, containerClient) + + bbClient, _ := createNewBlockBlob(c, containerClient) + blobLeaseClient := bbClient.NewBlobLeaseClient("") + + ctx := context.Background() + acquireLeaseResponse, err := blobLeaseClient.AcquireLease(ctx, &AcquireLeaseBlobOptions{Duration: to.Int32Ptr(15)}) + c.Assert(err, chk.IsNil) + c.Assert(acquireLeaseResponse.LeaseID, chk.NotNil) + c.Assert(*acquireLeaseResponse.LeaseID, chk.Equals, blobLeaseClient.LeaseId) + + proposedLeaseId := newUUID().String() + changeLeaseResp, err := blobLeaseClient.ChangeLease(ctx, &ChangeLeaseBlobOptions{ + ProposedLeaseId: proposedLeaseId, + }) + c.Assert(err, chk.IsNil) + c.Assert(*changeLeaseResp.LeaseID, chk.Equals, proposedLeaseId) + c.Assert(blobLeaseClient.LeaseId, chk.Equals, proposedLeaseId) + + _, err = blobLeaseClient.RenewLease(ctx, nil) + c.Assert(err, chk.IsNil) + + _, err = blobLeaseClient.ReleaseLease(ctx, nil) + c.Assert(err, chk.IsNil) +} diff --git a/sdk/storage/azblob/zt_page_blob_client_test.go b/sdk/storage/azblob/zt_page_blob_client_test.go index c33890b70662..5516ee37e313 100644 --- a/sdk/storage/azblob/zt_page_blob_client_test.go +++ b/sdk/storage/azblob/zt_page_blob_client_test.go @@ -22,7 +22,7 @@ func (s *aztestsSuite) TestPutGetPages(c *chk.C) { contentSize := 1024 offset, end, count := int64(0), int64(contentSize-1), int64(contentSize) - uploadPagesOptions := UploadPagesOptions{Offset: &offset, Count: &count} + uploadPagesOptions := UploadPagesOptions{PageRange: &HttpRange{offset, count}} putResp, err := pbClient.UploadPages(context.Background(), getReaderToRandomBytes(1024), &uploadPagesOptions) c.Assert(err, chk.IsNil) c.Assert(putResp.RawResponse.StatusCode, chk.Equals, 201) @@ -36,7 +36,7 @@ func (s *aztestsSuite) TestPutGetPages(c *chk.C) { c.Assert(putResp.Date, chk.NotNil) c.Assert((*putResp.Date).IsZero(), chk.Equals, false) - pageList, err := pbClient.GetPageRanges(context.Background(), 0, 1023, nil) + pageList, err := pbClient.GetPageRanges(context.Background(), HttpRange{0, 1023}, nil) c.Assert(err, chk.IsNil) c.Assert(pageList.RawResponse.StatusCode, chk.Equals, 200) c.Assert(pageList.LastModified, chk.NotNil) @@ -50,7 +50,9 @@ func (s *aztestsSuite) TestPutGetPages(c *chk.C) { c.Assert(pageList.PageList, chk.NotNil) pageRangeResp := pageList.PageList.PageRange c.Assert(*pageRangeResp, chk.HasLen, 1) - c.Assert((*pageRangeResp)[0], chk.DeepEquals, PageRange{Start: &offset, End: &end}) + rawStart, rawEnd := (*pageRangeResp)[0].Raw() + c.Assert(rawStart, chk.Equals, offset) + c.Assert(rawEnd, chk.Equals, end) } func (s *aztestsSuite) TestUploadPagesFromURL(c *chk.C) { @@ -62,14 +64,14 @@ func (s *aztestsSuite) TestUploadPagesFromURL(c *chk.C) { containerClient, _ := createNewContainer(c, bsu) defer deleteContainer(c, containerClient) - contentSize := 8 * 1024 // 8KB + contentSize := 4 * 1024 * 1024 // 8KB r, sourceData := getRandomDataAndReader(contentSize) ctx := context.Background() // Use default Background context srcBlob, _ := createNewPageBlobWithSize(c, containerClient, int64(contentSize)) destBlob, _ := createNewPageBlobWithSize(c, containerClient, int64(contentSize)) offset, _, count := int64(0), int64(contentSize-1), int64(contentSize) - uploadPagesOptions := UploadPagesOptions{Offset: &offset, Count: &count} + uploadPagesOptions := UploadPagesOptions{PageRange: &HttpRange{offset, count}} uploadSrcResp1, err := srcBlob.UploadPages(ctx, r, &uploadPagesOptions) c.Assert(err, chk.IsNil) c.Assert(uploadSrcResp1.RawResponse.StatusCode, chk.Equals, 201) @@ -138,7 +140,7 @@ func (s *aztestsSuite) TestUploadPagesFromURLWithMD5(c *chk.C) { // Prepare source pbClient for copy. offset, _, count := int64(0), int64(contentSize-1), int64(contentSize) - uploadPagesOptions := UploadPagesOptions{Offset: &offset, Count: &count} + uploadPagesOptions := UploadPagesOptions{PageRange: &HttpRange{offset, count}} uploadSrcResp1, err := srcBlob.UploadPages(ctx, r, &uploadPagesOptions) c.Assert(err, chk.IsNil) c.Assert(uploadSrcResp1.RawResponse.StatusCode, chk.Equals, 201) @@ -161,7 +163,7 @@ func (s *aztestsSuite) TestUploadPagesFromURLWithMD5(c *chk.C) { // Upload page from URL with MD5. uploadPagesFromURLOptions := UploadPagesFromURLOptions{ - SourceContentMd5: &contentMD5, + SourceContentMD5: &contentMD5, } pResp1, err := destBlob.UploadPagesFromURL(ctx, srcBlobURLWithSAS, 0, 0, int64(contentSize), &uploadPagesFromURLOptions) c.Assert(err, chk.IsNil) @@ -187,7 +189,7 @@ func (s *aztestsSuite) TestUploadPagesFromURLWithMD5(c *chk.C) { _, badMD5 := getRandomDataAndReader(16) badContentMD5 := badMD5[:] uploadPagesFromURLOptions = UploadPagesFromURLOptions{ - SourceContentMd5: &badContentMD5, + SourceContentMD5: &badContentMD5, } _, err = destBlob.UploadPagesFromURL(ctx, srcBlobURLWithSAS, 0, 0, int64(contentSize), &uploadPagesFromURLOptions) c.Assert(err, chk.NotNil) @@ -205,7 +207,7 @@ func (s *aztestsSuite) TestClearDiffPages(c *chk.C) { contentSize := 2 * 1024 r := getReaderToRandomBytes(contentSize) offset, _, count := int64(0), int64(contentSize-1), int64(contentSize) - uploadPagesOptions := UploadPagesOptions{Offset: &offset, Count: &count} + uploadPagesOptions := UploadPagesOptions{PageRange: &HttpRange{offset, count}} _, err := pbClient.UploadPages(context.Background(), r, &uploadPagesOptions) c.Assert(err, chk.IsNil) @@ -213,22 +215,25 @@ func (s *aztestsSuite) TestClearDiffPages(c *chk.C) { c.Assert(err, chk.IsNil) offset1, end1, count1 := int64(contentSize), int64(2*contentSize-1), int64(contentSize) - uploadPagesOptions1 := UploadPagesOptions{Offset: &offset1, Count: &count1} + uploadPagesOptions1 := UploadPagesOptions{PageRange: &HttpRange{offset1, count1}} _, err = pbClient.UploadPages(context.Background(), getReaderToRandomBytes(2048), &uploadPagesOptions1) c.Assert(err, chk.IsNil) - pageListResp, err := pbClient.GetPageRangesDiff(context.Background(), 0, 4096, *snapshotResp.Snapshot, nil) + pageListResp, err := pbClient.GetPageRangesDiff(context.Background(), HttpRange{0, 4096}, *snapshotResp.Snapshot, nil) c.Assert(err, chk.IsNil) pageRangeResp := pageListResp.PageList.PageRange c.Assert(pageRangeResp, chk.NotNil) c.Assert(*pageRangeResp, chk.HasLen, 1) - c.Assert((*pageRangeResp)[0], chk.DeepEquals, PageRange{Start: &offset1, End: &end1}) + // c.Assert((*pageRangeResp)[0], chk.DeepEquals, PageRange{Start: &offset1, End: &end1}) + rawStart, rawEnd := (*pageRangeResp)[0].Raw() + c.Assert(rawStart, chk.Equals, offset1) + c.Assert(rawEnd, chk.Equals, end1) - clearResp, err := pbClient.ClearPages(context.Background(), 2048, 2048, nil) + clearResp, err := pbClient.ClearPages(context.Background(), HttpRange{2048, 2048}, nil) c.Assert(err, chk.IsNil) c.Assert(clearResp.RawResponse.StatusCode, chk.Equals, 201) - pageListResp, err = pbClient.GetPageRangesDiff(context.Background(), 0, 4095, *snapshotResp.Snapshot, nil) + pageListResp, err = pbClient.GetPageRangesDiff(context.Background(), HttpRange{0, 4095}, *snapshotResp.Snapshot, nil) c.Assert(err, chk.IsNil) c.Assert(pageListResp.PageList.PageRange, chk.IsNil) } @@ -265,7 +270,7 @@ func (s *aztestsSuite) TestIncrementalCopy(c *chk.C) { contentSize := 1024 r := getReaderToRandomBytes(contentSize) offset, _, count := int64(0), int64(0)+int64(contentSize-1), int64(contentSize) - uploadPagesOptions := UploadPagesOptions{Offset: &offset, Count: &count} + uploadPagesOptions := UploadPagesOptions{PageRange: &HttpRange{offset, count}} _, err = srcBlob.UploadPages(context.Background(), r, &uploadPagesOptions) c.Assert(err, chk.IsNil) @@ -361,9 +366,8 @@ func (s *aztestsSuite) TestPutPagesWithMD5(c *chk.C) { md5Value := md5.Sum(body) contentMD5 := md5Value[:] uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, - TransactionalContentMd5: &contentMD5, + PageRange: &HttpRange{offset, count}, + TransactionalContentMD5: &contentMD5, } putResp, err := pbClient.UploadPages(context.Background(), readerToBody, &uploadPagesOptions) @@ -385,9 +389,8 @@ func (s *aztestsSuite) TestPutPagesWithMD5(c *chk.C) { _, badMD5 := getRandomDataAndReader(16) basContentMD5 := badMD5[:] uploadPagesOptions = UploadPagesOptions{ - Offset: &offset, - Count: &count, - TransactionalContentMd5: &basContentMD5, + PageRange: &HttpRange{offset, count}, + TransactionalContentMD5: &basContentMD5, } putResp, err = pbClient.UploadPages(context.Background(), readerToBody, &uploadPagesOptions) c.Assert(err, chk.NotNil) @@ -442,7 +445,7 @@ func (s *aztestsSuite) TestBlobCreatePageMetadataNonEmpty(c *chk.C) { resp, err := pbClient.GetProperties(ctx, nil) c.Assert(err, chk.IsNil) c.Assert(resp.Metadata, chk.NotNil) - c.Assert(*resp.Metadata, chk.DeepEquals, basicMetadata) + c.Assert(resp.Metadata, chk.DeepEquals, basicMetadata) } func (s *aztestsSuite) TestBlobCreatePageMetadataEmpty(c *chk.C) { @@ -489,7 +492,7 @@ func (s *aztestsSuite) TestBlobCreatePageHTTPHeaders(c *chk.C) { sequenceNumber := int64(0) createPageBlobOptions := CreatePageBlobOptions{ BlobSequenceNumber: &sequenceNumber, - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, } _, err := pbClient.Create(ctx, PageBlobPageBytes, &createPageBlobOptions) c.Assert(err, chk.IsNil) @@ -504,7 +507,7 @@ func validatePageBlobPut(c *chk.C, pbClient PageBlobClient) { resp, err := pbClient.GetProperties(ctx, nil) c.Assert(err, chk.IsNil) c.Assert(resp.Metadata, chk.NotNil) - c.Assert(*resp.Metadata, chk.DeepEquals, basicMetadata) + c.Assert(resp.Metadata, chk.DeepEquals, basicMetadata) c.Assert(resp.NewHTTPHeaders(), chk.DeepEquals, basicHeaders) } @@ -520,7 +523,7 @@ func (s *aztestsSuite) TestBlobCreatePageIfModifiedSinceTrue(c *chk.C) { createPageBlobOptions := CreatePageBlobOptions{ BlobSequenceNumber: &sequenceNumber, Metadata: &basicMetadata, - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ IfModifiedSince: ¤tTime, @@ -545,7 +548,7 @@ func (s *aztestsSuite) TestBlobCreatePageIfModifiedSinceFalse(c *chk.C) { createPageBlobOptions := CreatePageBlobOptions{ BlobSequenceNumber: &sequenceNumber, Metadata: &basicMetadata, - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ IfModifiedSince: ¤tTime, @@ -570,7 +573,7 @@ func (s *aztestsSuite) TestBlobCreatePageIfUnmodifiedSinceTrue(c *chk.C) { createPageBlobOptions := CreatePageBlobOptions{ BlobSequenceNumber: &sequenceNumber, Metadata: &basicMetadata, - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ IfUnmodifiedSince: ¤tTime, @@ -595,7 +598,7 @@ func (s *aztestsSuite) TestBlobCreatePageIfUnmodifiedSinceFalse(c *chk.C) { createPageBlobOptions := CreatePageBlobOptions{ BlobSequenceNumber: &sequenceNumber, Metadata: &basicMetadata, - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ IfUnmodifiedSince: ¤tTime, @@ -621,7 +624,7 @@ func (s *aztestsSuite) TestBlobCreatePageIfMatchTrue(c *chk.C) { createPageBlobOptions := CreatePageBlobOptions{ BlobSequenceNumber: &sequenceNumber, Metadata: &basicMetadata, - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ IfMatch: resp.ETag, @@ -645,7 +648,7 @@ func (s *aztestsSuite) TestBlobCreatePageIfMatchFalse(c *chk.C) { createPageBlobOptions := CreatePageBlobOptions{ BlobSequenceNumber: &sequenceNumber, Metadata: &basicMetadata, - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ IfMatch: &eTag, @@ -669,7 +672,7 @@ func (s *aztestsSuite) TestBlobCreatePageIfNoneMatchTrue(c *chk.C) { createPageBlobOptions := CreatePageBlobOptions{ BlobSequenceNumber: &sequenceNumber, Metadata: &basicMetadata, - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ IfNoneMatch: &eTag, @@ -694,7 +697,7 @@ func (s *aztestsSuite) TestBlobCreatePageIfNoneMatchFalse(c *chk.C) { createPageBlobOptions := CreatePageBlobOptions{ BlobSequenceNumber: &sequenceNumber, Metadata: &basicMetadata, - BlobHttpHeaders: &basicHeaders, + BlobHTTPHeaders: &basicHeaders, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ IfNoneMatch: resp.ETag, @@ -716,7 +719,7 @@ func (s *aztestsSuite) TestBlobPutPagesInvalidRange(c *chk.C) { contentSize := 1024 r := getReaderToRandomBytes(contentSize) offset, count := int64(0), int64(contentSize/2) - uploadPagesOptions := UploadPagesOptions{Offset: &offset, Count: &count} + uploadPagesOptions := UploadPagesOptions{PageRange: &HttpRange{offset, count}} _, err := pbClient.UploadPages(ctx, r, &uploadPagesOptions) c.Assert(err, chk.Not(chk.IsNil)) } @@ -740,7 +743,7 @@ func (s *aztestsSuite) TestBlobPutPagesEmptyBody(c *chk.C) { r := bytes.NewReader([]byte{}) offset, count := int64(0), int64(0) - uploadPagesOptions := UploadPagesOptions{Offset: &offset, Count: &count} + uploadPagesOptions := UploadPagesOptions{PageRange: &HttpRange{offset, count}} _, err := pbClient.UploadPages(ctx, r, &uploadPagesOptions) c.Assert(err, chk.NotNil) } @@ -753,7 +756,7 @@ func (s *aztestsSuite) TestBlobPutPagesNonExistentBlob(c *chk.C) { r := getReaderToRandomBytes(PageBlobPageBytes) offset, count := int64(0), int64(PageBlobPageBytes) - uploadPagesOptions := UploadPagesOptions{Offset: &offset, Count: &count} + uploadPagesOptions := UploadPagesOptions{PageRange: &HttpRange{offset, count}} _, err := pbClient.UploadPages(ctx, r, &uploadPagesOptions) c.Assert(err, chk.NotNil) @@ -762,11 +765,13 @@ func (s *aztestsSuite) TestBlobPutPagesNonExistentBlob(c *chk.C) { func validateUploadPages(c *chk.C, pbClient PageBlobClient) { // This will only validate a single put page at 0-PageBlobPageBytes-1 - resp, err := pbClient.GetPageRanges(ctx, 0, CountToEnd, nil) + resp, err := pbClient.GetPageRanges(ctx, HttpRange{0, CountToEnd}, nil) c.Assert(err, chk.IsNil) pageListResp := resp.PageList.PageRange start, end := int64(0), int64(PageBlobPageBytes-1) - c.Assert((*pageListResp)[0], chk.DeepEquals, PageRange{Start: &start, End: &end}) + rawStart, rawEnd := (*pageListResp)[0].Raw() + c.Assert(rawStart, chk.Equals, start) + c.Assert(rawEnd, chk.Equals, end) } func (s *aztestsSuite) TestBlobPutPagesIfModifiedSinceTrue(c *chk.C) { @@ -780,8 +785,7 @@ func (s *aztestsSuite) TestBlobPutPagesIfModifiedSinceTrue(c *chk.C) { r := getReaderToRandomBytes(PageBlobPageBytes) offset, count := int64(0), int64(PageBlobPageBytes) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ IfModifiedSince: ¤tTime, @@ -804,8 +808,7 @@ func (s *aztestsSuite) TestBlobPutPagesIfModifiedSinceFalse(c *chk.C) { r := getReaderToRandomBytes(PageBlobPageBytes) offset, count := int64(0), int64(PageBlobPageBytes) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ IfModifiedSince: ¤tTime, @@ -829,8 +832,7 @@ func (s *aztestsSuite) TestBlobPutPagesIfUnmodifiedSinceTrue(c *chk.C) { r := getReaderToRandomBytes(PageBlobPageBytes) offset, count := int64(0), int64(PageBlobPageBytes) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ IfUnmodifiedSince: ¤tTime, @@ -854,8 +856,7 @@ func (s *aztestsSuite) TestBlobPutPagesIfUnmodifiedSinceFalse(c *chk.C) { r := getReaderToRandomBytes(PageBlobPageBytes) offset, count := int64(0), int64(PageBlobPageBytes) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ IfUnmodifiedSince: ¤tTime, @@ -879,8 +880,7 @@ func (s *aztestsSuite) TestBlobPutPagesIfMatchTrue(c *chk.C) { r := getReaderToRandomBytes(PageBlobPageBytes) offset, count := int64(0), int64(PageBlobPageBytes) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ IfMatch: resp.ETag, @@ -903,8 +903,7 @@ func (s *aztestsSuite) TestBlobPutPagesIfMatchFalse(c *chk.C) { offset, count := int64(0), int64(PageBlobPageBytes) eTag := "garbage" uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ IfMatch: &eTag, @@ -927,8 +926,7 @@ func (s *aztestsSuite) TestBlobPutPagesIfNoneMatchTrue(c *chk.C) { offset, count := int64(0), int64(PageBlobPageBytes) eTag := "garbage" uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ IfNoneMatch: &eTag, @@ -952,8 +950,7 @@ func (s *aztestsSuite) TestBlobPutPagesIfNoneMatchFalse(c *chk.C) { r := getReaderToRandomBytes(PageBlobPageBytes) offset, count := int64(0), int64(PageBlobPageBytes) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, BlobAccessConditions: BlobAccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{ IfNoneMatch: resp.ETag, @@ -976,8 +973,7 @@ func (s *aztestsSuite) TestBlobPutPagesIfSequenceNumberLessThanTrue(c *chk.C) { offset, count := int64(0), int64(PageBlobPageBytes) ifSequenceNumberLessThan := int64(10) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, SequenceNumberAccessConditions: &SequenceNumberAccessConditions{ IfSequenceNumberLessThan: &ifSequenceNumberLessThan, }, @@ -1007,8 +1003,7 @@ func (s *aztestsSuite) TestBlobPutPagesIfSequenceNumberLessThanFalse(c *chk.C) { offset, count := int64(0), int64(PageBlobPageBytes) ifSequenceNumberLessThan := int64(1) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, SequenceNumberAccessConditions: &SequenceNumberAccessConditions{ IfSequenceNumberLessThan: &ifSequenceNumberLessThan, }, @@ -1029,8 +1024,7 @@ func (s *aztestsSuite) TestBlobPutPagesIfSequenceNumberLessThanNegOne(c *chk.C) offset, count := int64(0), int64(PageBlobPageBytes) ifSequenceNumberLessThanOrEqualTo := int64(-1) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, SequenceNumberAccessConditions: &SequenceNumberAccessConditions{ IfSequenceNumberLessThanOrEqualTo: &ifSequenceNumberLessThanOrEqualTo, }, @@ -1060,8 +1054,7 @@ func (s *aztestsSuite) TestBlobPutPagesIfSequenceNumberLTETrue(c *chk.C) { offset, count := int64(0), int64(PageBlobPageBytes) ifSequenceNumberLessThanOrEqualTo := int64(1) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, SequenceNumberAccessConditions: &SequenceNumberAccessConditions{ IfSequenceNumberLessThanOrEqualTo: &ifSequenceNumberLessThanOrEqualTo, }, @@ -1091,8 +1084,7 @@ func (s *aztestsSuite) TestBlobPutPagesIfSequenceNumberLTEqualFalse(c *chk.C) { offset, count := int64(0), int64(PageBlobPageBytes) ifSequenceNumberLessThanOrEqualTo := int64(1) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, SequenceNumberAccessConditions: &SequenceNumberAccessConditions{ IfSequenceNumberLessThanOrEqualTo: &ifSequenceNumberLessThanOrEqualTo, }, @@ -1113,8 +1105,7 @@ func (s *aztestsSuite) TestBlobPutPagesIfSequenceNumberLTENegOne(c *chk.C) { offset, count := int64(0), int64(PageBlobPageBytes) ifSequenceNumberLessThanOrEqualTo := int64(-1) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, SequenceNumberAccessConditions: &SequenceNumberAccessConditions{ IfSequenceNumberLessThanOrEqualTo: &ifSequenceNumberLessThanOrEqualTo, }, @@ -1144,8 +1135,7 @@ func (s *aztestsSuite) TestBlobPutPagesIfSequenceNumberEqualTrue(c *chk.C) { offset, count := int64(0), int64(PageBlobPageBytes) ifSequenceNumberEqualTo := int64(1) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, SequenceNumberAccessConditions: &SequenceNumberAccessConditions{ IfSequenceNumberEqualTo: &ifSequenceNumberEqualTo, }, @@ -1166,8 +1156,7 @@ func (s *aztestsSuite) TestBlobPutPagesIfSequenceNumberEqualFalse(c *chk.C) { offset, count := int64(0), int64(PageBlobPageBytes) ifSequenceNumberEqualTo := int64(1) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, SequenceNumberAccessConditions: &SequenceNumberAccessConditions{ IfSequenceNumberEqualTo: &ifSequenceNumberEqualTo, }, @@ -1188,8 +1177,7 @@ func (s *aztestsSuite) TestBlobPutPagesIfSequenceNumberEqualNegOne(c *chk.C) { offset, count := int64(0), int64(PageBlobPageBytes) ifSequenceNumberEqualTo := int64(-1) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, SequenceNumberAccessConditions: &SequenceNumberAccessConditions{ IfSequenceNumberEqualTo: &ifSequenceNumberEqualTo, }, @@ -1208,8 +1196,7 @@ func setupClearPagesTest(c *chk.C) (ContainerClient, PageBlobClient) { r := getReaderToRandomBytes(PageBlobPageBytes) offset, count := int64(0), int64(PageBlobPageBytes) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, } _, err := pbClient.UploadPages(ctx, r, &uploadPagesOptions) c.Assert(err, chk.IsNil) @@ -1218,7 +1205,7 @@ func setupClearPagesTest(c *chk.C) (ContainerClient, PageBlobClient) { } func validateClearPagesTest(c *chk.C, pbClient PageBlobClient) { - resp, err := pbClient.GetPageRanges(ctx, 0, 0, nil) + resp, err := pbClient.GetPageRanges(ctx, HttpRange{0, 0}, nil) c.Assert(err, chk.IsNil) pageListResp := resp.PageList.PageRange c.Assert(pageListResp, chk.IsNil) @@ -1228,7 +1215,7 @@ func (s *aztestsSuite) TestBlobClearPagesInvalidRange(c *chk.C) { containerClient, pbClient := setupClearPagesTest(c) defer deleteContainer(c, containerClient) - _, err := pbClient.ClearPages(ctx, 0, PageBlobPageBytes+1, nil) + _, err := pbClient.ClearPages(ctx, HttpRange{0, PageBlobPageBytes+1}, nil) c.Assert(err, chk.Not(chk.IsNil)) } @@ -1245,7 +1232,7 @@ func (s *aztestsSuite) TestBlobClearPagesIfModifiedSinceTrue(c *chk.C) { }, }, } - _, err := pbClient.ClearPages(ctx, 0, PageBlobPageBytes, &clearPageOptions) + _, err := pbClient.ClearPages(ctx, HttpRange{0, PageBlobPageBytes}, &clearPageOptions) c.Assert(err, chk.IsNil) validateClearPagesTest(c, pbClient) @@ -1264,7 +1251,7 @@ func (s *aztestsSuite) TestBlobClearPagesIfModifiedSinceFalse(c *chk.C) { }, }, } - _, err := pbClient.ClearPages(ctx, 0, PageBlobPageBytes, &clearPageOptions) + _, err := pbClient.ClearPages(ctx, HttpRange{0, PageBlobPageBytes}, &clearPageOptions) c.Assert(err, chk.NotNil) validateStorageError(c, err, StorageErrorCodeConditionNotMet) @@ -1283,7 +1270,7 @@ func (s *aztestsSuite) TestBlobClearPagesIfUnmodifiedSinceTrue(c *chk.C) { }, }, } - _, err := pbClient.ClearPages(ctx, 0, PageBlobPageBytes, &clearPageOptions) + _, err := pbClient.ClearPages(ctx, HttpRange{0, PageBlobPageBytes}, &clearPageOptions) c.Assert(err, chk.IsNil) validateClearPagesTest(c, pbClient) @@ -1302,7 +1289,7 @@ func (s *aztestsSuite) TestBlobClearPagesIfUnmodifiedSinceFalse(c *chk.C) { }, }, } - _, err := pbClient.ClearPages(ctx, 0, PageBlobPageBytes, &clearPageOptions) + _, err := pbClient.ClearPages(ctx, HttpRange{0, PageBlobPageBytes}, &clearPageOptions) c.Assert(err, chk.NotNil) validateStorageError(c, err, StorageErrorCodeConditionNotMet) @@ -1321,7 +1308,7 @@ func (s *aztestsSuite) TestBlobClearPagesIfMatchTrue(c *chk.C) { }, }, } - _, err := pbClient.ClearPages(ctx, 0, PageBlobPageBytes, &clearPageOptions) + _, err := pbClient.ClearPages(ctx, HttpRange{0, PageBlobPageBytes}, &clearPageOptions) c.Assert(err, chk.IsNil) validateClearPagesTest(c, pbClient) @@ -1339,7 +1326,7 @@ func (s *aztestsSuite) TestBlobClearPagesIfMatchFalse(c *chk.C) { }, }, } - _, err := pbClient.ClearPages(ctx, 0, PageBlobPageBytes, &clearPageOptions) + _, err := pbClient.ClearPages(ctx, HttpRange{0, PageBlobPageBytes}, &clearPageOptions) c.Assert(err, chk.NotNil) validateStorageError(c, err, StorageErrorCodeConditionNotMet) @@ -1357,7 +1344,7 @@ func (s *aztestsSuite) TestBlobClearPagesIfNoneMatchTrue(c *chk.C) { }, }, } - _, err := pbClient.ClearPages(ctx, 0, PageBlobPageBytes, &clearPageOptions) + _, err := pbClient.ClearPages(ctx, HttpRange{0, PageBlobPageBytes}, &clearPageOptions) c.Assert(err, chk.IsNil) validateClearPagesTest(c, pbClient) @@ -1376,7 +1363,7 @@ func (s *aztestsSuite) TestBlobClearPagesIfNoneMatchFalse(c *chk.C) { }, }, } - _, err := pbClient.ClearPages(ctx, 0, PageBlobPageBytes, &clearPageOptions) + _, err := pbClient.ClearPages(ctx, HttpRange{0, PageBlobPageBytes}, &clearPageOptions) c.Assert(err, chk.NotNil) validateStorageError(c, err, StorageErrorCodeConditionNotMet) @@ -1392,7 +1379,7 @@ func (s *aztestsSuite) TestBlobClearPagesIfSequenceNumberLessThanTrue(c *chk.C) IfSequenceNumberLessThan: &ifSequenceNumberLessThan, }, } - _, err := pbClient.ClearPages(ctx, 0, PageBlobPageBytes, &clearPageOptions) + _, err := pbClient.ClearPages(ctx, HttpRange{0, PageBlobPageBytes}, &clearPageOptions) c.Assert(err, chk.IsNil) validateClearPagesTest(c, pbClient) @@ -1417,7 +1404,7 @@ func (s *aztestsSuite) TestBlobClearPagesIfSequenceNumberLessThanFalse(c *chk.C) IfSequenceNumberLessThan: &ifSequenceNumberLessThan, }, } - _, err = pbClient.ClearPages(ctx, 0, PageBlobPageBytes, &clearPageOptions) + _, err = pbClient.ClearPages(ctx, HttpRange{0, PageBlobPageBytes}, &clearPageOptions) c.Assert(err, chk.NotNil) validateStorageError(c, err, StorageErrorCodeSequenceNumberConditionNotMet) @@ -1433,7 +1420,7 @@ func (s *aztestsSuite) TestBlobClearPagesIfSequenceNumberLessThanNegOne(c *chk.C IfSequenceNumberLessThan: &ifSequenceNumberLessThan, }, } - _, err := pbClient.ClearPages(ctx, 0, PageBlobPageBytes, &clearPageOptions) + _, err := pbClient.ClearPages(ctx, HttpRange{0, PageBlobPageBytes}, &clearPageOptions) c.Assert(err, chk.NotNil) validateStorageError(c, err, StorageErrorCodeInvalidInput) @@ -1449,7 +1436,7 @@ func (s *aztestsSuite) TestBlobClearPagesIfSequenceNumberLTETrue(c *chk.C) { IfSequenceNumberLessThanOrEqualTo: &ifSequenceNumberLessThanOrEqualTo, }, } - _, err := pbClient.ClearPages(ctx, 0, PageBlobPageBytes, &clearPageOptions) + _, err := pbClient.ClearPages(ctx, HttpRange{0, PageBlobPageBytes}, &clearPageOptions) c.Assert(err, chk.IsNil) validateClearPagesTest(c, pbClient) @@ -1474,7 +1461,7 @@ func (s *aztestsSuite) TestBlobClearPagesIfSequenceNumberLTEFalse(c *chk.C) { IfSequenceNumberLessThanOrEqualTo: &ifSequenceNumberLessThanOrEqualTo, }, } - _, err = pbClient.ClearPages(ctx, 0, PageBlobPageBytes, &clearPageOptions) + _, err = pbClient.ClearPages(ctx, HttpRange{0, PageBlobPageBytes}, &clearPageOptions) c.Assert(err, chk.NotNil) validateStorageError(c, err, StorageErrorCodeSequenceNumberConditionNotMet) @@ -1490,7 +1477,7 @@ func (s *aztestsSuite) TestBlobClearPagesIfSequenceNumberLTENegOne(c *chk.C) { IfSequenceNumberLessThanOrEqualTo: &ifSequenceNumberLessThanOrEqualTo, }, } - _, err := pbClient.ClearPages(ctx, 0, PageBlobPageBytes, &clearPageOptions) // This will cause the library to set the value of the header to 0 + _, err := pbClient.ClearPages(ctx, HttpRange{0, PageBlobPageBytes}, &clearPageOptions) // This will cause the library to set the value of the header to 0 c.Assert(err, chk.NotNil) validateStorageError(c, err, StorageErrorCodeInvalidInput) @@ -1515,7 +1502,7 @@ func (s *aztestsSuite) TestBlobClearPagesIfSequenceNumberEqualTrue(c *chk.C) { IfSequenceNumberEqualTo: &ifSequenceNumberEqualTo, }, } - _, err = pbClient.ClearPages(ctx, 0, PageBlobPageBytes, &clearPageOptions) + _, err = pbClient.ClearPages(ctx, HttpRange{0, PageBlobPageBytes}, &clearPageOptions) c.Assert(err, chk.IsNil) validateClearPagesTest(c, pbClient) @@ -1540,7 +1527,7 @@ func (s *aztestsSuite) TestBlobClearPagesIfSequenceNumberEqualFalse(c *chk.C) { IfSequenceNumberEqualTo: &ifSequenceNumberEqualTo, }, } - _, err = pbClient.ClearPages(ctx, 0, PageBlobPageBytes, &clearPageOptions) + _, err = pbClient.ClearPages(ctx, HttpRange{0, PageBlobPageBytes}, &clearPageOptions) c.Assert(err, chk.NotNil) validateStorageError(c, err, StorageErrorCodeSequenceNumberConditionNotMet) @@ -1556,7 +1543,7 @@ func (s *aztestsSuite) TestBlobClearPagesIfSequenceNumberEqualNegOne(c *chk.C) { IfSequenceNumberEqualTo: &ifSequenceNumberEqualTo, }, } - _, err := pbClient.ClearPages(ctx, 0, PageBlobPageBytes, &clearPageOptions) // This will cause the library to set the value of the header to 0 + _, err := pbClient.ClearPages(ctx, HttpRange{0, PageBlobPageBytes}, &clearPageOptions) // This will cause the library to set the value of the header to 0 c.Assert(err, chk.NotNil) validateStorageError(c, err, StorageErrorCodeInvalidInput) @@ -1570,8 +1557,7 @@ func setupGetPageRangesTest(c *chk.C) (containerClient ContainerClient, pbClient r := getReaderToRandomBytes(PageBlobPageBytes) offset, count := int64(0), int64(PageBlobPageBytes) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, } _, err := pbClient.UploadPages(ctx, r, &uploadPagesOptions) c.Assert(err, chk.IsNil) @@ -1584,7 +1570,9 @@ func validateBasicGetPageRanges(c *chk.C, resp *PageList, err error) { c.Assert(resp.PageRange, chk.NotNil) c.Assert(*resp.PageRange, chk.HasLen, 1) start, end := int64(0), int64(PageBlobPageBytes-1) - c.Assert((*resp.PageRange)[0], chk.DeepEquals, PageRange{Start: &start, End: &end}) + rawStart, rawEnd := (*resp.PageRange)[0].Raw() + c.Assert(rawStart, chk.Equals, start) + c.Assert(rawEnd, chk.Equals, end) } func (s *aztestsSuite) TestBlobGetPageRangesEmptyBlob(c *chk.C) { @@ -1593,7 +1581,7 @@ func (s *aztestsSuite) TestBlobGetPageRangesEmptyBlob(c *chk.C) { defer deleteContainer(c, containerClient) pbClient, _ := createNewPageBlob(c, containerClient) - resp, err := pbClient.GetPageRanges(ctx, 0, 0, nil) + resp, err := pbClient.GetPageRanges(ctx, HttpRange{0, 0}, nil) c.Assert(err, chk.IsNil) c.Assert(resp.PageList.PageRange, chk.IsNil) } @@ -1602,7 +1590,7 @@ func (s *aztestsSuite) TestBlobGetPageRangesEmptyRange(c *chk.C) { containerClient, pbClient := setupGetPageRangesTest(c) defer deleteContainer(c, containerClient) - resp, err := pbClient.GetPageRanges(ctx, 0, 0, nil) + resp, err := pbClient.GetPageRanges(ctx, HttpRange{0, 0}, nil) c.Assert(err, chk.IsNil) validateBasicGetPageRanges(c, resp.PageList, err) } @@ -1611,7 +1599,7 @@ func (s *aztestsSuite) TestBlobGetPageRangesInvalidRange(c *chk.C) { containerClient, pbClient := setupGetPageRangesTest(c) defer deleteContainer(c, containerClient) - _, err := pbClient.GetPageRanges(ctx, -2, 500, nil) + _, err := pbClient.GetPageRanges(ctx, HttpRange{-2, 500}, nil) c.Assert(err, chk.IsNil) } @@ -1622,28 +1610,33 @@ func (s *aztestsSuite) TestBlobGetPageRangesNonContiguousRanges(c *chk.C) { r := getReaderToRandomBytes(PageBlobPageBytes) offset, count := int64(2*PageBlobPageBytes), int64(PageBlobPageBytes) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, } _, err := pbClient.UploadPages(ctx, r, &uploadPagesOptions) c.Assert(err, chk.IsNil) - resp, err := pbClient.GetPageRanges(ctx, 0, 0, nil) + resp, err := pbClient.GetPageRanges(ctx, HttpRange{0, 0}, nil) c.Assert(err, chk.IsNil) pageListResp := resp.PageList.PageRange c.Assert(pageListResp, chk.NotNil) c.Assert(*pageListResp, chk.HasLen, 2) + start, end := int64(0), int64(PageBlobPageBytes-1) - c.Assert((*pageListResp)[0], chk.DeepEquals, PageRange{Start: &start, End: &end}) + rawStart, rawEnd := (*pageListResp)[0].Raw() + c.Assert(rawStart, chk.Equals, start) + c.Assert(rawEnd, chk.Equals, end) + start, end = int64(PageBlobPageBytes*2), int64((PageBlobPageBytes*3)-1) - c.Assert((*pageListResp)[1], chk.DeepEquals, PageRange{Start: &start, End: &end}) + rawStart, rawEnd = (*pageListResp)[1].Raw() + c.Assert(rawStart, chk.Equals, start) + c.Assert(rawEnd, chk.Equals, end) } func (s *aztestsSuite) TestBlobGetPageRangesNotPageAligned(c *chk.C) { containerClient, pbClient := setupGetPageRangesTest(c) defer deleteContainer(c, containerClient) - resp, err := pbClient.GetPageRanges(ctx, 0, 2000, nil) + resp, err := pbClient.GetPageRanges(ctx, HttpRange{0, 2000}, nil) c.Assert(err, chk.IsNil) validateBasicGetPageRanges(c, resp.PageList, err) } @@ -1657,7 +1650,7 @@ func (s *aztestsSuite) TestBlobGetPageRangesSnapshot(c *chk.C) { c.Assert(resp.Snapshot, chk.NotNil) snapshotURL := pbClient.WithSnapshot(*resp.Snapshot) - resp2, err := snapshotURL.GetPageRanges(ctx, 0, 0, nil) + resp2, err := snapshotURL.GetPageRanges(ctx, HttpRange{0, 0}, nil) c.Assert(err, chk.IsNil) validateBasicGetPageRanges(c, resp2.PageList, err) } @@ -1675,7 +1668,7 @@ func (s *aztestsSuite) TestBlobGetPageRangesIfModifiedSinceTrue(c *chk.C) { }, }, } - resp, err := pbClient.GetPageRanges(ctx, 0, 0, &getPageRangesOptions) + resp, err := pbClient.GetPageRanges(ctx, HttpRange{0, 0}, &getPageRangesOptions) c.Assert(err, chk.IsNil) validateBasicGetPageRanges(c, resp.PageList, err) } @@ -1693,7 +1686,7 @@ func (s *aztestsSuite) TestBlobGetPageRangesIfModifiedSinceFalse(c *chk.C) { }, }, } - _, err := pbClient.GetPageRanges(ctx, 0, 0, &getPageRangesOptions) + _, err := pbClient.GetPageRanges(ctx, HttpRange{0, 0}, &getPageRangesOptions) c.Assert(err, chk.NotNil) //serr := err.(StorageError) @@ -1713,7 +1706,7 @@ func (s *aztestsSuite) TestBlobGetPageRangesIfUnmodifiedSinceTrue(c *chk.C) { }, }, } - resp, err := pbClient.GetPageRanges(ctx, 0, 0, &getPageRangesOptions) + resp, err := pbClient.GetPageRanges(ctx, HttpRange{0, 0}, &getPageRangesOptions) c.Assert(err, chk.IsNil) validateBasicGetPageRanges(c, resp.PageList, err) } @@ -1731,7 +1724,7 @@ func (s *aztestsSuite) TestBlobGetPageRangesIfUnmodifiedSinceFalse(c *chk.C) { }, }, } - _, err := pbClient.GetPageRanges(ctx, 0, 0, &getPageRangesOptions) + _, err := pbClient.GetPageRanges(ctx, HttpRange{0, 0}, &getPageRangesOptions) c.Assert(err, chk.NotNil) validateStorageError(c, err, StorageErrorCodeConditionNotMet) @@ -1751,7 +1744,7 @@ func (s *aztestsSuite) TestBlobGetPageRangesIfMatchTrue(c *chk.C) { }, }, } - resp2, err := pbClient.GetPageRanges(ctx, 0, 0, &getPageRangesOptions) + resp2, err := pbClient.GetPageRanges(ctx, HttpRange{0, 0}, &getPageRangesOptions) c.Assert(err, chk.IsNil) validateBasicGetPageRanges(c, resp2.PageList, err) } @@ -1768,7 +1761,7 @@ func (s *aztestsSuite) TestBlobGetPageRangesIfMatchFalse(c *chk.C) { }, }, } - _, err := pbClient.GetPageRanges(ctx, 0, 0, &getPageRangesOptions) + _, err := pbClient.GetPageRanges(ctx, HttpRange{0, 0}, &getPageRangesOptions) c.Assert(err, chk.NotNil) validateStorageError(c, err, StorageErrorCodeConditionNotMet) @@ -1786,7 +1779,7 @@ func (s *aztestsSuite) TestBlobGetPageRangesIfNoneMatchTrue(c *chk.C) { }, }, } - resp, err := pbClient.GetPageRanges(ctx, 0, 0, &getPageRangesOptions) + resp, err := pbClient.GetPageRanges(ctx, HttpRange{0, 0}, &getPageRangesOptions) c.Assert(err, chk.IsNil) validateBasicGetPageRanges(c, resp.PageList, err) } @@ -1804,7 +1797,7 @@ func (s *aztestsSuite) TestBlobGetPageRangesIfNoneMatchFalse(c *chk.C) { }, }, } - _, err := pbClient.GetPageRanges(ctx, 0, 0, &getPageRangesOptions) + _, err := pbClient.GetPageRanges(ctx, HttpRange{0, 0}, &getPageRangesOptions) c.Assert(err, chk.NotNil) //serr := err.(StorageError) //c.Assert(serr.RawResponse.StatusCode, chk.Equals, 304) // Service Code not returned in the body for a HEAD @@ -1818,8 +1811,7 @@ func setupDiffPageRangesTest(c *chk.C) (containerClient ContainerClient, pbClien r := getReaderToRandomBytes(PageBlobPageBytes) offset, count := int64(0), int64(PageBlobPageBytes) uploadPagesOptions := UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, } _, err := pbClient.UploadPages(ctx, r, &uploadPagesOptions) c.Assert(err, chk.IsNil) @@ -1831,8 +1823,7 @@ func setupDiffPageRangesTest(c *chk.C) (containerClient ContainerClient, pbClien r = getReaderToRandomBytes(PageBlobPageBytes) offset, count = int64(0), int64(PageBlobPageBytes) uploadPagesOptions = UploadPagesOptions{ - Offset: &offset, - Count: &count, + PageRange: &HttpRange{offset, count}, } _, err = pbClient.UploadPages(ctx, r, &uploadPagesOptions) c.Assert(err, chk.IsNil) @@ -1845,7 +1836,9 @@ func validateDiffPageRanges(c *chk.C, resp *PageList, err error) { c.Assert(pageListResp, chk.NotNil) c.Assert(*resp.PageRange, chk.HasLen, 1) start, end := int64(0), int64(PageBlobPageBytes-1) - c.Assert((*pageListResp)[0], chk.DeepEquals, PageRange{Start: &start, End: &end}) + rawStart, rawEnd := (*pageListResp)[0].Raw() + c.Assert(rawStart, chk.DeepEquals, start) + c.Assert(rawEnd, chk.DeepEquals, end) } func (s *aztestsSuite) TestBlobDiffPageRangesNonExistentSnapshot(c *chk.C) { @@ -1854,7 +1847,7 @@ func (s *aztestsSuite) TestBlobDiffPageRangesNonExistentSnapshot(c *chk.C) { snapshotTime, _ := time.Parse(SnapshotTimeFormat, snapshot) snapshotTime = snapshotTime.Add(time.Minute) - _, err := pbClient.GetPageRangesDiff(ctx, 0, 0, snapshotTime.Format(SnapshotTimeFormat), nil) + _, err := pbClient.GetPageRangesDiff(ctx, HttpRange{0, 0}, snapshotTime.Format(SnapshotTimeFormat), nil) c.Assert(err, chk.NotNil) validateStorageError(c, err, StorageErrorCodePreviousSnapshotNotFound) @@ -1863,7 +1856,7 @@ func (s *aztestsSuite) TestBlobDiffPageRangesNonExistentSnapshot(c *chk.C) { func (s *aztestsSuite) TestBlobDiffPageRangeInvalidRange(c *chk.C) { containerClient, pbClient, snapshot := setupDiffPageRangesTest(c) defer deleteContainer(c, containerClient) - _, err := pbClient.GetPageRangesDiff(ctx, -22, 14, snapshot, nil) + _, err := pbClient.GetPageRangesDiff(ctx, HttpRange{-22, 14}, snapshot, nil) c.Assert(err, chk.IsNil) } @@ -1880,7 +1873,7 @@ func (s *aztestsSuite) TestBlobDiffPageRangeIfModifiedSinceTrue(c *chk.C) { }, }, } - resp, err := pbClient.GetPageRangesDiff(ctx, 0, 0, snapshot, &getPageRangesOptions) + resp, err := pbClient.GetPageRangesDiff(ctx, HttpRange{0, 0}, snapshot, &getPageRangesOptions) c.Assert(err, chk.IsNil) validateDiffPageRanges(c, resp.PageList, err) } @@ -1898,7 +1891,7 @@ func (s *aztestsSuite) TestBlobDiffPageRangeIfModifiedSinceFalse(c *chk.C) { }, }, } - _, err := pbClient.GetPageRangesDiff(ctx, 0, 0, snapshot, &getPageRangesOptions) + _, err := pbClient.GetPageRangesDiff(ctx, HttpRange{0, 0}, snapshot, &getPageRangesOptions) c.Assert(err, chk.NotNil) //stgErr := err.(StorageError) @@ -1918,7 +1911,7 @@ func (s *aztestsSuite) TestBlobDiffPageRangeIfUnmodifiedSinceTrue(c *chk.C) { }, }, } - resp, err := pbClient.GetPageRangesDiff(ctx, 0, 0, snapshot, &getPageRangesOptions) + resp, err := pbClient.GetPageRangesDiff(ctx, HttpRange{0, 0}, snapshot, &getPageRangesOptions) c.Assert(err, chk.IsNil) validateDiffPageRanges(c, resp.PageList, err) } @@ -1936,7 +1929,7 @@ func (s *aztestsSuite) TestBlobDiffPageRangeIfUnmodifiedSinceFalse(c *chk.C) { }, }, } - _, err := pbClient.GetPageRangesDiff(ctx, 0, 0, snapshot, &getPageRangesOptions) + _, err := pbClient.GetPageRangesDiff(ctx, HttpRange{0, 0}, snapshot, &getPageRangesOptions) c.Assert(err, chk.NotNil) validateStorageError(c, err, StorageErrorCodeConditionNotMet) @@ -1955,7 +1948,7 @@ func (s *aztestsSuite) TestBlobDiffPageRangeIfMatchTrue(c *chk.C) { }, }, } - resp2, err := pbClient.GetPageRangesDiff(ctx, 0, 0, snapshot, &getPageRangesOptions) + resp2, err := pbClient.GetPageRangesDiff(ctx, HttpRange{0, 0}, snapshot, &getPageRangesOptions) c.Assert(err, chk.IsNil) validateDiffPageRanges(c, resp2.PageList, err) } @@ -1972,7 +1965,7 @@ func (s *aztestsSuite) TestBlobDiffPageRangeIfMatchFalse(c *chk.C) { }, }, } - _, err := pbClient.GetPageRangesDiff(ctx, 0, 0, snapshot, &getPageRangesOptions) + _, err := pbClient.GetPageRangesDiff(ctx, HttpRange{0, 0}, snapshot, &getPageRangesOptions) c.Assert(err, chk.NotNil) validateStorageError(c, err, StorageErrorCodeConditionNotMet) @@ -1990,7 +1983,7 @@ func (s *aztestsSuite) TestBlobDiffPageRangeIfNoneMatchTrue(c *chk.C) { }, }, } - resp, err := pbClient.GetPageRangesDiff(ctx, 0, 0, snapshot, &getPageRangesOptions) + resp, err := pbClient.GetPageRangesDiff(ctx, HttpRange{0, 0}, snapshot, &getPageRangesOptions) c.Assert(err, chk.IsNil) validateDiffPageRanges(c, resp.PageList, err) } @@ -2008,7 +2001,7 @@ func (s *aztestsSuite) TestBlobDiffPageRangeIfNoneMatchFalse(c *chk.C) { }, }, } - _, err := pbClient.GetPageRangesDiff(ctx, 0, 0, snapshot, &getPageRangesOptions) + _, err := pbClient.GetPageRangesDiff(ctx, HttpRange{0, 0}, snapshot, &getPageRangesOptions) c.Assert(err, chk.NotNil) //serr := err.(StorageError) diff --git a/sdk/storage/azblob/zt_sas_blob_snapshot_test.go b/sdk/storage/azblob/zt_sas_blob_snapshot_test.go index d507295b22c8..ef7b8292f3d4 100644 --- a/sdk/storage/azblob/zt_sas_blob_snapshot_test.go +++ b/sdk/storage/azblob/zt_sas_blob_snapshot_test.go @@ -8,6 +8,7 @@ import ( "strings" "time" + "github.com/Azure/azure-sdk-for-go/sdk/azcore" chk "gopkg.in/check.v1" ) @@ -29,7 +30,7 @@ func (s *aztestsSuite) TestSnapshotSAS(c *chk.C) { contentType := "text/plain" uploadBlockBlobOptions := UploadBlockBlobOptions{ - BlobHttpHeaders: &BlobHttpHeaders{ + BlobHTTPHeaders: &BlobHTTPHeaders{ BlobContentType: &contentType, }, } @@ -76,7 +77,7 @@ func (s *aztestsSuite) TestSnapshotSAS(c *chk.C) { //Attach SAS query to block blob URL snapParts := NewBlobURLParts(blobURL.URL()) snapParts.SAS = snapSASQueryParams - sbUrl, err := NewBlockBlobClient(snapParts.URL(), NewAnonymousCredential(), nil) + sbUrl, err := NewBlockBlobClient(snapParts.URL(), azcore.AnonymousCredential(), nil) //Test the snapshot downloadResponse, err := sbUrl.Download(ctx, nil) @@ -101,7 +102,7 @@ func (s *aztestsSuite) TestSnapshotSAS(c *chk.C) { //If this succeeds, it means a normal SAS token was created. uploadBlockBlobOptions1 := UploadBlockBlobOptions{ - BlobHttpHeaders: &BlobHttpHeaders{ + BlobHTTPHeaders: &BlobHTTPHeaders{ BlobContentType: &contentType, }, } @@ -113,7 +114,7 @@ func (s *aztestsSuite) TestSnapshotSAS(c *chk.C) { fsbUrlParts := NewBlobURLParts(fsbUrl.URL()) fsbUrlParts.SAS = snapSASQueryParams - fsbUrl, err = NewBlockBlobClient(fsbUrlParts.URL(), NewAnonymousCredential(), nil) //re-use fsbUrl as we don't need the sharedkey version anymore + fsbUrl, err = NewBlockBlobClient(fsbUrlParts.URL(), azcore.AnonymousCredential(), nil) //re-use fsbUrl as we don't need the sharedkey version anymore resp, err := fsbUrl.Delete(ctx, nil) if err == nil { diff --git a/sdk/storage/azblob/zt_service_client_test.go b/sdk/storage/azblob/zt_service_client_test.go index eb46db7f8744..8eb81929722e 100644 --- a/sdk/storage/azblob/zt_service_client_test.go +++ b/sdk/storage/azblob/zt_service_client_test.go @@ -72,7 +72,16 @@ func (s *aztestsSuite) TestListContainersBasic(c *chk.C) { c.Assert(*container.Properties.LeaseState, chk.Equals, LeaseStateTypeAvailable) c.Assert(container.Properties.LeaseDuration, chk.IsNil) c.Assert(container.Properties.PublicAccess, chk.IsNil) - c.Assert(container.Metadata, chk.DeepEquals, &md) + c.Assert(container.Metadata, chk.NotNil) + + unwrappedMeta := map[string]string{} + for k,v := range *container.Metadata { + if v != nil { + unwrappedMeta[k] = *v + } + } + + c.Assert(unwrappedMeta, chk.DeepEquals, md) } } } @@ -125,7 +134,11 @@ func (s *aztestsSuite) TestListContainersPaged(c *chk.C) { for pager.NextPage(ctx) { for _, container := range *pager.PageResponse().EnumerationResults.ContainerItems { - results = append(results, container) + if container == nil { + continue + } + + results = append(results, *container) count += 1 c.Assert(container.Name, chk.NotNil) } diff --git a/sdk/storage/azblob/zt_test.go b/sdk/storage/azblob/zt_test.go index f30662c5c571..9ee19a4bb9fb 100644 --- a/sdk/storage/azblob/zt_test.go +++ b/sdk/storage/azblob/zt_test.go @@ -64,16 +64,16 @@ var ( blobContentEncoding string = "my_encoding" ) -var basicHeaders = BlobHttpHeaders{ +var basicHeaders = BlobHTTPHeaders{ BlobContentType: &blobContentType, BlobContentDisposition: &blobContentDisposition, BlobCacheControl: &blobCacheControl, - BlobContentMd5: nil, + BlobContentMD5: nil, BlobContentLanguage: &blobContentLanguage, BlobContentEncoding: &blobContentEncoding, } -var basicMetadata = map[string]string{"foo": "bar"} +var basicMetadata = map[string]string{"Foo": "bar"} var basicBlobTagsMap = map[string]string{ "azure": "blob", @@ -381,17 +381,21 @@ func blockIDIntToBase64(blockID int) string { return base64.StdEncoding.EncodeToString(binaryBlockID) } +// TODO: Figure out in which scenario, the parsing will fail. func validateStorageError(c *chk.C, err error, code StorageErrorCode) { - storageError, _ := err.(*StorageError) + c.Assert(err, chk.NotNil) + var storageError *StorageError + c.Assert(errors.As(err, &storageError), chk.Equals, true) + c.Assert(storageError.ErrorCode, chk.Equals, code) } func blobListToMap(list []string) map[string]bool { out := make(map[string]bool) - for _,v := range list { + for _, v := range list { out[v] = true } return out -} \ No newline at end of file +} diff --git a/sdk/storage/azblob/zt_user_delegation_sas_test.go b/sdk/storage/azblob/zt_user_delegation_sas_test.go index 2e054c0bbec1..aae5360164d2 100644 --- a/sdk/storage/azblob/zt_user_delegation_sas_test.go +++ b/sdk/storage/azblob/zt_user_delegation_sas_test.go @@ -20,8 +20,8 @@ func (s *aztestsSuite) TestUserDelegationSASContainer(c *chk.C) { currentTime := time.Now().UTC() // Ensuring currTime <= time of sending delegating request request keyInfo := KeyInfo{ - Start: to.StringPtr(currentTime.Format(SASTimeFormat)), - Expiry: to.StringPtr(currentTime.Add(48*time.Hour).Format(SASTimeFormat)), + Start: to.StringPtr(currentTime.Format(SASTimeFormat)), + Expiry: to.StringPtr(currentTime.Add(48 * time.Hour).Format(SASTimeFormat)), } time.Sleep(2 * time.Second) @@ -54,7 +54,7 @@ func (s *aztestsSuite) TestUserDelegationSASContainer(c *chk.C) { // Craft a container URL w/ container UDK SAS cURL := NewBlobURLParts(containerClient.URL()) cURL.SAS = cSAS - cSASURL, err := NewContainerClient(cURL.URL(), NewAnonymousCredential(), nil) + cSASURL, err := NewContainerClient(cURL.URL(), azcore.AnonymousCredential(), nil) bblob := cSASURL.NewBlockBlobClient("test") _, err = bblob.Upload(ctx, strings.NewReader("hello world!"), nil) @@ -103,7 +103,7 @@ func (s *aztestsSuite) TestUserDelegationSASBlob(c *chk.C) { } // Prepare user delegation key - keyInfo := KeyInfo{Start: to.StringPtr(currentTime.String()), Expiry: to.StringPtr(currentTime.Add(48*time.Hour).String())} + keyInfo := KeyInfo{Start: to.StringPtr(currentTime.String()), Expiry: to.StringPtr(currentTime.Add(48 * time.Hour).String())} cudk, err := serviceClient.GetUserDelegationCredential(ctx, keyInfo) c.Assert(err, chk.IsNil) c.Assert(cudk, chk.NotNil) diff --git a/sdk/storage/azblob/zz_generated_appendblob.go b/sdk/storage/azblob/zz_generated_appendblob_client.go similarity index 71% rename from sdk/storage/azblob/zz_generated_appendblob.go rename to sdk/storage/azblob/zz_generated_appendblob_client.go index c27dd879b4d1..734622e21529 100644 --- a/sdk/storage/azblob/zz_generated_appendblob.go +++ b/sdk/storage/azblob/zz_generated_appendblob_client.go @@ -10,67 +10,56 @@ package azblob import ( "context" "encoding/base64" + "github.com/Azure/azure-sdk-for-go/sdk/azcore" "net/http" - "net/url" "strconv" "time" - - "github.com/Azure/azure-sdk-for-go/sdk/azcore" ) type appendBlobClient struct { con *connection } -// Pipeline returns the pipeline associated with this client. -func (client appendBlobClient) Pipeline() azcore.Pipeline { - return client.con.Pipeline() -} - // AppendBlock - The Append Block operation commits a new block of data to the end of an existing append blob. The Append Block operation is permitted only // if the blob was created with x-ms-blob-type set to // AppendBlob. Append Block is supported only on version 2015-02-21 version or later. -func (client appendBlobClient) AppendBlock(ctx context.Context, contentLength int64, body azcore.ReadSeekCloser, appendBlobAppendBlockOptions *AppendBlobAppendBlockOptions, leaseAccessConditions *LeaseAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (AppendBlobAppendBlockResponse, error) { +func (client *appendBlobClient) AppendBlock(ctx context.Context, contentLength int64, body azcore.ReadSeekCloser, appendBlobAppendBlockOptions *AppendBlobAppendBlockOptions, leaseAccessConditions *LeaseAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (AppendBlobAppendBlockResponse, error) { req, err := client.appendBlockCreateRequest(ctx, contentLength, body, appendBlobAppendBlockOptions, leaseAccessConditions, appendPositionAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) if err != nil { return AppendBlobAppendBlockResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return AppendBlobAppendBlockResponse{}, err } if !resp.HasStatusCode(http.StatusCreated) { return AppendBlobAppendBlockResponse{}, client.appendBlockHandleError(resp) } - result, err := client.appendBlockHandleResponse(resp) - if err != nil { - return AppendBlobAppendBlockResponse{}, err - } - return result, nil + return client.appendBlockHandleResponse(resp) } // appendBlockCreateRequest creates the AppendBlock request. -func (client appendBlobClient) appendBlockCreateRequest(ctx context.Context, contentLength int64, body azcore.ReadSeekCloser, appendBlobAppendBlockOptions *AppendBlobAppendBlockOptions, leaseAccessConditions *LeaseAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *appendBlobClient) appendBlockCreateRequest(ctx context.Context, contentLength int64, body azcore.ReadSeekCloser, appendBlobAppendBlockOptions *AppendBlobAppendBlockOptions, leaseAccessConditions *LeaseAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "appendblock") + reqQP := req.URL.Query() + reqQP.Set("comp", "appendblock") if appendBlobAppendBlockOptions != nil && appendBlobAppendBlockOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*appendBlobAppendBlockOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*appendBlobAppendBlockOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if appendBlobAppendBlockOptions != nil && appendBlobAppendBlockOptions.TransactionalContentMd5 != nil { - req.Header.Set("Content-MD5", base64.StdEncoding.EncodeToString(*appendBlobAppendBlockOptions.TransactionalContentMd5)) + if appendBlobAppendBlockOptions != nil && appendBlobAppendBlockOptions.TransactionalContentMD5 != nil { + req.Header.Set("Content-MD5", base64.StdEncoding.EncodeToString(*appendBlobAppendBlockOptions.TransactionalContentMD5)) } - if appendBlobAppendBlockOptions != nil && appendBlobAppendBlockOptions.TransactionalContentCrc64 != nil { - req.Header.Set("x-ms-content-crc64", base64.StdEncoding.EncodeToString(*appendBlobAppendBlockOptions.TransactionalContentCrc64)) + if appendBlobAppendBlockOptions != nil && appendBlobAppendBlockOptions.TransactionalContentCRC64 != nil { + req.Header.Set("x-ms-content-crc64", base64.StdEncoding.EncodeToString(*appendBlobAppendBlockOptions.TransactionalContentCRC64)) } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if appendPositionAccessConditions != nil && appendPositionAccessConditions.MaxSize != nil { req.Header.Set("x-ms-blob-condition-maxsize", strconv.FormatInt(*appendPositionAccessConditions.MaxSize, 10)) @@ -81,8 +70,8 @@ func (client appendBlobClient) appendBlockCreateRequest(ctx context.Context, con if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Header.Set("x-ms-encryption-key", *cpkInfo.EncryptionKey) } - if cpkInfo != nil && cpkInfo.EncryptionKeySha256 != nil { - req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySha256) + if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { + req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySHA256) } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Header.Set("x-ms-encryption-algorithm", "AES256") @@ -106,15 +95,15 @@ func (client appendBlobClient) appendBlockCreateRequest(ctx context.Context, con req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } req.Header.Set("x-ms-version", "2019-12-12") - if appendBlobAppendBlockOptions != nil && appendBlobAppendBlockOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *appendBlobAppendBlockOptions.RequestId) + if appendBlobAppendBlockOptions != nil && appendBlobAppendBlockOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *appendBlobAppendBlockOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, req.SetBody(body, "application/octet-stream") } // appendBlockHandleResponse handles the AppendBlock response. -func (client appendBlobClient) appendBlockHandleResponse(resp *azcore.Response) (AppendBlobAppendBlockResponse, error) { +func (client *appendBlobClient) appendBlockHandleResponse(resp *azcore.Response) (AppendBlobAppendBlockResponse, error) { result := AppendBlobAppendBlockResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -127,18 +116,18 @@ func (client appendBlobClient) appendBlockHandleResponse(resp *azcore.Response) result.LastModified = &lastModified } if val := resp.Header.Get("Content-MD5"); val != "" { - contentMd5, err := base64.StdEncoding.DecodeString(val) + contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return AppendBlobAppendBlockResponse{}, err } - result.ContentMD5 = &contentMd5 + result.ContentMD5 = &contentMD5 } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { - contentCrc64, err := base64.StdEncoding.DecodeString(val) + xMSContentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return AppendBlobAppendBlockResponse{}, err } - result.ContentCRC64 = &contentCrc64 + result.XMSContentCRC64 = &xMSContentCRC64 } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val @@ -184,8 +173,8 @@ func (client appendBlobClient) appendBlockHandleResponse(resp *azcore.Response) } // appendBlockHandleError handles the AppendBlock error response. -func (client appendBlobClient) appendBlockHandleError(resp *azcore.Response) error { - var err StorageError +func (client *appendBlobClient) appendBlockHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -195,57 +184,53 @@ func (client appendBlobClient) appendBlockHandleError(resp *azcore.Response) err // AppendBlockFromURL - The Append Block operation commits a new block of data to the end of an existing append blob where the contents are read from a // source url. The Append Block operation is permitted only if the blob was // created with x-ms-blob-type set to AppendBlob. Append Block is supported only on version 2015-02-21 version or later. -func (client appendBlobClient) AppendBlockFromURL(ctx context.Context, sourceUrl url.URL, contentLength int64, appendBlobAppendBlockFromUrlOptions *AppendBlobAppendBlockFromURLOptions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, leaseAccessConditions *LeaseAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (AppendBlobAppendBlockFromURLResponse, error) { - req, err := client.appendBlockFromUrlCreateRequest(ctx, sourceUrl, contentLength, appendBlobAppendBlockFromUrlOptions, cpkInfo, cpkScopeInfo, leaseAccessConditions, appendPositionAccessConditions, modifiedAccessConditions, sourceModifiedAccessConditions) +func (client *appendBlobClient) AppendBlockFromURL(ctx context.Context, sourceURL string, contentLength int64, appendBlobAppendBlockFromURLOptions *AppendBlobAppendBlockFromURLOptions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, leaseAccessConditions *LeaseAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (AppendBlobAppendBlockFromURLResponse, error) { + req, err := client.appendBlockFromURLCreateRequest(ctx, sourceURL, contentLength, appendBlobAppendBlockFromURLOptions, cpkInfo, cpkScopeInfo, leaseAccessConditions, appendPositionAccessConditions, modifiedAccessConditions, sourceModifiedAccessConditions) if err != nil { return AppendBlobAppendBlockFromURLResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return AppendBlobAppendBlockFromURLResponse{}, err } if !resp.HasStatusCode(http.StatusCreated) { - return AppendBlobAppendBlockFromURLResponse{}, client.appendBlockFromUrlHandleError(resp) - } - result, err := client.appendBlockFromUrlHandleResponse(resp) - if err != nil { - return AppendBlobAppendBlockFromURLResponse{}, err + return AppendBlobAppendBlockFromURLResponse{}, client.appendBlockFromURLHandleError(resp) } - return result, nil + return client.appendBlockFromURLHandleResponse(resp) } -// appendBlockFromUrlCreateRequest creates the AppendBlockFromURL request. -func (client appendBlobClient) appendBlockFromUrlCreateRequest(ctx context.Context, sourceUrl url.URL, contentLength int64, appendBlobAppendBlockFromUrlOptions *AppendBlobAppendBlockFromURLOptions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, leaseAccessConditions *LeaseAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (*azcore.Request, error) { +// appendBlockFromURLCreateRequest creates the AppendBlockFromURL request. +func (client *appendBlobClient) appendBlockFromURLCreateRequest(ctx context.Context, sourceURL string, contentLength int64, appendBlobAppendBlockFromURLOptions *AppendBlobAppendBlockFromURLOptions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, leaseAccessConditions *LeaseAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "appendblock") - if appendBlobAppendBlockFromUrlOptions != nil && appendBlobAppendBlockFromUrlOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*appendBlobAppendBlockFromUrlOptions.Timeout), 10)) + reqQP := req.URL.Query() + reqQP.Set("comp", "appendblock") + if appendBlobAppendBlockFromURLOptions != nil && appendBlobAppendBlockFromURLOptions.Timeout != nil { + reqQP.Set("timeout", strconv.FormatInt(int64(*appendBlobAppendBlockFromURLOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() - req.Header.Set("x-ms-copy-source", sourceUrl.String()) - if appendBlobAppendBlockFromUrlOptions != nil && appendBlobAppendBlockFromUrlOptions.SourceRange != nil { - req.Header.Set("x-ms-source-range", *appendBlobAppendBlockFromUrlOptions.SourceRange) + req.URL.RawQuery = reqQP.Encode() + req.Header.Set("x-ms-copy-source", sourceURL) + if appendBlobAppendBlockFromURLOptions != nil && appendBlobAppendBlockFromURLOptions.SourceRange != nil { + req.Header.Set("x-ms-source-range", *appendBlobAppendBlockFromURLOptions.SourceRange) } - if appendBlobAppendBlockFromUrlOptions != nil && appendBlobAppendBlockFromUrlOptions.SourceContentMd5 != nil { - req.Header.Set("x-ms-source-content-md5", base64.StdEncoding.EncodeToString(*appendBlobAppendBlockFromUrlOptions.SourceContentMd5)) + if appendBlobAppendBlockFromURLOptions != nil && appendBlobAppendBlockFromURLOptions.SourceContentMD5 != nil { + req.Header.Set("x-ms-source-content-md5", base64.StdEncoding.EncodeToString(*appendBlobAppendBlockFromURLOptions.SourceContentMD5)) } - if appendBlobAppendBlockFromUrlOptions != nil && appendBlobAppendBlockFromUrlOptions.SourceContentcrc64 != nil { - req.Header.Set("x-ms-source-content-crc64", base64.StdEncoding.EncodeToString(*appendBlobAppendBlockFromUrlOptions.SourceContentcrc64)) + if appendBlobAppendBlockFromURLOptions != nil && appendBlobAppendBlockFromURLOptions.SourceContentcrc64 != nil { + req.Header.Set("x-ms-source-content-crc64", base64.StdEncoding.EncodeToString(*appendBlobAppendBlockFromURLOptions.SourceContentcrc64)) } req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if appendBlobAppendBlockFromUrlOptions != nil && appendBlobAppendBlockFromUrlOptions.TransactionalContentMd5 != nil { - req.Header.Set("Content-MD5", base64.StdEncoding.EncodeToString(*appendBlobAppendBlockFromUrlOptions.TransactionalContentMd5)) + if appendBlobAppendBlockFromURLOptions != nil && appendBlobAppendBlockFromURLOptions.TransactionalContentMD5 != nil { + req.Header.Set("Content-MD5", base64.StdEncoding.EncodeToString(*appendBlobAppendBlockFromURLOptions.TransactionalContentMD5)) } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Header.Set("x-ms-encryption-key", *cpkInfo.EncryptionKey) } - if cpkInfo != nil && cpkInfo.EncryptionKeySha256 != nil { - req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySha256) + if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { + req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySHA256) } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Header.Set("x-ms-encryption-algorithm", "AES256") @@ -253,8 +238,8 @@ func (client appendBlobClient) appendBlockFromUrlCreateRequest(ctx context.Conte if cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil { req.Header.Set("x-ms-encryption-scope", *cpkScopeInfo.EncryptionScope) } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if appendPositionAccessConditions != nil && appendPositionAccessConditions.MaxSize != nil { req.Header.Set("x-ms-blob-condition-maxsize", strconv.FormatInt(*appendPositionAccessConditions.MaxSize, 10)) @@ -290,15 +275,15 @@ func (client appendBlobClient) appendBlockFromUrlCreateRequest(ctx context.Conte req.Header.Set("x-ms-source-if-none-match", *sourceModifiedAccessConditions.SourceIfNoneMatch) } req.Header.Set("x-ms-version", "2019-12-12") - if appendBlobAppendBlockFromUrlOptions != nil && appendBlobAppendBlockFromUrlOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *appendBlobAppendBlockFromUrlOptions.RequestId) + if appendBlobAppendBlockFromURLOptions != nil && appendBlobAppendBlockFromURLOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *appendBlobAppendBlockFromURLOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } -// appendBlockFromUrlHandleResponse handles the AppendBlockFromURL response. -func (client appendBlobClient) appendBlockFromUrlHandleResponse(resp *azcore.Response) (AppendBlobAppendBlockFromURLResponse, error) { +// appendBlockFromURLHandleResponse handles the AppendBlockFromURL response. +func (client *appendBlobClient) appendBlockFromURLHandleResponse(resp *azcore.Response) (AppendBlobAppendBlockFromURLResponse, error) { result := AppendBlobAppendBlockFromURLResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -311,18 +296,18 @@ func (client appendBlobClient) appendBlockFromUrlHandleResponse(resp *azcore.Res result.LastModified = &lastModified } if val := resp.Header.Get("Content-MD5"); val != "" { - contentMd5, err := base64.StdEncoding.DecodeString(val) + contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return AppendBlobAppendBlockFromURLResponse{}, err } - result.ContentMD5 = &contentMd5 + result.ContentMD5 = &contentMD5 } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { - contentCrc64, err := base64.StdEncoding.DecodeString(val) + xMSContentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return AppendBlobAppendBlockFromURLResponse{}, err } - result.ContentCRC64 = &contentCrc64 + result.XMSContentCRC64 = &xMSContentCRC64 } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val @@ -364,9 +349,9 @@ func (client appendBlobClient) appendBlockFromUrlHandleResponse(resp *azcore.Res return result, nil } -// appendBlockFromUrlHandleError handles the AppendBlockFromURL error response. -func (client appendBlobClient) appendBlockFromUrlHandleError(resp *azcore.Response) error { - var err StorageError +// appendBlockFromURLHandleError handles the AppendBlockFromURL error response. +func (client *appendBlobClient) appendBlockFromURLHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -374,70 +359,66 @@ func (client appendBlobClient) appendBlockFromUrlHandleError(resp *azcore.Respon } // Create - The Create Append Blob operation creates a new append blob. -func (client appendBlobClient) Create(ctx context.Context, contentLength int64, appendBlobCreateOptions *AppendBlobCreateOptions, blobHttpHeaders *BlobHttpHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (AppendBlobCreateResponse, error) { - req, err := client.createCreateRequest(ctx, contentLength, appendBlobCreateOptions, blobHttpHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) +func (client *appendBlobClient) Create(ctx context.Context, contentLength int64, appendBlobCreateOptions *AppendBlobCreateOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (AppendBlobCreateResponse, error) { + req, err := client.createCreateRequest(ctx, contentLength, appendBlobCreateOptions, blobHTTPHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) if err != nil { return AppendBlobCreateResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return AppendBlobCreateResponse{}, err } if !resp.HasStatusCode(http.StatusCreated) { return AppendBlobCreateResponse{}, client.createHandleError(resp) } - result, err := client.createHandleResponse(resp) - if err != nil { - return AppendBlobCreateResponse{}, err - } - return result, nil + return client.createHandleResponse(resp) } // createCreateRequest creates the Create request. -func (client appendBlobClient) createCreateRequest(ctx context.Context, contentLength int64, appendBlobCreateOptions *AppendBlobCreateOptions, blobHttpHeaders *BlobHttpHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *appendBlobClient) createCreateRequest(ctx context.Context, contentLength int64, appendBlobCreateOptions *AppendBlobCreateOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() + reqQP := req.URL.Query() if appendBlobCreateOptions != nil && appendBlobCreateOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*appendBlobCreateOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*appendBlobCreateOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-blob-type", "AppendBlob") req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentType != nil { - req.Header.Set("x-ms-blob-content-type", *blobHttpHeaders.BlobContentType) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentType != nil { + req.Header.Set("x-ms-blob-content-type", *blobHTTPHeaders.BlobContentType) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentEncoding != nil { - req.Header.Set("x-ms-blob-content-encoding", *blobHttpHeaders.BlobContentEncoding) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentEncoding != nil { + req.Header.Set("x-ms-blob-content-encoding", *blobHTTPHeaders.BlobContentEncoding) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentLanguage != nil { - req.Header.Set("x-ms-blob-content-language", *blobHttpHeaders.BlobContentLanguage) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentLanguage != nil { + req.Header.Set("x-ms-blob-content-language", *blobHTTPHeaders.BlobContentLanguage) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentMd5 != nil { - req.Header.Set("x-ms-blob-content-md5", base64.StdEncoding.EncodeToString(*blobHttpHeaders.BlobContentMd5)) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentMD5 != nil { + req.Header.Set("x-ms-blob-content-md5", base64.StdEncoding.EncodeToString(*blobHTTPHeaders.BlobContentMD5)) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobCacheControl != nil { - req.Header.Set("x-ms-blob-cache-control", *blobHttpHeaders.BlobCacheControl) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobCacheControl != nil { + req.Header.Set("x-ms-blob-cache-control", *blobHTTPHeaders.BlobCacheControl) } if appendBlobCreateOptions != nil && appendBlobCreateOptions.Metadata != nil { for k, v := range *appendBlobCreateOptions.Metadata { req.Header.Set("x-ms-meta-"+k, v) } } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentDisposition != nil { - req.Header.Set("x-ms-blob-content-disposition", *blobHttpHeaders.BlobContentDisposition) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentDisposition != nil { + req.Header.Set("x-ms-blob-content-disposition", *blobHTTPHeaders.BlobContentDisposition) } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Header.Set("x-ms-encryption-key", *cpkInfo.EncryptionKey) } - if cpkInfo != nil && cpkInfo.EncryptionKeySha256 != nil { - req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySha256) + if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { + req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySHA256) } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Header.Set("x-ms-encryption-algorithm", "AES256") @@ -461,8 +442,8 @@ func (client appendBlobClient) createCreateRequest(ctx context.Context, contentL req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } req.Header.Set("x-ms-version", "2019-12-12") - if appendBlobCreateOptions != nil && appendBlobCreateOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *appendBlobCreateOptions.RequestId) + if appendBlobCreateOptions != nil && appendBlobCreateOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *appendBlobCreateOptions.RequestID) } if appendBlobCreateOptions != nil && appendBlobCreateOptions.BlobTagsString != nil { req.Header.Set("x-ms-tags", *appendBlobCreateOptions.BlobTagsString) @@ -472,7 +453,7 @@ func (client appendBlobClient) createCreateRequest(ctx context.Context, contentL } // createHandleResponse handles the Create response. -func (client appendBlobClient) createHandleResponse(resp *azcore.Response) (AppendBlobCreateResponse, error) { +func (client *appendBlobClient) createHandleResponse(resp *azcore.Response) (AppendBlobCreateResponse, error) { result := AppendBlobCreateResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -485,11 +466,11 @@ func (client appendBlobClient) createHandleResponse(resp *azcore.Response) (Appe result.LastModified = &lastModified } if val := resp.Header.Get("Content-MD5"); val != "" { - contentMd5, err := base64.StdEncoding.DecodeString(val) + contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return AppendBlobCreateResponse{}, err } - result.ContentMD5 = &contentMd5 + result.ContentMD5 = &contentMD5 } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val @@ -527,8 +508,8 @@ func (client appendBlobClient) createHandleResponse(resp *azcore.Response) (Appe } // createHandleError handles the Create error response. -func (client appendBlobClient) createHandleError(resp *azcore.Response) error { - var err StorageError +func (client *appendBlobClient) createHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -536,44 +517,40 @@ func (client appendBlobClient) createHandleError(resp *azcore.Response) error { } // Seal - The Seal operation seals the Append Blob to make it read-only. Seal is supported only on version 2019-12-12 version or later. -func (client appendBlobClient) Seal(ctx context.Context, appendBlobSealOptions *AppendBlobSealOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions) (AppendBlobSealResponse, error) { +func (client *appendBlobClient) Seal(ctx context.Context, appendBlobSealOptions *AppendBlobSealOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions) (AppendBlobSealResponse, error) { req, err := client.sealCreateRequest(ctx, appendBlobSealOptions, leaseAccessConditions, modifiedAccessConditions, appendPositionAccessConditions) if err != nil { return AppendBlobSealResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return AppendBlobSealResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return AppendBlobSealResponse{}, client.sealHandleError(resp) } - result, err := client.sealHandleResponse(resp) - if err != nil { - return AppendBlobSealResponse{}, err - } - return result, nil + return client.sealHandleResponse(resp) } // sealCreateRequest creates the Seal request. -func (client appendBlobClient) sealCreateRequest(ctx context.Context, appendBlobSealOptions *AppendBlobSealOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions) (*azcore.Request, error) { +func (client *appendBlobClient) sealCreateRequest(ctx context.Context, appendBlobSealOptions *AppendBlobSealOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "seal") + reqQP := req.URL.Query() + reqQP.Set("comp", "seal") if appendBlobSealOptions != nil && appendBlobSealOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*appendBlobSealOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*appendBlobSealOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-version", "2019-12-12") - if appendBlobSealOptions != nil && appendBlobSealOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *appendBlobSealOptions.RequestId) + if appendBlobSealOptions != nil && appendBlobSealOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *appendBlobSealOptions.RequestID) } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Header.Set("If-Modified-Since", modifiedAccessConditions.IfModifiedSince.Format(time.RFC1123)) @@ -595,7 +572,7 @@ func (client appendBlobClient) sealCreateRequest(ctx context.Context, appendBlob } // sealHandleResponse handles the Seal response. -func (client appendBlobClient) sealHandleResponse(resp *azcore.Response) (AppendBlobSealResponse, error) { +func (client *appendBlobClient) sealHandleResponse(resp *azcore.Response) (AppendBlobSealResponse, error) { result := AppendBlobSealResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -634,10 +611,11 @@ func (client appendBlobClient) sealHandleResponse(resp *azcore.Response) (Append } // sealHandleError handles the Seal error response. -func (client appendBlobClient) sealHandleError(resp *azcore.Response) error { - var err StorageError +func (client *appendBlobClient) sealHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } return azcore.NewResponseError(&err, resp.Response) } + diff --git a/sdk/storage/azblob/zz_generated_blob.go b/sdk/storage/azblob/zz_generated_blob_client.go similarity index 72% rename from sdk/storage/azblob/zz_generated_blob.go rename to sdk/storage/azblob/zz_generated_blob_client.go index d1f57e768af1..b380f718b180 100644 --- a/sdk/storage/azblob/zz_generated_blob.go +++ b/sdk/storage/azblob/zz_generated_blob_client.go @@ -10,74 +10,63 @@ package azblob import ( "context" "encoding/base64" + "github.com/Azure/azure-sdk-for-go/sdk/azcore" "net/http" - "net/url" "strconv" "strings" "time" - - "github.com/Azure/azure-sdk-for-go/sdk/azcore" ) type blobClient struct { - con *connection + con *connection pathRenameMode *PathRenameMode } -// Pipeline returns the pipeline associated with this client. -func (client blobClient) Pipeline() azcore.Pipeline { - return client.con.Pipeline() -} - // AbortCopyFromURL - The Abort Copy From URL operation aborts a pending Copy From URL operation, and leaves a destination blob with zero length and full // metadata. -func (client blobClient) AbortCopyFromURL(ctx context.Context, copyId string, blobAbortCopyFromUrlOptions *BlobAbortCopyFromURLOptions, leaseAccessConditions *LeaseAccessConditions) (BlobAbortCopyFromURLResponse, error) { - req, err := client.abortCopyFromUrlCreateRequest(ctx, copyId, blobAbortCopyFromUrlOptions, leaseAccessConditions) +func (client *blobClient) AbortCopyFromURL(ctx context.Context, copyID string, blobAbortCopyFromURLOptions *BlobAbortCopyFromURLOptions, leaseAccessConditions *LeaseAccessConditions) (BlobAbortCopyFromURLResponse, error) { + req, err := client.abortCopyFromURLCreateRequest(ctx, copyID, blobAbortCopyFromURLOptions, leaseAccessConditions) if err != nil { return BlobAbortCopyFromURLResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobAbortCopyFromURLResponse{}, err } if !resp.HasStatusCode(http.StatusNoContent) { - return BlobAbortCopyFromURLResponse{}, client.abortCopyFromUrlHandleError(resp) - } - result, err := client.abortCopyFromUrlHandleResponse(resp) - if err != nil { - return BlobAbortCopyFromURLResponse{}, err + return BlobAbortCopyFromURLResponse{}, client.abortCopyFromURLHandleError(resp) } - return result, nil + return client.abortCopyFromURLHandleResponse(resp) } -// abortCopyFromUrlCreateRequest creates the AbortCopyFromURL request. -func (client blobClient) abortCopyFromUrlCreateRequest(ctx context.Context, copyId string, blobAbortCopyFromUrlOptions *BlobAbortCopyFromURLOptions, leaseAccessConditions *LeaseAccessConditions) (*azcore.Request, error) { +// abortCopyFromURLCreateRequest creates the AbortCopyFromURL request. +func (client *blobClient) abortCopyFromURLCreateRequest(ctx context.Context, copyID string, blobAbortCopyFromURLOptions *BlobAbortCopyFromURLOptions, leaseAccessConditions *LeaseAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "copy") - query.Set("copyid", copyId) - if blobAbortCopyFromUrlOptions != nil && blobAbortCopyFromUrlOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobAbortCopyFromUrlOptions.Timeout), 10)) + reqQP := req.URL.Query() + reqQP.Set("comp", "copy") + reqQP.Set("copyid", copyID) + if blobAbortCopyFromURLOptions != nil && blobAbortCopyFromURLOptions.Timeout != nil { + reqQP.Set("timeout", strconv.FormatInt(int64(*blobAbortCopyFromURLOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-copy-action", "abort") - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } req.Header.Set("x-ms-version", "2019-12-12") - if blobAbortCopyFromUrlOptions != nil && blobAbortCopyFromUrlOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobAbortCopyFromUrlOptions.RequestId) + if blobAbortCopyFromURLOptions != nil && blobAbortCopyFromURLOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobAbortCopyFromURLOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } -// abortCopyFromUrlHandleResponse handles the AbortCopyFromURL response. -func (client blobClient) abortCopyFromUrlHandleResponse(resp *azcore.Response) (BlobAbortCopyFromURLResponse, error) { +// abortCopyFromURLHandleResponse handles the AbortCopyFromURL response. +func (client *blobClient) abortCopyFromURLHandleResponse(resp *azcore.Response) (BlobAbortCopyFromURLResponse, error) { result := BlobAbortCopyFromURLResponse{RawResponse: resp.Response} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val @@ -98,9 +87,9 @@ func (client blobClient) abortCopyFromUrlHandleResponse(resp *azcore.Response) ( return result, nil } -// abortCopyFromUrlHandleError handles the AbortCopyFromURL error response. -func (client blobClient) abortCopyFromUrlHandleError(resp *azcore.Response) error { - var err StorageError +// abortCopyFromURLHandleError handles the AbortCopyFromURL error response. +func (client *blobClient) abortCopyFromURLHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -108,44 +97,40 @@ func (client blobClient) abortCopyFromUrlHandleError(resp *azcore.Response) erro } // AcquireLease - [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations -func (client blobClient) AcquireLease(ctx context.Context, blobAcquireLeaseOptions *BlobAcquireLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobAcquireLeaseResponse, error) { +func (client *blobClient) AcquireLease(ctx context.Context, blobAcquireLeaseOptions *BlobAcquireLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobAcquireLeaseResponse, error) { req, err := client.acquireLeaseCreateRequest(ctx, blobAcquireLeaseOptions, modifiedAccessConditions) if err != nil { return BlobAcquireLeaseResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobAcquireLeaseResponse{}, err } if !resp.HasStatusCode(http.StatusCreated) { return BlobAcquireLeaseResponse{}, client.acquireLeaseHandleError(resp) } - result, err := client.acquireLeaseHandleResponse(resp) - if err != nil { - return BlobAcquireLeaseResponse{}, err - } - return result, nil + return client.acquireLeaseHandleResponse(resp) } // acquireLeaseCreateRequest creates the AcquireLease request. -func (client blobClient) acquireLeaseCreateRequest(ctx context.Context, blobAcquireLeaseOptions *BlobAcquireLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *blobClient) acquireLeaseCreateRequest(ctx context.Context, blobAcquireLeaseOptions *BlobAcquireLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "lease") + reqQP := req.URL.Query() + reqQP.Set("comp", "lease") if blobAcquireLeaseOptions != nil && blobAcquireLeaseOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobAcquireLeaseOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blobAcquireLeaseOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-lease-action", "acquire") if blobAcquireLeaseOptions != nil && blobAcquireLeaseOptions.Duration != nil { req.Header.Set("x-ms-lease-duration", strconv.FormatInt(int64(*blobAcquireLeaseOptions.Duration), 10)) } - if blobAcquireLeaseOptions != nil && blobAcquireLeaseOptions.ProposedLeaseId != nil { - req.Header.Set("x-ms-proposed-lease-id", *blobAcquireLeaseOptions.ProposedLeaseId) + if blobAcquireLeaseOptions != nil && blobAcquireLeaseOptions.ProposedLeaseID != nil { + req.Header.Set("x-ms-proposed-lease-id", *blobAcquireLeaseOptions.ProposedLeaseID) } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Header.Set("If-Modified-Since", modifiedAccessConditions.IfModifiedSince.Format(time.RFC1123)) @@ -163,15 +148,15 @@ func (client blobClient) acquireLeaseCreateRequest(ctx context.Context, blobAcqu req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } req.Header.Set("x-ms-version", "2019-12-12") - if blobAcquireLeaseOptions != nil && blobAcquireLeaseOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobAcquireLeaseOptions.RequestId) + if blobAcquireLeaseOptions != nil && blobAcquireLeaseOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobAcquireLeaseOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // acquireLeaseHandleResponse handles the AcquireLease response. -func (client blobClient) acquireLeaseHandleResponse(resp *azcore.Response) (BlobAcquireLeaseResponse, error) { +func (client *blobClient) acquireLeaseHandleResponse(resp *azcore.Response) (BlobAcquireLeaseResponse, error) { result := BlobAcquireLeaseResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -206,8 +191,8 @@ func (client blobClient) acquireLeaseHandleResponse(resp *azcore.Response) (Blob } // acquireLeaseHandleError handles the AcquireLease error response. -func (client blobClient) acquireLeaseHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blobClient) acquireLeaseHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -215,38 +200,34 @@ func (client blobClient) acquireLeaseHandleError(resp *azcore.Response) error { } // BreakLease - [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations -func (client blobClient) BreakLease(ctx context.Context, blobBreakLeaseOptions *BlobBreakLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobBreakLeaseResponse, error) { +func (client *blobClient) BreakLease(ctx context.Context, blobBreakLeaseOptions *BlobBreakLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobBreakLeaseResponse, error) { req, err := client.breakLeaseCreateRequest(ctx, blobBreakLeaseOptions, modifiedAccessConditions) if err != nil { return BlobBreakLeaseResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobBreakLeaseResponse{}, err } if !resp.HasStatusCode(http.StatusAccepted) { return BlobBreakLeaseResponse{}, client.breakLeaseHandleError(resp) } - result, err := client.breakLeaseHandleResponse(resp) - if err != nil { - return BlobBreakLeaseResponse{}, err - } - return result, nil + return client.breakLeaseHandleResponse(resp) } // breakLeaseCreateRequest creates the BreakLease request. -func (client blobClient) breakLeaseCreateRequest(ctx context.Context, blobBreakLeaseOptions *BlobBreakLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *blobClient) breakLeaseCreateRequest(ctx context.Context, blobBreakLeaseOptions *BlobBreakLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "lease") + reqQP := req.URL.Query() + reqQP.Set("comp", "lease") if blobBreakLeaseOptions != nil && blobBreakLeaseOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobBreakLeaseOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blobBreakLeaseOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-lease-action", "break") if blobBreakLeaseOptions != nil && blobBreakLeaseOptions.BreakPeriod != nil { req.Header.Set("x-ms-lease-break-period", strconv.FormatInt(int64(*blobBreakLeaseOptions.BreakPeriod), 10)) @@ -267,15 +248,15 @@ func (client blobClient) breakLeaseCreateRequest(ctx context.Context, blobBreakL req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } req.Header.Set("x-ms-version", "2019-12-12") - if blobBreakLeaseOptions != nil && blobBreakLeaseOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobBreakLeaseOptions.RequestId) + if blobBreakLeaseOptions != nil && blobBreakLeaseOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobBreakLeaseOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // breakLeaseHandleResponse handles the BreakLease response. -func (client blobClient) breakLeaseHandleResponse(resp *azcore.Response) (BlobBreakLeaseResponse, error) { +func (client *blobClient) breakLeaseHandleResponse(resp *azcore.Response) (BlobBreakLeaseResponse, error) { result := BlobBreakLeaseResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -315,8 +296,8 @@ func (client blobClient) breakLeaseHandleResponse(resp *azcore.Response) (BlobBr } // breakLeaseHandleError handles the BreakLease error response. -func (client blobClient) breakLeaseHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blobClient) breakLeaseHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -324,41 +305,37 @@ func (client blobClient) breakLeaseHandleError(resp *azcore.Response) error { } // ChangeLease - [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations -func (client blobClient) ChangeLease(ctx context.Context, leaseId string, proposedLeaseId string, blobChangeLeaseOptions *BlobChangeLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobChangeLeaseResponse, error) { - req, err := client.changeLeaseCreateRequest(ctx, leaseId, proposedLeaseId, blobChangeLeaseOptions, modifiedAccessConditions) +func (client *blobClient) ChangeLease(ctx context.Context, leaseID string, proposedLeaseID string, blobChangeLeaseOptions *BlobChangeLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobChangeLeaseResponse, error) { + req, err := client.changeLeaseCreateRequest(ctx, leaseID, proposedLeaseID, blobChangeLeaseOptions, modifiedAccessConditions) if err != nil { return BlobChangeLeaseResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobChangeLeaseResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return BlobChangeLeaseResponse{}, client.changeLeaseHandleError(resp) } - result, err := client.changeLeaseHandleResponse(resp) - if err != nil { - return BlobChangeLeaseResponse{}, err - } - return result, nil + return client.changeLeaseHandleResponse(resp) } // changeLeaseCreateRequest creates the ChangeLease request. -func (client blobClient) changeLeaseCreateRequest(ctx context.Context, leaseId string, proposedLeaseId string, blobChangeLeaseOptions *BlobChangeLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *blobClient) changeLeaseCreateRequest(ctx context.Context, leaseID string, proposedLeaseID string, blobChangeLeaseOptions *BlobChangeLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "lease") + reqQP := req.URL.Query() + reqQP.Set("comp", "lease") if blobChangeLeaseOptions != nil && blobChangeLeaseOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobChangeLeaseOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blobChangeLeaseOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-lease-action", "change") - req.Header.Set("x-ms-lease-id", leaseId) - req.Header.Set("x-ms-proposed-lease-id", proposedLeaseId) + req.Header.Set("x-ms-lease-id", leaseID) + req.Header.Set("x-ms-proposed-lease-id", proposedLeaseID) if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Header.Set("If-Modified-Since", modifiedAccessConditions.IfModifiedSince.Format(time.RFC1123)) } @@ -375,15 +352,15 @@ func (client blobClient) changeLeaseCreateRequest(ctx context.Context, leaseId s req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } req.Header.Set("x-ms-version", "2019-12-12") - if blobChangeLeaseOptions != nil && blobChangeLeaseOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobChangeLeaseOptions.RequestId) + if blobChangeLeaseOptions != nil && blobChangeLeaseOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobChangeLeaseOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // changeLeaseHandleResponse handles the ChangeLease response. -func (client blobClient) changeLeaseHandleResponse(resp *azcore.Response) (BlobChangeLeaseResponse, error) { +func (client *blobClient) changeLeaseHandleResponse(resp *azcore.Response) (BlobChangeLeaseResponse, error) { result := BlobChangeLeaseResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -418,8 +395,8 @@ func (client blobClient) changeLeaseHandleResponse(resp *azcore.Response) (BlobC } // changeLeaseHandleError handles the ChangeLease error response. -func (client blobClient) changeLeaseHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blobClient) changeLeaseHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -427,45 +404,41 @@ func (client blobClient) changeLeaseHandleError(resp *azcore.Response) error { } // CopyFromURL - The Copy From URL operation copies a blob or an internet resource to a new blob. It will not return a response until the copy is complete. -func (client blobClient) CopyFromURL(ctx context.Context, copySource url.URL, blobCopyFromUrlOptions *BlobCopyFromURLOptions, sourceModifiedAccessConditions *SourceModifiedAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (BlobCopyFromURLResponse, error) { - req, err := client.copyFromUrlCreateRequest(ctx, copySource, blobCopyFromUrlOptions, sourceModifiedAccessConditions, modifiedAccessConditions, leaseAccessConditions) +func (client *blobClient) CopyFromURL(ctx context.Context, copySource string, blobCopyFromURLOptions *BlobCopyFromURLOptions, sourceModifiedAccessConditions *SourceModifiedAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (BlobCopyFromURLResponse, error) { + req, err := client.copyFromURLCreateRequest(ctx, copySource, blobCopyFromURLOptions, sourceModifiedAccessConditions, modifiedAccessConditions, leaseAccessConditions) if err != nil { return BlobCopyFromURLResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobCopyFromURLResponse{}, err } if !resp.HasStatusCode(http.StatusAccepted) { - return BlobCopyFromURLResponse{}, client.copyFromUrlHandleError(resp) + return BlobCopyFromURLResponse{}, client.copyFromURLHandleError(resp) } - result, err := client.copyFromUrlHandleResponse(resp) - if err != nil { - return BlobCopyFromURLResponse{}, err - } - return result, nil + return client.copyFromURLHandleResponse(resp) } -// copyFromUrlCreateRequest creates the CopyFromURL request. -func (client blobClient) copyFromUrlCreateRequest(ctx context.Context, copySource url.URL, blobCopyFromUrlOptions *BlobCopyFromURLOptions, sourceModifiedAccessConditions *SourceModifiedAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (*azcore.Request, error) { +// copyFromURLCreateRequest creates the CopyFromURL request. +func (client *blobClient) copyFromURLCreateRequest(ctx context.Context, copySource string, blobCopyFromURLOptions *BlobCopyFromURLOptions, sourceModifiedAccessConditions *SourceModifiedAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - if blobCopyFromUrlOptions != nil && blobCopyFromUrlOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobCopyFromUrlOptions.Timeout), 10)) + reqQP := req.URL.Query() + if blobCopyFromURLOptions != nil && blobCopyFromURLOptions.Timeout != nil { + reqQP.Set("timeout", strconv.FormatInt(int64(*blobCopyFromURLOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-requires-sync", "true") - if blobCopyFromUrlOptions != nil && blobCopyFromUrlOptions.Metadata != nil { - for k, v := range *blobCopyFromUrlOptions.Metadata { + if blobCopyFromURLOptions != nil && blobCopyFromURLOptions.Metadata != nil { + for k, v := range *blobCopyFromURLOptions.Metadata { req.Header.Set("x-ms-meta-"+k, v) } } - if blobCopyFromUrlOptions != nil && blobCopyFromUrlOptions.Tier != nil { - req.Header.Set("x-ms-access-tier", string(*blobCopyFromUrlOptions.Tier)) + if blobCopyFromURLOptions != nil && blobCopyFromURLOptions.Tier != nil { + req.Header.Set("x-ms-access-tier", string(*blobCopyFromURLOptions.Tier)) } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfModifiedSince != nil { req.Header.Set("x-ms-source-if-modified-since", sourceModifiedAccessConditions.SourceIfModifiedSince.Format(time.RFC1123)) @@ -494,26 +467,26 @@ func (client blobClient) copyFromUrlCreateRequest(ctx context.Context, copySourc if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } - req.Header.Set("x-ms-copy-source", copySource.String()) - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + req.Header.Set("x-ms-copy-source", copySource) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } req.Header.Set("x-ms-version", "2019-12-12") - if blobCopyFromUrlOptions != nil && blobCopyFromUrlOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobCopyFromUrlOptions.RequestId) + if blobCopyFromURLOptions != nil && blobCopyFromURLOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobCopyFromURLOptions.RequestID) } - if blobCopyFromUrlOptions != nil && blobCopyFromUrlOptions.SourceContentMd5 != nil { - req.Header.Set("x-ms-source-content-md5", base64.StdEncoding.EncodeToString(*blobCopyFromUrlOptions.SourceContentMd5)) + if blobCopyFromURLOptions != nil && blobCopyFromURLOptions.SourceContentMD5 != nil { + req.Header.Set("x-ms-source-content-md5", base64.StdEncoding.EncodeToString(*blobCopyFromURLOptions.SourceContentMD5)) } - if blobCopyFromUrlOptions != nil && blobCopyFromUrlOptions.BlobTagsString != nil { - req.Header.Set("x-ms-tags", *blobCopyFromUrlOptions.BlobTagsString) + if blobCopyFromURLOptions != nil && blobCopyFromURLOptions.BlobTagsString != nil { + req.Header.Set("x-ms-tags", *blobCopyFromURLOptions.BlobTagsString) } req.Header.Set("Accept", "application/xml") return req, nil } -// copyFromUrlHandleResponse handles the CopyFromURL response. -func (client blobClient) copyFromUrlHandleResponse(resp *azcore.Response) (BlobCopyFromURLResponse, error) { +// copyFromURLHandleResponse handles the CopyFromURL response. +func (client *blobClient) copyFromURLHandleResponse(resp *azcore.Response) (BlobCopyFromURLResponse, error) { result := BlobCopyFromURLResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -551,25 +524,25 @@ func (client blobClient) copyFromUrlHandleResponse(resp *azcore.Response) (BlobC result.CopyStatus = &val } if val := resp.Header.Get("Content-MD5"); val != "" { - contentMd5, err := base64.StdEncoding.DecodeString(val) + contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlobCopyFromURLResponse{}, err } - result.ContentMD5 = &contentMd5 + result.ContentMD5 = &contentMD5 } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { - contentCrc64, err := base64.StdEncoding.DecodeString(val) + xMSContentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlobCopyFromURLResponse{}, err } - result.ContentCRC64 = &contentCrc64 + result.XMSContentCRC64 = &xMSContentCRC64 } return result, nil } -// copyFromUrlHandleError handles the CopyFromURL error response. -func (client blobClient) copyFromUrlHandleError(resp *azcore.Response) error { - var err StorageError +// copyFromURLHandleError handles the CopyFromURL error response. +func (client *blobClient) copyFromURLHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -577,38 +550,34 @@ func (client blobClient) copyFromUrlHandleError(resp *azcore.Response) error { } // CreateSnapshot - The Create Snapshot operation creates a read-only snapshot of a blob -func (client blobClient) CreateSnapshot(ctx context.Context, blobCreateSnapshotOptions *BlobCreateSnapshotOptions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (BlobCreateSnapshotResponse, error) { +func (client *blobClient) CreateSnapshot(ctx context.Context, blobCreateSnapshotOptions *BlobCreateSnapshotOptions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (BlobCreateSnapshotResponse, error) { req, err := client.createSnapshotCreateRequest(ctx, blobCreateSnapshotOptions, cpkInfo, cpkScopeInfo, modifiedAccessConditions, leaseAccessConditions) if err != nil { return BlobCreateSnapshotResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobCreateSnapshotResponse{}, err } if !resp.HasStatusCode(http.StatusCreated) { return BlobCreateSnapshotResponse{}, client.createSnapshotHandleError(resp) } - result, err := client.createSnapshotHandleResponse(resp) - if err != nil { - return BlobCreateSnapshotResponse{}, err - } - return result, nil + return client.createSnapshotHandleResponse(resp) } // createSnapshotCreateRequest creates the CreateSnapshot request. -func (client blobClient) createSnapshotCreateRequest(ctx context.Context, blobCreateSnapshotOptions *BlobCreateSnapshotOptions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (*azcore.Request, error) { +func (client *blobClient) createSnapshotCreateRequest(ctx context.Context, blobCreateSnapshotOptions *BlobCreateSnapshotOptions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "snapshot") + reqQP := req.URL.Query() + reqQP.Set("comp", "snapshot") if blobCreateSnapshotOptions != nil && blobCreateSnapshotOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobCreateSnapshotOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blobCreateSnapshotOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() if blobCreateSnapshotOptions != nil && blobCreateSnapshotOptions.Metadata != nil { for k, v := range *blobCreateSnapshotOptions.Metadata { req.Header.Set("x-ms-meta-"+k, v) @@ -617,8 +586,8 @@ func (client blobClient) createSnapshotCreateRequest(ctx context.Context, blobCr if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Header.Set("x-ms-encryption-key", *cpkInfo.EncryptionKey) } - if cpkInfo != nil && cpkInfo.EncryptionKeySha256 != nil { - req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySha256) + if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { + req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySHA256) } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Header.Set("x-ms-encryption-algorithm", "AES256") @@ -641,19 +610,19 @@ func (client blobClient) createSnapshotCreateRequest(ctx context.Context, blobCr if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } req.Header.Set("x-ms-version", "2019-12-12") - if blobCreateSnapshotOptions != nil && blobCreateSnapshotOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobCreateSnapshotOptions.RequestId) + if blobCreateSnapshotOptions != nil && blobCreateSnapshotOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobCreateSnapshotOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // createSnapshotHandleResponse handles the CreateSnapshot response. -func (client blobClient) createSnapshotHandleResponse(resp *azcore.Response) (BlobCreateSnapshotResponse, error) { +func (client *blobClient) createSnapshotHandleResponse(resp *azcore.Response) (BlobCreateSnapshotResponse, error) { result := BlobCreateSnapshotResponse{RawResponse: resp.Response} if val := resp.Header.Get("x-ms-snapshot"); val != "" { result.Snapshot = &val @@ -698,8 +667,8 @@ func (client blobClient) createSnapshotHandleResponse(resp *azcore.Response) (Bl } // createSnapshotHandleError handles the CreateSnapshot error response. -func (client blobClient) createSnapshotHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blobClient) createSnapshotHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -717,45 +686,41 @@ func (client blobClient) createSnapshotHandleError(resp *azcore.Response) error // which blobs and snapshots have been soft deleted. You can then use the Undelete Blob API to restore a soft-deleted blob. All other operations on a soft-deleted // blob or snapshot causes the service to // return an HTTP status code of 404 (ResourceNotFound). -func (client blobClient) Delete(ctx context.Context, blobDeleteOptions *BlobDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (BlobDeleteResponse, error) { +func (client *blobClient) Delete(ctx context.Context, blobDeleteOptions *BlobDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (BlobDeleteResponse, error) { req, err := client.deleteCreateRequest(ctx, blobDeleteOptions, leaseAccessConditions, modifiedAccessConditions) if err != nil { return BlobDeleteResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobDeleteResponse{}, err } if !resp.HasStatusCode(http.StatusAccepted) { return BlobDeleteResponse{}, client.deleteHandleError(resp) } - result, err := client.deleteHandleResponse(resp) - if err != nil { - return BlobDeleteResponse{}, err - } - return result, nil + return client.deleteHandleResponse(resp) } // deleteCreateRequest creates the Delete request. -func (client blobClient) deleteCreateRequest(ctx context.Context, blobDeleteOptions *BlobDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *blobClient) deleteCreateRequest(ctx context.Context, blobDeleteOptions *BlobDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodDelete, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() + reqQP := req.URL.Query() if blobDeleteOptions != nil && blobDeleteOptions.Snapshot != nil { - query.Set("snapshot", *blobDeleteOptions.Snapshot) + reqQP.Set("snapshot", *blobDeleteOptions.Snapshot) } - if blobDeleteOptions != nil && blobDeleteOptions.VersionId != nil { - query.Set("versionid", *blobDeleteOptions.VersionId) + if blobDeleteOptions != nil && blobDeleteOptions.VersionID != nil { + reqQP.Set("versionid", *blobDeleteOptions.VersionID) } if blobDeleteOptions != nil && blobDeleteOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobDeleteOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blobDeleteOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + req.URL.RawQuery = reqQP.Encode() + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if blobDeleteOptions != nil && blobDeleteOptions.DeleteSnapshots != nil { req.Header.Set("x-ms-delete-snapshots", string(*blobDeleteOptions.DeleteSnapshots)) @@ -776,15 +741,15 @@ func (client blobClient) deleteCreateRequest(ctx context.Context, blobDeleteOpti req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } req.Header.Set("x-ms-version", "2019-12-12") - if blobDeleteOptions != nil && blobDeleteOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobDeleteOptions.RequestId) + if blobDeleteOptions != nil && blobDeleteOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobDeleteOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // deleteHandleResponse handles the Delete response. -func (client blobClient) deleteHandleResponse(resp *azcore.Response) (BlobDeleteResponse, error) { +func (client *blobClient) deleteHandleResponse(resp *azcore.Response) (BlobDeleteResponse, error) { result := BlobDeleteResponse{RawResponse: resp.Response} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val @@ -806,8 +771,8 @@ func (client blobClient) deleteHandleResponse(resp *azcore.Response) (BlobDelete } // deleteHandleError handles the Delete error response. -func (client blobClient) deleteHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blobClient) deleteHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -816,62 +781,57 @@ func (client blobClient) deleteHandleError(resp *azcore.Response) error { // Download - The Download operation reads or downloads a blob from the system, including its metadata and properties. You can also call Download to read // a snapshot. -func (client blobClient) Download(ctx context.Context, blobDownloadOptions *BlobDownloadOptions, - leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlobDownloadResponse, error) { +func (client *blobClient) Download(ctx context.Context, blobDownloadOptions *BlobDownloadOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlobDownloadResponse, error) { req, err := client.downloadCreateRequest(ctx, blobDownloadOptions, leaseAccessConditions, cpkInfo, modifiedAccessConditions) if err != nil { return BlobDownloadResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobDownloadResponse{}, err } if !resp.HasStatusCode(http.StatusOK, http.StatusPartialContent) { return BlobDownloadResponse{}, client.downloadHandleError(resp) } - result, err := client.downloadHandleResponse(resp) - if err != nil { - return BlobDownloadResponse{}, err - } - return result, nil + return client.downloadHandleResponse(resp) } // downloadCreateRequest creates the Download request. -func (client blobClient) downloadCreateRequest(ctx context.Context, blobDownloadOptions *BlobDownloadOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *blobClient) downloadCreateRequest(ctx context.Context, blobDownloadOptions *BlobDownloadOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodGet, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() + reqQP := req.URL.Query() if blobDownloadOptions != nil && blobDownloadOptions.Snapshot != nil { - query.Set("snapshot", *blobDownloadOptions.Snapshot) + reqQP.Set("snapshot", *blobDownloadOptions.Snapshot) } - if blobDownloadOptions != nil && blobDownloadOptions.VersionId != nil { - query.Set("versionid", *blobDownloadOptions.VersionId) + if blobDownloadOptions != nil && blobDownloadOptions.VersionID != nil { + reqQP.Set("versionid", *blobDownloadOptions.VersionID) } if blobDownloadOptions != nil && blobDownloadOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobDownloadOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blobDownloadOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.SkipBodyDownload() - if blobDownloadOptions != nil && blobDownloadOptions.RangeParameter != nil { - req.Header.Set("x-ms-range", *blobDownloadOptions.RangeParameter) + if blobDownloadOptions != nil && blobDownloadOptions.Range != nil { + req.Header.Set("x-ms-range", *blobDownloadOptions.Range) } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } - if blobDownloadOptions != nil && blobDownloadOptions.RangeGetContentMd5 != nil { - req.Header.Set("x-ms-range-get-content-md5", strconv.FormatBool(*blobDownloadOptions.RangeGetContentMd5)) + if blobDownloadOptions != nil && blobDownloadOptions.RangeGetContentMD5 != nil { + req.Header.Set("x-ms-range-get-content-md5", strconv.FormatBool(*blobDownloadOptions.RangeGetContentMD5)) } - if blobDownloadOptions != nil && blobDownloadOptions.RangeGetContentCrc64 != nil { - req.Header.Set("x-ms-range-get-content-crc64", strconv.FormatBool(*blobDownloadOptions.RangeGetContentCrc64)) + if blobDownloadOptions != nil && blobDownloadOptions.RangeGetContentCRC64 != nil { + req.Header.Set("x-ms-range-get-content-crc64", strconv.FormatBool(*blobDownloadOptions.RangeGetContentCRC64)) } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Header.Set("x-ms-encryption-key", *cpkInfo.EncryptionKey) } - if cpkInfo != nil && cpkInfo.EncryptionKeySha256 != nil { - req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySha256) + if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { + req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySHA256) } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Header.Set("x-ms-encryption-algorithm", "AES256") @@ -892,15 +852,15 @@ func (client blobClient) downloadCreateRequest(ctx context.Context, blobDownload req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } req.Header.Set("x-ms-version", "2019-12-12") - if blobDownloadOptions != nil && blobDownloadOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobDownloadOptions.RequestId) + if blobDownloadOptions != nil && blobDownloadOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobDownloadOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // downloadHandleResponse handles the Download response. -func (client blobClient) downloadHandleResponse(resp *azcore.Response) (BlobDownloadResponse, error) { +func (client *blobClient) downloadHandleResponse(resp *azcore.Response) (BlobDownloadResponse, error) { result := BlobDownloadResponse{RawResponse: resp.Response} if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) @@ -909,23 +869,25 @@ func (client blobClient) downloadHandleResponse(resp *azcore.Response) (BlobDown } result.LastModified = &lastModified } + prefix := strings.ToUpper("x-ms-meta-") for hh := range resp.Header { - if strings.HasPrefix(hh, "x-ms-meta-") { + if strings.HasPrefix(strings.ToUpper(hh), prefix) { if result.Metadata == nil { - result.Metadata = &map[string]string{} + result.Metadata = map[string]string{} } - (*result.Metadata)[hh[len("x-ms-meta-"):]] = resp.Header.Get(hh) + result.Metadata[hh[len(prefix):]] = resp.Header.Get(hh) } } if val := resp.Header.Get("x-ms-or-policy-id"); val != "" { result.ObjectReplicationPolicyID = &val } + prefix = strings.ToUpper("x-ms-or-") for hh := range resp.Header { - if strings.HasPrefix(hh, "x-ms-or-") { + if strings.HasPrefix(strings.ToUpper(hh), prefix) { if result.Metadata == nil { - result.Metadata = &map[string]string{} + result.Metadata = map[string]string{} } - (*result.Metadata)[hh[len("x-ms-or-"):]] = resp.Header.Get(hh) + result.Metadata[hh[len(prefix):]] = resp.Header.Get(hh) } } if val := resp.Header.Get("Content-Length"); val != "" { @@ -945,11 +907,11 @@ func (client blobClient) downloadHandleResponse(resp *azcore.Response) (BlobDown result.ETag = &val } if val := resp.Header.Get("Content-MD5"); val != "" { - contentMd5, err := base64.StdEncoding.DecodeString(val) + contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlobDownloadResponse{}, err } - result.ContentMD5 = &contentMd5 + result.ContentMD5 = &contentMD5 } if val := resp.Header.Get("Content-Encoding"); val != "" { result.ContentEncoding = &val @@ -1016,6 +978,13 @@ func (client blobClient) downloadHandleResponse(resp *azcore.Response) (BlobDown if val := resp.Header.Get("x-ms-version-id"); val != "" { result.VersionID = &val } + if val := resp.Header.Get("x-ms-is-current-version"); val != "" { + isCurrentVersion, err := strconv.ParseBool(val) + if err != nil { + return BlobDownloadResponse{}, err + } + result.IsCurrentVersion = &isCurrentVersion + } if val := resp.Header.Get("Accept-Ranges"); val != "" { result.AcceptRanges = &val } @@ -1048,11 +1017,11 @@ func (client blobClient) downloadHandleResponse(resp *azcore.Response) (BlobDown result.EncryptionScope = &val } if val := resp.Header.Get("x-ms-blob-content-md5"); val != "" { - blobContentMd5, err := base64.StdEncoding.DecodeString(val) + blobContentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlobDownloadResponse{}, err } - result.BlobContentMD5 = &blobContentMd5 + result.BlobContentMD5 = &blobContentMD5 } if val := resp.Header.Get("x-ms-tag-count"); val != "" { tagCount, err := strconv.ParseInt(val, 10, 64) @@ -1069,18 +1038,18 @@ func (client blobClient) downloadHandleResponse(resp *azcore.Response) (BlobDown result.IsSealed = &isSealed } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { - contentCrc64, err := base64.StdEncoding.DecodeString(val) + contentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlobDownloadResponse{}, err } - result.ContentCRC64 = &contentCrc64 + result.ContentCRC64 = &contentCRC64 } return result, nil } // downloadHandleError handles the Download error response. -func (client blobClient) downloadHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blobClient) downloadHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -1088,43 +1057,39 @@ func (client blobClient) downloadHandleError(resp *azcore.Response) error { } // GetAccessControl - Get the owner, group, permissions, or access control list for a blob. -func (client blobClient) GetAccessControl(ctx context.Context, blobGetAccessControlOptions *BlobGetAccessControlOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (BlobGetAccessControlResponse, error) { +func (client *blobClient) GetAccessControl(ctx context.Context, blobGetAccessControlOptions *BlobGetAccessControlOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (BlobGetAccessControlResponse, error) { req, err := client.getAccessControlCreateRequest(ctx, blobGetAccessControlOptions, leaseAccessConditions, modifiedAccessConditions) if err != nil { return BlobGetAccessControlResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobGetAccessControlResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return BlobGetAccessControlResponse{}, client.getAccessControlHandleError(resp) } - result, err := client.getAccessControlHandleResponse(resp) - if err != nil { - return BlobGetAccessControlResponse{}, err - } - return result, nil + return client.getAccessControlHandleResponse(resp) } // getAccessControlCreateRequest creates the GetAccessControl request. -func (client blobClient) getAccessControlCreateRequest(ctx context.Context, blobGetAccessControlOptions *BlobGetAccessControlOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *blobClient) getAccessControlCreateRequest(ctx context.Context, blobGetAccessControlOptions *BlobGetAccessControlOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodHead, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("action", "getAccessControl") + reqQP := req.URL.Query() + reqQP.Set("action", "getAccessControl") if blobGetAccessControlOptions != nil && blobGetAccessControlOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobGetAccessControlOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blobGetAccessControlOptions.Timeout), 10)) } if blobGetAccessControlOptions != nil && blobGetAccessControlOptions.Upn != nil { - query.Set("upn", strconv.FormatBool(*blobGetAccessControlOptions.Upn)) + reqQP.Set("upn", strconv.FormatBool(*blobGetAccessControlOptions.Upn)) } - req.URL.RawQuery = query.Encode() - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + req.URL.RawQuery = reqQP.Encode() + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Header.Set("If-Match", *modifiedAccessConditions.IfMatch) @@ -1138,8 +1103,8 @@ func (client blobClient) getAccessControlCreateRequest(ctx context.Context, blob if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Header.Set("If-Unmodified-Since", modifiedAccessConditions.IfUnmodifiedSince.Format(time.RFC1123)) } - if blobGetAccessControlOptions != nil && blobGetAccessControlOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobGetAccessControlOptions.RequestId) + if blobGetAccessControlOptions != nil && blobGetAccessControlOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobGetAccessControlOptions.RequestID) } req.Header.Set("x-ms-version", "2019-12-12") req.Header.Set("Accept", "application/xml") @@ -1147,7 +1112,7 @@ func (client blobClient) getAccessControlCreateRequest(ctx context.Context, blob } // getAccessControlHandleResponse handles the GetAccessControl response. -func (client blobClient) getAccessControlHandleResponse(resp *azcore.Response) (BlobGetAccessControlResponse, error) { +func (client *blobClient) getAccessControlHandleResponse(resp *azcore.Response) (BlobGetAccessControlResponse, error) { result := BlobGetAccessControlResponse{RawResponse: resp.Response} if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) @@ -1167,16 +1132,16 @@ func (client blobClient) getAccessControlHandleResponse(resp *azcore.Response) ( result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-owner"); val != "" { - result.Owner = &val + result.XMSOwner = &val } if val := resp.Header.Get("x-ms-group"); val != "" { - result.Group = &val + result.XMSGroup = &val } if val := resp.Header.Get("x-ms-permissions"); val != "" { - result.Permissions = &val + result.XMSPermissions = &val } if val := resp.Header.Get("x-ms-acl"); val != "" { - result.ACL = &val + result.XMSACL = &val } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val @@ -1188,8 +1153,8 @@ func (client blobClient) getAccessControlHandleResponse(resp *azcore.Response) ( } // getAccessControlHandleError handles the GetAccessControl error response. -func (client blobClient) getAccessControlHandleError(resp *azcore.Response) error { - var err DataLakeStorageError +func (client *blobClient) getAccessControlHandleError(resp *azcore.Response) error { +var err DataLakeStorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -1197,43 +1162,39 @@ func (client blobClient) getAccessControlHandleError(resp *azcore.Response) erro } // GetAccountInfo - Returns the sku name and account kind -func (client blobClient) GetAccountInfo(ctx context.Context, options *BlobGetAccountInfoOptions) (BlobGetAccountInfoResponse, error) { +func (client *blobClient) GetAccountInfo(ctx context.Context, options *BlobGetAccountInfoOptions) (BlobGetAccountInfoResponse, error) { req, err := client.getAccountInfoCreateRequest(ctx, options) if err != nil { return BlobGetAccountInfoResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobGetAccountInfoResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return BlobGetAccountInfoResponse{}, client.getAccountInfoHandleError(resp) } - result, err := client.getAccountInfoHandleResponse(resp) - if err != nil { - return BlobGetAccountInfoResponse{}, err - } - return result, nil + return client.getAccountInfoHandleResponse(resp) } // getAccountInfoCreateRequest creates the GetAccountInfo request. -func (client blobClient) getAccountInfoCreateRequest(ctx context.Context, options *BlobGetAccountInfoOptions) (*azcore.Request, error) { +func (client *blobClient) getAccountInfoCreateRequest(ctx context.Context, options *BlobGetAccountInfoOptions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodGet, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("restype", "account") - query.Set("comp", "properties") - req.URL.RawQuery = query.Encode() + reqQP := req.URL.Query() + reqQP.Set("restype", "account") + reqQP.Set("comp", "properties") + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-version", "2019-12-12") req.Header.Set("Accept", "application/xml") return req, nil } // getAccountInfoHandleResponse handles the GetAccountInfo response. -func (client blobClient) getAccountInfoHandleResponse(resp *azcore.Response) (BlobGetAccountInfoResponse, error) { +func (client *blobClient) getAccountInfoHandleResponse(resp *azcore.Response) (BlobGetAccountInfoResponse, error) { result := BlobGetAccountInfoResponse{RawResponse: resp.Response} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val @@ -1261,8 +1222,8 @@ func (client blobClient) getAccountInfoHandleResponse(resp *azcore.Response) (Bl } // getAccountInfoHandleError handles the GetAccountInfo error response. -func (client blobClient) getAccountInfoHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blobClient) getAccountInfoHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -1271,51 +1232,47 @@ func (client blobClient) getAccountInfoHandleError(resp *azcore.Response) error // GetProperties - The Get Properties operation returns all user-defined metadata, standard HTTP properties, and system properties for the blob. It does // not return the content of the blob. -func (client blobClient) GetProperties(ctx context.Context, blobGetPropertiesOptions *BlobGetPropertiesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlobGetPropertiesResponse, error) { +func (client *blobClient) GetProperties(ctx context.Context, blobGetPropertiesOptions *BlobGetPropertiesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlobGetPropertiesResponse, error) { req, err := client.getPropertiesCreateRequest(ctx, blobGetPropertiesOptions, leaseAccessConditions, cpkInfo, modifiedAccessConditions) if err != nil { return BlobGetPropertiesResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobGetPropertiesResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return BlobGetPropertiesResponse{}, client.getPropertiesHandleError(resp) } - result, err := client.getPropertiesHandleResponse(resp) - if err != nil { - return BlobGetPropertiesResponse{}, err - } - return result, nil + return client.getPropertiesHandleResponse(resp) } // getPropertiesCreateRequest creates the GetProperties request. -func (client blobClient) getPropertiesCreateRequest(ctx context.Context, blobGetPropertiesOptions *BlobGetPropertiesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *blobClient) getPropertiesCreateRequest(ctx context.Context, blobGetPropertiesOptions *BlobGetPropertiesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodHead, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() + reqQP := req.URL.Query() if blobGetPropertiesOptions != nil && blobGetPropertiesOptions.Snapshot != nil { - query.Set("snapshot", *blobGetPropertiesOptions.Snapshot) + reqQP.Set("snapshot", *blobGetPropertiesOptions.Snapshot) } - if blobGetPropertiesOptions != nil && blobGetPropertiesOptions.VersionId != nil { - query.Set("versionid", *blobGetPropertiesOptions.VersionId) + if blobGetPropertiesOptions != nil && blobGetPropertiesOptions.VersionID != nil { + reqQP.Set("versionid", *blobGetPropertiesOptions.VersionID) } if blobGetPropertiesOptions != nil && blobGetPropertiesOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobGetPropertiesOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blobGetPropertiesOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + req.URL.RawQuery = reqQP.Encode() + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Header.Set("x-ms-encryption-key", *cpkInfo.EncryptionKey) } - if cpkInfo != nil && cpkInfo.EncryptionKeySha256 != nil { - req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySha256) + if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { + req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySHA256) } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Header.Set("x-ms-encryption-algorithm", "AES256") @@ -1336,15 +1293,15 @@ func (client blobClient) getPropertiesCreateRequest(ctx context.Context, blobGet req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } req.Header.Set("x-ms-version", "2019-12-12") - if blobGetPropertiesOptions != nil && blobGetPropertiesOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobGetPropertiesOptions.RequestId) + if blobGetPropertiesOptions != nil && blobGetPropertiesOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobGetPropertiesOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // getPropertiesHandleResponse handles the GetProperties response. -func (client blobClient) getPropertiesHandleResponse(resp *azcore.Response) (BlobGetPropertiesResponse, error) { +func (client *blobClient) getPropertiesHandleResponse(resp *azcore.Response) (BlobGetPropertiesResponse, error) { result := BlobGetPropertiesResponse{RawResponse: resp.Response} if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) @@ -1360,23 +1317,25 @@ func (client blobClient) getPropertiesHandleResponse(resp *azcore.Response) (Blo } result.CreationTime = &creationTime } + prefix := strings.ToUpper("x-ms-meta-") for hh := range resp.Header { - if strings.HasPrefix(hh, "x-ms-meta-") { + if strings.HasPrefix(strings.ToUpper(hh), prefix) { if result.Metadata == nil { - result.Metadata = &map[string]string{} + result.Metadata = map[string]string{} } - (*result.Metadata)[hh[len("x-ms-meta-"):]] = resp.Header.Get(hh) + result.Metadata[hh[len(prefix):]] = resp.Header.Get(hh) } } if val := resp.Header.Get("x-ms-or-policy-id"); val != "" { result.ObjectReplicationPolicyID = &val } + prefix = strings.ToUpper("x-ms-or-") for hh := range resp.Header { - if strings.HasPrefix(hh, "x-ms-or-") { + if strings.HasPrefix(strings.ToUpper(hh), prefix) { if result.Metadata == nil { - result.Metadata = &map[string]string{} + result.Metadata = map[string]string{} } - (*result.Metadata)[hh[len("x-ms-or-"):]] = resp.Header.Get(hh) + result.Metadata[hh[len(prefix):]] = resp.Header.Get(hh) } } if val := resp.Header.Get("x-ms-blob-type"); val != "" { @@ -1437,11 +1396,11 @@ func (client blobClient) getPropertiesHandleResponse(resp *azcore.Response) (Blo result.ETag = &val } if val := resp.Header.Get("Content-MD5"); val != "" { - contentMd5, err := base64.StdEncoding.DecodeString(val) + contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlobGetPropertiesResponse{}, err } - result.ContentMD5 = &contentMd5 + result.ContentMD5 = &contentMD5 } if val := resp.Header.Get("Content-Encoding"); val != "" { result.ContentEncoding = &val @@ -1560,8 +1519,8 @@ func (client blobClient) getPropertiesHandleResponse(resp *azcore.Response) (Blo } // getPropertiesHandleError handles the GetProperties error response. -func (client blobClient) getPropertiesHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blobClient) getPropertiesHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -1569,47 +1528,43 @@ func (client blobClient) getPropertiesHandleError(resp *azcore.Response) error { } // GetTags - The Get Tags operation enables users to get the tags associated with a blob. -func (client blobClient) GetTags(ctx context.Context, blobGetTagsOptions *BlobGetTagsOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobTagsResponse, error) { +func (client *blobClient) GetTags(ctx context.Context, blobGetTagsOptions *BlobGetTagsOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobTagsResponse, error) { req, err := client.getTagsCreateRequest(ctx, blobGetTagsOptions, modifiedAccessConditions) if err != nil { return BlobTagsResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobTagsResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return BlobTagsResponse{}, client.getTagsHandleError(resp) } - result, err := client.getTagsHandleResponse(resp) - if err != nil { - return BlobTagsResponse{}, err - } - return result, nil + return client.getTagsHandleResponse(resp) } // getTagsCreateRequest creates the GetTags request. -func (client blobClient) getTagsCreateRequest(ctx context.Context, blobGetTagsOptions *BlobGetTagsOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *blobClient) getTagsCreateRequest(ctx context.Context, blobGetTagsOptions *BlobGetTagsOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodGet, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "tags") + reqQP := req.URL.Query() + reqQP.Set("comp", "tags") if blobGetTagsOptions != nil && blobGetTagsOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobGetTagsOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blobGetTagsOptions.Timeout), 10)) } if blobGetTagsOptions != nil && blobGetTagsOptions.Snapshot != nil { - query.Set("snapshot", *blobGetTagsOptions.Snapshot) + reqQP.Set("snapshot", *blobGetTagsOptions.Snapshot) } - if blobGetTagsOptions != nil && blobGetTagsOptions.VersionId != nil { - query.Set("versionid", *blobGetTagsOptions.VersionId) + if blobGetTagsOptions != nil && blobGetTagsOptions.VersionID != nil { + reqQP.Set("versionid", *blobGetTagsOptions.VersionID) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-version", "2019-12-12") - if blobGetTagsOptions != nil && blobGetTagsOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobGetTagsOptions.RequestId) + if blobGetTagsOptions != nil && blobGetTagsOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobGetTagsOptions.RequestID) } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) @@ -1619,8 +1574,12 @@ func (client blobClient) getTagsCreateRequest(ctx context.Context, blobGetTagsOp } // getTagsHandleResponse handles the GetTags response. -func (client blobClient) getTagsHandleResponse(resp *azcore.Response) (BlobTagsResponse, error) { - result := BlobTagsResponse{RawResponse: resp.Response} +func (client *blobClient) getTagsHandleResponse(resp *azcore.Response) (BlobTagsResponse, error) { + var val *BlobTags + if err := resp.UnmarshalAsXML(&val); err != nil { + return BlobTagsResponse{}, err + } + result := BlobTagsResponse{RawResponse: resp.Response, Tags: val} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } @@ -1637,13 +1596,12 @@ func (client blobClient) getTagsHandleResponse(resp *azcore.Response) (BlobTagsR } result.Date = &date } - err := resp.UnmarshalAsXML(&result.Tags) - return result, err + return result, nil } // getTagsHandleError handles the GetTags error response. -func (client blobClient) getTagsHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blobClient) getTagsHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -1651,50 +1609,46 @@ func (client blobClient) getTagsHandleError(resp *azcore.Response) error { } // Query - The Query operation enables users to select/project on blob data by providing simple query expressions. -func (client blobClient) Query(ctx context.Context, blobQueryOptions *BlobQueryOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlobQueryResponse, error) { +func (client *blobClient) Query(ctx context.Context, blobQueryOptions *BlobQueryOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlobQueryResponse, error) { req, err := client.queryCreateRequest(ctx, blobQueryOptions, leaseAccessConditions, cpkInfo, modifiedAccessConditions) if err != nil { return BlobQueryResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobQueryResponse{}, err } if !resp.HasStatusCode(http.StatusOK, http.StatusPartialContent) { return BlobQueryResponse{}, client.queryHandleError(resp) } - result, err := client.queryHandleResponse(resp) - if err != nil { - return BlobQueryResponse{}, err - } - return result, nil + return client.queryHandleResponse(resp) } // queryCreateRequest creates the Query request. -func (client blobClient) queryCreateRequest(ctx context.Context, blobQueryOptions *BlobQueryOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *blobClient) queryCreateRequest(ctx context.Context, blobQueryOptions *BlobQueryOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPost, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "query") + reqQP := req.URL.Query() + reqQP.Set("comp", "query") if blobQueryOptions != nil && blobQueryOptions.Snapshot != nil { - query.Set("snapshot", *blobQueryOptions.Snapshot) + reqQP.Set("snapshot", *blobQueryOptions.Snapshot) } if blobQueryOptions != nil && blobQueryOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobQueryOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blobQueryOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.SkipBodyDownload() - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Header.Set("x-ms-encryption-key", *cpkInfo.EncryptionKey) } - if cpkInfo != nil && cpkInfo.EncryptionKeySha256 != nil { - req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySha256) + if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { + req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySHA256) } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Header.Set("x-ms-encryption-algorithm", "AES256") @@ -1715,18 +1669,18 @@ func (client blobClient) queryCreateRequest(ctx context.Context, blobQueryOption req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } req.Header.Set("x-ms-version", "2019-12-12") - if blobQueryOptions != nil && blobQueryOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobQueryOptions.RequestId) + if blobQueryOptions != nil && blobQueryOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobQueryOptions.RequestID) } req.Header.Set("Accept", "application/xml") - if blobQueryOptions != nil { + if blobQueryOptions != nil && blobQueryOptions.QueryRequest != nil { return req, req.MarshalAsXML(blobQueryOptions.QueryRequest) } return req, nil } // queryHandleResponse handles the Query response. -func (client blobClient) queryHandleResponse(resp *azcore.Response) (BlobQueryResponse, error) { +func (client *blobClient) queryHandleResponse(resp *azcore.Response) (BlobQueryResponse, error) { result := BlobQueryResponse{RawResponse: resp.Response} if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) @@ -1735,12 +1689,13 @@ func (client blobClient) queryHandleResponse(resp *azcore.Response) (BlobQueryRe } result.LastModified = &lastModified } + prefix := strings.ToUpper("x-ms-meta-") for hh := range resp.Header { - if strings.HasPrefix(hh, "x-ms-meta-") { + if strings.HasPrefix(strings.ToUpper(hh), prefix) { if result.Metadata == nil { - result.Metadata = &map[string]string{} + result.Metadata = map[string]string{} } - (*result.Metadata)[hh[len("x-ms-meta-"):]] = resp.Header.Get(hh) + result.Metadata[hh[len(prefix):]] = resp.Header.Get(hh) } } if val := resp.Header.Get("Content-Length"); val != "" { @@ -1760,11 +1715,11 @@ func (client blobClient) queryHandleResponse(resp *azcore.Response) (BlobQueryRe result.ETag = &val } if val := resp.Header.Get("Content-MD5"); val != "" { - contentMd5, err := base64.StdEncoding.DecodeString(val) + contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlobQueryResponse{}, err } - result.ContentMD5 = &contentMd5 + result.ContentMD5 = &contentMD5 } if val := resp.Header.Get("Content-Encoding"); val != "" { result.ContentEncoding = &val @@ -1860,25 +1815,25 @@ func (client blobClient) queryHandleResponse(resp *azcore.Response) (BlobQueryRe result.EncryptionScope = &val } if val := resp.Header.Get("x-ms-blob-content-md5"); val != "" { - blobContentMd5, err := base64.StdEncoding.DecodeString(val) + blobContentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlobQueryResponse{}, err } - result.BlobContentMD5 = &blobContentMd5 + result.BlobContentMD5 = &blobContentMD5 } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { - contentCrc64, err := base64.StdEncoding.DecodeString(val) + contentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlobQueryResponse{}, err } - result.ContentCRC64 = &contentCrc64 + result.ContentCRC64 = &contentCRC64 } return result, nil } // queryHandleError handles the Query error response. -func (client blobClient) queryHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blobClient) queryHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -1886,40 +1841,36 @@ func (client blobClient) queryHandleError(resp *azcore.Response) error { } // ReleaseLease - [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations -func (client blobClient) ReleaseLease(ctx context.Context, leaseId string, blobReleaseLeaseOptions *BlobReleaseLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobReleaseLeaseResponse, error) { - req, err := client.releaseLeaseCreateRequest(ctx, leaseId, blobReleaseLeaseOptions, modifiedAccessConditions) +func (client *blobClient) ReleaseLease(ctx context.Context, leaseID string, blobReleaseLeaseOptions *BlobReleaseLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobReleaseLeaseResponse, error) { + req, err := client.releaseLeaseCreateRequest(ctx, leaseID, blobReleaseLeaseOptions, modifiedAccessConditions) if err != nil { return BlobReleaseLeaseResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobReleaseLeaseResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return BlobReleaseLeaseResponse{}, client.releaseLeaseHandleError(resp) } - result, err := client.releaseLeaseHandleResponse(resp) - if err != nil { - return BlobReleaseLeaseResponse{}, err - } - return result, nil + return client.releaseLeaseHandleResponse(resp) } // releaseLeaseCreateRequest creates the ReleaseLease request. -func (client blobClient) releaseLeaseCreateRequest(ctx context.Context, leaseId string, blobReleaseLeaseOptions *BlobReleaseLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *blobClient) releaseLeaseCreateRequest(ctx context.Context, leaseID string, blobReleaseLeaseOptions *BlobReleaseLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "lease") + reqQP := req.URL.Query() + reqQP.Set("comp", "lease") if blobReleaseLeaseOptions != nil && blobReleaseLeaseOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobReleaseLeaseOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blobReleaseLeaseOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-lease-action", "release") - req.Header.Set("x-ms-lease-id", leaseId) + req.Header.Set("x-ms-lease-id", leaseID) if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Header.Set("If-Modified-Since", modifiedAccessConditions.IfModifiedSince.Format(time.RFC1123)) } @@ -1936,15 +1887,15 @@ func (client blobClient) releaseLeaseCreateRequest(ctx context.Context, leaseId req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } req.Header.Set("x-ms-version", "2019-12-12") - if blobReleaseLeaseOptions != nil && blobReleaseLeaseOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobReleaseLeaseOptions.RequestId) + if blobReleaseLeaseOptions != nil && blobReleaseLeaseOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobReleaseLeaseOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // releaseLeaseHandleResponse handles the ReleaseLease response. -func (client blobClient) releaseLeaseHandleResponse(resp *azcore.Response) (BlobReleaseLeaseResponse, error) { +func (client *blobClient) releaseLeaseHandleResponse(resp *azcore.Response) (BlobReleaseLeaseResponse, error) { result := BlobReleaseLeaseResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -1976,8 +1927,8 @@ func (client blobClient) releaseLeaseHandleResponse(resp *azcore.Response) (Blob } // releaseLeaseHandleError handles the ReleaseLease error response. -func (client blobClient) releaseLeaseHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blobClient) releaseLeaseHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -1989,40 +1940,36 @@ func (client blobClient) releaseLeaseHandleError(resp *azcore.Response) error { // information, see Specifying Conditional Headers for Blob Service Operations [https://docs.microsoft.com/en-us/rest/api/storageservices/specifying-conditional-headers-for-blob-service-operations]. // To // fail if the destination already exists, use a conditional request with If-None-Match: "*". -func (client blobClient) Rename(ctx context.Context, renameSource string, blobRenameOptions *BlobRenameOptions, directoryHttpHeaders *DirectoryHttpHeaders, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (BlobRenameResponse, error) { - req, err := client.renameCreateRequest(ctx, renameSource, blobRenameOptions, directoryHttpHeaders, leaseAccessConditions, modifiedAccessConditions, sourceModifiedAccessConditions) +func (client *blobClient) Rename(ctx context.Context, renameSource string, blobRenameOptions *BlobRenameOptions, directoryHTTPHeaders *DirectoryHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (BlobRenameResponse, error) { + req, err := client.renameCreateRequest(ctx, renameSource, blobRenameOptions, directoryHTTPHeaders, leaseAccessConditions, modifiedAccessConditions, sourceModifiedAccessConditions) if err != nil { return BlobRenameResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobRenameResponse{}, err } if !resp.HasStatusCode(http.StatusCreated) { return BlobRenameResponse{}, client.renameHandleError(resp) } - result, err := client.renameHandleResponse(resp) - if err != nil { - return BlobRenameResponse{}, err - } - return result, nil + return client.renameHandleResponse(resp) } // renameCreateRequest creates the Rename request. -func (client blobClient) renameCreateRequest(ctx context.Context, renameSource string, blobRenameOptions *BlobRenameOptions, directoryHttpHeaders *DirectoryHttpHeaders, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (*azcore.Request, error) { +func (client *blobClient) renameCreateRequest(ctx context.Context, renameSource string, blobRenameOptions *BlobRenameOptions, directoryHTTPHeaders *DirectoryHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() + reqQP := req.URL.Query() if blobRenameOptions != nil && blobRenameOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobRenameOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blobRenameOptions.Timeout), 10)) } if client.pathRenameMode != nil { - query.Set("mode", string(*client.pathRenameMode)) + reqQP.Set("mode", string(*client.pathRenameMode)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-rename-source", renameSource) if blobRenameOptions != nil && blobRenameOptions.DirectoryProperties != nil { req.Header.Set("x-ms-properties", *blobRenameOptions.DirectoryProperties) @@ -2033,26 +1980,26 @@ func (client blobClient) renameCreateRequest(ctx context.Context, renameSource s if blobRenameOptions != nil && blobRenameOptions.PosixUmask != nil { req.Header.Set("x-ms-umask", *blobRenameOptions.PosixUmask) } - if directoryHttpHeaders != nil && directoryHttpHeaders.CacheControl != nil { - req.Header.Set("x-ms-cache-control", *directoryHttpHeaders.CacheControl) + if directoryHTTPHeaders != nil && directoryHTTPHeaders.CacheControl != nil { + req.Header.Set("x-ms-cache-control", *directoryHTTPHeaders.CacheControl) } - if directoryHttpHeaders != nil && directoryHttpHeaders.ContentType != nil { - req.Header.Set("x-ms-content-type", *directoryHttpHeaders.ContentType) + if directoryHTTPHeaders != nil && directoryHTTPHeaders.ContentType != nil { + req.Header.Set("x-ms-content-type", *directoryHTTPHeaders.ContentType) } - if directoryHttpHeaders != nil && directoryHttpHeaders.ContentEncoding != nil { - req.Header.Set("x-ms-content-encoding", *directoryHttpHeaders.ContentEncoding) + if directoryHTTPHeaders != nil && directoryHTTPHeaders.ContentEncoding != nil { + req.Header.Set("x-ms-content-encoding", *directoryHTTPHeaders.ContentEncoding) } - if directoryHttpHeaders != nil && directoryHttpHeaders.ContentLanguage != nil { - req.Header.Set("x-ms-content-language", *directoryHttpHeaders.ContentLanguage) + if directoryHTTPHeaders != nil && directoryHTTPHeaders.ContentLanguage != nil { + req.Header.Set("x-ms-content-language", *directoryHTTPHeaders.ContentLanguage) } - if directoryHttpHeaders != nil && directoryHttpHeaders.ContentDisposition != nil { - req.Header.Set("x-ms-content-disposition", *directoryHttpHeaders.ContentDisposition) + if directoryHTTPHeaders != nil && directoryHTTPHeaders.ContentDisposition != nil { + req.Header.Set("x-ms-content-disposition", *directoryHTTPHeaders.ContentDisposition) } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } - if blobRenameOptions != nil && blobRenameOptions.SourceLeaseId != nil { - req.Header.Set("x-ms-source-lease-id", *blobRenameOptions.SourceLeaseId) + if blobRenameOptions != nil && blobRenameOptions.SourceLeaseID != nil { + req.Header.Set("x-ms-source-lease-id", *blobRenameOptions.SourceLeaseID) } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Header.Set("If-Modified-Since", modifiedAccessConditions.IfModifiedSince.Format(time.RFC1123)) @@ -2079,15 +2026,15 @@ func (client blobClient) renameCreateRequest(ctx context.Context, renameSource s req.Header.Set("x-ms-source-if-none-match", *sourceModifiedAccessConditions.SourceIfNoneMatch) } req.Header.Set("x-ms-version", "2019-12-12") - if blobRenameOptions != nil && blobRenameOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobRenameOptions.RequestId) + if blobRenameOptions != nil && blobRenameOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobRenameOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // renameHandleResponse handles the Rename response. -func (client blobClient) renameHandleResponse(resp *azcore.Response) (BlobRenameResponse, error) { +func (client *blobClient) renameHandleResponse(resp *azcore.Response) (BlobRenameResponse, error) { result := BlobRenameResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -2126,8 +2073,8 @@ func (client blobClient) renameHandleResponse(resp *azcore.Response) (BlobRename } // renameHandleError handles the Rename error response. -func (client blobClient) renameHandleError(resp *azcore.Response) error { - var err DataLakeStorageError +func (client *blobClient) renameHandleError(resp *azcore.Response) error { +var err DataLakeStorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -2135,40 +2082,36 @@ func (client blobClient) renameHandleError(resp *azcore.Response) error { } // RenewLease - [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations -func (client blobClient) RenewLease(ctx context.Context, leaseId string, blobRenewLeaseOptions *BlobRenewLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobRenewLeaseResponse, error) { - req, err := client.renewLeaseCreateRequest(ctx, leaseId, blobRenewLeaseOptions, modifiedAccessConditions) +func (client *blobClient) RenewLease(ctx context.Context, leaseID string, blobRenewLeaseOptions *BlobRenewLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobRenewLeaseResponse, error) { + req, err := client.renewLeaseCreateRequest(ctx, leaseID, blobRenewLeaseOptions, modifiedAccessConditions) if err != nil { return BlobRenewLeaseResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobRenewLeaseResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return BlobRenewLeaseResponse{}, client.renewLeaseHandleError(resp) } - result, err := client.renewLeaseHandleResponse(resp) - if err != nil { - return BlobRenewLeaseResponse{}, err - } - return result, nil + return client.renewLeaseHandleResponse(resp) } // renewLeaseCreateRequest creates the RenewLease request. -func (client blobClient) renewLeaseCreateRequest(ctx context.Context, leaseId string, blobRenewLeaseOptions *BlobRenewLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *blobClient) renewLeaseCreateRequest(ctx context.Context, leaseID string, blobRenewLeaseOptions *BlobRenewLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "lease") + reqQP := req.URL.Query() + reqQP.Set("comp", "lease") if blobRenewLeaseOptions != nil && blobRenewLeaseOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobRenewLeaseOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blobRenewLeaseOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-lease-action", "renew") - req.Header.Set("x-ms-lease-id", leaseId) + req.Header.Set("x-ms-lease-id", leaseID) if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Header.Set("If-Modified-Since", modifiedAccessConditions.IfModifiedSince.Format(time.RFC1123)) } @@ -2185,15 +2128,15 @@ func (client blobClient) renewLeaseCreateRequest(ctx context.Context, leaseId st req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } req.Header.Set("x-ms-version", "2019-12-12") - if blobRenewLeaseOptions != nil && blobRenewLeaseOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobRenewLeaseOptions.RequestId) + if blobRenewLeaseOptions != nil && blobRenewLeaseOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobRenewLeaseOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // renewLeaseHandleResponse handles the RenewLease response. -func (client blobClient) renewLeaseHandleResponse(resp *azcore.Response) (BlobRenewLeaseResponse, error) { +func (client *blobClient) renewLeaseHandleResponse(resp *azcore.Response) (BlobRenewLeaseResponse, error) { result := BlobRenewLeaseResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -2228,8 +2171,8 @@ func (client blobClient) renewLeaseHandleResponse(resp *azcore.Response) (BlobRe } // renewLeaseHandleError handles the RenewLease error response. -func (client blobClient) renewLeaseHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blobClient) renewLeaseHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -2237,40 +2180,36 @@ func (client blobClient) renewLeaseHandleError(resp *azcore.Response) error { } // SetAccessControl - Set the owner, group, permissions, or access control list for a blob. -func (client blobClient) SetAccessControl(ctx context.Context, blobSetAccessControlOptions *BlobSetAccessControlOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (BlobSetAccessControlResponse, error) { +func (client *blobClient) SetAccessControl(ctx context.Context, blobSetAccessControlOptions *BlobSetAccessControlOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (BlobSetAccessControlResponse, error) { req, err := client.setAccessControlCreateRequest(ctx, blobSetAccessControlOptions, leaseAccessConditions, modifiedAccessConditions) if err != nil { return BlobSetAccessControlResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobSetAccessControlResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return BlobSetAccessControlResponse{}, client.setAccessControlHandleError(resp) } - result, err := client.setAccessControlHandleResponse(resp) - if err != nil { - return BlobSetAccessControlResponse{}, err - } - return result, nil + return client.setAccessControlHandleResponse(resp) } // setAccessControlCreateRequest creates the SetAccessControl request. -func (client blobClient) setAccessControlCreateRequest(ctx context.Context, blobSetAccessControlOptions *BlobSetAccessControlOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *blobClient) setAccessControlCreateRequest(ctx context.Context, blobSetAccessControlOptions *BlobSetAccessControlOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPatch, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("action", "setAccessControl") + reqQP := req.URL.Query() + reqQP.Set("action", "setAccessControl") if blobSetAccessControlOptions != nil && blobSetAccessControlOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobSetAccessControlOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blobSetAccessControlOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + req.URL.RawQuery = reqQP.Encode() + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if blobSetAccessControlOptions != nil && blobSetAccessControlOptions.Owner != nil { req.Header.Set("x-ms-owner", *blobSetAccessControlOptions.Owner) @@ -2281,8 +2220,8 @@ func (client blobClient) setAccessControlCreateRequest(ctx context.Context, blob if blobSetAccessControlOptions != nil && blobSetAccessControlOptions.PosixPermissions != nil { req.Header.Set("x-ms-permissions", *blobSetAccessControlOptions.PosixPermissions) } - if blobSetAccessControlOptions != nil && blobSetAccessControlOptions.PosixAcl != nil { - req.Header.Set("x-ms-acl", *blobSetAccessControlOptions.PosixAcl) + if blobSetAccessControlOptions != nil && blobSetAccessControlOptions.PosixACL != nil { + req.Header.Set("x-ms-acl", *blobSetAccessControlOptions.PosixACL) } if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Header.Set("If-Match", *modifiedAccessConditions.IfMatch) @@ -2296,8 +2235,8 @@ func (client blobClient) setAccessControlCreateRequest(ctx context.Context, blob if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Header.Set("If-Unmodified-Since", modifiedAccessConditions.IfUnmodifiedSince.Format(time.RFC1123)) } - if blobSetAccessControlOptions != nil && blobSetAccessControlOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobSetAccessControlOptions.RequestId) + if blobSetAccessControlOptions != nil && blobSetAccessControlOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobSetAccessControlOptions.RequestID) } req.Header.Set("x-ms-version", "2019-12-12") req.Header.Set("Accept", "application/xml") @@ -2305,7 +2244,7 @@ func (client blobClient) setAccessControlCreateRequest(ctx context.Context, blob } // setAccessControlHandleResponse handles the SetAccessControl response. -func (client blobClient) setAccessControlHandleResponse(resp *azcore.Response) (BlobSetAccessControlResponse, error) { +func (client *blobClient) setAccessControlHandleResponse(resp *azcore.Response) (BlobSetAccessControlResponse, error) { result := BlobSetAccessControlResponse{RawResponse: resp.Response} if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) @@ -2334,8 +2273,8 @@ func (client blobClient) setAccessControlHandleResponse(resp *azcore.Response) ( } // setAccessControlHandleError handles the SetAccessControl error response. -func (client blobClient) setAccessControlHandleError(resp *azcore.Response) error { - var err DataLakeStorageError +func (client *blobClient) setAccessControlHandleError(resp *azcore.Response) error { +var err DataLakeStorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -2343,41 +2282,37 @@ func (client blobClient) setAccessControlHandleError(resp *azcore.Response) erro } // SetExpiry - Sets the time a blob will expire and be deleted. -func (client blobClient) SetExpiry(ctx context.Context, expiryOptions BlobExpiryOptions, options *BlobSetExpiryOptions) (BlobSetExpiryResponse, error) { +func (client *blobClient) SetExpiry(ctx context.Context, expiryOptions BlobExpiryOptions, options *BlobSetExpiryOptions) (BlobSetExpiryResponse, error) { req, err := client.setExpiryCreateRequest(ctx, expiryOptions, options) if err != nil { return BlobSetExpiryResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobSetExpiryResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return BlobSetExpiryResponse{}, client.setExpiryHandleError(resp) } - result, err := client.setExpiryHandleResponse(resp) - if err != nil { - return BlobSetExpiryResponse{}, err - } - return result, nil + return client.setExpiryHandleResponse(resp) } // setExpiryCreateRequest creates the SetExpiry request. -func (client blobClient) setExpiryCreateRequest(ctx context.Context, expiryOptions BlobExpiryOptions, options *BlobSetExpiryOptions) (*azcore.Request, error) { +func (client *blobClient) setExpiryCreateRequest(ctx context.Context, expiryOptions BlobExpiryOptions, options *BlobSetExpiryOptions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "expiry") + reqQP := req.URL.Query() + reqQP.Set("comp", "expiry") if options != nil && options.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-version", "2019-12-12") - if options != nil && options.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *options.RequestId) + if options != nil && options.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *options.RequestID) } req.Header.Set("x-ms-expiry-option", string(expiryOptions)) if options != nil && options.ExpiresOn != nil { @@ -2388,7 +2323,7 @@ func (client blobClient) setExpiryCreateRequest(ctx context.Context, expiryOptio } // setExpiryHandleResponse handles the SetExpiry response. -func (client blobClient) setExpiryHandleResponse(resp *azcore.Response) (BlobSetExpiryResponse, error) { +func (client *blobClient) setExpiryHandleResponse(resp *azcore.Response) (BlobSetExpiryResponse, error) { result := BlobSetExpiryResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -2420,8 +2355,8 @@ func (client blobClient) setExpiryHandleResponse(resp *azcore.Response) (BlobSet } // setExpiryHandleError handles the SetExpiry error response. -func (client blobClient) setExpiryHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blobClient) setExpiryHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -2429,55 +2364,51 @@ func (client blobClient) setExpiryHandleError(resp *azcore.Response) error { } // SetHTTPHeaders - The Set HTTP Headers operation sets system properties on the blob -func (client blobClient) SetHTTPHeaders(ctx context.Context, blobSetHttpHeadersOptions *BlobSetHTTPHeadersOptions, blobHttpHeaders *BlobHttpHeaders, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (BlobSetHTTPHeadersResponse, error) { - req, err := client.setHttpHeadersCreateRequest(ctx, blobSetHttpHeadersOptions, blobHttpHeaders, leaseAccessConditions, modifiedAccessConditions) +func (client *blobClient) SetHTTPHeaders(ctx context.Context, blobSetHTTPHeadersOptions *BlobSetHTTPHeadersOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (BlobSetHTTPHeadersResponse, error) { + req, err := client.setHTTPHeadersCreateRequest(ctx, blobSetHTTPHeadersOptions, blobHTTPHeaders, leaseAccessConditions, modifiedAccessConditions) if err != nil { return BlobSetHTTPHeadersResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobSetHTTPHeadersResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { - return BlobSetHTTPHeadersResponse{}, client.setHttpHeadersHandleError(resp) + return BlobSetHTTPHeadersResponse{}, client.setHTTPHeadersHandleError(resp) } - result, err := client.setHttpHeadersHandleResponse(resp) - if err != nil { - return BlobSetHTTPHeadersResponse{}, err - } - return result, nil + return client.setHTTPHeadersHandleResponse(resp) } -// setHttpHeadersCreateRequest creates the SetHTTPHeaders request. -func (client blobClient) setHttpHeadersCreateRequest(ctx context.Context, blobSetHttpHeadersOptions *BlobSetHTTPHeadersOptions, blobHttpHeaders *BlobHttpHeaders, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +// setHTTPHeadersCreateRequest creates the SetHTTPHeaders request. +func (client *blobClient) setHTTPHeadersCreateRequest(ctx context.Context, blobSetHTTPHeadersOptions *BlobSetHTTPHeadersOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "properties") - if blobSetHttpHeadersOptions != nil && blobSetHttpHeadersOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobSetHttpHeadersOptions.Timeout), 10)) + reqQP := req.URL.Query() + reqQP.Set("comp", "properties") + if blobSetHTTPHeadersOptions != nil && blobSetHTTPHeadersOptions.Timeout != nil { + reqQP.Set("timeout", strconv.FormatInt(int64(*blobSetHTTPHeadersOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() - if blobHttpHeaders != nil && blobHttpHeaders.BlobCacheControl != nil { - req.Header.Set("x-ms-blob-cache-control", *blobHttpHeaders.BlobCacheControl) + req.URL.RawQuery = reqQP.Encode() + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobCacheControl != nil { + req.Header.Set("x-ms-blob-cache-control", *blobHTTPHeaders.BlobCacheControl) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentType != nil { - req.Header.Set("x-ms-blob-content-type", *blobHttpHeaders.BlobContentType) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentType != nil { + req.Header.Set("x-ms-blob-content-type", *blobHTTPHeaders.BlobContentType) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentMd5 != nil { - req.Header.Set("x-ms-blob-content-md5", base64.StdEncoding.EncodeToString(*blobHttpHeaders.BlobContentMd5)) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentMD5 != nil { + req.Header.Set("x-ms-blob-content-md5", base64.StdEncoding.EncodeToString(*blobHTTPHeaders.BlobContentMD5)) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentEncoding != nil { - req.Header.Set("x-ms-blob-content-encoding", *blobHttpHeaders.BlobContentEncoding) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentEncoding != nil { + req.Header.Set("x-ms-blob-content-encoding", *blobHTTPHeaders.BlobContentEncoding) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentLanguage != nil { - req.Header.Set("x-ms-blob-content-language", *blobHttpHeaders.BlobContentLanguage) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentLanguage != nil { + req.Header.Set("x-ms-blob-content-language", *blobHTTPHeaders.BlobContentLanguage) } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Header.Set("If-Modified-Since", modifiedAccessConditions.IfModifiedSince.Format(time.RFC1123)) @@ -2494,19 +2425,19 @@ func (client blobClient) setHttpHeadersCreateRequest(ctx context.Context, blobSe if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentDisposition != nil { - req.Header.Set("x-ms-blob-content-disposition", *blobHttpHeaders.BlobContentDisposition) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentDisposition != nil { + req.Header.Set("x-ms-blob-content-disposition", *blobHTTPHeaders.BlobContentDisposition) } req.Header.Set("x-ms-version", "2019-12-12") - if blobSetHttpHeadersOptions != nil && blobSetHttpHeadersOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobSetHttpHeadersOptions.RequestId) + if blobSetHTTPHeadersOptions != nil && blobSetHTTPHeadersOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobSetHTTPHeadersOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } -// setHttpHeadersHandleResponse handles the SetHTTPHeaders response. -func (client blobClient) setHttpHeadersHandleResponse(resp *azcore.Response) (BlobSetHTTPHeadersResponse, error) { +// setHTTPHeadersHandleResponse handles the SetHTTPHeaders response. +func (client *blobClient) setHTTPHeadersHandleResponse(resp *azcore.Response) (BlobSetHTTPHeadersResponse, error) { result := BlobSetHTTPHeadersResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -2544,9 +2475,9 @@ func (client blobClient) setHttpHeadersHandleResponse(resp *azcore.Response) (Bl return result, nil } -// setHttpHeadersHandleError handles the SetHTTPHeaders error response. -func (client blobClient) setHttpHeadersHandleError(resp *azcore.Response) error { - var err StorageError +// setHTTPHeadersHandleError handles the SetHTTPHeaders error response. +func (client *blobClient) setHTTPHeadersHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -2554,51 +2485,47 @@ func (client blobClient) setHttpHeadersHandleError(resp *azcore.Response) error } // SetMetadata - The Set Blob Metadata operation sets user-defined metadata for the specified blob as one or more name-value pairs -func (client blobClient) SetMetadata(ctx context.Context, blobSetMetadataOptions *BlobSetMetadataOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlobSetMetadataResponse, error) { +func (client *blobClient) SetMetadata(ctx context.Context, blobSetMetadataOptions *BlobSetMetadataOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlobSetMetadataResponse, error) { req, err := client.setMetadataCreateRequest(ctx, blobSetMetadataOptions, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) if err != nil { return BlobSetMetadataResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobSetMetadataResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return BlobSetMetadataResponse{}, client.setMetadataHandleError(resp) } - result, err := client.setMetadataHandleResponse(resp) - if err != nil { - return BlobSetMetadataResponse{}, err - } - return result, nil + return client.setMetadataHandleResponse(resp) } // setMetadataCreateRequest creates the SetMetadata request. -func (client blobClient) setMetadataCreateRequest(ctx context.Context, blobSetMetadataOptions *BlobSetMetadataOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *blobClient) setMetadataCreateRequest(ctx context.Context, blobSetMetadataOptions *BlobSetMetadataOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "metadata") + reqQP := req.URL.Query() + reqQP.Set("comp", "metadata") if blobSetMetadataOptions != nil && blobSetMetadataOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobSetMetadataOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blobSetMetadataOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() if blobSetMetadataOptions != nil && blobSetMetadataOptions.Metadata != nil { for k, v := range *blobSetMetadataOptions.Metadata { req.Header.Set("x-ms-meta-"+k, v) } } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Header.Set("x-ms-encryption-key", *cpkInfo.EncryptionKey) } - if cpkInfo != nil && cpkInfo.EncryptionKeySha256 != nil { - req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySha256) + if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { + req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySHA256) } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Header.Set("x-ms-encryption-algorithm", "AES256") @@ -2622,15 +2549,15 @@ func (client blobClient) setMetadataCreateRequest(ctx context.Context, blobSetMe req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } req.Header.Set("x-ms-version", "2019-12-12") - if blobSetMetadataOptions != nil && blobSetMetadataOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobSetMetadataOptions.RequestId) + if blobSetMetadataOptions != nil && blobSetMetadataOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobSetMetadataOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // setMetadataHandleResponse handles the SetMetadata response. -func (client blobClient) setMetadataHandleResponse(resp *azcore.Response) (BlobSetMetadataResponse, error) { +func (client *blobClient) setMetadataHandleResponse(resp *azcore.Response) (BlobSetMetadataResponse, error) { result := BlobSetMetadataResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -2678,8 +2605,8 @@ func (client blobClient) setMetadataHandleResponse(resp *azcore.Response) (BlobS } // setMetadataHandleError handles the SetMetadata error response. -func (client blobClient) setMetadataHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blobClient) setMetadataHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -2687,63 +2614,59 @@ func (client blobClient) setMetadataHandleError(resp *azcore.Response) error { } // SetTags - The Set Tags operation enables users to set tags on a blob. -func (client blobClient) SetTags(ctx context.Context, blobSetTagsOptions *BlobSetTagsOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobSetTagsResponse, error) { +func (client *blobClient) SetTags(ctx context.Context, blobSetTagsOptions *BlobSetTagsOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobSetTagsResponse, error) { req, err := client.setTagsCreateRequest(ctx, blobSetTagsOptions, modifiedAccessConditions) if err != nil { return BlobSetTagsResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobSetTagsResponse{}, err } if !resp.HasStatusCode(http.StatusNoContent) { return BlobSetTagsResponse{}, client.setTagsHandleError(resp) } - result, err := client.setTagsHandleResponse(resp) - if err != nil { - return BlobSetTagsResponse{}, err - } - return result, nil + return client.setTagsHandleResponse(resp) } // setTagsCreateRequest creates the SetTags request. -func (client blobClient) setTagsCreateRequest(ctx context.Context, blobSetTagsOptions *BlobSetTagsOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *blobClient) setTagsCreateRequest(ctx context.Context, blobSetTagsOptions *BlobSetTagsOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "tags") + reqQP := req.URL.Query() + reqQP.Set("comp", "tags") if blobSetTagsOptions != nil && blobSetTagsOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobSetTagsOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blobSetTagsOptions.Timeout), 10)) } - if blobSetTagsOptions != nil && blobSetTagsOptions.VersionId != nil { - query.Set("versionid", *blobSetTagsOptions.VersionId) + if blobSetTagsOptions != nil && blobSetTagsOptions.VersionID != nil { + reqQP.Set("versionid", *blobSetTagsOptions.VersionID) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-version", "2019-12-12") - if blobSetTagsOptions != nil && blobSetTagsOptions.TransactionalContentMd5 != nil { - req.Header.Set("Content-MD5", base64.StdEncoding.EncodeToString(*blobSetTagsOptions.TransactionalContentMd5)) + if blobSetTagsOptions != nil && blobSetTagsOptions.TransactionalContentMD5 != nil { + req.Header.Set("Content-MD5", base64.StdEncoding.EncodeToString(*blobSetTagsOptions.TransactionalContentMD5)) } - if blobSetTagsOptions != nil && blobSetTagsOptions.TransactionalContentCrc64 != nil { - req.Header.Set("x-ms-content-crc64", base64.StdEncoding.EncodeToString(*blobSetTagsOptions.TransactionalContentCrc64)) + if blobSetTagsOptions != nil && blobSetTagsOptions.TransactionalContentCRC64 != nil { + req.Header.Set("x-ms-content-crc64", base64.StdEncoding.EncodeToString(*blobSetTagsOptions.TransactionalContentCRC64)) } - if blobSetTagsOptions != nil && blobSetTagsOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobSetTagsOptions.RequestId) + if blobSetTagsOptions != nil && blobSetTagsOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobSetTagsOptions.RequestID) } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } req.Header.Set("Accept", "application/xml") - if blobSetTagsOptions != nil { + if blobSetTagsOptions != nil && blobSetTagsOptions.Tags != nil { return req, req.MarshalAsXML(blobSetTagsOptions.Tags) } return req, nil } // setTagsHandleResponse handles the SetTags response. -func (client blobClient) setTagsHandleResponse(resp *azcore.Response) (BlobSetTagsResponse, error) { +func (client *blobClient) setTagsHandleResponse(resp *azcore.Response) (BlobSetTagsResponse, error) { result := BlobSetTagsResponse{RawResponse: resp.Response} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val @@ -2765,8 +2688,8 @@ func (client blobClient) setTagsHandleResponse(resp *azcore.Response) (BlobSetTa } // setTagsHandleError handles the SetTags error response. -func (client blobClient) setTagsHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blobClient) setTagsHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -2777,54 +2700,50 @@ func (client blobClient) setTagsHandleError(resp *azcore.Response) error { // a blob storage account (locally redundant storage only). A // premium page blob's tier determines the allowed size, IOPS, and bandwidth of the blob. A block blob's tier determines Hot/Cool/Archive storage type. // This operation does not update the blob's ETag. -func (client blobClient) SetTier(ctx context.Context, tier AccessTier, blobSetTierOptions *BlobSetTierOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (BlobSetTierResponse, error) { +func (client *blobClient) SetTier(ctx context.Context, tier AccessTier, blobSetTierOptions *BlobSetTierOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (BlobSetTierResponse, error) { req, err := client.setTierCreateRequest(ctx, tier, blobSetTierOptions, leaseAccessConditions, modifiedAccessConditions) if err != nil { return BlobSetTierResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobSetTierResponse{}, err } if !resp.HasStatusCode(http.StatusOK, http.StatusAccepted) { return BlobSetTierResponse{}, client.setTierHandleError(resp) } - result, err := client.setTierHandleResponse(resp) - if err != nil { - return BlobSetTierResponse{}, err - } - return result, nil + return client.setTierHandleResponse(resp) } // setTierCreateRequest creates the SetTier request. -func (client blobClient) setTierCreateRequest(ctx context.Context, tier AccessTier, blobSetTierOptions *BlobSetTierOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *blobClient) setTierCreateRequest(ctx context.Context, tier AccessTier, blobSetTierOptions *BlobSetTierOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "tier") + reqQP := req.URL.Query() + reqQP.Set("comp", "tier") if blobSetTierOptions != nil && blobSetTierOptions.Snapshot != nil { - query.Set("snapshot", *blobSetTierOptions.Snapshot) + reqQP.Set("snapshot", *blobSetTierOptions.Snapshot) } - if blobSetTierOptions != nil && blobSetTierOptions.VersionId != nil { - query.Set("versionid", *blobSetTierOptions.VersionId) + if blobSetTierOptions != nil && blobSetTierOptions.VersionID != nil { + reqQP.Set("versionid", *blobSetTierOptions.VersionID) } if blobSetTierOptions != nil && blobSetTierOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobSetTierOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blobSetTierOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-access-tier", string(tier)) if blobSetTierOptions != nil && blobSetTierOptions.RehydratePriority != nil { req.Header.Set("x-ms-rehydrate-priority", string(*blobSetTierOptions.RehydratePriority)) } req.Header.Set("x-ms-version", "2019-12-12") - if blobSetTierOptions != nil && blobSetTierOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobSetTierOptions.RequestId) + if blobSetTierOptions != nil && blobSetTierOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobSetTierOptions.RequestID) } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) @@ -2834,7 +2753,7 @@ func (client blobClient) setTierCreateRequest(ctx context.Context, tier AccessTi } // setTierHandleResponse handles the SetTier response. -func (client blobClient) setTierHandleResponse(resp *azcore.Response) (BlobSetTierResponse, error) { +func (client *blobClient) setTierHandleResponse(resp *azcore.Response) (BlobSetTierResponse, error) { result := BlobSetTierResponse{RawResponse: resp.Response} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val @@ -2849,8 +2768,8 @@ func (client blobClient) setTierHandleResponse(resp *azcore.Response) (BlobSetTi } // setTierHandleError handles the SetTier error response. -func (client blobClient) setTierHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blobClient) setTierHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -2858,47 +2777,43 @@ func (client blobClient) setTierHandleError(resp *azcore.Response) error { } // StartCopyFromURL - The Start Copy From URL operation copies a blob or an internet resource to a new blob. -func (client blobClient) StartCopyFromURL(ctx context.Context, copySource url.URL, blobStartCopyFromUrlOptions *BlobStartCopyFromURLOptions, sourceModifiedAccessConditions *SourceModifiedAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (BlobStartCopyFromURLResponse, error) { - req, err := client.startCopyFromUrlCreateRequest(ctx, copySource, blobStartCopyFromUrlOptions, sourceModifiedAccessConditions, modifiedAccessConditions, leaseAccessConditions) +func (client *blobClient) StartCopyFromURL(ctx context.Context, copySource string, blobStartCopyFromURLOptions *BlobStartCopyFromURLOptions, sourceModifiedAccessConditions *SourceModifiedAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (BlobStartCopyFromURLResponse, error) { + req, err := client.startCopyFromURLCreateRequest(ctx, copySource, blobStartCopyFromURLOptions, sourceModifiedAccessConditions, modifiedAccessConditions, leaseAccessConditions) if err != nil { return BlobStartCopyFromURLResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobStartCopyFromURLResponse{}, err } if !resp.HasStatusCode(http.StatusAccepted) { - return BlobStartCopyFromURLResponse{}, client.startCopyFromUrlHandleError(resp) - } - result, err := client.startCopyFromUrlHandleResponse(resp) - if err != nil { - return BlobStartCopyFromURLResponse{}, err + return BlobStartCopyFromURLResponse{}, client.startCopyFromURLHandleError(resp) } - return result, nil + return client.startCopyFromURLHandleResponse(resp) } -// startCopyFromUrlCreateRequest creates the StartCopyFromURL request. -func (client blobClient) startCopyFromUrlCreateRequest(ctx context.Context, copySource url.URL, blobStartCopyFromUrlOptions *BlobStartCopyFromURLOptions, sourceModifiedAccessConditions *SourceModifiedAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (*azcore.Request, error) { +// startCopyFromURLCreateRequest creates the StartCopyFromURL request. +func (client *blobClient) startCopyFromURLCreateRequest(ctx context.Context, copySource string, blobStartCopyFromURLOptions *BlobStartCopyFromURLOptions, sourceModifiedAccessConditions *SourceModifiedAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - if blobStartCopyFromUrlOptions != nil && blobStartCopyFromUrlOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blobStartCopyFromUrlOptions.Timeout), 10)) + reqQP := req.URL.Query() + if blobStartCopyFromURLOptions != nil && blobStartCopyFromURLOptions.Timeout != nil { + reqQP.Set("timeout", strconv.FormatInt(int64(*blobStartCopyFromURLOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() - if blobStartCopyFromUrlOptions != nil && blobStartCopyFromUrlOptions.Metadata != nil { - for k, v := range *blobStartCopyFromUrlOptions.Metadata { + req.URL.RawQuery = reqQP.Encode() + if blobStartCopyFromURLOptions != nil && blobStartCopyFromURLOptions.Metadata != nil { + for k, v := range *blobStartCopyFromURLOptions.Metadata { req.Header.Set("x-ms-meta-"+k, v) } } - if blobStartCopyFromUrlOptions != nil && blobStartCopyFromUrlOptions.Tier != nil { - req.Header.Set("x-ms-access-tier", string(*blobStartCopyFromUrlOptions.Tier)) + if blobStartCopyFromURLOptions != nil && blobStartCopyFromURLOptions.Tier != nil { + req.Header.Set("x-ms-access-tier", string(*blobStartCopyFromURLOptions.Tier)) } - if blobStartCopyFromUrlOptions != nil && blobStartCopyFromUrlOptions.RehydratePriority != nil { - req.Header.Set("x-ms-rehydrate-priority", string(*blobStartCopyFromUrlOptions.RehydratePriority)) + if blobStartCopyFromURLOptions != nil && blobStartCopyFromURLOptions.RehydratePriority != nil { + req.Header.Set("x-ms-rehydrate-priority", string(*blobStartCopyFromURLOptions.RehydratePriority)) } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfModifiedSince != nil { req.Header.Set("x-ms-source-if-modified-since", sourceModifiedAccessConditions.SourceIfModifiedSince.Format(time.RFC1123)) @@ -2930,26 +2845,26 @@ func (client blobClient) startCopyFromUrlCreateRequest(ctx context.Context, copy if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } - req.Header.Set("x-ms-copy-source", copySource.String()) - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + req.Header.Set("x-ms-copy-source", copySource) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } req.Header.Set("x-ms-version", "2019-12-12") - if blobStartCopyFromUrlOptions != nil && blobStartCopyFromUrlOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blobStartCopyFromUrlOptions.RequestId) + if blobStartCopyFromURLOptions != nil && blobStartCopyFromURLOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blobStartCopyFromURLOptions.RequestID) } - if blobStartCopyFromUrlOptions != nil && blobStartCopyFromUrlOptions.BlobTagsString != nil { - req.Header.Set("x-ms-tags", *blobStartCopyFromUrlOptions.BlobTagsString) + if blobStartCopyFromURLOptions != nil && blobStartCopyFromURLOptions.BlobTagsString != nil { + req.Header.Set("x-ms-tags", *blobStartCopyFromURLOptions.BlobTagsString) } - if blobStartCopyFromUrlOptions != nil && blobStartCopyFromUrlOptions.SealBlob != nil { - req.Header.Set("x-ms-seal-blob", strconv.FormatBool(*blobStartCopyFromUrlOptions.SealBlob)) + if blobStartCopyFromURLOptions != nil && blobStartCopyFromURLOptions.SealBlob != nil { + req.Header.Set("x-ms-seal-blob", strconv.FormatBool(*blobStartCopyFromURLOptions.SealBlob)) } req.Header.Set("Accept", "application/xml") return req, nil } -// startCopyFromUrlHandleResponse handles the StartCopyFromURL response. -func (client blobClient) startCopyFromUrlHandleResponse(resp *azcore.Response) (BlobStartCopyFromURLResponse, error) { +// startCopyFromURLHandleResponse handles the StartCopyFromURL response. +func (client *blobClient) startCopyFromURLHandleResponse(resp *azcore.Response) (BlobStartCopyFromURLResponse, error) { result := BlobStartCopyFromURLResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -2989,9 +2904,9 @@ func (client blobClient) startCopyFromUrlHandleResponse(resp *azcore.Response) ( return result, nil } -// startCopyFromUrlHandleError handles the StartCopyFromURL error response. -func (client blobClient) startCopyFromUrlHandleError(resp *azcore.Response) error { - var err StorageError +// startCopyFromURLHandleError handles the StartCopyFromURL error response. +func (client *blobClient) startCopyFromURLHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -2999,48 +2914,44 @@ func (client blobClient) startCopyFromUrlHandleError(resp *azcore.Response) erro } // Undelete - Undelete a blob that was previously soft deleted -func (client blobClient) Undelete(ctx context.Context, options *BlobUndeleteOptions) (BlobUndeleteResponse, error) { +func (client *blobClient) Undelete(ctx context.Context, options *BlobUndeleteOptions) (BlobUndeleteResponse, error) { req, err := client.undeleteCreateRequest(ctx, options) if err != nil { return BlobUndeleteResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlobUndeleteResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return BlobUndeleteResponse{}, client.undeleteHandleError(resp) } - result, err := client.undeleteHandleResponse(resp) - if err != nil { - return BlobUndeleteResponse{}, err - } - return result, nil + return client.undeleteHandleResponse(resp) } // undeleteCreateRequest creates the Undelete request. -func (client blobClient) undeleteCreateRequest(ctx context.Context, options *BlobUndeleteOptions) (*azcore.Request, error) { +func (client *blobClient) undeleteCreateRequest(ctx context.Context, options *BlobUndeleteOptions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "undelete") + reqQP := req.URL.Query() + reqQP.Set("comp", "undelete") if options != nil && options.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-version", "2019-12-12") - if options != nil && options.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *options.RequestId) + if options != nil && options.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *options.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // undeleteHandleResponse handles the Undelete response. -func (client blobClient) undeleteHandleResponse(resp *azcore.Response) (BlobUndeleteResponse, error) { +func (client *blobClient) undeleteHandleResponse(resp *azcore.Response) (BlobUndeleteResponse, error) { result := BlobUndeleteResponse{RawResponse: resp.Response} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val @@ -3062,10 +2973,11 @@ func (client blobClient) undeleteHandleResponse(resp *azcore.Response) (BlobUnde } // undeleteHandleError handles the Undelete error response. -func (client blobClient) undeleteHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blobClient) undeleteHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } return azcore.NewResponseError(&err, resp.Response) } + diff --git a/sdk/storage/azblob/zz_generated_blockblob.go b/sdk/storage/azblob/zz_generated_blockblob_client.go similarity index 66% rename from sdk/storage/azblob/zz_generated_blockblob.go rename to sdk/storage/azblob/zz_generated_blockblob_client.go index 502672b03f4c..19a4b70d972e 100644 --- a/sdk/storage/azblob/zz_generated_blockblob.go +++ b/sdk/storage/azblob/zz_generated_blockblob_client.go @@ -10,23 +10,16 @@ package azblob import ( "context" "encoding/base64" + "github.com/Azure/azure-sdk-for-go/sdk/azcore" "net/http" - "net/url" "strconv" "time" - - "github.com/Azure/azure-sdk-for-go/sdk/azcore" ) type blockBlobClient struct { con *connection } -// Pipeline returns the pipeline associated with this client. -func (client blockBlobClient) Pipeline() azcore.Pipeline { - return client.con.Pipeline() -} - // CommitBlockList - The Commit Block List operation writes a blob by specifying the list of block IDs that make up the blob. In order to be written as // part of a blob, a block must have been successfully written to the // server in a prior Put Block operation. You can call Put Block List to update a blob by uploading only those blocks that have changed, then committing @@ -34,75 +27,71 @@ func (client blockBlobClient) Pipeline() azcore.Pipeline { // this by specifying whether to commit a block from the committed block list or from the uncommitted block list, or to commit the most recently uploaded // version of the block, whichever list it may // belong to. -func (client blockBlobClient) CommitBlockList(ctx context.Context, blocks BlockLookupList, blockBlobCommitBlockListOptions *BlockBlobCommitBlockListOptions, blobHttpHeaders *BlobHttpHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlockBlobCommitBlockListResponse, error) { - req, err := client.commitBlockListCreateRequest(ctx, blocks, blockBlobCommitBlockListOptions, blobHttpHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) +func (client *blockBlobClient) CommitBlockList(ctx context.Context, blocks BlockLookupList, blockBlobCommitBlockListOptions *BlockBlobCommitBlockListOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlockBlobCommitBlockListResponse, error) { + req, err := client.commitBlockListCreateRequest(ctx, blocks, blockBlobCommitBlockListOptions, blobHTTPHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) if err != nil { return BlockBlobCommitBlockListResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlockBlobCommitBlockListResponse{}, err } if !resp.HasStatusCode(http.StatusCreated) { return BlockBlobCommitBlockListResponse{}, client.commitBlockListHandleError(resp) } - result, err := client.commitBlockListHandleResponse(resp) - if err != nil { - return BlockBlobCommitBlockListResponse{}, err - } - return result, nil + return client.commitBlockListHandleResponse(resp) } // commitBlockListCreateRequest creates the CommitBlockList request. -func (client blockBlobClient) commitBlockListCreateRequest(ctx context.Context, blocks BlockLookupList, blockBlobCommitBlockListOptions *BlockBlobCommitBlockListOptions, blobHttpHeaders *BlobHttpHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *blockBlobClient) commitBlockListCreateRequest(ctx context.Context, blocks BlockLookupList, blockBlobCommitBlockListOptions *BlockBlobCommitBlockListOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "blocklist") + reqQP := req.URL.Query() + reqQP.Set("comp", "blocklist") if blockBlobCommitBlockListOptions != nil && blockBlobCommitBlockListOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blockBlobCommitBlockListOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blockBlobCommitBlockListOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() - if blobHttpHeaders != nil && blobHttpHeaders.BlobCacheControl != nil { - req.Header.Set("x-ms-blob-cache-control", *blobHttpHeaders.BlobCacheControl) + req.URL.RawQuery = reqQP.Encode() + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobCacheControl != nil { + req.Header.Set("x-ms-blob-cache-control", *blobHTTPHeaders.BlobCacheControl) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentType != nil { - req.Header.Set("x-ms-blob-content-type", *blobHttpHeaders.BlobContentType) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentType != nil { + req.Header.Set("x-ms-blob-content-type", *blobHTTPHeaders.BlobContentType) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentEncoding != nil { - req.Header.Set("x-ms-blob-content-encoding", *blobHttpHeaders.BlobContentEncoding) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentEncoding != nil { + req.Header.Set("x-ms-blob-content-encoding", *blobHTTPHeaders.BlobContentEncoding) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentLanguage != nil { - req.Header.Set("x-ms-blob-content-language", *blobHttpHeaders.BlobContentLanguage) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentLanguage != nil { + req.Header.Set("x-ms-blob-content-language", *blobHTTPHeaders.BlobContentLanguage) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentMd5 != nil { - req.Header.Set("x-ms-blob-content-md5", base64.StdEncoding.EncodeToString(*blobHttpHeaders.BlobContentMd5)) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentMD5 != nil { + req.Header.Set("x-ms-blob-content-md5", base64.StdEncoding.EncodeToString(*blobHTTPHeaders.BlobContentMD5)) } - if blockBlobCommitBlockListOptions != nil && blockBlobCommitBlockListOptions.TransactionalContentMd5 != nil { - req.Header.Set("Content-MD5", base64.StdEncoding.EncodeToString(*blockBlobCommitBlockListOptions.TransactionalContentMd5)) + if blockBlobCommitBlockListOptions != nil && blockBlobCommitBlockListOptions.TransactionalContentMD5 != nil { + req.Header.Set("Content-MD5", base64.StdEncoding.EncodeToString(*blockBlobCommitBlockListOptions.TransactionalContentMD5)) } - if blockBlobCommitBlockListOptions != nil && blockBlobCommitBlockListOptions.TransactionalContentCrc64 != nil { - req.Header.Set("x-ms-content-crc64", base64.StdEncoding.EncodeToString(*blockBlobCommitBlockListOptions.TransactionalContentCrc64)) + if blockBlobCommitBlockListOptions != nil && blockBlobCommitBlockListOptions.TransactionalContentCRC64 != nil { + req.Header.Set("x-ms-content-crc64", base64.StdEncoding.EncodeToString(*blockBlobCommitBlockListOptions.TransactionalContentCRC64)) } if blockBlobCommitBlockListOptions != nil && blockBlobCommitBlockListOptions.Metadata != nil { for k, v := range *blockBlobCommitBlockListOptions.Metadata { req.Header.Set("x-ms-meta-"+k, v) } } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentDisposition != nil { - req.Header.Set("x-ms-blob-content-disposition", *blobHttpHeaders.BlobContentDisposition) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentDisposition != nil { + req.Header.Set("x-ms-blob-content-disposition", *blobHTTPHeaders.BlobContentDisposition) } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Header.Set("x-ms-encryption-key", *cpkInfo.EncryptionKey) } - if cpkInfo != nil && cpkInfo.EncryptionKeySha256 != nil { - req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySha256) + if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { + req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySHA256) } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Header.Set("x-ms-encryption-algorithm", "AES256") @@ -129,8 +118,8 @@ func (client blockBlobClient) commitBlockListCreateRequest(ctx context.Context, req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } req.Header.Set("x-ms-version", "2019-12-12") - if blockBlobCommitBlockListOptions != nil && blockBlobCommitBlockListOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blockBlobCommitBlockListOptions.RequestId) + if blockBlobCommitBlockListOptions != nil && blockBlobCommitBlockListOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blockBlobCommitBlockListOptions.RequestID) } if blockBlobCommitBlockListOptions != nil && blockBlobCommitBlockListOptions.BlobTagsString != nil { req.Header.Set("x-ms-tags", *blockBlobCommitBlockListOptions.BlobTagsString) @@ -140,7 +129,7 @@ func (client blockBlobClient) commitBlockListCreateRequest(ctx context.Context, } // commitBlockListHandleResponse handles the CommitBlockList response. -func (client blockBlobClient) commitBlockListHandleResponse(resp *azcore.Response) (BlockBlobCommitBlockListResponse, error) { +func (client *blockBlobClient) commitBlockListHandleResponse(resp *azcore.Response) (BlockBlobCommitBlockListResponse, error) { result := BlockBlobCommitBlockListResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -153,18 +142,18 @@ func (client blockBlobClient) commitBlockListHandleResponse(resp *azcore.Respons result.LastModified = &lastModified } if val := resp.Header.Get("Content-MD5"); val != "" { - contentMd5, err := base64.StdEncoding.DecodeString(val) + contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlockBlobCommitBlockListResponse{}, err } - result.ContentMD5 = &contentMd5 + result.ContentMD5 = &contentMD5 } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { - contentCrc64, err := base64.StdEncoding.DecodeString(val) + xMSContentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlockBlobCommitBlockListResponse{}, err } - result.ContentCRC64 = &contentCrc64 + result.XMSContentCRC64 = &xMSContentCRC64 } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val @@ -202,8 +191,8 @@ func (client blockBlobClient) commitBlockListHandleResponse(resp *azcore.Respons } // commitBlockListHandleError handles the CommitBlockList error response. -func (client blockBlobClient) commitBlockListHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blockBlobClient) commitBlockListHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -211,59 +200,59 @@ func (client blockBlobClient) commitBlockListHandleError(resp *azcore.Response) } // GetBlockList - The Get Block List operation retrieves the list of blocks that have been uploaded as part of a block blob -func (client blockBlobClient) GetBlockList(ctx context.Context, listType BlockListType, blockBlobGetBlockListOptions *BlockBlobGetBlockListOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (BlockListResponse, error) { +func (client *blockBlobClient) GetBlockList(ctx context.Context, listType BlockListType, blockBlobGetBlockListOptions *BlockBlobGetBlockListOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (BlockListResponse, error) { req, err := client.getBlockListCreateRequest(ctx, listType, blockBlobGetBlockListOptions, leaseAccessConditions, modifiedAccessConditions) if err != nil { return BlockListResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlockListResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return BlockListResponse{}, client.getBlockListHandleError(resp) } - result, err := client.getBlockListHandleResponse(resp) - if err != nil { - return BlockListResponse{}, err - } - return result, nil + return client.getBlockListHandleResponse(resp) } // getBlockListCreateRequest creates the GetBlockList request. -func (client blockBlobClient) getBlockListCreateRequest(ctx context.Context, listType BlockListType, blockBlobGetBlockListOptions *BlockBlobGetBlockListOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *blockBlobClient) getBlockListCreateRequest(ctx context.Context, listType BlockListType, blockBlobGetBlockListOptions *BlockBlobGetBlockListOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodGet, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "blocklist") + reqQP := req.URL.Query() + reqQP.Set("comp", "blocklist") if blockBlobGetBlockListOptions != nil && blockBlobGetBlockListOptions.Snapshot != nil { - query.Set("snapshot", *blockBlobGetBlockListOptions.Snapshot) + reqQP.Set("snapshot", *blockBlobGetBlockListOptions.Snapshot) } - query.Set("blocklisttype", string(listType)) + reqQP.Set("blocklisttype", string(listType)) if blockBlobGetBlockListOptions != nil && blockBlobGetBlockListOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blockBlobGetBlockListOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blockBlobGetBlockListOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + req.URL.RawQuery = reqQP.Encode() + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } req.Header.Set("x-ms-version", "2019-12-12") - if blockBlobGetBlockListOptions != nil && blockBlobGetBlockListOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blockBlobGetBlockListOptions.RequestId) + if blockBlobGetBlockListOptions != nil && blockBlobGetBlockListOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blockBlobGetBlockListOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // getBlockListHandleResponse handles the GetBlockList response. -func (client blockBlobClient) getBlockListHandleResponse(resp *azcore.Response) (BlockListResponse, error) { - result := BlockListResponse{RawResponse: resp.Response} +func (client *blockBlobClient) getBlockListHandleResponse(resp *azcore.Response) (BlockListResponse, error) { + var val *BlockList + if err := resp.UnmarshalAsXML(&val); err != nil { + return BlockListResponse{}, err + } + result := BlockListResponse{RawResponse: resp.Response, BlockList: val} if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { @@ -300,13 +289,12 @@ func (client blockBlobClient) getBlockListHandleResponse(resp *azcore.Response) } result.Date = &date } - err := resp.UnmarshalAsXML(&result.BlockList) - return result, err + return result, nil } // getBlockListHandleError handles the GetBlockList error response. -func (client blockBlobClient) getBlockListHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blockBlobClient) getBlockListHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -314,54 +302,50 @@ func (client blockBlobClient) getBlockListHandleError(resp *azcore.Response) err } // StageBlock - The Stage Block operation creates a new block to be committed as part of a blob -func (client blockBlobClient) StageBlock(ctx context.Context, blockId string, contentLength int64, body azcore.ReadSeekCloser, blockBlobStageBlockOptions *BlockBlobStageBlockOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo) (BlockBlobStageBlockResponse, error) { - req, err := client.stageBlockCreateRequest(ctx, blockId, contentLength, body, blockBlobStageBlockOptions, leaseAccessConditions, cpkInfo, cpkScopeInfo) +func (client *blockBlobClient) StageBlock(ctx context.Context, blockID string, contentLength int64, body azcore.ReadSeekCloser, blockBlobStageBlockOptions *BlockBlobStageBlockOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo) (BlockBlobStageBlockResponse, error) { + req, err := client.stageBlockCreateRequest(ctx, blockID, contentLength, body, blockBlobStageBlockOptions, leaseAccessConditions, cpkInfo, cpkScopeInfo) if err != nil { return BlockBlobStageBlockResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlockBlobStageBlockResponse{}, err } if !resp.HasStatusCode(http.StatusCreated) { return BlockBlobStageBlockResponse{}, client.stageBlockHandleError(resp) } - result, err := client.stageBlockHandleResponse(resp) - if err != nil { - return BlockBlobStageBlockResponse{}, err - } - return result, nil + return client.stageBlockHandleResponse(resp) } // stageBlockCreateRequest creates the StageBlock request. -func (client blockBlobClient) stageBlockCreateRequest(ctx context.Context, blockId string, contentLength int64, body azcore.ReadSeekCloser, blockBlobStageBlockOptions *BlockBlobStageBlockOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo) (*azcore.Request, error) { +func (client *blockBlobClient) stageBlockCreateRequest(ctx context.Context, blockID string, contentLength int64, body azcore.ReadSeekCloser, blockBlobStageBlockOptions *BlockBlobStageBlockOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "block") - query.Set("blockid", blockId) + reqQP := req.URL.Query() + reqQP.Set("comp", "block") + reqQP.Set("blockid", blockID) if blockBlobStageBlockOptions != nil && blockBlobStageBlockOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blockBlobStageBlockOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blockBlobStageBlockOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if blockBlobStageBlockOptions != nil && blockBlobStageBlockOptions.TransactionalContentMd5 != nil { - req.Header.Set("Content-MD5", base64.StdEncoding.EncodeToString(*blockBlobStageBlockOptions.TransactionalContentMd5)) + if blockBlobStageBlockOptions != nil && blockBlobStageBlockOptions.TransactionalContentMD5 != nil { + req.Header.Set("Content-MD5", base64.StdEncoding.EncodeToString(*blockBlobStageBlockOptions.TransactionalContentMD5)) } - if blockBlobStageBlockOptions != nil && blockBlobStageBlockOptions.TransactionalContentCrc64 != nil { - req.Header.Set("x-ms-content-crc64", base64.StdEncoding.EncodeToString(*blockBlobStageBlockOptions.TransactionalContentCrc64)) + if blockBlobStageBlockOptions != nil && blockBlobStageBlockOptions.TransactionalContentCRC64 != nil { + req.Header.Set("x-ms-content-crc64", base64.StdEncoding.EncodeToString(*blockBlobStageBlockOptions.TransactionalContentCRC64)) } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Header.Set("x-ms-encryption-key", *cpkInfo.EncryptionKey) } - if cpkInfo != nil && cpkInfo.EncryptionKeySha256 != nil { - req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySha256) + if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { + req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySHA256) } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Header.Set("x-ms-encryption-algorithm", "AES256") @@ -370,22 +354,22 @@ func (client blockBlobClient) stageBlockCreateRequest(ctx context.Context, block req.Header.Set("x-ms-encryption-scope", *cpkScopeInfo.EncryptionScope) } req.Header.Set("x-ms-version", "2019-12-12") - if blockBlobStageBlockOptions != nil && blockBlobStageBlockOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blockBlobStageBlockOptions.RequestId) + if blockBlobStageBlockOptions != nil && blockBlobStageBlockOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blockBlobStageBlockOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, req.SetBody(body, "application/octet-stream") } // stageBlockHandleResponse handles the StageBlock response. -func (client blockBlobClient) stageBlockHandleResponse(resp *azcore.Response) (BlockBlobStageBlockResponse, error) { +func (client *blockBlobClient) stageBlockHandleResponse(resp *azcore.Response) (BlockBlobStageBlockResponse, error) { result := BlockBlobStageBlockResponse{RawResponse: resp.Response} if val := resp.Header.Get("Content-MD5"); val != "" { - contentMd5, err := base64.StdEncoding.DecodeString(val) + contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlockBlobStageBlockResponse{}, err } - result.ContentMD5 = &contentMd5 + result.ContentMD5 = &contentMD5 } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val @@ -404,11 +388,11 @@ func (client blockBlobClient) stageBlockHandleResponse(resp *azcore.Response) (B result.Date = &date } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { - contentCrc64, err := base64.StdEncoding.DecodeString(val) + xMSContentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlockBlobStageBlockResponse{}, err } - result.ContentCRC64 = &contentCrc64 + result.XMSContentCRC64 = &xMSContentCRC64 } if val := resp.Header.Get("x-ms-request-server-encrypted"); val != "" { isServerEncrypted, err := strconv.ParseBool(val) @@ -427,8 +411,8 @@ func (client blockBlobClient) stageBlockHandleResponse(resp *azcore.Response) (B } // stageBlockHandleError handles the StageBlock error response. -func (client blockBlobClient) stageBlockHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blockBlobClient) stageBlockHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -436,55 +420,51 @@ func (client blockBlobClient) stageBlockHandleError(resp *azcore.Response) error } // StageBlockFromURL - The Stage Block operation creates a new block to be committed as part of a blob where the contents are read from a URL. -func (client blockBlobClient) StageBlockFromURL(ctx context.Context, blockId string, contentLength int64, sourceUrl url.URL, blockBlobStageBlockFromUrlOptions *BlockBlobStageBlockFromURLOptions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, leaseAccessConditions *LeaseAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (BlockBlobStageBlockFromURLResponse, error) { - req, err := client.stageBlockFromUrlCreateRequest(ctx, blockId, contentLength, sourceUrl, blockBlobStageBlockFromUrlOptions, cpkInfo, cpkScopeInfo, leaseAccessConditions, sourceModifiedAccessConditions) +func (client *blockBlobClient) StageBlockFromURL(ctx context.Context, blockID string, contentLength int64, sourceURL string, blockBlobStageBlockFromURLOptions *BlockBlobStageBlockFromURLOptions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, leaseAccessConditions *LeaseAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (BlockBlobStageBlockFromURLResponse, error) { + req, err := client.stageBlockFromURLCreateRequest(ctx, blockID, contentLength, sourceURL, blockBlobStageBlockFromURLOptions, cpkInfo, cpkScopeInfo, leaseAccessConditions, sourceModifiedAccessConditions) if err != nil { return BlockBlobStageBlockFromURLResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlockBlobStageBlockFromURLResponse{}, err } if !resp.HasStatusCode(http.StatusCreated) { - return BlockBlobStageBlockFromURLResponse{}, client.stageBlockFromUrlHandleError(resp) - } - result, err := client.stageBlockFromUrlHandleResponse(resp) - if err != nil { - return BlockBlobStageBlockFromURLResponse{}, err + return BlockBlobStageBlockFromURLResponse{}, client.stageBlockFromURLHandleError(resp) } - return result, nil + return client.stageBlockFromURLHandleResponse(resp) } -// stageBlockFromUrlCreateRequest creates the StageBlockFromURL request. -func (client blockBlobClient) stageBlockFromUrlCreateRequest(ctx context.Context, blockId string, contentLength int64, sourceUrl url.URL, blockBlobStageBlockFromUrlOptions *BlockBlobStageBlockFromURLOptions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, leaseAccessConditions *LeaseAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (*azcore.Request, error) { +// stageBlockFromURLCreateRequest creates the StageBlockFromURL request. +func (client *blockBlobClient) stageBlockFromURLCreateRequest(ctx context.Context, blockID string, contentLength int64, sourceURL string, blockBlobStageBlockFromURLOptions *BlockBlobStageBlockFromURLOptions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, leaseAccessConditions *LeaseAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "block") - query.Set("blockid", blockId) - if blockBlobStageBlockFromUrlOptions != nil && blockBlobStageBlockFromUrlOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blockBlobStageBlockFromUrlOptions.Timeout), 10)) + reqQP := req.URL.Query() + reqQP.Set("comp", "block") + reqQP.Set("blockid", blockID) + if blockBlobStageBlockFromURLOptions != nil && blockBlobStageBlockFromURLOptions.Timeout != nil { + reqQP.Set("timeout", strconv.FormatInt(int64(*blockBlobStageBlockFromURLOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - req.Header.Set("x-ms-copy-source", sourceUrl.String()) - if blockBlobStageBlockFromUrlOptions != nil && blockBlobStageBlockFromUrlOptions.SourceRange != nil { - req.Header.Set("x-ms-source-range", *blockBlobStageBlockFromUrlOptions.SourceRange) + req.Header.Set("x-ms-copy-source", sourceURL) + if blockBlobStageBlockFromURLOptions != nil && blockBlobStageBlockFromURLOptions.SourceRange != nil { + req.Header.Set("x-ms-source-range", *blockBlobStageBlockFromURLOptions.SourceRange) } - if blockBlobStageBlockFromUrlOptions != nil && blockBlobStageBlockFromUrlOptions.SourceContentMd5 != nil { - req.Header.Set("x-ms-source-content-md5", base64.StdEncoding.EncodeToString(*blockBlobStageBlockFromUrlOptions.SourceContentMd5)) + if blockBlobStageBlockFromURLOptions != nil && blockBlobStageBlockFromURLOptions.SourceContentMD5 != nil { + req.Header.Set("x-ms-source-content-md5", base64.StdEncoding.EncodeToString(*blockBlobStageBlockFromURLOptions.SourceContentMD5)) } - if blockBlobStageBlockFromUrlOptions != nil && blockBlobStageBlockFromUrlOptions.SourceContentcrc64 != nil { - req.Header.Set("x-ms-source-content-crc64", base64.StdEncoding.EncodeToString(*blockBlobStageBlockFromUrlOptions.SourceContentcrc64)) + if blockBlobStageBlockFromURLOptions != nil && blockBlobStageBlockFromURLOptions.SourceContentcrc64 != nil { + req.Header.Set("x-ms-source-content-crc64", base64.StdEncoding.EncodeToString(*blockBlobStageBlockFromURLOptions.SourceContentcrc64)) } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Header.Set("x-ms-encryption-key", *cpkInfo.EncryptionKey) } - if cpkInfo != nil && cpkInfo.EncryptionKeySha256 != nil { - req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySha256) + if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { + req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySHA256) } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Header.Set("x-ms-encryption-algorithm", "AES256") @@ -492,8 +472,8 @@ func (client blockBlobClient) stageBlockFromUrlCreateRequest(ctx context.Context if cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil { req.Header.Set("x-ms-encryption-scope", *cpkScopeInfo.EncryptionScope) } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfModifiedSince != nil { req.Header.Set("x-ms-source-if-modified-since", sourceModifiedAccessConditions.SourceIfModifiedSince.Format(time.RFC1123)) @@ -508,29 +488,29 @@ func (client blockBlobClient) stageBlockFromUrlCreateRequest(ctx context.Context req.Header.Set("x-ms-source-if-none-match", *sourceModifiedAccessConditions.SourceIfNoneMatch) } req.Header.Set("x-ms-version", "2019-12-12") - if blockBlobStageBlockFromUrlOptions != nil && blockBlobStageBlockFromUrlOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blockBlobStageBlockFromUrlOptions.RequestId) + if blockBlobStageBlockFromURLOptions != nil && blockBlobStageBlockFromURLOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blockBlobStageBlockFromURLOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } -// stageBlockFromUrlHandleResponse handles the StageBlockFromURL response. -func (client blockBlobClient) stageBlockFromUrlHandleResponse(resp *azcore.Response) (BlockBlobStageBlockFromURLResponse, error) { +// stageBlockFromURLHandleResponse handles the StageBlockFromURL response. +func (client *blockBlobClient) stageBlockFromURLHandleResponse(resp *azcore.Response) (BlockBlobStageBlockFromURLResponse, error) { result := BlockBlobStageBlockFromURLResponse{RawResponse: resp.Response} if val := resp.Header.Get("Content-MD5"); val != "" { - contentMd5, err := base64.StdEncoding.DecodeString(val) + contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlockBlobStageBlockFromURLResponse{}, err } - result.ContentMD5 = &contentMd5 + result.ContentMD5 = &contentMD5 } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { - contentCrc64, err := base64.StdEncoding.DecodeString(val) + xMSContentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlockBlobStageBlockFromURLResponse{}, err } - result.ContentCRC64 = &contentCrc64 + result.XMSContentCRC64 = &xMSContentCRC64 } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val @@ -564,9 +544,9 @@ func (client blockBlobClient) stageBlockFromUrlHandleResponse(resp *azcore.Respo return result, nil } -// stageBlockFromUrlHandleError handles the StageBlockFromURL error response. -func (client blockBlobClient) stageBlockFromUrlHandleError(resp *azcore.Response) error { - var err StorageError +// stageBlockFromURLHandleError handles the StageBlockFromURL error response. +func (client *blockBlobClient) stageBlockFromURLHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -577,73 +557,69 @@ func (client blockBlobClient) stageBlockFromUrlHandleError(resp *azcore.Response // on the blob. Partial updates are not supported with Put // Blob; the content of the existing blob is overwritten with the content of the new blob. To perform a partial update of the content of a block blob, use // the Put Block List operation. -func (client blockBlobClient) Upload(ctx context.Context, contentLength int64, body azcore.ReadSeekCloser, blockBlobUploadOptions *BlockBlobUploadOptions, blobHttpHeaders *BlobHttpHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlockBlobUploadResponse, error) { - req, err := client.uploadCreateRequest(ctx, contentLength, body, blockBlobUploadOptions, blobHttpHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) +func (client *blockBlobClient) Upload(ctx context.Context, contentLength int64, body azcore.ReadSeekCloser, blockBlobUploadOptions *BlockBlobUploadOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlockBlobUploadResponse, error) { + req, err := client.uploadCreateRequest(ctx, contentLength, body, blockBlobUploadOptions, blobHTTPHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) if err != nil { return BlockBlobUploadResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return BlockBlobUploadResponse{}, err } if !resp.HasStatusCode(http.StatusCreated) { return BlockBlobUploadResponse{}, client.uploadHandleError(resp) } - result, err := client.uploadHandleResponse(resp) - if err != nil { - return BlockBlobUploadResponse{}, err - } - return result, nil + return client.uploadHandleResponse(resp) } // uploadCreateRequest creates the Upload request. -func (client blockBlobClient) uploadCreateRequest(ctx context.Context, contentLength int64, body azcore.ReadSeekCloser, blockBlobUploadOptions *BlockBlobUploadOptions, blobHttpHeaders *BlobHttpHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *blockBlobClient) uploadCreateRequest(ctx context.Context, contentLength int64, body azcore.ReadSeekCloser, blockBlobUploadOptions *BlockBlobUploadOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() + reqQP := req.URL.Query() if blockBlobUploadOptions != nil && blockBlobUploadOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*blockBlobUploadOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*blockBlobUploadOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-blob-type", "BlockBlob") - if blockBlobUploadOptions != nil && blockBlobUploadOptions.TransactionalContentMd5 != nil { - req.Header.Set("Content-MD5", base64.StdEncoding.EncodeToString(*blockBlobUploadOptions.TransactionalContentMd5)) + if blockBlobUploadOptions != nil && blockBlobUploadOptions.TransactionalContentMD5 != nil { + req.Header.Set("Content-MD5", base64.StdEncoding.EncodeToString(*blockBlobUploadOptions.TransactionalContentMD5)) } req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentType != nil { - req.Header.Set("x-ms-blob-content-type", *blobHttpHeaders.BlobContentType) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentType != nil { + req.Header.Set("x-ms-blob-content-type", *blobHTTPHeaders.BlobContentType) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentEncoding != nil { - req.Header.Set("x-ms-blob-content-encoding", *blobHttpHeaders.BlobContentEncoding) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentEncoding != nil { + req.Header.Set("x-ms-blob-content-encoding", *blobHTTPHeaders.BlobContentEncoding) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentLanguage != nil { - req.Header.Set("x-ms-blob-content-language", *blobHttpHeaders.BlobContentLanguage) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentLanguage != nil { + req.Header.Set("x-ms-blob-content-language", *blobHTTPHeaders.BlobContentLanguage) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentMd5 != nil { - req.Header.Set("x-ms-blob-content-md5", base64.StdEncoding.EncodeToString(*blobHttpHeaders.BlobContentMd5)) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentMD5 != nil { + req.Header.Set("x-ms-blob-content-md5", base64.StdEncoding.EncodeToString(*blobHTTPHeaders.BlobContentMD5)) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobCacheControl != nil { - req.Header.Set("x-ms-blob-cache-control", *blobHttpHeaders.BlobCacheControl) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobCacheControl != nil { + req.Header.Set("x-ms-blob-cache-control", *blobHTTPHeaders.BlobCacheControl) } if blockBlobUploadOptions != nil && blockBlobUploadOptions.Metadata != nil { for k, v := range *blockBlobUploadOptions.Metadata { req.Header.Set("x-ms-meta-"+k, v) } } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentDisposition != nil { - req.Header.Set("x-ms-blob-content-disposition", *blobHttpHeaders.BlobContentDisposition) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentDisposition != nil { + req.Header.Set("x-ms-blob-content-disposition", *blobHTTPHeaders.BlobContentDisposition) } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Header.Set("x-ms-encryption-key", *cpkInfo.EncryptionKey) } - if cpkInfo != nil && cpkInfo.EncryptionKeySha256 != nil { - req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySha256) + if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { + req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySHA256) } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Header.Set("x-ms-encryption-algorithm", "AES256") @@ -670,8 +646,8 @@ func (client blockBlobClient) uploadCreateRequest(ctx context.Context, contentLe req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } req.Header.Set("x-ms-version", "2019-12-12") - if blockBlobUploadOptions != nil && blockBlobUploadOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *blockBlobUploadOptions.RequestId) + if blockBlobUploadOptions != nil && blockBlobUploadOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *blockBlobUploadOptions.RequestID) } if blockBlobUploadOptions != nil && blockBlobUploadOptions.BlobTagsString != nil { req.Header.Set("x-ms-tags", *blockBlobUploadOptions.BlobTagsString) @@ -681,7 +657,7 @@ func (client blockBlobClient) uploadCreateRequest(ctx context.Context, contentLe } // uploadHandleResponse handles the Upload response. -func (client blockBlobClient) uploadHandleResponse(resp *azcore.Response) (BlockBlobUploadResponse, error) { +func (client *blockBlobClient) uploadHandleResponse(resp *azcore.Response) (BlockBlobUploadResponse, error) { result := BlockBlobUploadResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -694,11 +670,11 @@ func (client blockBlobClient) uploadHandleResponse(resp *azcore.Response) (Block result.LastModified = &lastModified } if val := resp.Header.Get("Content-MD5"); val != "" { - contentMd5, err := base64.StdEncoding.DecodeString(val) + contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlockBlobUploadResponse{}, err } - result.ContentMD5 = &contentMd5 + result.ContentMD5 = &contentMD5 } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val @@ -736,10 +712,11 @@ func (client blockBlobClient) uploadHandleResponse(resp *azcore.Response) (Block } // uploadHandleError handles the Upload error response. -func (client blockBlobClient) uploadHandleError(resp *azcore.Response) error { - var err StorageError +func (client *blockBlobClient) uploadHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } return azcore.NewResponseError(&err, resp.Response) } + diff --git a/sdk/storage/azblob/zz_generated_connection.go b/sdk/storage/azblob/zz_generated_connection.go index e3d138c35bff..36bd6517ff9f 100644 --- a/sdk/storage/azblob/zz_generated_connection.go +++ b/sdk/storage/azblob/zz_generated_connection.go @@ -9,14 +9,13 @@ package azblob import ( "fmt" - "github.com/Azure/azure-sdk-for-go/sdk/azcore" ) const scope = "https://storage.azure.com/.default" const telemetryInfo = "azsdk-go-generated/" - // connectionOptions contains configuration settings for the connection's pipeline. +// All zero-value fields will be initialized with their default values. type connectionOptions struct { // HTTPClient sets the transport for making HTTP requests. HTTPClient azcore.Transport @@ -24,14 +23,14 @@ type connectionOptions struct { Retry azcore.RetryOptions // Telemetry configures the built-in telemetry policy behavior. Telemetry azcore.TelemetryOptions -} - -// defaultConnectionOptions creates a connectionOptions type initialized with default values. -func defaultConnectionOptions() connectionOptions { - return connectionOptions{ - Retry: azcore.DefaultRetryOptions(), - Telemetry: azcore.DefaultTelemetryOptions(), - } + // Logging configures the built-in logging policy behavior. + Logging azcore.LogOptions + // PerCallPolicies contains custom policies to inject into the pipeline. + // Each policy is executed once per request. + PerCallPolicies []azcore.Policy + // PerRetryPolicies contains custom policies to inject into the pipeline. + // Each policy is executed once per request, and for each retry request. + PerRetryPolicies []azcore.Policy } func (c *connectionOptions) telemetryOptions() *azcore.TelemetryOptions { @@ -50,22 +49,20 @@ type connection struct { } // newConnection creates an instance of the connection type with the specified endpoint. +// Pass nil to accept the default options; this is the same as passing a zero-value options. func newConnection(endpoint string, cred azcore.Credential, options *connectionOptions) *connection { if options == nil { - o := defaultConnectionOptions() - options = &o + options = &connectionOptions{} } - p := azcore.NewPipeline(options.HTTPClient, + policies := []azcore.Policy{ azcore.NewTelemetryPolicy(options.telemetryOptions()), - azcore.NewRetryPolicy(&options.Retry), - cred.AuthenticationPolicy(azcore.AuthenticationPolicyOptions{Options: azcore.TokenRequestOptions{Scopes: []string{scope}}}), - azcore.NewLogPolicy(nil)) - return newConnectionWithPipeline(endpoint, p) -} - -// newConnectionWithPipeline creates an instance of the connection type with the specified endpoint and pipeline. -func newConnectionWithPipeline(endpoint string, p azcore.Pipeline) *connection { - return &connection{u: endpoint, p: p} + } + policies = append(policies, options.PerCallPolicies...) + policies = append(policies, azcore.NewRetryPolicy(&options.Retry)) + policies = append(policies, options.PerRetryPolicies...) + policies = append(policies, cred.AuthenticationPolicy(azcore.AuthenticationPolicyOptions{Options: azcore.TokenRequestOptions{Scopes: []string{scope}}})) + policies = append(policies, azcore.NewLogPolicy(&options.Logging)) + return &connection{u: endpoint, p: azcore.NewPipeline(options.HTTPClient, policies...)} } // Endpoint returns the connection's endpoint. @@ -74,6 +71,7 @@ func (c *connection) Endpoint() string { } // Pipeline returns the connection's pipeline. -func (c *connection) Pipeline() azcore.Pipeline { +func (c *connection) Pipeline() (azcore.Pipeline) { return c.p } + diff --git a/sdk/storage/azblob/zz_generated_constants.go b/sdk/storage/azblob/zz_generated_constants.go new file mode 100644 index 000000000000..4a226d8ae624 --- /dev/null +++ b/sdk/storage/azblob/zz_generated_constants.go @@ -0,0 +1,759 @@ +// +build go1.13 + +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// Code generated by Microsoft (R) AutoRest Code Generator. +// Changes may cause incorrect behavior and will be lost if the code is regenerated. + +package azblob + +type AccessTier string + +const ( + AccessTierArchive AccessTier = "Archive" + AccessTierCool AccessTier = "Cool" + AccessTierHot AccessTier = "Hot" + AccessTierP10 AccessTier = "P10" + AccessTierP15 AccessTier = "P15" + AccessTierP20 AccessTier = "P20" + AccessTierP30 AccessTier = "P30" + AccessTierP4 AccessTier = "P4" + AccessTierP40 AccessTier = "P40" + AccessTierP50 AccessTier = "P50" + AccessTierP6 AccessTier = "P6" + AccessTierP60 AccessTier = "P60" + AccessTierP70 AccessTier = "P70" + AccessTierP80 AccessTier = "P80" +) + +// PossibleAccessTierValues returns the possible values for the AccessTier const type. +func PossibleAccessTierValues() []AccessTier { + return []AccessTier{ + AccessTierArchive, + AccessTierCool, + AccessTierHot, + AccessTierP10, + AccessTierP15, + AccessTierP20, + AccessTierP30, + AccessTierP4, + AccessTierP40, + AccessTierP50, + AccessTierP6, + AccessTierP60, + AccessTierP70, + AccessTierP80, + } +} + +// ToPtr() returns a *AccessTier pointing to the current value. +func (c AccessTier) ToPtr() *AccessTier { + return &c +} + +type AccountKind string + +const ( + AccountKindStorage AccountKind = "Storage" + AccountKindBlobStorage AccountKind = "BlobStorage" + AccountKindStorageV2 AccountKind = "StorageV2" + AccountKindFileStorage AccountKind = "FileStorage" + AccountKindBlockBlobStorage AccountKind = "BlockBlobStorage" +) + +// PossibleAccountKindValues returns the possible values for the AccountKind const type. +func PossibleAccountKindValues() []AccountKind { + return []AccountKind{ + AccountKindStorage, + AccountKindBlobStorage, + AccountKindStorageV2, + AccountKindFileStorage, + AccountKindBlockBlobStorage, + } +} + +// ToPtr() returns a *AccountKind pointing to the current value. +func (c AccountKind) ToPtr() *AccountKind { + return &c +} + +type ArchiveStatus string + +const ( + ArchiveStatusRehydratePendingToCool ArchiveStatus = "rehydrate-pending-to-cool" + ArchiveStatusRehydratePendingToHot ArchiveStatus = "rehydrate-pending-to-hot" +) + +// PossibleArchiveStatusValues returns the possible values for the ArchiveStatus const type. +func PossibleArchiveStatusValues() []ArchiveStatus { + return []ArchiveStatus{ + ArchiveStatusRehydratePendingToCool, + ArchiveStatusRehydratePendingToHot, + } +} + +// ToPtr() returns a *ArchiveStatus pointing to the current value. +func (c ArchiveStatus) ToPtr() *ArchiveStatus { + return &c +} + +type BlobExpiryOptions string + +const ( + BlobExpiryOptionsAbsolute BlobExpiryOptions = "Absolute" + BlobExpiryOptionsNeverExpire BlobExpiryOptions = "NeverExpire" + BlobExpiryOptionsRelativeToCreation BlobExpiryOptions = "RelativeToCreation" + BlobExpiryOptionsRelativeToNow BlobExpiryOptions = "RelativeToNow" +) + +// PossibleBlobExpiryOptionsValues returns the possible values for the BlobExpiryOptions const type. +func PossibleBlobExpiryOptionsValues() []BlobExpiryOptions { + return []BlobExpiryOptions{ + BlobExpiryOptionsAbsolute, + BlobExpiryOptionsNeverExpire, + BlobExpiryOptionsRelativeToCreation, + BlobExpiryOptionsRelativeToNow, + } +} + +// ToPtr() returns a *BlobExpiryOptions pointing to the current value. +func (c BlobExpiryOptions) ToPtr() *BlobExpiryOptions { + return &c +} + +type BlobType string + +const ( + BlobTypeBlockBlob BlobType = "BlockBlob" + BlobTypePageBlob BlobType = "PageBlob" + BlobTypeAppendBlob BlobType = "AppendBlob" +) + +// PossibleBlobTypeValues returns the possible values for the BlobType const type. +func PossibleBlobTypeValues() []BlobType { + return []BlobType{ + BlobTypeBlockBlob, + BlobTypePageBlob, + BlobTypeAppendBlob, + } +} + +// ToPtr() returns a *BlobType pointing to the current value. +func (c BlobType) ToPtr() *BlobType { + return &c +} + +type BlockListType string + +const ( + BlockListTypeCommitted BlockListType = "committed" + BlockListTypeUncommitted BlockListType = "uncommitted" + BlockListTypeAll BlockListType = "all" +) + +// PossibleBlockListTypeValues returns the possible values for the BlockListType const type. +func PossibleBlockListTypeValues() []BlockListType { + return []BlockListType{ + BlockListTypeCommitted, + BlockListTypeUncommitted, + BlockListTypeAll, + } +} + +// ToPtr() returns a *BlockListType pointing to the current value. +func (c BlockListType) ToPtr() *BlockListType { + return &c +} + +type CopyStatusType string + +const ( + CopyStatusTypePending CopyStatusType = "pending" + CopyStatusTypeSuccess CopyStatusType = "success" + CopyStatusTypeAborted CopyStatusType = "aborted" + CopyStatusTypeFailed CopyStatusType = "failed" +) + +// PossibleCopyStatusTypeValues returns the possible values for the CopyStatusType const type. +func PossibleCopyStatusTypeValues() []CopyStatusType { + return []CopyStatusType{ + CopyStatusTypePending, + CopyStatusTypeSuccess, + CopyStatusTypeAborted, + CopyStatusTypeFailed, + } +} + +// ToPtr() returns a *CopyStatusType pointing to the current value. +func (c CopyStatusType) ToPtr() *CopyStatusType { + return &c +} + +type DeleteSnapshotsOptionType string + +const ( + DeleteSnapshotsOptionTypeInclude DeleteSnapshotsOptionType = "include" + DeleteSnapshotsOptionTypeOnly DeleteSnapshotsOptionType = "only" +) + +// PossibleDeleteSnapshotsOptionTypeValues returns the possible values for the DeleteSnapshotsOptionType const type. +func PossibleDeleteSnapshotsOptionTypeValues() []DeleteSnapshotsOptionType { + return []DeleteSnapshotsOptionType{ + DeleteSnapshotsOptionTypeInclude, + DeleteSnapshotsOptionTypeOnly, + } +} + +// ToPtr() returns a *DeleteSnapshotsOptionType pointing to the current value. +func (c DeleteSnapshotsOptionType) ToPtr() *DeleteSnapshotsOptionType { + return &c +} + +// GeoReplicationStatusType - The status of the secondary location +type GeoReplicationStatusType string + +const ( + GeoReplicationStatusTypeBootstrap GeoReplicationStatusType = "bootstrap" + GeoReplicationStatusTypeLive GeoReplicationStatusType = "live" + GeoReplicationStatusTypeUnavailable GeoReplicationStatusType = "unavailable" +) + +// PossibleGeoReplicationStatusTypeValues returns the possible values for the GeoReplicationStatusType const type. +func PossibleGeoReplicationStatusTypeValues() []GeoReplicationStatusType { + return []GeoReplicationStatusType{ + GeoReplicationStatusTypeBootstrap, + GeoReplicationStatusTypeLive, + GeoReplicationStatusTypeUnavailable, + } +} + +// ToPtr() returns a *GeoReplicationStatusType pointing to the current value. +func (c GeoReplicationStatusType) ToPtr() *GeoReplicationStatusType { + return &c +} + +type LeaseDurationType string + +const ( + LeaseDurationTypeInfinite LeaseDurationType = "infinite" + LeaseDurationTypeFixed LeaseDurationType = "fixed" +) + +// PossibleLeaseDurationTypeValues returns the possible values for the LeaseDurationType const type. +func PossibleLeaseDurationTypeValues() []LeaseDurationType { + return []LeaseDurationType{ + LeaseDurationTypeInfinite, + LeaseDurationTypeFixed, + } +} + +// ToPtr() returns a *LeaseDurationType pointing to the current value. +func (c LeaseDurationType) ToPtr() *LeaseDurationType { + return &c +} + +type LeaseStateType string + +const ( + LeaseStateTypeAvailable LeaseStateType = "available" + LeaseStateTypeLeased LeaseStateType = "leased" + LeaseStateTypeExpired LeaseStateType = "expired" + LeaseStateTypeBreaking LeaseStateType = "breaking" + LeaseStateTypeBroken LeaseStateType = "broken" +) + +// PossibleLeaseStateTypeValues returns the possible values for the LeaseStateType const type. +func PossibleLeaseStateTypeValues() []LeaseStateType { + return []LeaseStateType{ + LeaseStateTypeAvailable, + LeaseStateTypeLeased, + LeaseStateTypeExpired, + LeaseStateTypeBreaking, + LeaseStateTypeBroken, + } +} + +// ToPtr() returns a *LeaseStateType pointing to the current value. +func (c LeaseStateType) ToPtr() *LeaseStateType { + return &c +} + +type LeaseStatusType string + +const ( + LeaseStatusTypeLocked LeaseStatusType = "locked" + LeaseStatusTypeUnlocked LeaseStatusType = "unlocked" +) + +// PossibleLeaseStatusTypeValues returns the possible values for the LeaseStatusType const type. +func PossibleLeaseStatusTypeValues() []LeaseStatusType { + return []LeaseStatusType{ + LeaseStatusTypeLocked, + LeaseStatusTypeUnlocked, + } +} + +// ToPtr() returns a *LeaseStatusType pointing to the current value. +func (c LeaseStatusType) ToPtr() *LeaseStatusType { + return &c +} + +type ListBlobsIncludeItem string + +const ( + ListBlobsIncludeItemCopy ListBlobsIncludeItem = "copy" + ListBlobsIncludeItemDeleted ListBlobsIncludeItem = "deleted" + ListBlobsIncludeItemMetadata ListBlobsIncludeItem = "metadata" + ListBlobsIncludeItemSnapshots ListBlobsIncludeItem = "snapshots" + ListBlobsIncludeItemUncommittedblobs ListBlobsIncludeItem = "uncommittedblobs" + ListBlobsIncludeItemVersions ListBlobsIncludeItem = "versions" + ListBlobsIncludeItemTags ListBlobsIncludeItem = "tags" +) + +// PossibleListBlobsIncludeItemValues returns the possible values for the ListBlobsIncludeItem const type. +func PossibleListBlobsIncludeItemValues() []ListBlobsIncludeItem { + return []ListBlobsIncludeItem{ + ListBlobsIncludeItemCopy, + ListBlobsIncludeItemDeleted, + ListBlobsIncludeItemMetadata, + ListBlobsIncludeItemSnapshots, + ListBlobsIncludeItemUncommittedblobs, + ListBlobsIncludeItemVersions, + ListBlobsIncludeItemTags, + } +} + +// ToPtr() returns a *ListBlobsIncludeItem pointing to the current value. +func (c ListBlobsIncludeItem) ToPtr() *ListBlobsIncludeItem { + return &c +} + +type ListContainersIncludeType string + +const ( + ListContainersIncludeTypeMetadata ListContainersIncludeType = "metadata" + ListContainersIncludeTypeDeleted ListContainersIncludeType = "deleted" +) + +// PossibleListContainersIncludeTypeValues returns the possible values for the ListContainersIncludeType const type. +func PossibleListContainersIncludeTypeValues() []ListContainersIncludeType { + return []ListContainersIncludeType{ + ListContainersIncludeTypeMetadata, + ListContainersIncludeTypeDeleted, + } +} + +// ToPtr() returns a *ListContainersIncludeType pointing to the current value. +func (c ListContainersIncludeType) ToPtr() *ListContainersIncludeType { + return &c +} + +type PathRenameMode string + +const ( + PathRenameModeLegacy PathRenameMode = "legacy" + PathRenameModePosix PathRenameMode = "posix" +) + +// PossiblePathRenameModeValues returns the possible values for the PathRenameMode const type. +func PossiblePathRenameModeValues() []PathRenameMode { + return []PathRenameMode{ + PathRenameModeLegacy, + PathRenameModePosix, + } +} + +// ToPtr() returns a *PathRenameMode pointing to the current value. +func (c PathRenameMode) ToPtr() *PathRenameMode { + return &c +} + +type PremiumPageBlobAccessTier string + +const ( + PremiumPageBlobAccessTierP10 PremiumPageBlobAccessTier = "P10" + PremiumPageBlobAccessTierP15 PremiumPageBlobAccessTier = "P15" + PremiumPageBlobAccessTierP20 PremiumPageBlobAccessTier = "P20" + PremiumPageBlobAccessTierP30 PremiumPageBlobAccessTier = "P30" + PremiumPageBlobAccessTierP4 PremiumPageBlobAccessTier = "P4" + PremiumPageBlobAccessTierP40 PremiumPageBlobAccessTier = "P40" + PremiumPageBlobAccessTierP50 PremiumPageBlobAccessTier = "P50" + PremiumPageBlobAccessTierP6 PremiumPageBlobAccessTier = "P6" + PremiumPageBlobAccessTierP60 PremiumPageBlobAccessTier = "P60" + PremiumPageBlobAccessTierP70 PremiumPageBlobAccessTier = "P70" + PremiumPageBlobAccessTierP80 PremiumPageBlobAccessTier = "P80" +) + +// PossiblePremiumPageBlobAccessTierValues returns the possible values for the PremiumPageBlobAccessTier const type. +func PossiblePremiumPageBlobAccessTierValues() []PremiumPageBlobAccessTier { + return []PremiumPageBlobAccessTier{ + PremiumPageBlobAccessTierP10, + PremiumPageBlobAccessTierP15, + PremiumPageBlobAccessTierP20, + PremiumPageBlobAccessTierP30, + PremiumPageBlobAccessTierP4, + PremiumPageBlobAccessTierP40, + PremiumPageBlobAccessTierP50, + PremiumPageBlobAccessTierP6, + PremiumPageBlobAccessTierP60, + PremiumPageBlobAccessTierP70, + PremiumPageBlobAccessTierP80, + } +} + +// ToPtr() returns a *PremiumPageBlobAccessTier pointing to the current value. +func (c PremiumPageBlobAccessTier) ToPtr() *PremiumPageBlobAccessTier { + return &c +} + +type PublicAccessType string + +const ( + PublicAccessTypeBlob PublicAccessType = "blob" + PublicAccessTypeContainer PublicAccessType = "container" +) + +// PossiblePublicAccessTypeValues returns the possible values for the PublicAccessType const type. +func PossiblePublicAccessTypeValues() []PublicAccessType { + return []PublicAccessType{ + PublicAccessTypeBlob, + PublicAccessTypeContainer, + } +} + +// ToPtr() returns a *PublicAccessType pointing to the current value. +func (c PublicAccessType) ToPtr() *PublicAccessType { + return &c +} + +// QueryFormatType - The quick query format type. +type QueryFormatType string + +const ( + QueryFormatTypeDelimited QueryFormatType = "delimited" + QueryFormatTypeJSON QueryFormatType = "json" +) + +// PossibleQueryFormatTypeValues returns the possible values for the QueryFormatType const type. +func PossibleQueryFormatTypeValues() []QueryFormatType { + return []QueryFormatType{ + QueryFormatTypeDelimited, + QueryFormatTypeJSON, + } +} + +// ToPtr() returns a *QueryFormatType pointing to the current value. +func (c QueryFormatType) ToPtr() *QueryFormatType { + return &c +} + +// RehydratePriority - If an object is in rehydrate pending state then this header is returned with priority of rehydrate. Valid values are High and Standard. +type RehydratePriority string + +const ( + RehydratePriorityHigh RehydratePriority = "High" + RehydratePriorityStandard RehydratePriority = "Standard" +) + +// PossibleRehydratePriorityValues returns the possible values for the RehydratePriority const type. +func PossibleRehydratePriorityValues() []RehydratePriority { + return []RehydratePriority{ + RehydratePriorityHigh, + RehydratePriorityStandard, + } +} + +// ToPtr() returns a *RehydratePriority pointing to the current value. +func (c RehydratePriority) ToPtr() *RehydratePriority { + return &c +} + +type SKUName string + +const ( + SKUNameStandardLRS SKUName = "Standard_LRS" + SKUNameStandardGRS SKUName = "Standard_GRS" + SKUNameStandardRAGRS SKUName = "Standard_RAGRS" + SKUNameStandardZRS SKUName = "Standard_ZRS" + SKUNamePremiumLRS SKUName = "Premium_LRS" +) + +// PossibleSKUNameValues returns the possible values for the SKUName const type. +func PossibleSKUNameValues() []SKUName { + return []SKUName{ + SKUNameStandardLRS, + SKUNameStandardGRS, + SKUNameStandardRAGRS, + SKUNameStandardZRS, + SKUNamePremiumLRS, + } +} + +// ToPtr() returns a *SKUName pointing to the current value. +func (c SKUName) ToPtr() *SKUName { + return &c +} + +type SequenceNumberActionType string + +const ( + SequenceNumberActionTypeMax SequenceNumberActionType = "max" + SequenceNumberActionTypeUpdate SequenceNumberActionType = "update" + SequenceNumberActionTypeIncrement SequenceNumberActionType = "increment" +) + +// PossibleSequenceNumberActionTypeValues returns the possible values for the SequenceNumberActionType const type. +func PossibleSequenceNumberActionTypeValues() []SequenceNumberActionType { + return []SequenceNumberActionType{ + SequenceNumberActionTypeMax, + SequenceNumberActionTypeUpdate, + SequenceNumberActionTypeIncrement, + } +} + +// ToPtr() returns a *SequenceNumberActionType pointing to the current value. +func (c SequenceNumberActionType) ToPtr() *SequenceNumberActionType { + return &c +} + +// StorageErrorCode - Error codes returned by the service +type StorageErrorCode string + +const ( + StorageErrorCodeAccountAlreadyExists StorageErrorCode = "AccountAlreadyExists" + StorageErrorCodeAccountBeingCreated StorageErrorCode = "AccountBeingCreated" + StorageErrorCodeAccountIsDisabled StorageErrorCode = "AccountIsDisabled" + StorageErrorCodeAppendPositionConditionNotMet StorageErrorCode = "AppendPositionConditionNotMet" + StorageErrorCodeAuthenticationFailed StorageErrorCode = "AuthenticationFailed" + StorageErrorCodeAuthorizationFailure StorageErrorCode = "AuthorizationFailure" + StorageErrorCodeAuthorizationPermissionMismatch StorageErrorCode = "AuthorizationPermissionMismatch" + StorageErrorCodeAuthorizationProtocolMismatch StorageErrorCode = "AuthorizationProtocolMismatch" + StorageErrorCodeAuthorizationResourceTypeMismatch StorageErrorCode = "AuthorizationResourceTypeMismatch" + StorageErrorCodeAuthorizationServiceMismatch StorageErrorCode = "AuthorizationServiceMismatch" + StorageErrorCodeAuthorizationSourceIPMismatch StorageErrorCode = "AuthorizationSourceIPMismatch" + StorageErrorCodeBlobAlreadyExists StorageErrorCode = "BlobAlreadyExists" + StorageErrorCodeBlobArchived StorageErrorCode = "BlobArchived" + StorageErrorCodeBlobBeingRehydrated StorageErrorCode = "BlobBeingRehydrated" + StorageErrorCodeBlobImmutableDueToPolicy StorageErrorCode = "BlobImmutableDueToPolicy" + StorageErrorCodeBlobNotArchived StorageErrorCode = "BlobNotArchived" + StorageErrorCodeBlobNotFound StorageErrorCode = "BlobNotFound" + StorageErrorCodeBlobOverwritten StorageErrorCode = "BlobOverwritten" + StorageErrorCodeBlobTierInadequateForContentLength StorageErrorCode = "BlobTierInadequateForContentLength" + StorageErrorCodeBlockCountExceedsLimit StorageErrorCode = "BlockCountExceedsLimit" + StorageErrorCodeBlockListTooLong StorageErrorCode = "BlockListTooLong" + StorageErrorCodeCannotChangeToLowerTier StorageErrorCode = "CannotChangeToLowerTier" + StorageErrorCodeCannotVerifyCopySource StorageErrorCode = "CannotVerifyCopySource" + StorageErrorCodeConditionHeadersNotSupported StorageErrorCode = "ConditionHeadersNotSupported" + StorageErrorCodeConditionNotMet StorageErrorCode = "ConditionNotMet" + StorageErrorCodeContainerAlreadyExists StorageErrorCode = "ContainerAlreadyExists" + StorageErrorCodeContainerBeingDeleted StorageErrorCode = "ContainerBeingDeleted" + StorageErrorCodeContainerDisabled StorageErrorCode = "ContainerDisabled" + StorageErrorCodeContainerNotFound StorageErrorCode = "ContainerNotFound" + StorageErrorCodeContentLengthLargerThanTierLimit StorageErrorCode = "ContentLengthLargerThanTierLimit" + StorageErrorCodeCopyAcrossAccountsNotSupported StorageErrorCode = "CopyAcrossAccountsNotSupported" + StorageErrorCodeCopyIDMismatch StorageErrorCode = "CopyIdMismatch" + StorageErrorCodeEmptyMetadataKey StorageErrorCode = "EmptyMetadataKey" + StorageErrorCodeFeatureVersionMismatch StorageErrorCode = "FeatureVersionMismatch" + StorageErrorCodeIncrementalCopyBlobMismatch StorageErrorCode = "IncrementalCopyBlobMismatch" + StorageErrorCodeIncrementalCopyOfEralierVersionSnapshotNotAllowed StorageErrorCode = "IncrementalCopyOfEralierVersionSnapshotNotAllowed" + StorageErrorCodeIncrementalCopySourceMustBeSnapshot StorageErrorCode = "IncrementalCopySourceMustBeSnapshot" + StorageErrorCodeInfiniteLeaseDurationRequired StorageErrorCode = "InfiniteLeaseDurationRequired" + StorageErrorCodeInsufficientAccountPermissions StorageErrorCode = "InsufficientAccountPermissions" + StorageErrorCodeInternalError StorageErrorCode = "InternalError" + StorageErrorCodeInvalidAuthenticationInfo StorageErrorCode = "InvalidAuthenticationInfo" + StorageErrorCodeInvalidBlobOrBlock StorageErrorCode = "InvalidBlobOrBlock" + StorageErrorCodeInvalidBlobTier StorageErrorCode = "InvalidBlobTier" + StorageErrorCodeInvalidBlobType StorageErrorCode = "InvalidBlobType" + StorageErrorCodeInvalidBlockID StorageErrorCode = "InvalidBlockId" + StorageErrorCodeInvalidBlockList StorageErrorCode = "InvalidBlockList" + StorageErrorCodeInvalidHTTPVerb StorageErrorCode = "InvalidHttpVerb" + StorageErrorCodeInvalidHeaderValue StorageErrorCode = "InvalidHeaderValue" + StorageErrorCodeInvalidInput StorageErrorCode = "InvalidInput" + StorageErrorCodeInvalidMD5 StorageErrorCode = "InvalidMd5" + StorageErrorCodeInvalidMetadata StorageErrorCode = "InvalidMetadata" + StorageErrorCodeInvalidOperation StorageErrorCode = "InvalidOperation" + StorageErrorCodeInvalidPageRange StorageErrorCode = "InvalidPageRange" + StorageErrorCodeInvalidQueryParameterValue StorageErrorCode = "InvalidQueryParameterValue" + StorageErrorCodeInvalidRange StorageErrorCode = "InvalidRange" + StorageErrorCodeInvalidResourceName StorageErrorCode = "InvalidResourceName" + StorageErrorCodeInvalidSourceBlobType StorageErrorCode = "InvalidSourceBlobType" + StorageErrorCodeInvalidSourceBlobURL StorageErrorCode = "InvalidSourceBlobUrl" + StorageErrorCodeInvalidURI StorageErrorCode = "InvalidUri" + StorageErrorCodeInvalidVersionForPageBlobOperation StorageErrorCode = "InvalidVersionForPageBlobOperation" + StorageErrorCodeInvalidXMLDocument StorageErrorCode = "InvalidXmlDocument" + StorageErrorCodeInvalidXMLNodeValue StorageErrorCode = "InvalidXmlNodeValue" + StorageErrorCodeLeaseAlreadyBroken StorageErrorCode = "LeaseAlreadyBroken" + StorageErrorCodeLeaseAlreadyPresent StorageErrorCode = "LeaseAlreadyPresent" + StorageErrorCodeLeaseIDMismatchWithBlobOperation StorageErrorCode = "LeaseIdMismatchWithBlobOperation" + StorageErrorCodeLeaseIDMismatchWithContainerOperation StorageErrorCode = "LeaseIdMismatchWithContainerOperation" + StorageErrorCodeLeaseIDMismatchWithLeaseOperation StorageErrorCode = "LeaseIdMismatchWithLeaseOperation" + StorageErrorCodeLeaseIDMissing StorageErrorCode = "LeaseIdMissing" + StorageErrorCodeLeaseIsBreakingAndCannotBeAcquired StorageErrorCode = "LeaseIsBreakingAndCannotBeAcquired" + StorageErrorCodeLeaseIsBreakingAndCannotBeChanged StorageErrorCode = "LeaseIsBreakingAndCannotBeChanged" + StorageErrorCodeLeaseIsBrokenAndCannotBeRenewed StorageErrorCode = "LeaseIsBrokenAndCannotBeRenewed" + StorageErrorCodeLeaseLost StorageErrorCode = "LeaseLost" + StorageErrorCodeLeaseNotPresentWithBlobOperation StorageErrorCode = "LeaseNotPresentWithBlobOperation" + StorageErrorCodeLeaseNotPresentWithContainerOperation StorageErrorCode = "LeaseNotPresentWithContainerOperation" + StorageErrorCodeLeaseNotPresentWithLeaseOperation StorageErrorCode = "LeaseNotPresentWithLeaseOperation" + StorageErrorCodeMD5Mismatch StorageErrorCode = "Md5Mismatch" + StorageErrorCodeMaxBlobSizeConditionNotMet StorageErrorCode = "MaxBlobSizeConditionNotMet" + StorageErrorCodeMetadataTooLarge StorageErrorCode = "MetadataTooLarge" + StorageErrorCodeMissingContentLengthHeader StorageErrorCode = "MissingContentLengthHeader" + StorageErrorCodeMissingRequiredHeader StorageErrorCode = "MissingRequiredHeader" + StorageErrorCodeMissingRequiredQueryParameter StorageErrorCode = "MissingRequiredQueryParameter" + StorageErrorCodeMissingRequiredXMLNode StorageErrorCode = "MissingRequiredXmlNode" + StorageErrorCodeMultipleConditionHeadersNotSupported StorageErrorCode = "MultipleConditionHeadersNotSupported" + StorageErrorCodeNoAuthenticationInformation StorageErrorCode = "NoAuthenticationInformation" + StorageErrorCodeNoPendingCopyOperation StorageErrorCode = "NoPendingCopyOperation" + StorageErrorCodeOperationNotAllowedOnIncrementalCopyBlob StorageErrorCode = "OperationNotAllowedOnIncrementalCopyBlob" + StorageErrorCodeOperationTimedOut StorageErrorCode = "OperationTimedOut" + StorageErrorCodeOutOfRangeInput StorageErrorCode = "OutOfRangeInput" + StorageErrorCodeOutOfRangeQueryParameterValue StorageErrorCode = "OutOfRangeQueryParameterValue" + StorageErrorCodePendingCopyOperation StorageErrorCode = "PendingCopyOperation" + StorageErrorCodePreviousSnapshotCannotBeNewer StorageErrorCode = "PreviousSnapshotCannotBeNewer" + StorageErrorCodePreviousSnapshotNotFound StorageErrorCode = "PreviousSnapshotNotFound" + StorageErrorCodePreviousSnapshotOperationNotSupported StorageErrorCode = "PreviousSnapshotOperationNotSupported" + StorageErrorCodeRequestBodyTooLarge StorageErrorCode = "RequestBodyTooLarge" + StorageErrorCodeRequestURLFailedToParse StorageErrorCode = "RequestUrlFailedToParse" + StorageErrorCodeResourceAlreadyExists StorageErrorCode = "ResourceAlreadyExists" + StorageErrorCodeResourceNotFound StorageErrorCode = "ResourceNotFound" + StorageErrorCodeResourceTypeMismatch StorageErrorCode = "ResourceTypeMismatch" + StorageErrorCodeSequenceNumberConditionNotMet StorageErrorCode = "SequenceNumberConditionNotMet" + StorageErrorCodeSequenceNumberIncrementTooLarge StorageErrorCode = "SequenceNumberIncrementTooLarge" + StorageErrorCodeServerBusy StorageErrorCode = "ServerBusy" + StorageErrorCodeSnaphotOperationRateExceeded StorageErrorCode = "SnaphotOperationRateExceeded" + StorageErrorCodeSnapshotCountExceeded StorageErrorCode = "SnapshotCountExceeded" + StorageErrorCodeSnapshotsPresent StorageErrorCode = "SnapshotsPresent" + StorageErrorCodeSourceConditionNotMet StorageErrorCode = "SourceConditionNotMet" + StorageErrorCodeSystemInUse StorageErrorCode = "SystemInUse" + StorageErrorCodeTargetConditionNotMet StorageErrorCode = "TargetConditionNotMet" + StorageErrorCodeUnauthorizedBlobOverwrite StorageErrorCode = "UnauthorizedBlobOverwrite" + StorageErrorCodeUnsupportedHTTPVerb StorageErrorCode = "UnsupportedHttpVerb" + StorageErrorCodeUnsupportedHeader StorageErrorCode = "UnsupportedHeader" + StorageErrorCodeUnsupportedQueryParameter StorageErrorCode = "UnsupportedQueryParameter" + StorageErrorCodeUnsupportedXMLNode StorageErrorCode = "UnsupportedXmlNode" +) + +// PossibleStorageErrorCodeValues returns the possible values for the StorageErrorCode const type. +func PossibleStorageErrorCodeValues() []StorageErrorCode { + return []StorageErrorCode{ + StorageErrorCodeAccountAlreadyExists, + StorageErrorCodeAccountBeingCreated, + StorageErrorCodeAccountIsDisabled, + StorageErrorCodeAppendPositionConditionNotMet, + StorageErrorCodeAuthenticationFailed, + StorageErrorCodeAuthorizationFailure, + StorageErrorCodeAuthorizationPermissionMismatch, + StorageErrorCodeAuthorizationProtocolMismatch, + StorageErrorCodeAuthorizationResourceTypeMismatch, + StorageErrorCodeAuthorizationServiceMismatch, + StorageErrorCodeAuthorizationSourceIPMismatch, + StorageErrorCodeBlobAlreadyExists, + StorageErrorCodeBlobArchived, + StorageErrorCodeBlobBeingRehydrated, + StorageErrorCodeBlobImmutableDueToPolicy, + StorageErrorCodeBlobNotArchived, + StorageErrorCodeBlobNotFound, + StorageErrorCodeBlobOverwritten, + StorageErrorCodeBlobTierInadequateForContentLength, + StorageErrorCodeBlockCountExceedsLimit, + StorageErrorCodeBlockListTooLong, + StorageErrorCodeCannotChangeToLowerTier, + StorageErrorCodeCannotVerifyCopySource, + StorageErrorCodeConditionHeadersNotSupported, + StorageErrorCodeConditionNotMet, + StorageErrorCodeContainerAlreadyExists, + StorageErrorCodeContainerBeingDeleted, + StorageErrorCodeContainerDisabled, + StorageErrorCodeContainerNotFound, + StorageErrorCodeContentLengthLargerThanTierLimit, + StorageErrorCodeCopyAcrossAccountsNotSupported, + StorageErrorCodeCopyIDMismatch, + StorageErrorCodeEmptyMetadataKey, + StorageErrorCodeFeatureVersionMismatch, + StorageErrorCodeIncrementalCopyBlobMismatch, + StorageErrorCodeIncrementalCopyOfEralierVersionSnapshotNotAllowed, + StorageErrorCodeIncrementalCopySourceMustBeSnapshot, + StorageErrorCodeInfiniteLeaseDurationRequired, + StorageErrorCodeInsufficientAccountPermissions, + StorageErrorCodeInternalError, + StorageErrorCodeInvalidAuthenticationInfo, + StorageErrorCodeInvalidBlobOrBlock, + StorageErrorCodeInvalidBlobTier, + StorageErrorCodeInvalidBlobType, + StorageErrorCodeInvalidBlockID, + StorageErrorCodeInvalidBlockList, + StorageErrorCodeInvalidHTTPVerb, + StorageErrorCodeInvalidHeaderValue, + StorageErrorCodeInvalidInput, + StorageErrorCodeInvalidMD5, + StorageErrorCodeInvalidMetadata, + StorageErrorCodeInvalidOperation, + StorageErrorCodeInvalidPageRange, + StorageErrorCodeInvalidQueryParameterValue, + StorageErrorCodeInvalidRange, + StorageErrorCodeInvalidResourceName, + StorageErrorCodeInvalidSourceBlobType, + StorageErrorCodeInvalidSourceBlobURL, + StorageErrorCodeInvalidURI, + StorageErrorCodeInvalidVersionForPageBlobOperation, + StorageErrorCodeInvalidXMLDocument, + StorageErrorCodeInvalidXMLNodeValue, + StorageErrorCodeLeaseAlreadyBroken, + StorageErrorCodeLeaseAlreadyPresent, + StorageErrorCodeLeaseIDMismatchWithBlobOperation, + StorageErrorCodeLeaseIDMismatchWithContainerOperation, + StorageErrorCodeLeaseIDMismatchWithLeaseOperation, + StorageErrorCodeLeaseIDMissing, + StorageErrorCodeLeaseIsBreakingAndCannotBeAcquired, + StorageErrorCodeLeaseIsBreakingAndCannotBeChanged, + StorageErrorCodeLeaseIsBrokenAndCannotBeRenewed, + StorageErrorCodeLeaseLost, + StorageErrorCodeLeaseNotPresentWithBlobOperation, + StorageErrorCodeLeaseNotPresentWithContainerOperation, + StorageErrorCodeLeaseNotPresentWithLeaseOperation, + StorageErrorCodeMD5Mismatch, + StorageErrorCodeMaxBlobSizeConditionNotMet, + StorageErrorCodeMetadataTooLarge, + StorageErrorCodeMissingContentLengthHeader, + StorageErrorCodeMissingRequiredHeader, + StorageErrorCodeMissingRequiredQueryParameter, + StorageErrorCodeMissingRequiredXMLNode, + StorageErrorCodeMultipleConditionHeadersNotSupported, + StorageErrorCodeNoAuthenticationInformation, + StorageErrorCodeNoPendingCopyOperation, + StorageErrorCodeOperationNotAllowedOnIncrementalCopyBlob, + StorageErrorCodeOperationTimedOut, + StorageErrorCodeOutOfRangeInput, + StorageErrorCodeOutOfRangeQueryParameterValue, + StorageErrorCodePendingCopyOperation, + StorageErrorCodePreviousSnapshotCannotBeNewer, + StorageErrorCodePreviousSnapshotNotFound, + StorageErrorCodePreviousSnapshotOperationNotSupported, + StorageErrorCodeRequestBodyTooLarge, + StorageErrorCodeRequestURLFailedToParse, + StorageErrorCodeResourceAlreadyExists, + StorageErrorCodeResourceNotFound, + StorageErrorCodeResourceTypeMismatch, + StorageErrorCodeSequenceNumberConditionNotMet, + StorageErrorCodeSequenceNumberIncrementTooLarge, + StorageErrorCodeServerBusy, + StorageErrorCodeSnaphotOperationRateExceeded, + StorageErrorCodeSnapshotCountExceeded, + StorageErrorCodeSnapshotsPresent, + StorageErrorCodeSourceConditionNotMet, + StorageErrorCodeSystemInUse, + StorageErrorCodeTargetConditionNotMet, + StorageErrorCodeUnauthorizedBlobOverwrite, + StorageErrorCodeUnsupportedHTTPVerb, + StorageErrorCodeUnsupportedHeader, + StorageErrorCodeUnsupportedQueryParameter, + StorageErrorCodeUnsupportedXMLNode, + } +} + +// ToPtr() returns a *StorageErrorCode pointing to the current value. +func (c StorageErrorCode) ToPtr() *StorageErrorCode { + return &c +} + diff --git a/sdk/storage/azblob/zz_generated_container.go b/sdk/storage/azblob/zz_generated_container_client.go similarity index 68% rename from sdk/storage/azblob/zz_generated_container.go rename to sdk/storage/azblob/zz_generated_container_client.go index e7757df0cf47..5576de2ad3c2 100644 --- a/sdk/storage/azblob/zz_generated_container.go +++ b/sdk/storage/azblob/zz_generated_container_client.go @@ -11,63 +11,53 @@ import ( "context" "encoding/xml" "fmt" + "github.com/Azure/azure-sdk-for-go/sdk/azcore" "net/http" "strconv" "strings" "time" - - "github.com/Azure/azure-sdk-for-go/sdk/azcore" ) type containerClient struct { con *connection } -// Pipeline returns the pipeline associated with this client. -func (client containerClient) Pipeline() azcore.Pipeline { - return client.con.Pipeline() -} - // AcquireLease - [Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 to 60 seconds, or can be infinite -func (client containerClient) AcquireLease(ctx context.Context, containerAcquireLeaseOptions *ContainerAcquireLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerAcquireLeaseResponse, error) { +func (client *containerClient) AcquireLease(ctx context.Context, containerAcquireLeaseOptions *ContainerAcquireLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerAcquireLeaseResponse, error) { req, err := client.acquireLeaseCreateRequest(ctx, containerAcquireLeaseOptions, modifiedAccessConditions) if err != nil { return ContainerAcquireLeaseResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return ContainerAcquireLeaseResponse{}, err } if !resp.HasStatusCode(http.StatusCreated) { return ContainerAcquireLeaseResponse{}, client.acquireLeaseHandleError(resp) } - result, err := client.acquireLeaseHandleResponse(resp) - if err != nil { - return ContainerAcquireLeaseResponse{}, err - } - return result, nil + return client.acquireLeaseHandleResponse(resp) } // acquireLeaseCreateRequest creates the AcquireLease request. -func (client containerClient) acquireLeaseCreateRequest(ctx context.Context, containerAcquireLeaseOptions *ContainerAcquireLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *containerClient) acquireLeaseCreateRequest(ctx context.Context, containerAcquireLeaseOptions *ContainerAcquireLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "lease") - query.Set("restype", "container") + reqQP := req.URL.Query() + reqQP.Set("comp", "lease") + reqQP.Set("restype", "container") if containerAcquireLeaseOptions != nil && containerAcquireLeaseOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*containerAcquireLeaseOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*containerAcquireLeaseOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-lease-action", "acquire") if containerAcquireLeaseOptions != nil && containerAcquireLeaseOptions.Duration != nil { req.Header.Set("x-ms-lease-duration", strconv.FormatInt(int64(*containerAcquireLeaseOptions.Duration), 10)) } - if containerAcquireLeaseOptions != nil && containerAcquireLeaseOptions.ProposedLeaseId != nil { - req.Header.Set("x-ms-proposed-lease-id", *containerAcquireLeaseOptions.ProposedLeaseId) + if containerAcquireLeaseOptions != nil && containerAcquireLeaseOptions.ProposedLeaseID != nil { + req.Header.Set("x-ms-proposed-lease-id", *containerAcquireLeaseOptions.ProposedLeaseID) } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Header.Set("If-Modified-Since", modifiedAccessConditions.IfModifiedSince.Format(time.RFC1123)) @@ -76,15 +66,15 @@ func (client containerClient) acquireLeaseCreateRequest(ctx context.Context, con req.Header.Set("If-Unmodified-Since", modifiedAccessConditions.IfUnmodifiedSince.Format(time.RFC1123)) } req.Header.Set("x-ms-version", "2019-12-12") - if containerAcquireLeaseOptions != nil && containerAcquireLeaseOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *containerAcquireLeaseOptions.RequestId) + if containerAcquireLeaseOptions != nil && containerAcquireLeaseOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *containerAcquireLeaseOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // acquireLeaseHandleResponse handles the AcquireLease response. -func (client containerClient) acquireLeaseHandleResponse(resp *azcore.Response) (ContainerAcquireLeaseResponse, error) { +func (client *containerClient) acquireLeaseHandleResponse(resp *azcore.Response) (ContainerAcquireLeaseResponse, error) { result := ContainerAcquireLeaseResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -119,8 +109,8 @@ func (client containerClient) acquireLeaseHandleResponse(resp *azcore.Response) } // acquireLeaseHandleError handles the AcquireLease error response. -func (client containerClient) acquireLeaseHandleError(resp *azcore.Response) error { - var err StorageError +func (client *containerClient) acquireLeaseHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -128,39 +118,35 @@ func (client containerClient) acquireLeaseHandleError(resp *azcore.Response) err } // BreakLease - [Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 to 60 seconds, or can be infinite -func (client containerClient) BreakLease(ctx context.Context, containerBreakLeaseOptions *ContainerBreakLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerBreakLeaseResponse, error) { +func (client *containerClient) BreakLease(ctx context.Context, containerBreakLeaseOptions *ContainerBreakLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerBreakLeaseResponse, error) { req, err := client.breakLeaseCreateRequest(ctx, containerBreakLeaseOptions, modifiedAccessConditions) if err != nil { return ContainerBreakLeaseResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return ContainerBreakLeaseResponse{}, err } if !resp.HasStatusCode(http.StatusAccepted) { return ContainerBreakLeaseResponse{}, client.breakLeaseHandleError(resp) } - result, err := client.breakLeaseHandleResponse(resp) - if err != nil { - return ContainerBreakLeaseResponse{}, err - } - return result, nil + return client.breakLeaseHandleResponse(resp) } // breakLeaseCreateRequest creates the BreakLease request. -func (client containerClient) breakLeaseCreateRequest(ctx context.Context, containerBreakLeaseOptions *ContainerBreakLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *containerClient) breakLeaseCreateRequest(ctx context.Context, containerBreakLeaseOptions *ContainerBreakLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "lease") - query.Set("restype", "container") + reqQP := req.URL.Query() + reqQP.Set("comp", "lease") + reqQP.Set("restype", "container") if containerBreakLeaseOptions != nil && containerBreakLeaseOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*containerBreakLeaseOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*containerBreakLeaseOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-lease-action", "break") if containerBreakLeaseOptions != nil && containerBreakLeaseOptions.BreakPeriod != nil { req.Header.Set("x-ms-lease-break-period", strconv.FormatInt(int64(*containerBreakLeaseOptions.BreakPeriod), 10)) @@ -172,15 +158,15 @@ func (client containerClient) breakLeaseCreateRequest(ctx context.Context, conta req.Header.Set("If-Unmodified-Since", modifiedAccessConditions.IfUnmodifiedSince.Format(time.RFC1123)) } req.Header.Set("x-ms-version", "2019-12-12") - if containerBreakLeaseOptions != nil && containerBreakLeaseOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *containerBreakLeaseOptions.RequestId) + if containerBreakLeaseOptions != nil && containerBreakLeaseOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *containerBreakLeaseOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // breakLeaseHandleResponse handles the BreakLease response. -func (client containerClient) breakLeaseHandleResponse(resp *azcore.Response) (ContainerBreakLeaseResponse, error) { +func (client *containerClient) breakLeaseHandleResponse(resp *azcore.Response) (ContainerBreakLeaseResponse, error) { result := ContainerBreakLeaseResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -220,8 +206,8 @@ func (client containerClient) breakLeaseHandleResponse(resp *azcore.Response) (C } // breakLeaseHandleError handles the BreakLease error response. -func (client containerClient) breakLeaseHandleError(resp *azcore.Response) error { - var err StorageError +func (client *containerClient) breakLeaseHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -229,42 +215,38 @@ func (client containerClient) breakLeaseHandleError(resp *azcore.Response) error } // ChangeLease - [Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 to 60 seconds, or can be infinite -func (client containerClient) ChangeLease(ctx context.Context, leaseId string, proposedLeaseId string, containerChangeLeaseOptions *ContainerChangeLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerChangeLeaseResponse, error) { - req, err := client.changeLeaseCreateRequest(ctx, leaseId, proposedLeaseId, containerChangeLeaseOptions, modifiedAccessConditions) +func (client *containerClient) ChangeLease(ctx context.Context, leaseID string, proposedLeaseID string, containerChangeLeaseOptions *ContainerChangeLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerChangeLeaseResponse, error) { + req, err := client.changeLeaseCreateRequest(ctx, leaseID, proposedLeaseID, containerChangeLeaseOptions, modifiedAccessConditions) if err != nil { return ContainerChangeLeaseResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return ContainerChangeLeaseResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return ContainerChangeLeaseResponse{}, client.changeLeaseHandleError(resp) } - result, err := client.changeLeaseHandleResponse(resp) - if err != nil { - return ContainerChangeLeaseResponse{}, err - } - return result, nil + return client.changeLeaseHandleResponse(resp) } // changeLeaseCreateRequest creates the ChangeLease request. -func (client containerClient) changeLeaseCreateRequest(ctx context.Context, leaseId string, proposedLeaseId string, containerChangeLeaseOptions *ContainerChangeLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *containerClient) changeLeaseCreateRequest(ctx context.Context, leaseID string, proposedLeaseID string, containerChangeLeaseOptions *ContainerChangeLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "lease") - query.Set("restype", "container") + reqQP := req.URL.Query() + reqQP.Set("comp", "lease") + reqQP.Set("restype", "container") if containerChangeLeaseOptions != nil && containerChangeLeaseOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*containerChangeLeaseOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*containerChangeLeaseOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-lease-action", "change") - req.Header.Set("x-ms-lease-id", leaseId) - req.Header.Set("x-ms-proposed-lease-id", proposedLeaseId) + req.Header.Set("x-ms-lease-id", leaseID) + req.Header.Set("x-ms-proposed-lease-id", proposedLeaseID) if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Header.Set("If-Modified-Since", modifiedAccessConditions.IfModifiedSince.Format(time.RFC1123)) } @@ -272,15 +254,15 @@ func (client containerClient) changeLeaseCreateRequest(ctx context.Context, leas req.Header.Set("If-Unmodified-Since", modifiedAccessConditions.IfUnmodifiedSince.Format(time.RFC1123)) } req.Header.Set("x-ms-version", "2019-12-12") - if containerChangeLeaseOptions != nil && containerChangeLeaseOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *containerChangeLeaseOptions.RequestId) + if containerChangeLeaseOptions != nil && containerChangeLeaseOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *containerChangeLeaseOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // changeLeaseHandleResponse handles the ChangeLease response. -func (client containerClient) changeLeaseHandleResponse(resp *azcore.Response) (ContainerChangeLeaseResponse, error) { +func (client *containerClient) changeLeaseHandleResponse(resp *azcore.Response) (ContainerChangeLeaseResponse, error) { result := ContainerChangeLeaseResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -315,8 +297,8 @@ func (client containerClient) changeLeaseHandleResponse(resp *azcore.Response) ( } // changeLeaseHandleError handles the ChangeLease error response. -func (client containerClient) changeLeaseHandleError(resp *azcore.Response) error { - var err StorageError +func (client *containerClient) changeLeaseHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -324,38 +306,34 @@ func (client containerClient) changeLeaseHandleError(resp *azcore.Response) erro } // Create - creates a new container under the specified account. If the container with the same name already exists, the operation fails -func (client containerClient) Create(ctx context.Context, containerCreateOptions *ContainerCreateOptions, containerCpkScopeInfo *ContainerCpkScopeInfo) (ContainerCreateResponse, error) { +func (client *containerClient) Create(ctx context.Context, containerCreateOptions *ContainerCreateOptions, containerCpkScopeInfo *ContainerCpkScopeInfo) (ContainerCreateResponse, error) { req, err := client.createCreateRequest(ctx, containerCreateOptions, containerCpkScopeInfo) if err != nil { return ContainerCreateResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return ContainerCreateResponse{}, err } if !resp.HasStatusCode(http.StatusCreated) { return ContainerCreateResponse{}, client.createHandleError(resp) } - result, err := client.createHandleResponse(resp) - if err != nil { - return ContainerCreateResponse{}, err - } - return result, nil + return client.createHandleResponse(resp) } // createCreateRequest creates the Create request. -func (client containerClient) createCreateRequest(ctx context.Context, containerCreateOptions *ContainerCreateOptions, containerCpkScopeInfo *ContainerCpkScopeInfo) (*azcore.Request, error) { +func (client *containerClient) createCreateRequest(ctx context.Context, containerCreateOptions *ContainerCreateOptions, containerCpkScopeInfo *ContainerCpkScopeInfo) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("restype", "container") + reqQP := req.URL.Query() + reqQP.Set("restype", "container") if containerCreateOptions != nil && containerCreateOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*containerCreateOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*containerCreateOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() if containerCreateOptions != nil && containerCreateOptions.Metadata != nil { for k, v := range *containerCreateOptions.Metadata { req.Header.Set("x-ms-meta-"+k, v) @@ -365,8 +343,8 @@ func (client containerClient) createCreateRequest(ctx context.Context, container req.Header.Set("x-ms-blob-public-access", string(*containerCreateOptions.Access)) } req.Header.Set("x-ms-version", "2019-12-12") - if containerCreateOptions != nil && containerCreateOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *containerCreateOptions.RequestId) + if containerCreateOptions != nil && containerCreateOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *containerCreateOptions.RequestID) } if containerCpkScopeInfo != nil && containerCpkScopeInfo.DefaultEncryptionScope != nil { req.Header.Set("x-ms-default-encryption-scope", *containerCpkScopeInfo.DefaultEncryptionScope) @@ -379,7 +357,7 @@ func (client containerClient) createCreateRequest(ctx context.Context, container } // createHandleResponse handles the Create response. -func (client containerClient) createHandleResponse(resp *azcore.Response) (ContainerCreateResponse, error) { +func (client *containerClient) createHandleResponse(resp *azcore.Response) (ContainerCreateResponse, error) { result := ContainerCreateResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -411,8 +389,8 @@ func (client containerClient) createHandleResponse(resp *azcore.Response) (Conta } // createHandleError handles the Create error response. -func (client containerClient) createHandleError(resp *azcore.Response) error { - var err StorageError +func (client *containerClient) createHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -420,40 +398,36 @@ func (client containerClient) createHandleError(resp *azcore.Response) error { } // Delete - operation marks the specified container for deletion. The container and any blobs contained within it are later deleted during garbage collection -func (client containerClient) Delete(ctx context.Context, containerDeleteOptions *ContainerDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerDeleteResponse, error) { +func (client *containerClient) Delete(ctx context.Context, containerDeleteOptions *ContainerDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerDeleteResponse, error) { req, err := client.deleteCreateRequest(ctx, containerDeleteOptions, leaseAccessConditions, modifiedAccessConditions) if err != nil { return ContainerDeleteResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return ContainerDeleteResponse{}, err } if !resp.HasStatusCode(http.StatusAccepted) { return ContainerDeleteResponse{}, client.deleteHandleError(resp) } - result, err := client.deleteHandleResponse(resp) - if err != nil { - return ContainerDeleteResponse{}, err - } - return result, nil + return client.deleteHandleResponse(resp) } // deleteCreateRequest creates the Delete request. -func (client containerClient) deleteCreateRequest(ctx context.Context, containerDeleteOptions *ContainerDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *containerClient) deleteCreateRequest(ctx context.Context, containerDeleteOptions *ContainerDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodDelete, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("restype", "container") + reqQP := req.URL.Query() + reqQP.Set("restype", "container") if containerDeleteOptions != nil && containerDeleteOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*containerDeleteOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*containerDeleteOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + req.URL.RawQuery = reqQP.Encode() + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Header.Set("If-Modified-Since", modifiedAccessConditions.IfModifiedSince.Format(time.RFC1123)) @@ -462,15 +436,15 @@ func (client containerClient) deleteCreateRequest(ctx context.Context, container req.Header.Set("If-Unmodified-Since", modifiedAccessConditions.IfUnmodifiedSince.Format(time.RFC1123)) } req.Header.Set("x-ms-version", "2019-12-12") - if containerDeleteOptions != nil && containerDeleteOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *containerDeleteOptions.RequestId) + if containerDeleteOptions != nil && containerDeleteOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *containerDeleteOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // deleteHandleResponse handles the Delete response. -func (client containerClient) deleteHandleResponse(resp *azcore.Response) (ContainerDeleteResponse, error) { +func (client *containerClient) deleteHandleResponse(resp *azcore.Response) (ContainerDeleteResponse, error) { result := ContainerDeleteResponse{RawResponse: resp.Response} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val @@ -492,8 +466,8 @@ func (client containerClient) deleteHandleResponse(resp *azcore.Response) (Conta } // deleteHandleError handles the Delete error response. -func (client containerClient) deleteHandleError(resp *azcore.Response) error { - var err StorageError +func (client *containerClient) deleteHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -501,53 +475,52 @@ func (client containerClient) deleteHandleError(resp *azcore.Response) error { } // GetAccessPolicy - gets the permissions for the specified container. The permissions indicate whether container data may be accessed publicly. -func (client containerClient) GetAccessPolicy(ctx context.Context, containerGetAccessPolicyOptions *ContainerGetAccessPolicyOptions, leaseAccessConditions *LeaseAccessConditions) (SignedIDentifierArrayResponse, error) { +func (client *containerClient) GetAccessPolicy(ctx context.Context, containerGetAccessPolicyOptions *ContainerGetAccessPolicyOptions, leaseAccessConditions *LeaseAccessConditions) (SignedIdentifierArrayResponse, error) { req, err := client.getAccessPolicyCreateRequest(ctx, containerGetAccessPolicyOptions, leaseAccessConditions) if err != nil { - return SignedIDentifierArrayResponse{}, err + return SignedIdentifierArrayResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { - return SignedIDentifierArrayResponse{}, err + return SignedIdentifierArrayResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { - return SignedIDentifierArrayResponse{}, client.getAccessPolicyHandleError(resp) - } - result, err := client.getAccessPolicyHandleResponse(resp) - if err != nil { - return SignedIDentifierArrayResponse{}, err + return SignedIdentifierArrayResponse{}, client.getAccessPolicyHandleError(resp) } - return result, nil + return client.getAccessPolicyHandleResponse(resp) } // getAccessPolicyCreateRequest creates the GetAccessPolicy request. -func (client containerClient) getAccessPolicyCreateRequest(ctx context.Context, containerGetAccessPolicyOptions *ContainerGetAccessPolicyOptions, leaseAccessConditions *LeaseAccessConditions) (*azcore.Request, error) { +func (client *containerClient) getAccessPolicyCreateRequest(ctx context.Context, containerGetAccessPolicyOptions *ContainerGetAccessPolicyOptions, leaseAccessConditions *LeaseAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodGet, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("restype", "container") - query.Set("comp", "acl") + reqQP := req.URL.Query() + reqQP.Set("restype", "container") + reqQP.Set("comp", "acl") if containerGetAccessPolicyOptions != nil && containerGetAccessPolicyOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*containerGetAccessPolicyOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*containerGetAccessPolicyOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + req.URL.RawQuery = reqQP.Encode() + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } req.Header.Set("x-ms-version", "2019-12-12") - if containerGetAccessPolicyOptions != nil && containerGetAccessPolicyOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *containerGetAccessPolicyOptions.RequestId) + if containerGetAccessPolicyOptions != nil && containerGetAccessPolicyOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *containerGetAccessPolicyOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // getAccessPolicyHandleResponse handles the GetAccessPolicy response. -func (client containerClient) getAccessPolicyHandleResponse(resp *azcore.Response) (SignedIDentifierArrayResponse, error) { - result := SignedIDentifierArrayResponse{RawResponse: resp.Response} +func (client *containerClient) getAccessPolicyHandleResponse(resp *azcore.Response) (SignedIdentifierArrayResponse, error) { + result := SignedIdentifierArrayResponse{RawResponse: resp.Response} + if err := resp.UnmarshalAsXML(&result); err != nil { + return SignedIdentifierArrayResponse{}, err + } if val := resp.Header.Get("x-ms-blob-public-access"); val != "" { result.BlobPublicAccess = (*PublicAccessType)(&val) } @@ -557,7 +530,7 @@ func (client containerClient) getAccessPolicyHandleResponse(resp *azcore.Respons if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { - return SignedIDentifierArrayResponse{}, err + return SignedIdentifierArrayResponse{}, err } result.LastModified = &lastModified } @@ -573,17 +546,16 @@ func (client containerClient) getAccessPolicyHandleResponse(resp *azcore.Respons if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { - return SignedIDentifierArrayResponse{}, err + return SignedIdentifierArrayResponse{}, err } result.Date = &date } - err := resp.UnmarshalAsXML(&result) - return result, err + return result, nil } // getAccessPolicyHandleError handles the GetAccessPolicy error response. -func (client containerClient) getAccessPolicyHandleError(resp *azcore.Response) error { - var err StorageError +func (client *containerClient) getAccessPolicyHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -591,43 +563,39 @@ func (client containerClient) getAccessPolicyHandleError(resp *azcore.Response) } // GetAccountInfo - Returns the sku name and account kind -func (client containerClient) GetAccountInfo(ctx context.Context, options *ContainerGetAccountInfoOptions) (ContainerGetAccountInfoResponse, error) { +func (client *containerClient) GetAccountInfo(ctx context.Context, options *ContainerGetAccountInfoOptions) (ContainerGetAccountInfoResponse, error) { req, err := client.getAccountInfoCreateRequest(ctx, options) if err != nil { return ContainerGetAccountInfoResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return ContainerGetAccountInfoResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return ContainerGetAccountInfoResponse{}, client.getAccountInfoHandleError(resp) } - result, err := client.getAccountInfoHandleResponse(resp) - if err != nil { - return ContainerGetAccountInfoResponse{}, err - } - return result, nil + return client.getAccountInfoHandleResponse(resp) } // getAccountInfoCreateRequest creates the GetAccountInfo request. -func (client containerClient) getAccountInfoCreateRequest(ctx context.Context, options *ContainerGetAccountInfoOptions) (*azcore.Request, error) { +func (client *containerClient) getAccountInfoCreateRequest(ctx context.Context, options *ContainerGetAccountInfoOptions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodGet, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("restype", "account") - query.Set("comp", "properties") - req.URL.RawQuery = query.Encode() + reqQP := req.URL.Query() + reqQP.Set("restype", "account") + reqQP.Set("comp", "properties") + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-version", "2019-12-12") req.Header.Set("Accept", "application/xml") return req, nil } // getAccountInfoHandleResponse handles the GetAccountInfo response. -func (client containerClient) getAccountInfoHandleResponse(resp *azcore.Response) (ContainerGetAccountInfoResponse, error) { +func (client *containerClient) getAccountInfoHandleResponse(resp *azcore.Response) (ContainerGetAccountInfoResponse, error) { result := ContainerGetAccountInfoResponse{RawResponse: resp.Response} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val @@ -655,8 +623,8 @@ func (client containerClient) getAccountInfoHandleResponse(resp *azcore.Response } // getAccountInfoHandleError handles the GetAccountInfo error response. -func (client containerClient) getAccountInfoHandleError(resp *azcore.Response) error { - var err StorageError +func (client *containerClient) getAccountInfoHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -665,58 +633,55 @@ func (client containerClient) getAccountInfoHandleError(resp *azcore.Response) e // GetProperties - returns all user-defined metadata and system properties for the specified container. The data returned does not include the container's // list of blobs -func (client containerClient) GetProperties(ctx context.Context, containerGetPropertiesOptions *ContainerGetPropertiesOptions, leaseAccessConditions *LeaseAccessConditions) (ContainerGetPropertiesResponse, error) { +func (client *containerClient) GetProperties(ctx context.Context, containerGetPropertiesOptions *ContainerGetPropertiesOptions, leaseAccessConditions *LeaseAccessConditions) (ContainerGetPropertiesResponse, error) { req, err := client.getPropertiesCreateRequest(ctx, containerGetPropertiesOptions, leaseAccessConditions) if err != nil { return ContainerGetPropertiesResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return ContainerGetPropertiesResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return ContainerGetPropertiesResponse{}, client.getPropertiesHandleError(resp) } - result, err := client.getPropertiesHandleResponse(resp) - if err != nil { - return ContainerGetPropertiesResponse{}, err - } - return result, nil + return client.getPropertiesHandleResponse(resp) } // getPropertiesCreateRequest creates the GetProperties request. -func (client containerClient) getPropertiesCreateRequest(ctx context.Context, containerGetPropertiesOptions *ContainerGetPropertiesOptions, leaseAccessConditions *LeaseAccessConditions) (*azcore.Request, error) { +func (client *containerClient) getPropertiesCreateRequest(ctx context.Context, containerGetPropertiesOptions *ContainerGetPropertiesOptions, leaseAccessConditions *LeaseAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodGet, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("restype", "container") + reqQP := req.URL.Query() + reqQP.Set("restype", "container") if containerGetPropertiesOptions != nil && containerGetPropertiesOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*containerGetPropertiesOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*containerGetPropertiesOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + req.URL.RawQuery = reqQP.Encode() + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } req.Header.Set("x-ms-version", "2019-12-12") - if containerGetPropertiesOptions != nil && containerGetPropertiesOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *containerGetPropertiesOptions.RequestId) + if containerGetPropertiesOptions != nil && containerGetPropertiesOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *containerGetPropertiesOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // getPropertiesHandleResponse handles the GetProperties response. -func (client containerClient) getPropertiesHandleResponse(resp *azcore.Response) (ContainerGetPropertiesResponse, error) { +func (client *containerClient) getPropertiesHandleResponse(resp *azcore.Response) (ContainerGetPropertiesResponse, error) { result := ContainerGetPropertiesResponse{RawResponse: resp.Response} + prefix := strings.ToUpper("x-ms-meta-") for hh := range resp.Header { - if strings.HasPrefix(hh, "x-ms-meta-") { + if strings.HasPrefix(strings.ToUpper(hh), prefix) { if result.Metadata == nil { - result.Metadata = &map[string]string{} + result.Metadata = map[string]string{} } - (*result.Metadata)[hh[len("x-ms-meta-"):]] = resp.Header.Get(hh) + result.Metadata[hh[len(prefix):]] = resp.Header.Get(hh) } } if val := resp.Header.Get("ETag"); val != "" { @@ -785,8 +750,8 @@ func (client containerClient) getPropertiesHandleResponse(resp *azcore.Response) } // getPropertiesHandleError handles the GetProperties error response. -func (client containerClient) getPropertiesHandleError(resp *azcore.Response) error { - var err StorageError +func (client *containerClient) getPropertiesHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -794,7 +759,7 @@ func (client containerClient) getPropertiesHandleError(resp *azcore.Response) er } // ListBlobFlatSegment - [Update] The List Blobs operation returns a list of the blobs under the specified container -func (client containerClient) ListBlobFlatSegment(options *ContainerListBlobFlatSegmentOptions) ListBlobsFlatSegmentResponsePager { +func (client *containerClient) ListBlobFlatSegment(options *ContainerListBlobFlatSegmentOptions) (ListBlobsFlatSegmentResponsePager) { return &listBlobsFlatSegmentResponsePager{ pipeline: client.con.Pipeline(), requester: func(ctx context.Context) (*azcore.Request, error) { @@ -810,42 +775,46 @@ func (client containerClient) ListBlobFlatSegment(options *ContainerListBlobFlat } // listBlobFlatSegmentCreateRequest creates the ListBlobFlatSegment request. -func (client containerClient) listBlobFlatSegmentCreateRequest(ctx context.Context, options *ContainerListBlobFlatSegmentOptions) (*azcore.Request, error) { +func (client *containerClient) listBlobFlatSegmentCreateRequest(ctx context.Context, options *ContainerListBlobFlatSegmentOptions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodGet, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("restype", "container") - query.Set("comp", "list") + reqQP := req.URL.Query() + reqQP.Set("restype", "container") + reqQP.Set("comp", "list") if options != nil && options.Prefix != nil { - query.Set("prefix", *options.Prefix) + reqQP.Set("prefix", *options.Prefix) } if options != nil && options.Marker != nil { - query.Set("marker", *options.Marker) + reqQP.Set("marker", *options.Marker) } if options != nil && options.Maxresults != nil { - query.Set("maxresults", strconv.FormatInt(int64(*options.Maxresults), 10)) + reqQP.Set("maxresults", strconv.FormatInt(int64(*options.Maxresults), 10)) } if options != nil && options.Include != nil { - query.Set("include", strings.Join(strings.Fields(strings.Trim(fmt.Sprint(*options.Include), "[]")), ",")) + reqQP.Set("include", strings.Join(strings.Fields(strings.Trim(fmt.Sprint(*options.Include), "[]")), ",")) } if options != nil && options.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-version", "2019-12-12") - if options != nil && options.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *options.RequestId) + if options != nil && options.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *options.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // listBlobFlatSegmentHandleResponse handles the ListBlobFlatSegment response. -func (client containerClient) listBlobFlatSegmentHandleResponse(resp *azcore.Response) (ListBlobsFlatSegmentResponseResponse, error) { - result := ListBlobsFlatSegmentResponseResponse{RawResponse: resp.Response} +func (client *containerClient) listBlobFlatSegmentHandleResponse(resp *azcore.Response) (ListBlobsFlatSegmentResponseResponse, error) { + var val *ListBlobsFlatSegmentResponse + if err := resp.UnmarshalAsXML(&val); err != nil { + return ListBlobsFlatSegmentResponseResponse{}, err + } + result := ListBlobsFlatSegmentResponseResponse{RawResponse: resp.Response, EnumerationResults: val} if val := resp.Header.Get("Content-Type"); val != "" { result.ContentType = &val } @@ -865,13 +834,12 @@ func (client containerClient) listBlobFlatSegmentHandleResponse(resp *azcore.Res } result.Date = &date } - err := resp.UnmarshalAsXML(&result.EnumerationResults) - return result, err + return result, nil } // listBlobFlatSegmentHandleError handles the ListBlobFlatSegment error response. -func (client containerClient) listBlobFlatSegmentHandleError(resp *azcore.Response) error { - var err StorageError +func (client *containerClient) listBlobFlatSegmentHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -879,7 +847,7 @@ func (client containerClient) listBlobFlatSegmentHandleError(resp *azcore.Respon } // ListBlobHierarchySegment - [Update] The List Blobs operation returns a list of the blobs under the specified container -func (client containerClient) ListBlobHierarchySegment(delimiter string, options *ContainerListBlobHierarchySegmentOptions) ListBlobsHierarchySegmentResponsePager { +func (client *containerClient) ListBlobHierarchySegment(delimiter string, options *ContainerListBlobHierarchySegmentOptions) (ListBlobsHierarchySegmentResponsePager) { return &listBlobsHierarchySegmentResponsePager{ pipeline: client.con.Pipeline(), requester: func(ctx context.Context) (*azcore.Request, error) { @@ -895,43 +863,47 @@ func (client containerClient) ListBlobHierarchySegment(delimiter string, options } // listBlobHierarchySegmentCreateRequest creates the ListBlobHierarchySegment request. -func (client containerClient) listBlobHierarchySegmentCreateRequest(ctx context.Context, delimiter string, options *ContainerListBlobHierarchySegmentOptions) (*azcore.Request, error) { +func (client *containerClient) listBlobHierarchySegmentCreateRequest(ctx context.Context, delimiter string, options *ContainerListBlobHierarchySegmentOptions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodGet, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("restype", "container") - query.Set("comp", "list") + reqQP := req.URL.Query() + reqQP.Set("restype", "container") + reqQP.Set("comp", "list") if options != nil && options.Prefix != nil { - query.Set("prefix", *options.Prefix) + reqQP.Set("prefix", *options.Prefix) } - query.Set("delimiter", delimiter) + reqQP.Set("delimiter", delimiter) if options != nil && options.Marker != nil { - query.Set("marker", *options.Marker) + reqQP.Set("marker", *options.Marker) } if options != nil && options.Maxresults != nil { - query.Set("maxresults", strconv.FormatInt(int64(*options.Maxresults), 10)) + reqQP.Set("maxresults", strconv.FormatInt(int64(*options.Maxresults), 10)) } if options != nil && options.Include != nil { - query.Set("include", strings.Join(strings.Fields(strings.Trim(fmt.Sprint(*options.Include), "[]")), ",")) + reqQP.Set("include", strings.Join(strings.Fields(strings.Trim(fmt.Sprint(*options.Include), "[]")), ",")) } if options != nil && options.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-version", "2019-12-12") - if options != nil && options.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *options.RequestId) + if options != nil && options.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *options.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // listBlobHierarchySegmentHandleResponse handles the ListBlobHierarchySegment response. -func (client containerClient) listBlobHierarchySegmentHandleResponse(resp *azcore.Response) (ListBlobsHierarchySegmentResponseResponse, error) { - result := ListBlobsHierarchySegmentResponseResponse{RawResponse: resp.Response} +func (client *containerClient) listBlobHierarchySegmentHandleResponse(resp *azcore.Response) (ListBlobsHierarchySegmentResponseResponse, error) { + var val *ListBlobsHierarchySegmentResponse + if err := resp.UnmarshalAsXML(&val); err != nil { + return ListBlobsHierarchySegmentResponseResponse{}, err + } + result := ListBlobsHierarchySegmentResponseResponse{RawResponse: resp.Response, EnumerationResults: val} if val := resp.Header.Get("Content-Type"); val != "" { result.ContentType = &val } @@ -951,13 +923,12 @@ func (client containerClient) listBlobHierarchySegmentHandleResponse(resp *azcor } result.Date = &date } - err := resp.UnmarshalAsXML(&result.EnumerationResults) - return result, err + return result, nil } // listBlobHierarchySegmentHandleError handles the ListBlobHierarchySegment error response. -func (client containerClient) listBlobHierarchySegmentHandleError(resp *azcore.Response) error { - var err StorageError +func (client *containerClient) listBlobHierarchySegmentHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -965,41 +936,37 @@ func (client containerClient) listBlobHierarchySegmentHandleError(resp *azcore.R } // ReleaseLease - [Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 to 60 seconds, or can be infinite -func (client containerClient) ReleaseLease(ctx context.Context, leaseId string, containerReleaseLeaseOptions *ContainerReleaseLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerReleaseLeaseResponse, error) { - req, err := client.releaseLeaseCreateRequest(ctx, leaseId, containerReleaseLeaseOptions, modifiedAccessConditions) +func (client *containerClient) ReleaseLease(ctx context.Context, leaseID string, containerReleaseLeaseOptions *ContainerReleaseLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerReleaseLeaseResponse, error) { + req, err := client.releaseLeaseCreateRequest(ctx, leaseID, containerReleaseLeaseOptions, modifiedAccessConditions) if err != nil { return ContainerReleaseLeaseResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return ContainerReleaseLeaseResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return ContainerReleaseLeaseResponse{}, client.releaseLeaseHandleError(resp) } - result, err := client.releaseLeaseHandleResponse(resp) - if err != nil { - return ContainerReleaseLeaseResponse{}, err - } - return result, nil + return client.releaseLeaseHandleResponse(resp) } // releaseLeaseCreateRequest creates the ReleaseLease request. -func (client containerClient) releaseLeaseCreateRequest(ctx context.Context, leaseId string, containerReleaseLeaseOptions *ContainerReleaseLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *containerClient) releaseLeaseCreateRequest(ctx context.Context, leaseID string, containerReleaseLeaseOptions *ContainerReleaseLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "lease") - query.Set("restype", "container") + reqQP := req.URL.Query() + reqQP.Set("comp", "lease") + reqQP.Set("restype", "container") if containerReleaseLeaseOptions != nil && containerReleaseLeaseOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*containerReleaseLeaseOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*containerReleaseLeaseOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-lease-action", "release") - req.Header.Set("x-ms-lease-id", leaseId) + req.Header.Set("x-ms-lease-id", leaseID) if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Header.Set("If-Modified-Since", modifiedAccessConditions.IfModifiedSince.Format(time.RFC1123)) } @@ -1007,15 +974,15 @@ func (client containerClient) releaseLeaseCreateRequest(ctx context.Context, lea req.Header.Set("If-Unmodified-Since", modifiedAccessConditions.IfUnmodifiedSince.Format(time.RFC1123)) } req.Header.Set("x-ms-version", "2019-12-12") - if containerReleaseLeaseOptions != nil && containerReleaseLeaseOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *containerReleaseLeaseOptions.RequestId) + if containerReleaseLeaseOptions != nil && containerReleaseLeaseOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *containerReleaseLeaseOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // releaseLeaseHandleResponse handles the ReleaseLease response. -func (client containerClient) releaseLeaseHandleResponse(resp *azcore.Response) (ContainerReleaseLeaseResponse, error) { +func (client *containerClient) releaseLeaseHandleResponse(resp *azcore.Response) (ContainerReleaseLeaseResponse, error) { result := ContainerReleaseLeaseResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -1047,8 +1014,8 @@ func (client containerClient) releaseLeaseHandleResponse(resp *azcore.Response) } // releaseLeaseHandleError handles the ReleaseLease error response. -func (client containerClient) releaseLeaseHandleError(resp *azcore.Response) error { - var err StorageError +func (client *containerClient) releaseLeaseHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -1056,41 +1023,37 @@ func (client containerClient) releaseLeaseHandleError(resp *azcore.Response) err } // RenewLease - [Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 to 60 seconds, or can be infinite -func (client containerClient) RenewLease(ctx context.Context, leaseId string, containerRenewLeaseOptions *ContainerRenewLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerRenewLeaseResponse, error) { - req, err := client.renewLeaseCreateRequest(ctx, leaseId, containerRenewLeaseOptions, modifiedAccessConditions) +func (client *containerClient) RenewLease(ctx context.Context, leaseID string, containerRenewLeaseOptions *ContainerRenewLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerRenewLeaseResponse, error) { + req, err := client.renewLeaseCreateRequest(ctx, leaseID, containerRenewLeaseOptions, modifiedAccessConditions) if err != nil { return ContainerRenewLeaseResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return ContainerRenewLeaseResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return ContainerRenewLeaseResponse{}, client.renewLeaseHandleError(resp) } - result, err := client.renewLeaseHandleResponse(resp) - if err != nil { - return ContainerRenewLeaseResponse{}, err - } - return result, nil + return client.renewLeaseHandleResponse(resp) } // renewLeaseCreateRequest creates the RenewLease request. -func (client containerClient) renewLeaseCreateRequest(ctx context.Context, leaseId string, containerRenewLeaseOptions *ContainerRenewLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *containerClient) renewLeaseCreateRequest(ctx context.Context, leaseID string, containerRenewLeaseOptions *ContainerRenewLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "lease") - query.Set("restype", "container") + reqQP := req.URL.Query() + reqQP.Set("comp", "lease") + reqQP.Set("restype", "container") if containerRenewLeaseOptions != nil && containerRenewLeaseOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*containerRenewLeaseOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*containerRenewLeaseOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-lease-action", "renew") - req.Header.Set("x-ms-lease-id", leaseId) + req.Header.Set("x-ms-lease-id", leaseID) if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Header.Set("If-Modified-Since", modifiedAccessConditions.IfModifiedSince.Format(time.RFC1123)) } @@ -1098,15 +1061,15 @@ func (client containerClient) renewLeaseCreateRequest(ctx context.Context, lease req.Header.Set("If-Unmodified-Since", modifiedAccessConditions.IfUnmodifiedSince.Format(time.RFC1123)) } req.Header.Set("x-ms-version", "2019-12-12") - if containerRenewLeaseOptions != nil && containerRenewLeaseOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *containerRenewLeaseOptions.RequestId) + if containerRenewLeaseOptions != nil && containerRenewLeaseOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *containerRenewLeaseOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // renewLeaseHandleResponse handles the RenewLease response. -func (client containerClient) renewLeaseHandleResponse(resp *azcore.Response) (ContainerRenewLeaseResponse, error) { +func (client *containerClient) renewLeaseHandleResponse(resp *azcore.Response) (ContainerRenewLeaseResponse, error) { result := ContainerRenewLeaseResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -1141,8 +1104,8 @@ func (client containerClient) renewLeaseHandleResponse(resp *azcore.Response) (C } // renewLeaseHandleError handles the RenewLease error response. -func (client containerClient) renewLeaseHandleError(resp *azcore.Response) error { - var err StorageError +func (client *containerClient) renewLeaseHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -1150,42 +1113,38 @@ func (client containerClient) renewLeaseHandleError(resp *azcore.Response) error } // Restore - Restores a previously-deleted container. -func (client containerClient) Restore(ctx context.Context, options *ContainerRestoreOptions) (ContainerRestoreResponse, error) { +func (client *containerClient) Restore(ctx context.Context, options *ContainerRestoreOptions) (ContainerRestoreResponse, error) { req, err := client.restoreCreateRequest(ctx, options) if err != nil { return ContainerRestoreResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return ContainerRestoreResponse{}, err } if !resp.HasStatusCode(http.StatusCreated) { return ContainerRestoreResponse{}, client.restoreHandleError(resp) } - result, err := client.restoreHandleResponse(resp) - if err != nil { - return ContainerRestoreResponse{}, err - } - return result, nil + return client.restoreHandleResponse(resp) } // restoreCreateRequest creates the Restore request. -func (client containerClient) restoreCreateRequest(ctx context.Context, options *ContainerRestoreOptions) (*azcore.Request, error) { +func (client *containerClient) restoreCreateRequest(ctx context.Context, options *ContainerRestoreOptions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("restype", "container") - query.Set("comp", "undelete") + reqQP := req.URL.Query() + reqQP.Set("restype", "container") + reqQP.Set("comp", "undelete") if options != nil && options.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-version", "2019-12-12") - if options != nil && options.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *options.RequestId) + if options != nil && options.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *options.RequestID) } if options != nil && options.DeletedContainerName != nil { req.Header.Set("x-ms-deleted-container-name", *options.DeletedContainerName) @@ -1198,7 +1157,7 @@ func (client containerClient) restoreCreateRequest(ctx context.Context, options } // restoreHandleResponse handles the Restore response. -func (client containerClient) restoreHandleResponse(resp *azcore.Response) (ContainerRestoreResponse, error) { +func (client *containerClient) restoreHandleResponse(resp *azcore.Response) (ContainerRestoreResponse, error) { result := ContainerRestoreResponse{RawResponse: resp.Response} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val @@ -1220,8 +1179,8 @@ func (client containerClient) restoreHandleResponse(resp *azcore.Response) (Cont } // restoreHandleError handles the Restore error response. -func (client containerClient) restoreHandleError(resp *azcore.Response) error { - var err StorageError +func (client *containerClient) restoreHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -1229,41 +1188,37 @@ func (client containerClient) restoreHandleError(resp *azcore.Response) error { } // SetAccessPolicy - sets the permissions for the specified container. The permissions indicate whether blobs in a container may be accessed publicly. -func (client containerClient) SetAccessPolicy(ctx context.Context, containerSetAccessPolicyOptions *ContainerSetAccessPolicyOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerSetAccessPolicyResponse, error) { +func (client *containerClient) SetAccessPolicy(ctx context.Context, containerSetAccessPolicyOptions *ContainerSetAccessPolicyOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerSetAccessPolicyResponse, error) { req, err := client.setAccessPolicyCreateRequest(ctx, containerSetAccessPolicyOptions, leaseAccessConditions, modifiedAccessConditions) if err != nil { return ContainerSetAccessPolicyResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return ContainerSetAccessPolicyResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return ContainerSetAccessPolicyResponse{}, client.setAccessPolicyHandleError(resp) } - result, err := client.setAccessPolicyHandleResponse(resp) - if err != nil { - return ContainerSetAccessPolicyResponse{}, err - } - return result, nil + return client.setAccessPolicyHandleResponse(resp) } // setAccessPolicyCreateRequest creates the SetAccessPolicy request. -func (client containerClient) setAccessPolicyCreateRequest(ctx context.Context, containerSetAccessPolicyOptions *ContainerSetAccessPolicyOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *containerClient) setAccessPolicyCreateRequest(ctx context.Context, containerSetAccessPolicyOptions *ContainerSetAccessPolicyOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("restype", "container") - query.Set("comp", "acl") + reqQP := req.URL.Query() + reqQP.Set("restype", "container") + reqQP.Set("comp", "acl") if containerSetAccessPolicyOptions != nil && containerSetAccessPolicyOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*containerSetAccessPolicyOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*containerSetAccessPolicyOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + req.URL.RawQuery = reqQP.Encode() + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if containerSetAccessPolicyOptions != nil && containerSetAccessPolicyOptions.Access != nil { req.Header.Set("x-ms-blob-public-access", string(*containerSetAccessPolicyOptions.Access)) @@ -1275,22 +1230,22 @@ func (client containerClient) setAccessPolicyCreateRequest(ctx context.Context, req.Header.Set("If-Unmodified-Since", modifiedAccessConditions.IfUnmodifiedSince.Format(time.RFC1123)) } req.Header.Set("x-ms-version", "2019-12-12") - if containerSetAccessPolicyOptions != nil && containerSetAccessPolicyOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *containerSetAccessPolicyOptions.RequestId) + if containerSetAccessPolicyOptions != nil && containerSetAccessPolicyOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *containerSetAccessPolicyOptions.RequestID) } req.Header.Set("Accept", "application/xml") type wrapper struct { - XMLName xml.Name `xml:"SignedIdentifiers"` - ContainerAcl *[]SignedIDentifier `xml:"SignedIdentifier"` + XMLName xml.Name `xml:"SignedIdentifiers"` + ContainerACL *[]*SignedIdentifier `xml:"SignedIdentifier"` } - if containerSetAccessPolicyOptions != nil { - return req, req.MarshalAsXML(wrapper{ContainerAcl: containerSetAccessPolicyOptions.ContainerAcl}) + if containerSetAccessPolicyOptions != nil && containerSetAccessPolicyOptions.ContainerACL != nil { + return req, req.MarshalAsXML(wrapper{ContainerACL: containerSetAccessPolicyOptions.ContainerACL}) } return req, nil } // setAccessPolicyHandleResponse handles the SetAccessPolicy response. -func (client containerClient) setAccessPolicyHandleResponse(resp *azcore.Response) (ContainerSetAccessPolicyResponse, error) { +func (client *containerClient) setAccessPolicyHandleResponse(resp *azcore.Response) (ContainerSetAccessPolicyResponse, error) { result := ContainerSetAccessPolicyResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -1322,8 +1277,8 @@ func (client containerClient) setAccessPolicyHandleResponse(resp *azcore.Respons } // setAccessPolicyHandleError handles the SetAccessPolicy error response. -func (client containerClient) setAccessPolicyHandleError(resp *azcore.Response) error { - var err StorageError +func (client *containerClient) setAccessPolicyHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -1331,41 +1286,37 @@ func (client containerClient) setAccessPolicyHandleError(resp *azcore.Response) } // SetMetadata - operation sets one or more user-defined name-value pairs for the specified container. -func (client containerClient) SetMetadata(ctx context.Context, containerSetMetadataOptions *ContainerSetMetadataOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerSetMetadataResponse, error) { +func (client *containerClient) SetMetadata(ctx context.Context, containerSetMetadataOptions *ContainerSetMetadataOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerSetMetadataResponse, error) { req, err := client.setMetadataCreateRequest(ctx, containerSetMetadataOptions, leaseAccessConditions, modifiedAccessConditions) if err != nil { return ContainerSetMetadataResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return ContainerSetMetadataResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return ContainerSetMetadataResponse{}, client.setMetadataHandleError(resp) } - result, err := client.setMetadataHandleResponse(resp) - if err != nil { - return ContainerSetMetadataResponse{}, err - } - return result, nil + return client.setMetadataHandleResponse(resp) } // setMetadataCreateRequest creates the SetMetadata request. -func (client containerClient) setMetadataCreateRequest(ctx context.Context, containerSetMetadataOptions *ContainerSetMetadataOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *containerClient) setMetadataCreateRequest(ctx context.Context, containerSetMetadataOptions *ContainerSetMetadataOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("restype", "container") - query.Set("comp", "metadata") + reqQP := req.URL.Query() + reqQP.Set("restype", "container") + reqQP.Set("comp", "metadata") if containerSetMetadataOptions != nil && containerSetMetadataOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*containerSetMetadataOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*containerSetMetadataOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + req.URL.RawQuery = reqQP.Encode() + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if containerSetMetadataOptions != nil && containerSetMetadataOptions.Metadata != nil { for k, v := range *containerSetMetadataOptions.Metadata { @@ -1376,15 +1327,15 @@ func (client containerClient) setMetadataCreateRequest(ctx context.Context, cont req.Header.Set("If-Modified-Since", modifiedAccessConditions.IfModifiedSince.Format(time.RFC1123)) } req.Header.Set("x-ms-version", "2019-12-12") - if containerSetMetadataOptions != nil && containerSetMetadataOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *containerSetMetadataOptions.RequestId) + if containerSetMetadataOptions != nil && containerSetMetadataOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *containerSetMetadataOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // setMetadataHandleResponse handles the SetMetadata response. -func (client containerClient) setMetadataHandleResponse(resp *azcore.Response) (ContainerSetMetadataResponse, error) { +func (client *containerClient) setMetadataHandleResponse(resp *azcore.Response) (ContainerSetMetadataResponse, error) { result := ContainerSetMetadataResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -1416,10 +1367,11 @@ func (client containerClient) setMetadataHandleResponse(resp *azcore.Response) ( } // setMetadataHandleError handles the SetMetadata error response. -func (client containerClient) setMetadataHandleError(resp *azcore.Response) error { - var err StorageError +func (client *containerClient) setMetadataHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } return azcore.NewResponseError(&err, resp.Response) } + diff --git a/sdk/storage/azblob/zz_generated_directory.go b/sdk/storage/azblob/zz_generated_directory_client.go similarity index 70% rename from sdk/storage/azblob/zz_generated_directory.go rename to sdk/storage/azblob/zz_generated_directory_client.go index 17d9f0509f82..600a56ad32ca 100644 --- a/sdk/storage/azblob/zz_generated_directory.go +++ b/sdk/storage/azblob/zz_generated_directory_client.go @@ -9,60 +9,50 @@ package azblob import ( "context" + "github.com/Azure/azure-sdk-for-go/sdk/azcore" "net/http" "strconv" "time" - - "github.com/Azure/azure-sdk-for-go/sdk/azcore" ) type directoryClient struct { - con *connection + con *connection pathRenameMode *PathRenameMode } -// Pipeline returns the pipeline associated with this client. -func (client directoryClient) Pipeline() azcore.Pipeline { - return client.con.Pipeline() -} - // Create - Create a directory. By default, the destination is overwritten and if the destination already exists and has a lease the lease is broken. This // operation supports conditional HTTP requests. For more // information, see Specifying Conditional Headers for Blob Service Operations [https://docs.microsoft.com/en-us/rest/api/storageservices/specifying-conditional-headers-for-blob-service-operations]. // To // fail if the destination already exists, use a conditional request with If-None-Match: "*". -func (client directoryClient) Create(ctx context.Context, directoryCreateOptions *DirectoryCreateOptions, directoryHttpHeaders *DirectoryHttpHeaders, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (DirectoryCreateResponse, error) { - req, err := client.createCreateRequest(ctx, directoryCreateOptions, directoryHttpHeaders, leaseAccessConditions, modifiedAccessConditions) +func (client *directoryClient) Create(ctx context.Context, directoryCreateOptions *DirectoryCreateOptions, directoryHTTPHeaders *DirectoryHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (DirectoryCreateResponse, error) { + req, err := client.createCreateRequest(ctx, directoryCreateOptions, directoryHTTPHeaders, leaseAccessConditions, modifiedAccessConditions) if err != nil { return DirectoryCreateResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return DirectoryCreateResponse{}, err } if !resp.HasStatusCode(http.StatusCreated) { return DirectoryCreateResponse{}, client.createHandleError(resp) } - result, err := client.createHandleResponse(resp) - if err != nil { - return DirectoryCreateResponse{}, err - } - return result, nil + return client.createHandleResponse(resp) } // createCreateRequest creates the Create request. -func (client directoryClient) createCreateRequest(ctx context.Context, directoryCreateOptions *DirectoryCreateOptions, directoryHttpHeaders *DirectoryHttpHeaders, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *directoryClient) createCreateRequest(ctx context.Context, directoryCreateOptions *DirectoryCreateOptions, directoryHTTPHeaders *DirectoryHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("resource", "directory") + reqQP := req.URL.Query() + reqQP.Set("resource", "directory") if directoryCreateOptions != nil && directoryCreateOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*directoryCreateOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*directoryCreateOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() if directoryCreateOptions != nil && directoryCreateOptions.DirectoryProperties != nil { req.Header.Set("x-ms-properties", *directoryCreateOptions.DirectoryProperties) } @@ -72,23 +62,23 @@ func (client directoryClient) createCreateRequest(ctx context.Context, directory if directoryCreateOptions != nil && directoryCreateOptions.PosixUmask != nil { req.Header.Set("x-ms-umask", *directoryCreateOptions.PosixUmask) } - if directoryHttpHeaders != nil && directoryHttpHeaders.CacheControl != nil { - req.Header.Set("x-ms-cache-control", *directoryHttpHeaders.CacheControl) + if directoryHTTPHeaders != nil && directoryHTTPHeaders.CacheControl != nil { + req.Header.Set("x-ms-cache-control", *directoryHTTPHeaders.CacheControl) } - if directoryHttpHeaders != nil && directoryHttpHeaders.ContentType != nil { - req.Header.Set("x-ms-content-type", *directoryHttpHeaders.ContentType) + if directoryHTTPHeaders != nil && directoryHTTPHeaders.ContentType != nil { + req.Header.Set("x-ms-content-type", *directoryHTTPHeaders.ContentType) } - if directoryHttpHeaders != nil && directoryHttpHeaders.ContentEncoding != nil { - req.Header.Set("x-ms-content-encoding", *directoryHttpHeaders.ContentEncoding) + if directoryHTTPHeaders != nil && directoryHTTPHeaders.ContentEncoding != nil { + req.Header.Set("x-ms-content-encoding", *directoryHTTPHeaders.ContentEncoding) } - if directoryHttpHeaders != nil && directoryHttpHeaders.ContentLanguage != nil { - req.Header.Set("x-ms-content-language", *directoryHttpHeaders.ContentLanguage) + if directoryHTTPHeaders != nil && directoryHTTPHeaders.ContentLanguage != nil { + req.Header.Set("x-ms-content-language", *directoryHTTPHeaders.ContentLanguage) } - if directoryHttpHeaders != nil && directoryHttpHeaders.ContentDisposition != nil { - req.Header.Set("x-ms-content-disposition", *directoryHttpHeaders.ContentDisposition) + if directoryHTTPHeaders != nil && directoryHTTPHeaders.ContentDisposition != nil { + req.Header.Set("x-ms-content-disposition", *directoryHTTPHeaders.ContentDisposition) } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Header.Set("If-Modified-Since", modifiedAccessConditions.IfModifiedSince.Format(time.RFC1123)) @@ -103,15 +93,15 @@ func (client directoryClient) createCreateRequest(ctx context.Context, directory req.Header.Set("If-None-Match", *modifiedAccessConditions.IfNoneMatch) } req.Header.Set("x-ms-version", "2019-12-12") - if directoryCreateOptions != nil && directoryCreateOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *directoryCreateOptions.RequestId) + if directoryCreateOptions != nil && directoryCreateOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *directoryCreateOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // createHandleResponse handles the Create response. -func (client directoryClient) createHandleResponse(resp *azcore.Response) (DirectoryCreateResponse, error) { +func (client *directoryClient) createHandleResponse(resp *azcore.Response) (DirectoryCreateResponse, error) { result := DirectoryCreateResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -150,8 +140,8 @@ func (client directoryClient) createHandleResponse(resp *azcore.Response) (Direc } // createHandleError handles the Create error response. -func (client directoryClient) createHandleError(resp *azcore.Response) error { - var err DataLakeStorageError +func (client *directoryClient) createHandleError(resp *azcore.Response) error { +var err DataLakeStorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -159,43 +149,39 @@ func (client directoryClient) createHandleError(resp *azcore.Response) error { } // Delete - Deletes the directory -func (client directoryClient) Delete(ctx context.Context, recursiveDirectoryDelete bool, directoryDeleteOptions *DirectoryDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (DirectoryDeleteResponse, error) { +func (client *directoryClient) Delete(ctx context.Context, recursiveDirectoryDelete bool, directoryDeleteOptions *DirectoryDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (DirectoryDeleteResponse, error) { req, err := client.deleteCreateRequest(ctx, recursiveDirectoryDelete, directoryDeleteOptions, leaseAccessConditions, modifiedAccessConditions) if err != nil { return DirectoryDeleteResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return DirectoryDeleteResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return DirectoryDeleteResponse{}, client.deleteHandleError(resp) } - result, err := client.deleteHandleResponse(resp) - if err != nil { - return DirectoryDeleteResponse{}, err - } - return result, nil + return client.deleteHandleResponse(resp) } // deleteCreateRequest creates the Delete request. -func (client directoryClient) deleteCreateRequest(ctx context.Context, recursiveDirectoryDelete bool, directoryDeleteOptions *DirectoryDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *directoryClient) deleteCreateRequest(ctx context.Context, recursiveDirectoryDelete bool, directoryDeleteOptions *DirectoryDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodDelete, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() + reqQP := req.URL.Query() if directoryDeleteOptions != nil && directoryDeleteOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*directoryDeleteOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*directoryDeleteOptions.Timeout), 10)) } - query.Set("recursive", strconv.FormatBool(recursiveDirectoryDelete)) + reqQP.Set("recursive", strconv.FormatBool(recursiveDirectoryDelete)) if directoryDeleteOptions != nil && directoryDeleteOptions.Marker != nil { - query.Set("continuation", *directoryDeleteOptions.Marker) + reqQP.Set("continuation", *directoryDeleteOptions.Marker) } - req.URL.RawQuery = query.Encode() - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + req.URL.RawQuery = reqQP.Encode() + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Header.Set("If-Modified-Since", modifiedAccessConditions.IfModifiedSince.Format(time.RFC1123)) @@ -210,15 +196,15 @@ func (client directoryClient) deleteCreateRequest(ctx context.Context, recursive req.Header.Set("If-None-Match", *modifiedAccessConditions.IfNoneMatch) } req.Header.Set("x-ms-version", "2019-12-12") - if directoryDeleteOptions != nil && directoryDeleteOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *directoryDeleteOptions.RequestId) + if directoryDeleteOptions != nil && directoryDeleteOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *directoryDeleteOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // deleteHandleResponse handles the Delete response. -func (client directoryClient) deleteHandleResponse(resp *azcore.Response) (DirectoryDeleteResponse, error) { +func (client *directoryClient) deleteHandleResponse(resp *azcore.Response) (DirectoryDeleteResponse, error) { result := DirectoryDeleteResponse{RawResponse: resp.Response} if val := resp.Header.Get("x-ms-continuation"); val != "" { result.Marker = &val @@ -243,8 +229,8 @@ func (client directoryClient) deleteHandleResponse(resp *azcore.Response) (Direc } // deleteHandleError handles the Delete error response. -func (client directoryClient) deleteHandleError(resp *azcore.Response) error { - var err DataLakeStorageError +func (client *directoryClient) deleteHandleError(resp *azcore.Response) error { +var err DataLakeStorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -252,43 +238,39 @@ func (client directoryClient) deleteHandleError(resp *azcore.Response) error { } // GetAccessControl - Get the owner, group, permissions, or access control list for a directory. -func (client directoryClient) GetAccessControl(ctx context.Context, directoryGetAccessControlOptions *DirectoryGetAccessControlOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (DirectoryGetAccessControlResponse, error) { +func (client *directoryClient) GetAccessControl(ctx context.Context, directoryGetAccessControlOptions *DirectoryGetAccessControlOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (DirectoryGetAccessControlResponse, error) { req, err := client.getAccessControlCreateRequest(ctx, directoryGetAccessControlOptions, leaseAccessConditions, modifiedAccessConditions) if err != nil { return DirectoryGetAccessControlResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return DirectoryGetAccessControlResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return DirectoryGetAccessControlResponse{}, client.getAccessControlHandleError(resp) } - result, err := client.getAccessControlHandleResponse(resp) - if err != nil { - return DirectoryGetAccessControlResponse{}, err - } - return result, nil + return client.getAccessControlHandleResponse(resp) } // getAccessControlCreateRequest creates the GetAccessControl request. -func (client directoryClient) getAccessControlCreateRequest(ctx context.Context, directoryGetAccessControlOptions *DirectoryGetAccessControlOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *directoryClient) getAccessControlCreateRequest(ctx context.Context, directoryGetAccessControlOptions *DirectoryGetAccessControlOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodHead, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("action", "getAccessControl") + reqQP := req.URL.Query() + reqQP.Set("action", "getAccessControl") if directoryGetAccessControlOptions != nil && directoryGetAccessControlOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*directoryGetAccessControlOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*directoryGetAccessControlOptions.Timeout), 10)) } if directoryGetAccessControlOptions != nil && directoryGetAccessControlOptions.Upn != nil { - query.Set("upn", strconv.FormatBool(*directoryGetAccessControlOptions.Upn)) + reqQP.Set("upn", strconv.FormatBool(*directoryGetAccessControlOptions.Upn)) } - req.URL.RawQuery = query.Encode() - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + req.URL.RawQuery = reqQP.Encode() + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Header.Set("If-Match", *modifiedAccessConditions.IfMatch) @@ -302,8 +284,8 @@ func (client directoryClient) getAccessControlCreateRequest(ctx context.Context, if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Header.Set("If-Unmodified-Since", modifiedAccessConditions.IfUnmodifiedSince.Format(time.RFC1123)) } - if directoryGetAccessControlOptions != nil && directoryGetAccessControlOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *directoryGetAccessControlOptions.RequestId) + if directoryGetAccessControlOptions != nil && directoryGetAccessControlOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *directoryGetAccessControlOptions.RequestID) } req.Header.Set("x-ms-version", "2019-12-12") req.Header.Set("Accept", "application/xml") @@ -311,7 +293,7 @@ func (client directoryClient) getAccessControlCreateRequest(ctx context.Context, } // getAccessControlHandleResponse handles the GetAccessControl response. -func (client directoryClient) getAccessControlHandleResponse(resp *azcore.Response) (DirectoryGetAccessControlResponse, error) { +func (client *directoryClient) getAccessControlHandleResponse(resp *azcore.Response) (DirectoryGetAccessControlResponse, error) { result := DirectoryGetAccessControlResponse{RawResponse: resp.Response} if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) @@ -331,16 +313,16 @@ func (client directoryClient) getAccessControlHandleResponse(resp *azcore.Respon result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-owner"); val != "" { - result.Owner = &val + result.XMSOwner = &val } if val := resp.Header.Get("x-ms-group"); val != "" { - result.Group = &val + result.XMSGroup = &val } if val := resp.Header.Get("x-ms-permissions"); val != "" { - result.Permissions = &val + result.XMSPermissions = &val } if val := resp.Header.Get("x-ms-acl"); val != "" { - result.ACL = &val + result.XMSACL = &val } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val @@ -352,8 +334,8 @@ func (client directoryClient) getAccessControlHandleResponse(resp *azcore.Respon } // getAccessControlHandleError handles the GetAccessControl error response. -func (client directoryClient) getAccessControlHandleError(resp *azcore.Response) error { - var err DataLakeStorageError +func (client *directoryClient) getAccessControlHandleError(resp *azcore.Response) error { +var err DataLakeStorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -365,43 +347,39 @@ func (client directoryClient) getAccessControlHandleError(resp *azcore.Response) // information, see Specifying Conditional Headers for Blob Service Operations [https://docs.microsoft.com/en-us/rest/api/storageservices/specifying-conditional-headers-for-blob-service-operations]. // To // fail if the destination already exists, use a conditional request with If-None-Match: "*". -func (client directoryClient) Rename(ctx context.Context, renameSource string, directoryRenameOptions *DirectoryRenameOptions, directoryHttpHeaders *DirectoryHttpHeaders, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (DirectoryRenameResponse, error) { - req, err := client.renameCreateRequest(ctx, renameSource, directoryRenameOptions, directoryHttpHeaders, leaseAccessConditions, modifiedAccessConditions, sourceModifiedAccessConditions) +func (client *directoryClient) Rename(ctx context.Context, renameSource string, directoryRenameOptions *DirectoryRenameOptions, directoryHTTPHeaders *DirectoryHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (DirectoryRenameResponse, error) { + req, err := client.renameCreateRequest(ctx, renameSource, directoryRenameOptions, directoryHTTPHeaders, leaseAccessConditions, modifiedAccessConditions, sourceModifiedAccessConditions) if err != nil { return DirectoryRenameResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return DirectoryRenameResponse{}, err } if !resp.HasStatusCode(http.StatusCreated) { return DirectoryRenameResponse{}, client.renameHandleError(resp) } - result, err := client.renameHandleResponse(resp) - if err != nil { - return DirectoryRenameResponse{}, err - } - return result, nil + return client.renameHandleResponse(resp) } // renameCreateRequest creates the Rename request. -func (client directoryClient) renameCreateRequest(ctx context.Context, renameSource string, directoryRenameOptions *DirectoryRenameOptions, directoryHttpHeaders *DirectoryHttpHeaders, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (*azcore.Request, error) { +func (client *directoryClient) renameCreateRequest(ctx context.Context, renameSource string, directoryRenameOptions *DirectoryRenameOptions, directoryHTTPHeaders *DirectoryHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() + reqQP := req.URL.Query() if directoryRenameOptions != nil && directoryRenameOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*directoryRenameOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*directoryRenameOptions.Timeout), 10)) } if directoryRenameOptions != nil && directoryRenameOptions.Marker != nil { - query.Set("continuation", *directoryRenameOptions.Marker) + reqQP.Set("continuation", *directoryRenameOptions.Marker) } if client.pathRenameMode != nil { - query.Set("mode", string(*client.pathRenameMode)) + reqQP.Set("mode", string(*client.pathRenameMode)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-rename-source", renameSource) if directoryRenameOptions != nil && directoryRenameOptions.DirectoryProperties != nil { req.Header.Set("x-ms-properties", *directoryRenameOptions.DirectoryProperties) @@ -412,26 +390,26 @@ func (client directoryClient) renameCreateRequest(ctx context.Context, renameSou if directoryRenameOptions != nil && directoryRenameOptions.PosixUmask != nil { req.Header.Set("x-ms-umask", *directoryRenameOptions.PosixUmask) } - if directoryHttpHeaders != nil && directoryHttpHeaders.CacheControl != nil { - req.Header.Set("x-ms-cache-control", *directoryHttpHeaders.CacheControl) + if directoryHTTPHeaders != nil && directoryHTTPHeaders.CacheControl != nil { + req.Header.Set("x-ms-cache-control", *directoryHTTPHeaders.CacheControl) } - if directoryHttpHeaders != nil && directoryHttpHeaders.ContentType != nil { - req.Header.Set("x-ms-content-type", *directoryHttpHeaders.ContentType) + if directoryHTTPHeaders != nil && directoryHTTPHeaders.ContentType != nil { + req.Header.Set("x-ms-content-type", *directoryHTTPHeaders.ContentType) } - if directoryHttpHeaders != nil && directoryHttpHeaders.ContentEncoding != nil { - req.Header.Set("x-ms-content-encoding", *directoryHttpHeaders.ContentEncoding) + if directoryHTTPHeaders != nil && directoryHTTPHeaders.ContentEncoding != nil { + req.Header.Set("x-ms-content-encoding", *directoryHTTPHeaders.ContentEncoding) } - if directoryHttpHeaders != nil && directoryHttpHeaders.ContentLanguage != nil { - req.Header.Set("x-ms-content-language", *directoryHttpHeaders.ContentLanguage) + if directoryHTTPHeaders != nil && directoryHTTPHeaders.ContentLanguage != nil { + req.Header.Set("x-ms-content-language", *directoryHTTPHeaders.ContentLanguage) } - if directoryHttpHeaders != nil && directoryHttpHeaders.ContentDisposition != nil { - req.Header.Set("x-ms-content-disposition", *directoryHttpHeaders.ContentDisposition) + if directoryHTTPHeaders != nil && directoryHTTPHeaders.ContentDisposition != nil { + req.Header.Set("x-ms-content-disposition", *directoryHTTPHeaders.ContentDisposition) } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } - if directoryRenameOptions != nil && directoryRenameOptions.SourceLeaseId != nil { - req.Header.Set("x-ms-source-lease-id", *directoryRenameOptions.SourceLeaseId) + if directoryRenameOptions != nil && directoryRenameOptions.SourceLeaseID != nil { + req.Header.Set("x-ms-source-lease-id", *directoryRenameOptions.SourceLeaseID) } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Header.Set("If-Modified-Since", modifiedAccessConditions.IfModifiedSince.Format(time.RFC1123)) @@ -458,15 +436,15 @@ func (client directoryClient) renameCreateRequest(ctx context.Context, renameSou req.Header.Set("x-ms-source-if-none-match", *sourceModifiedAccessConditions.SourceIfNoneMatch) } req.Header.Set("x-ms-version", "2019-12-12") - if directoryRenameOptions != nil && directoryRenameOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *directoryRenameOptions.RequestId) + if directoryRenameOptions != nil && directoryRenameOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *directoryRenameOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // renameHandleResponse handles the Rename response. -func (client directoryClient) renameHandleResponse(resp *azcore.Response) (DirectoryRenameResponse, error) { +func (client *directoryClient) renameHandleResponse(resp *azcore.Response) (DirectoryRenameResponse, error) { result := DirectoryRenameResponse{RawResponse: resp.Response} if val := resp.Header.Get("x-ms-continuation"); val != "" { result.Marker = &val @@ -508,8 +486,8 @@ func (client directoryClient) renameHandleResponse(resp *azcore.Response) (Direc } // renameHandleError handles the Rename error response. -func (client directoryClient) renameHandleError(resp *azcore.Response) error { - var err DataLakeStorageError +func (client *directoryClient) renameHandleError(resp *azcore.Response) error { +var err DataLakeStorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -517,40 +495,36 @@ func (client directoryClient) renameHandleError(resp *azcore.Response) error { } // SetAccessControl - Set the owner, group, permissions, or access control list for a directory. -func (client directoryClient) SetAccessControl(ctx context.Context, directorySetAccessControlOptions *DirectorySetAccessControlOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (DirectorySetAccessControlResponse, error) { +func (client *directoryClient) SetAccessControl(ctx context.Context, directorySetAccessControlOptions *DirectorySetAccessControlOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (DirectorySetAccessControlResponse, error) { req, err := client.setAccessControlCreateRequest(ctx, directorySetAccessControlOptions, leaseAccessConditions, modifiedAccessConditions) if err != nil { return DirectorySetAccessControlResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return DirectorySetAccessControlResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return DirectorySetAccessControlResponse{}, client.setAccessControlHandleError(resp) } - result, err := client.setAccessControlHandleResponse(resp) - if err != nil { - return DirectorySetAccessControlResponse{}, err - } - return result, nil + return client.setAccessControlHandleResponse(resp) } // setAccessControlCreateRequest creates the SetAccessControl request. -func (client directoryClient) setAccessControlCreateRequest(ctx context.Context, directorySetAccessControlOptions *DirectorySetAccessControlOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *directoryClient) setAccessControlCreateRequest(ctx context.Context, directorySetAccessControlOptions *DirectorySetAccessControlOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPatch, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("action", "setAccessControl") + reqQP := req.URL.Query() + reqQP.Set("action", "setAccessControl") if directorySetAccessControlOptions != nil && directorySetAccessControlOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*directorySetAccessControlOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*directorySetAccessControlOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + req.URL.RawQuery = reqQP.Encode() + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if directorySetAccessControlOptions != nil && directorySetAccessControlOptions.Owner != nil { req.Header.Set("x-ms-owner", *directorySetAccessControlOptions.Owner) @@ -561,8 +535,8 @@ func (client directoryClient) setAccessControlCreateRequest(ctx context.Context, if directorySetAccessControlOptions != nil && directorySetAccessControlOptions.PosixPermissions != nil { req.Header.Set("x-ms-permissions", *directorySetAccessControlOptions.PosixPermissions) } - if directorySetAccessControlOptions != nil && directorySetAccessControlOptions.PosixAcl != nil { - req.Header.Set("x-ms-acl", *directorySetAccessControlOptions.PosixAcl) + if directorySetAccessControlOptions != nil && directorySetAccessControlOptions.PosixACL != nil { + req.Header.Set("x-ms-acl", *directorySetAccessControlOptions.PosixACL) } if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Header.Set("If-Match", *modifiedAccessConditions.IfMatch) @@ -576,8 +550,8 @@ func (client directoryClient) setAccessControlCreateRequest(ctx context.Context, if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Header.Set("If-Unmodified-Since", modifiedAccessConditions.IfUnmodifiedSince.Format(time.RFC1123)) } - if directorySetAccessControlOptions != nil && directorySetAccessControlOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *directorySetAccessControlOptions.RequestId) + if directorySetAccessControlOptions != nil && directorySetAccessControlOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *directorySetAccessControlOptions.RequestID) } req.Header.Set("x-ms-version", "2019-12-12") req.Header.Set("Accept", "application/xml") @@ -585,7 +559,7 @@ func (client directoryClient) setAccessControlCreateRequest(ctx context.Context, } // setAccessControlHandleResponse handles the SetAccessControl response. -func (client directoryClient) setAccessControlHandleResponse(resp *azcore.Response) (DirectorySetAccessControlResponse, error) { +func (client *directoryClient) setAccessControlHandleResponse(resp *azcore.Response) (DirectorySetAccessControlResponse, error) { result := DirectorySetAccessControlResponse{RawResponse: resp.Response} if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) @@ -614,10 +588,11 @@ func (client directoryClient) setAccessControlHandleResponse(resp *azcore.Respon } // setAccessControlHandleError handles the SetAccessControl error response. -func (client directoryClient) setAccessControlHandleError(resp *azcore.Response) error { - var err DataLakeStorageError +func (client *directoryClient) setAccessControlHandleError(resp *azcore.Response) error { +var err DataLakeStorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } return azcore.NewResponseError(&err, resp.Response) } + diff --git a/sdk/storage/azblob/zz_generated_enums.go b/sdk/storage/azblob/zz_generated_enums.go deleted file mode 100644 index 7e12446ce82c..000000000000 --- a/sdk/storage/azblob/zz_generated_enums.go +++ /dev/null @@ -1,714 +0,0 @@ -// +build go1.13 - -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. -// Code generated by Microsoft (R) AutoRest Code Generator. -// Changes may cause incorrect behavior and will be lost if the code is regenerated. - -package azblob - -type AccessTier string - -const ( - AccessTierArchive AccessTier = "Archive" - AccessTierCool AccessTier = "Cool" - AccessTierHot AccessTier = "Hot" - AccessTierP10 AccessTier = "P10" - AccessTierP15 AccessTier = "P15" - AccessTierP20 AccessTier = "P20" - AccessTierP30 AccessTier = "P30" - AccessTierP4 AccessTier = "P4" - AccessTierP40 AccessTier = "P40" - AccessTierP50 AccessTier = "P50" - AccessTierP6 AccessTier = "P6" - AccessTierP60 AccessTier = "P60" - AccessTierP70 AccessTier = "P70" - AccessTierP80 AccessTier = "P80" -) - -func PossibleAccessTierValues() []AccessTier { - return []AccessTier{ - AccessTierArchive, - AccessTierCool, - AccessTierHot, - AccessTierP10, - AccessTierP15, - AccessTierP20, - AccessTierP30, - AccessTierP4, - AccessTierP40, - AccessTierP50, - AccessTierP6, - AccessTierP60, - AccessTierP70, - AccessTierP80, - } -} - -func (c AccessTier) ToPtr() *AccessTier { - return &c -} - -type AccountKind string - -const ( - AccountKindStorage AccountKind = "Storage" - AccountKindBlobStorage AccountKind = "BlobStorage" - AccountKindStorageV2 AccountKind = "StorageV2" - AccountKindFileStorage AccountKind = "FileStorage" - AccountKindBlockBlobStorage AccountKind = "BlockBlobStorage" -) - -func PossibleAccountKindValues() []AccountKind { - return []AccountKind{ - AccountKindStorage, - AccountKindBlobStorage, - AccountKindStorageV2, - AccountKindFileStorage, - AccountKindBlockBlobStorage, - } -} - -func (c AccountKind) ToPtr() *AccountKind { - return &c -} - -type ArchiveStatus string - -const ( - ArchiveStatusRehydratePendingToCool ArchiveStatus = "rehydrate-pending-to-cool" - ArchiveStatusRehydratePendingToHot ArchiveStatus = "rehydrate-pending-to-hot" -) - -func PossibleArchiveStatusValues() []ArchiveStatus { - return []ArchiveStatus{ - ArchiveStatusRehydratePendingToCool, - ArchiveStatusRehydratePendingToHot, - } -} - -func (c ArchiveStatus) ToPtr() *ArchiveStatus { - return &c -} - -type BlobExpiryOptions string - -const ( - BlobExpiryOptionsAbsolute BlobExpiryOptions = "Absolute" - BlobExpiryOptionsNeverExpire BlobExpiryOptions = "NeverExpire" - BlobExpiryOptionsRelativeToCreation BlobExpiryOptions = "RelativeToCreation" - BlobExpiryOptionsRelativeToNow BlobExpiryOptions = "RelativeToNow" -) - -func PossibleBlobExpiryOptionsValues() []BlobExpiryOptions { - return []BlobExpiryOptions{ - BlobExpiryOptionsAbsolute, - BlobExpiryOptionsNeverExpire, - BlobExpiryOptionsRelativeToCreation, - BlobExpiryOptionsRelativeToNow, - } -} - -func (c BlobExpiryOptions) ToPtr() *BlobExpiryOptions { - return &c -} - -type BlobType string - -const ( - BlobTypeBlockBlob BlobType = "BlockBlob" - BlobTypePageBlob BlobType = "PageBlob" - BlobTypeAppendBlob BlobType = "AppendBlob" -) - -func PossibleBlobTypeValues() []BlobType { - return []BlobType{ - BlobTypeBlockBlob, - BlobTypePageBlob, - BlobTypeAppendBlob, - } -} - -func (c BlobType) ToPtr() *BlobType { - return &c -} - -type BlockListType string - -const ( - BlockListTypeCommitted BlockListType = "committed" - BlockListTypeUncommitted BlockListType = "uncommitted" - BlockListTypeAll BlockListType = "all" -) - -func PossibleBlockListTypeValues() []BlockListType { - return []BlockListType{ - BlockListTypeCommitted, - BlockListTypeUncommitted, - BlockListTypeAll, - } -} - -func (c BlockListType) ToPtr() *BlockListType { - return &c -} - -type CopyStatusType string - -const ( - CopyStatusTypePending CopyStatusType = "pending" - CopyStatusTypeSuccess CopyStatusType = "success" - CopyStatusTypeAborted CopyStatusType = "aborted" - CopyStatusTypeFailed CopyStatusType = "failed" -) - -func PossibleCopyStatusTypeValues() []CopyStatusType { - return []CopyStatusType{ - CopyStatusTypePending, - CopyStatusTypeSuccess, - CopyStatusTypeAborted, - CopyStatusTypeFailed, - } -} - -func (c CopyStatusType) ToPtr() *CopyStatusType { - return &c -} - -type DeleteSnapshotsOptionType string - -const ( - DeleteSnapshotsOptionTypeInclude DeleteSnapshotsOptionType = "include" - DeleteSnapshotsOptionTypeOnly DeleteSnapshotsOptionType = "only" -) - -func PossibleDeleteSnapshotsOptionTypeValues() []DeleteSnapshotsOptionType { - return []DeleteSnapshotsOptionType{ - DeleteSnapshotsOptionTypeInclude, - DeleteSnapshotsOptionTypeOnly, - } -} - -func (c DeleteSnapshotsOptionType) ToPtr() *DeleteSnapshotsOptionType { - return &c -} - -// GeoReplicationStatusType - The status of the secondary location -type GeoReplicationStatusType string - -const ( - GeoReplicationStatusTypeBootstrap GeoReplicationStatusType = "bootstrap" - GeoReplicationStatusTypeLive GeoReplicationStatusType = "live" - GeoReplicationStatusTypeUnavailable GeoReplicationStatusType = "unavailable" -) - -func PossibleGeoReplicationStatusTypeValues() []GeoReplicationStatusType { - return []GeoReplicationStatusType{ - GeoReplicationStatusTypeBootstrap, - GeoReplicationStatusTypeLive, - GeoReplicationStatusTypeUnavailable, - } -} - -func (c GeoReplicationStatusType) ToPtr() *GeoReplicationStatusType { - return &c -} - -type LeaseDurationType string - -const ( - LeaseDurationTypeInfinite LeaseDurationType = "infinite" - LeaseDurationTypeFixed LeaseDurationType = "fixed" -) - -func PossibleLeaseDurationTypeValues() []LeaseDurationType { - return []LeaseDurationType{ - LeaseDurationTypeInfinite, - LeaseDurationTypeFixed, - } -} - -func (c LeaseDurationType) ToPtr() *LeaseDurationType { - return &c -} - -type LeaseStateType string - -const ( - LeaseStateTypeAvailable LeaseStateType = "available" - LeaseStateTypeLeased LeaseStateType = "leased" - LeaseStateTypeExpired LeaseStateType = "expired" - LeaseStateTypeBreaking LeaseStateType = "breaking" - LeaseStateTypeBroken LeaseStateType = "broken" -) - -func PossibleLeaseStateTypeValues() []LeaseStateType { - return []LeaseStateType{ - LeaseStateTypeAvailable, - LeaseStateTypeLeased, - LeaseStateTypeExpired, - LeaseStateTypeBreaking, - LeaseStateTypeBroken, - } -} - -func (c LeaseStateType) ToPtr() *LeaseStateType { - return &c -} - -type LeaseStatusType string - -const ( - LeaseStatusTypeLocked LeaseStatusType = "locked" - LeaseStatusTypeUnlocked LeaseStatusType = "unlocked" -) - -func PossibleLeaseStatusTypeValues() []LeaseStatusType { - return []LeaseStatusType{ - LeaseStatusTypeLocked, - LeaseStatusTypeUnlocked, - } -} - -func (c LeaseStatusType) ToPtr() *LeaseStatusType { - return &c -} - -type ListBlobsIncludeItem string - -const ( - ListBlobsIncludeItemCopy ListBlobsIncludeItem = "copy" - ListBlobsIncludeItemDeleted ListBlobsIncludeItem = "deleted" - ListBlobsIncludeItemMetadata ListBlobsIncludeItem = "metadata" - ListBlobsIncludeItemSnapshots ListBlobsIncludeItem = "snapshots" - ListBlobsIncludeItemUncommittedblobs ListBlobsIncludeItem = "uncommittedblobs" - ListBlobsIncludeItemVersions ListBlobsIncludeItem = "versions" - ListBlobsIncludeItemTags ListBlobsIncludeItem = "tags" -) - -func PossibleListBlobsIncludeItemValues() []ListBlobsIncludeItem { - return []ListBlobsIncludeItem{ - ListBlobsIncludeItemCopy, - ListBlobsIncludeItemDeleted, - ListBlobsIncludeItemMetadata, - ListBlobsIncludeItemSnapshots, - ListBlobsIncludeItemUncommittedblobs, - ListBlobsIncludeItemVersions, - ListBlobsIncludeItemTags, - } -} - -func (c ListBlobsIncludeItem) ToPtr() *ListBlobsIncludeItem { - return &c -} - -type ListContainersIncludeType string - -const ( - ListContainersIncludeTypeMetadata ListContainersIncludeType = "metadata" - ListContainersIncludeTypeDeleted ListContainersIncludeType = "deleted" -) - -func PossibleListContainersIncludeTypeValues() []ListContainersIncludeType { - return []ListContainersIncludeType{ - ListContainersIncludeTypeMetadata, - ListContainersIncludeTypeDeleted, - } -} - -func (c ListContainersIncludeType) ToPtr() *ListContainersIncludeType { - return &c -} - -type PathRenameMode string - -const ( - PathRenameModeLegacy PathRenameMode = "legacy" - PathRenameModePosix PathRenameMode = "posix" -) - -func PossiblePathRenameModeValues() []PathRenameMode { - return []PathRenameMode{ - PathRenameModeLegacy, - PathRenameModePosix, - } -} - -func (c PathRenameMode) ToPtr() *PathRenameMode { - return &c -} - -type PremiumPageBlobAccessTier string - -const ( - PremiumPageBlobAccessTierP10 PremiumPageBlobAccessTier = "P10" - PremiumPageBlobAccessTierP15 PremiumPageBlobAccessTier = "P15" - PremiumPageBlobAccessTierP20 PremiumPageBlobAccessTier = "P20" - PremiumPageBlobAccessTierP30 PremiumPageBlobAccessTier = "P30" - PremiumPageBlobAccessTierP4 PremiumPageBlobAccessTier = "P4" - PremiumPageBlobAccessTierP40 PremiumPageBlobAccessTier = "P40" - PremiumPageBlobAccessTierP50 PremiumPageBlobAccessTier = "P50" - PremiumPageBlobAccessTierP6 PremiumPageBlobAccessTier = "P6" - PremiumPageBlobAccessTierP60 PremiumPageBlobAccessTier = "P60" - PremiumPageBlobAccessTierP70 PremiumPageBlobAccessTier = "P70" - PremiumPageBlobAccessTierP80 PremiumPageBlobAccessTier = "P80" -) - -func PossiblePremiumPageBlobAccessTierValues() []PremiumPageBlobAccessTier { - return []PremiumPageBlobAccessTier{ - PremiumPageBlobAccessTierP10, - PremiumPageBlobAccessTierP15, - PremiumPageBlobAccessTierP20, - PremiumPageBlobAccessTierP30, - PremiumPageBlobAccessTierP4, - PremiumPageBlobAccessTierP40, - PremiumPageBlobAccessTierP50, - PremiumPageBlobAccessTierP6, - PremiumPageBlobAccessTierP60, - PremiumPageBlobAccessTierP70, - PremiumPageBlobAccessTierP80, - } -} - -func (c PremiumPageBlobAccessTier) ToPtr() *PremiumPageBlobAccessTier { - return &c -} - -type PublicAccessType string - -const ( - PublicAccessTypeBlob PublicAccessType = "blob" - PublicAccessTypeContainer PublicAccessType = "container" -) - -func PossiblePublicAccessTypeValues() []PublicAccessType { - return []PublicAccessType{ - PublicAccessTypeBlob, - PublicAccessTypeContainer, - } -} - -func (c PublicAccessType) ToPtr() *PublicAccessType { - return &c -} - -// QueryFormatType - The quick query format type. -type QueryFormatType string - -const ( - QueryFormatTypeDelimited QueryFormatType = "delimited" - QueryFormatTypeJSON QueryFormatType = "json" -) - -func PossibleQueryFormatTypeValues() []QueryFormatType { - return []QueryFormatType{ - QueryFormatTypeDelimited, - QueryFormatTypeJSON, - } -} - -func (c QueryFormatType) ToPtr() *QueryFormatType { - return &c -} - -// RehydratePriority - If an object is in rehydrate pending state then this header is returned with priority of rehydrate. Valid values are High and Standard. -type RehydratePriority string - -const ( - RehydratePriorityHigh RehydratePriority = "High" - RehydratePriorityStandard RehydratePriority = "Standard" -) - -func PossibleRehydratePriorityValues() []RehydratePriority { - return []RehydratePriority{ - RehydratePriorityHigh, - RehydratePriorityStandard, - } -} - -func (c RehydratePriority) ToPtr() *RehydratePriority { - return &c -} - -type SKUName string - -const ( - SKUNameStandardLrs SKUName = "Standard_LRS" - SKUNameStandardGrs SKUName = "Standard_GRS" - SKUNameStandardRagrs SKUName = "Standard_RAGRS" - SKUNameStandardZrs SKUName = "Standard_ZRS" - SKUNamePremiumLrs SKUName = "Premium_LRS" -) - -func PossibleSKUNameValues() []SKUName { - return []SKUName{ - SKUNameStandardLrs, - SKUNameStandardGrs, - SKUNameStandardRagrs, - SKUNameStandardZrs, - SKUNamePremiumLrs, - } -} - -func (c SKUName) ToPtr() *SKUName { - return &c -} - -type SequenceNumberActionType string - -const ( - SequenceNumberActionTypeMax SequenceNumberActionType = "max" - SequenceNumberActionTypeUpdate SequenceNumberActionType = "update" - SequenceNumberActionTypeIncrement SequenceNumberActionType = "increment" -) - -func PossibleSequenceNumberActionTypeValues() []SequenceNumberActionType { - return []SequenceNumberActionType{ - SequenceNumberActionTypeMax, - SequenceNumberActionTypeUpdate, - SequenceNumberActionTypeIncrement, - } -} - -func (c SequenceNumberActionType) ToPtr() *SequenceNumberActionType { - return &c -} - -// StorageErrorCode - Error codes returned by the service -type StorageErrorCode string - -const ( - StorageErrorCodeAccountAlreadyExists StorageErrorCode = "AccountAlreadyExists" - StorageErrorCodeAccountBeingCreated StorageErrorCode = "AccountBeingCreated" - StorageErrorCodeAccountIsDisabled StorageErrorCode = "AccountIsDisabled" - StorageErrorCodeAppendPositionConditionNotMet StorageErrorCode = "AppendPositionConditionNotMet" - StorageErrorCodeAuthenticationFailed StorageErrorCode = "AuthenticationFailed" - StorageErrorCodeAuthorizationFailure StorageErrorCode = "AuthorizationFailure" - StorageErrorCodeAuthorizationPermissionMismatch StorageErrorCode = "AuthorizationPermissionMismatch" - StorageErrorCodeAuthorizationProtocolMismatch StorageErrorCode = "AuthorizationProtocolMismatch" - StorageErrorCodeAuthorizationResourceTypeMismatch StorageErrorCode = "AuthorizationResourceTypeMismatch" - StorageErrorCodeAuthorizationServiceMismatch StorageErrorCode = "AuthorizationServiceMismatch" - StorageErrorCodeAuthorizationSourceIPMismatch StorageErrorCode = "AuthorizationSourceIPMismatch" - StorageErrorCodeBlobAlreadyExists StorageErrorCode = "BlobAlreadyExists" - StorageErrorCodeBlobArchived StorageErrorCode = "BlobArchived" - StorageErrorCodeBlobBeingRehydrated StorageErrorCode = "BlobBeingRehydrated" - StorageErrorCodeBlobImmutableDueToPolicy StorageErrorCode = "BlobImmutableDueToPolicy" - StorageErrorCodeBlobNotArchived StorageErrorCode = "BlobNotArchived" - StorageErrorCodeBlobNotFound StorageErrorCode = "BlobNotFound" - StorageErrorCodeBlobOverwritten StorageErrorCode = "BlobOverwritten" - StorageErrorCodeBlobTierInadequateForContentLength StorageErrorCode = "BlobTierInadequateForContentLength" - StorageErrorCodeBlockCountExceedsLimit StorageErrorCode = "BlockCountExceedsLimit" - StorageErrorCodeBlockListTooLong StorageErrorCode = "BlockListTooLong" - StorageErrorCodeCannotChangeToLowerTier StorageErrorCode = "CannotChangeToLowerTier" - StorageErrorCodeCannotVerifyCopySource StorageErrorCode = "CannotVerifyCopySource" - StorageErrorCodeConditionHeadersNotSupported StorageErrorCode = "ConditionHeadersNotSupported" - StorageErrorCodeConditionNotMet StorageErrorCode = "ConditionNotMet" - StorageErrorCodeContainerAlreadyExists StorageErrorCode = "ContainerAlreadyExists" - StorageErrorCodeContainerBeingDeleted StorageErrorCode = "ContainerBeingDeleted" - StorageErrorCodeContainerDisabled StorageErrorCode = "ContainerDisabled" - StorageErrorCodeContainerNotFound StorageErrorCode = "ContainerNotFound" - StorageErrorCodeContentLengthLargerThanTierLimit StorageErrorCode = "ContentLengthLargerThanTierLimit" - StorageErrorCodeCopyAcrossAccountsNotSupported StorageErrorCode = "CopyAcrossAccountsNotSupported" - StorageErrorCodeCopyIDMismatch StorageErrorCode = "CopyIdMismatch" - StorageErrorCodeEmptyMetadataKey StorageErrorCode = "EmptyMetadataKey" - StorageErrorCodeFeatureVersionMismatch StorageErrorCode = "FeatureVersionMismatch" - StorageErrorCodeIncrementalCopyBlobMismatch StorageErrorCode = "IncrementalCopyBlobMismatch" - StorageErrorCodeIncrementalCopyOfEralierVersionSnapshotNotAllowed StorageErrorCode = "IncrementalCopyOfEralierVersionSnapshotNotAllowed" - StorageErrorCodeIncrementalCopySourceMustBeSnapshot StorageErrorCode = "IncrementalCopySourceMustBeSnapshot" - StorageErrorCodeInfiniteLeaseDurationRequired StorageErrorCode = "InfiniteLeaseDurationRequired" - StorageErrorCodeInsufficientAccountPermissions StorageErrorCode = "InsufficientAccountPermissions" - StorageErrorCodeInternalError StorageErrorCode = "InternalError" - StorageErrorCodeInvalidAuthenticationInfo StorageErrorCode = "InvalidAuthenticationInfo" - StorageErrorCodeInvalidBlobOrBlock StorageErrorCode = "InvalidBlobOrBlock" - StorageErrorCodeInvalidBlobTier StorageErrorCode = "InvalidBlobTier" - StorageErrorCodeInvalidBlobType StorageErrorCode = "InvalidBlobType" - StorageErrorCodeInvalidBlockID StorageErrorCode = "InvalidBlockId" - StorageErrorCodeInvalidBlockList StorageErrorCode = "InvalidBlockList" - StorageErrorCodeInvalidHTTPVerb StorageErrorCode = "InvalidHttpVerb" - StorageErrorCodeInvalidHeaderValue StorageErrorCode = "InvalidHeaderValue" - StorageErrorCodeInvalidInput StorageErrorCode = "InvalidInput" - StorageErrorCodeInvalidMD5 StorageErrorCode = "InvalidMd5" - StorageErrorCodeInvalidMetadata StorageErrorCode = "InvalidMetadata" - StorageErrorCodeInvalidOperation StorageErrorCode = "InvalidOperation" - StorageErrorCodeInvalidPageRange StorageErrorCode = "InvalidPageRange" - StorageErrorCodeInvalidQueryParameterValue StorageErrorCode = "InvalidQueryParameterValue" - StorageErrorCodeInvalidRange StorageErrorCode = "InvalidRange" - StorageErrorCodeInvalidResourceName StorageErrorCode = "InvalidResourceName" - StorageErrorCodeInvalidSourceBlobType StorageErrorCode = "InvalidSourceBlobType" - StorageErrorCodeInvalidSourceBlobURL StorageErrorCode = "InvalidSourceBlobUrl" - StorageErrorCodeInvalidURI StorageErrorCode = "InvalidUri" - StorageErrorCodeInvalidVersionForPageBlobOperation StorageErrorCode = "InvalidVersionForPageBlobOperation" - StorageErrorCodeInvalidXMLDocument StorageErrorCode = "InvalidXmlDocument" - StorageErrorCodeInvalidXMLNodeValue StorageErrorCode = "InvalidXmlNodeValue" - StorageErrorCodeLeaseAlreadyBroken StorageErrorCode = "LeaseAlreadyBroken" - StorageErrorCodeLeaseAlreadyPresent StorageErrorCode = "LeaseAlreadyPresent" - StorageErrorCodeLeaseIDMismatchWithBlobOperation StorageErrorCode = "LeaseIdMismatchWithBlobOperation" - StorageErrorCodeLeaseIDMismatchWithContainerOperation StorageErrorCode = "LeaseIdMismatchWithContainerOperation" - StorageErrorCodeLeaseIDMismatchWithLeaseOperation StorageErrorCode = "LeaseIdMismatchWithLeaseOperation" - StorageErrorCodeLeaseIDMissing StorageErrorCode = "LeaseIdMissing" - StorageErrorCodeLeaseIsBreakingAndCannotBeAcquired StorageErrorCode = "LeaseIsBreakingAndCannotBeAcquired" - StorageErrorCodeLeaseIsBreakingAndCannotBeChanged StorageErrorCode = "LeaseIsBreakingAndCannotBeChanged" - StorageErrorCodeLeaseIsBrokenAndCannotBeRenewed StorageErrorCode = "LeaseIsBrokenAndCannotBeRenewed" - StorageErrorCodeLeaseLost StorageErrorCode = "LeaseLost" - StorageErrorCodeLeaseNotPresentWithBlobOperation StorageErrorCode = "LeaseNotPresentWithBlobOperation" - StorageErrorCodeLeaseNotPresentWithContainerOperation StorageErrorCode = "LeaseNotPresentWithContainerOperation" - StorageErrorCodeLeaseNotPresentWithLeaseOperation StorageErrorCode = "LeaseNotPresentWithLeaseOperation" - StorageErrorCodeMD5Mismatch StorageErrorCode = "Md5Mismatch" - StorageErrorCodeMaxBlobSizeConditionNotMet StorageErrorCode = "MaxBlobSizeConditionNotMet" - StorageErrorCodeMetadataTooLarge StorageErrorCode = "MetadataTooLarge" - StorageErrorCodeMissingContentLengthHeader StorageErrorCode = "MissingContentLengthHeader" - StorageErrorCodeMissingRequiredHeader StorageErrorCode = "MissingRequiredHeader" - StorageErrorCodeMissingRequiredQueryParameter StorageErrorCode = "MissingRequiredQueryParameter" - StorageErrorCodeMissingRequiredXMLNode StorageErrorCode = "MissingRequiredXmlNode" - StorageErrorCodeMultipleConditionHeadersNotSupported StorageErrorCode = "MultipleConditionHeadersNotSupported" - StorageErrorCodeNoAuthenticationInformation StorageErrorCode = "NoAuthenticationInformation" - StorageErrorCodeNoPendingCopyOperation StorageErrorCode = "NoPendingCopyOperation" - StorageErrorCodeOperationNotAllowedOnIncrementalCopyBlob StorageErrorCode = "OperationNotAllowedOnIncrementalCopyBlob" - StorageErrorCodeOperationTimedOut StorageErrorCode = "OperationTimedOut" - StorageErrorCodeOutOfRangeInput StorageErrorCode = "OutOfRangeInput" - StorageErrorCodeOutOfRangeQueryParameterValue StorageErrorCode = "OutOfRangeQueryParameterValue" - StorageErrorCodePendingCopyOperation StorageErrorCode = "PendingCopyOperation" - StorageErrorCodePreviousSnapshotCannotBeNewer StorageErrorCode = "PreviousSnapshotCannotBeNewer" - StorageErrorCodePreviousSnapshotNotFound StorageErrorCode = "PreviousSnapshotNotFound" - StorageErrorCodePreviousSnapshotOperationNotSupported StorageErrorCode = "PreviousSnapshotOperationNotSupported" - StorageErrorCodeRequestBodyTooLarge StorageErrorCode = "RequestBodyTooLarge" - StorageErrorCodeRequestURLFailedToParse StorageErrorCode = "RequestUrlFailedToParse" - StorageErrorCodeResourceAlreadyExists StorageErrorCode = "ResourceAlreadyExists" - StorageErrorCodeResourceNotFound StorageErrorCode = "ResourceNotFound" - StorageErrorCodeResourceTypeMismatch StorageErrorCode = "ResourceTypeMismatch" - StorageErrorCodeSequenceNumberConditionNotMet StorageErrorCode = "SequenceNumberConditionNotMet" - StorageErrorCodeSequenceNumberIncrementTooLarge StorageErrorCode = "SequenceNumberIncrementTooLarge" - StorageErrorCodeServerBusy StorageErrorCode = "ServerBusy" - StorageErrorCodeSnaphotOperationRateExceeded StorageErrorCode = "SnaphotOperationRateExceeded" - StorageErrorCodeSnapshotCountExceeded StorageErrorCode = "SnapshotCountExceeded" - StorageErrorCodeSnapshotsPresent StorageErrorCode = "SnapshotsPresent" - StorageErrorCodeSourceConditionNotMet StorageErrorCode = "SourceConditionNotMet" - StorageErrorCodeSystemInUse StorageErrorCode = "SystemInUse" - StorageErrorCodeTargetConditionNotMet StorageErrorCode = "TargetConditionNotMet" - StorageErrorCodeUnauthorizedBlobOverwrite StorageErrorCode = "UnauthorizedBlobOverwrite" - StorageErrorCodeUnsupportedHTTPVerb StorageErrorCode = "UnsupportedHttpVerb" - StorageErrorCodeUnsupportedHeader StorageErrorCode = "UnsupportedHeader" - StorageErrorCodeUnsupportedQueryParameter StorageErrorCode = "UnsupportedQueryParameter" - StorageErrorCodeUnsupportedXMLNode StorageErrorCode = "UnsupportedXmlNode" -) - -func PossibleStorageErrorCodeValues() []StorageErrorCode { - return []StorageErrorCode{ - StorageErrorCodeAccountAlreadyExists, - StorageErrorCodeAccountBeingCreated, - StorageErrorCodeAccountIsDisabled, - StorageErrorCodeAppendPositionConditionNotMet, - StorageErrorCodeAuthenticationFailed, - StorageErrorCodeAuthorizationFailure, - StorageErrorCodeAuthorizationPermissionMismatch, - StorageErrorCodeAuthorizationProtocolMismatch, - StorageErrorCodeAuthorizationResourceTypeMismatch, - StorageErrorCodeAuthorizationServiceMismatch, - StorageErrorCodeAuthorizationSourceIPMismatch, - StorageErrorCodeBlobAlreadyExists, - StorageErrorCodeBlobArchived, - StorageErrorCodeBlobBeingRehydrated, - StorageErrorCodeBlobImmutableDueToPolicy, - StorageErrorCodeBlobNotArchived, - StorageErrorCodeBlobNotFound, - StorageErrorCodeBlobOverwritten, - StorageErrorCodeBlobTierInadequateForContentLength, - StorageErrorCodeBlockCountExceedsLimit, - StorageErrorCodeBlockListTooLong, - StorageErrorCodeCannotChangeToLowerTier, - StorageErrorCodeCannotVerifyCopySource, - StorageErrorCodeConditionHeadersNotSupported, - StorageErrorCodeConditionNotMet, - StorageErrorCodeContainerAlreadyExists, - StorageErrorCodeContainerBeingDeleted, - StorageErrorCodeContainerDisabled, - StorageErrorCodeContainerNotFound, - StorageErrorCodeContentLengthLargerThanTierLimit, - StorageErrorCodeCopyAcrossAccountsNotSupported, - StorageErrorCodeCopyIDMismatch, - StorageErrorCodeEmptyMetadataKey, - StorageErrorCodeFeatureVersionMismatch, - StorageErrorCodeIncrementalCopyBlobMismatch, - StorageErrorCodeIncrementalCopyOfEralierVersionSnapshotNotAllowed, - StorageErrorCodeIncrementalCopySourceMustBeSnapshot, - StorageErrorCodeInfiniteLeaseDurationRequired, - StorageErrorCodeInsufficientAccountPermissions, - StorageErrorCodeInternalError, - StorageErrorCodeInvalidAuthenticationInfo, - StorageErrorCodeInvalidBlobOrBlock, - StorageErrorCodeInvalidBlobTier, - StorageErrorCodeInvalidBlobType, - StorageErrorCodeInvalidBlockID, - StorageErrorCodeInvalidBlockList, - StorageErrorCodeInvalidHTTPVerb, - StorageErrorCodeInvalidHeaderValue, - StorageErrorCodeInvalidInput, - StorageErrorCodeInvalidMD5, - StorageErrorCodeInvalidMetadata, - StorageErrorCodeInvalidOperation, - StorageErrorCodeInvalidPageRange, - StorageErrorCodeInvalidQueryParameterValue, - StorageErrorCodeInvalidRange, - StorageErrorCodeInvalidResourceName, - StorageErrorCodeInvalidSourceBlobType, - StorageErrorCodeInvalidSourceBlobURL, - StorageErrorCodeInvalidURI, - StorageErrorCodeInvalidVersionForPageBlobOperation, - StorageErrorCodeInvalidXMLDocument, - StorageErrorCodeInvalidXMLNodeValue, - StorageErrorCodeLeaseAlreadyBroken, - StorageErrorCodeLeaseAlreadyPresent, - StorageErrorCodeLeaseIDMismatchWithBlobOperation, - StorageErrorCodeLeaseIDMismatchWithContainerOperation, - StorageErrorCodeLeaseIDMismatchWithLeaseOperation, - StorageErrorCodeLeaseIDMissing, - StorageErrorCodeLeaseIsBreakingAndCannotBeAcquired, - StorageErrorCodeLeaseIsBreakingAndCannotBeChanged, - StorageErrorCodeLeaseIsBrokenAndCannotBeRenewed, - StorageErrorCodeLeaseLost, - StorageErrorCodeLeaseNotPresentWithBlobOperation, - StorageErrorCodeLeaseNotPresentWithContainerOperation, - StorageErrorCodeLeaseNotPresentWithLeaseOperation, - StorageErrorCodeMD5Mismatch, - StorageErrorCodeMaxBlobSizeConditionNotMet, - StorageErrorCodeMetadataTooLarge, - StorageErrorCodeMissingContentLengthHeader, - StorageErrorCodeMissingRequiredHeader, - StorageErrorCodeMissingRequiredQueryParameter, - StorageErrorCodeMissingRequiredXMLNode, - StorageErrorCodeMultipleConditionHeadersNotSupported, - StorageErrorCodeNoAuthenticationInformation, - StorageErrorCodeNoPendingCopyOperation, - StorageErrorCodeOperationNotAllowedOnIncrementalCopyBlob, - StorageErrorCodeOperationTimedOut, - StorageErrorCodeOutOfRangeInput, - StorageErrorCodeOutOfRangeQueryParameterValue, - StorageErrorCodePendingCopyOperation, - StorageErrorCodePreviousSnapshotCannotBeNewer, - StorageErrorCodePreviousSnapshotNotFound, - StorageErrorCodePreviousSnapshotOperationNotSupported, - StorageErrorCodeRequestBodyTooLarge, - StorageErrorCodeRequestURLFailedToParse, - StorageErrorCodeResourceAlreadyExists, - StorageErrorCodeResourceNotFound, - StorageErrorCodeResourceTypeMismatch, - StorageErrorCodeSequenceNumberConditionNotMet, - StorageErrorCodeSequenceNumberIncrementTooLarge, - StorageErrorCodeServerBusy, - StorageErrorCodeSnaphotOperationRateExceeded, - StorageErrorCodeSnapshotCountExceeded, - StorageErrorCodeSnapshotsPresent, - StorageErrorCodeSourceConditionNotMet, - StorageErrorCodeSystemInUse, - StorageErrorCodeTargetConditionNotMet, - StorageErrorCodeUnauthorizedBlobOverwrite, - StorageErrorCodeUnsupportedHTTPVerb, - StorageErrorCodeUnsupportedHeader, - StorageErrorCodeUnsupportedQueryParameter, - StorageErrorCodeUnsupportedXMLNode, - } -} - -func (c StorageErrorCode) ToPtr() *StorageErrorCode { - return &c -} diff --git a/sdk/storage/azblob/zz_generated_models.go b/sdk/storage/azblob/zz_generated_models.go index 0460ba79f85a..c093eea24421 100644 --- a/sdk/storage/azblob/zz_generated_models.go +++ b/sdk/storage/azblob/zz_generated_models.go @@ -11,7 +11,6 @@ import ( "encoding/xml" "fmt" "net/http" - "net/url" "time" ) @@ -33,11 +32,11 @@ func (a AccessPolicy) MarshalXML(e *xml.Encoder, start xml.StartElement) error { aux := &struct { *alias Expiry *timeRFC3339 `xml:"Expiry"` - Start *timeRFC3339 `xml:"Start"` + Start *timeRFC3339 `xml:"Start"` }{ - alias: (*alias)(&a), + alias: (*alias)(&a), Expiry: (*timeRFC3339)(a.Expiry), - Start: (*timeRFC3339)(a.Start), + Start: (*timeRFC3339)(a.Start), } return e.EncodeElement(aux, start) } @@ -48,7 +47,7 @@ func (a *AccessPolicy) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro aux := &struct { *alias Expiry *timeRFC3339 `xml:"Expiry"` - Start *timeRFC3339 `xml:"Start"` + Start *timeRFC3339 `xml:"Start"` }{ alias: (*alias)(a), } @@ -63,18 +62,18 @@ func (a *AccessPolicy) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro // AppendBlobAppendBlockFromURLOptions contains the optional parameters for the AppendBlob.AppendBlockFromURL method. type AppendBlobAppendBlockFromURLOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // Specify the md5 calculated for the range of bytes that must be read from the copy source. - SourceContentMd5 *[]byte + SourceContentMD5 *[]byte // Specify the crc64 calculated for the range of bytes that must be read from the copy source. SourceContentcrc64 *[]byte // Bytes of source data in the specified range. SourceRange *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 // Specify the transactional md5 for the body, to be validated by the service. - TransactionalContentMd5 *[]byte + TransactionalContentMD5 *[]byte } // AppendBlobAppendBlockFromURLResponse contains the response from method AppendBlob.AppendBlockFromURL. @@ -85,9 +84,6 @@ type AppendBlobAppendBlockFromURLResponse struct { // BlobCommittedBlockCount contains the information returned from the x-ms-blob-committed-block-count header response. BlobCommittedBlockCount *int32 - // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. - ContentCRC64 *[]byte - // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 *[]byte @@ -117,19 +113,22 @@ type AppendBlobAppendBlockFromURLResponse struct { // Version contains the information returned from the x-ms-version header response. Version *string + + // XMSContentCRC64 contains the information returned from the x-ms-content-crc64 header response. + XMSContentCRC64 *[]byte } // AppendBlobAppendBlockOptions contains the optional parameters for the AppendBlob.AppendBlock method. type AppendBlobAppendBlockOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 // Specify the transactional crc64 for the body, to be validated by the service. - TransactionalContentCrc64 *[]byte + TransactionalContentCRC64 *[]byte // Specify the transactional md5 for the body, to be validated by the service. - TransactionalContentMd5 *[]byte + TransactionalContentMD5 *[]byte } // AppendBlobAppendBlockResponse contains the response from method AppendBlob.AppendBlock. @@ -143,9 +142,6 @@ type AppendBlobAppendBlockResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string - // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. - ContentCRC64 *[]byte - // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 *[]byte @@ -175,6 +171,9 @@ type AppendBlobAppendBlockResponse struct { // Version contains the information returned from the x-ms-version header response. Version *string + + // XMSContentCRC64 contains the information returned from the x-ms-content-crc64 header response. + XMSContentCRC64 *[]byte } // AppendBlobCreateOptions contains the optional parameters for the AppendBlob.Create method. @@ -182,14 +181,14 @@ type AppendBlobCreateOptions struct { // Optional. Used to set blob tags in various blob operations. BlobTagsString *string // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the operation will copy the metadata - // from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified - // metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming - // rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information. +// from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified +// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming +// rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information. Metadata *map[string]string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -235,9 +234,9 @@ type AppendBlobCreateResponse struct { // AppendBlobSealOptions contains the optional parameters for the AppendBlob.Seal method. type AppendBlobSealOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -271,21 +270,21 @@ type AppendBlobSealResponse struct { // AppendPositionAccessConditions contains a group of parameters for the AppendBlob.AppendBlock method. type AppendPositionAccessConditions struct { // Optional conditional header, used only for the Append Block operation. A number indicating the byte offset to compare. Append Block will succeed only - // if the append position is equal to this number. If it is not, the request will fail with the AppendPositionConditionNotMet error (HTTP status code 412 - // - Precondition Failed). +// if the append position is equal to this number. If it is not, the request will fail with the AppendPositionConditionNotMet error (HTTP status code 412 +// - Precondition Failed). AppendPosition *int64 // Optional conditional header. The max length in bytes permitted for the append blob. If the Append Block operation would cause the blob to exceed that - // limit or if the blob size is already greater than the value specified in this header, the request will fail with MaxBlobSizeConditionNotMet error (HTTP - // status code 412 - Precondition Failed). +// limit or if the blob size is already greater than the value specified in this header, the request will fail with MaxBlobSizeConditionNotMet error (HTTP +// status code 412 - Precondition Failed). MaxSize *int64 } // BlobAbortCopyFromURLOptions contains the optional parameters for the Blob.AbortCopyFromURL method. type BlobAbortCopyFromURLOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -310,15 +309,15 @@ type BlobAbortCopyFromURLResponse struct { // BlobAcquireLeaseOptions contains the optional parameters for the Blob.AcquireLease method. type BlobAcquireLeaseOptions struct { // Specifies the duration of the lease, in seconds, or negative one (-1) for a lease that never expires. A non-infinite lease can be between 15 and 60 seconds. - // A lease duration cannot be changed using renew or change. +// A lease duration cannot be changed using renew or change. Duration *int32 // Proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the proposed lease ID is not in the correct format. See - // Guid Constructor (String) for a list of valid GUID string formats. - ProposedLeaseId *string +// Guid Constructor (String) for a list of valid GUID string formats. + ProposedLeaseID *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -352,14 +351,14 @@ type BlobAcquireLeaseResponse struct { // BlobBreakLeaseOptions contains the optional parameters for the Blob.BreakLease method. type BlobBreakLeaseOptions struct { // For a break operation, proposed duration the lease should continue before it is broken, in seconds, between 0 and 60. This break period is only used - // if it is shorter than the time remaining on the lease. If longer, the time remaining on the lease is used. A new lease will not be available before the - // break period has expired, but the lease may be held for longer than the break period. If this header does not appear with a break operation, a fixed-duration - // lease breaks after the remaining lease period elapses, and an infinite lease breaks immediately. +// if it is shorter than the time remaining on the lease. If longer, the time remaining on the lease is used. A new lease will not be available before the +// break period has expired, but the lease may be held for longer than the break period. If this header does not appear with a break operation, a fixed-duration +// lease breaks after the remaining lease period elapses, and an infinite lease breaks immediately. BreakPeriod *int32 // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -393,9 +392,9 @@ type BlobBreakLeaseResponse struct { // BlobChangeLeaseOptions contains the optional parameters for the Blob.ChangeLease method. type BlobChangeLeaseOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -431,18 +430,18 @@ type BlobCopyFromURLOptions struct { // Optional. Used to set blob tags in various blob operations. BlobTagsString *string // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the operation will copy the metadata - // from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified - // metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming - // rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information. +// from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified +// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming +// rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information. Metadata *map[string]string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // Specify the md5 calculated for the range of bytes that must be read from the copy source. - SourceContentMd5 *[]byte + SourceContentMD5 *[]byte // Optional. Indicates the tier to be set on the blob. Tier *AccessTier // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -451,9 +450,6 @@ type BlobCopyFromURLResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string - // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. - ContentCRC64 *[]byte - // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 *[]byte @@ -483,19 +479,22 @@ type BlobCopyFromURLResponse struct { // VersionID contains the information returned from the x-ms-version-id header response. VersionID *string + + // XMSContentCRC64 contains the information returned from the x-ms-content-crc64 header response. + XMSContentCRC64 *[]byte } // BlobCreateSnapshotOptions contains the optional parameters for the Blob.CreateSnapshot method. type BlobCreateSnapshotOptions struct { // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the operation will copy the metadata - // from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified - // metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming - // rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information. +// from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified +// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming +// rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information. Metadata *map[string]string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -535,20 +534,20 @@ type BlobCreateSnapshotResponse struct { // BlobDeleteOptions contains the optional parameters for the Blob.Delete method. type BlobDeleteOptions struct { // Required if the blob has associated snapshots. Specify one of the following two options: include: Delete the base blob and all of its snapshots. only: - // Delete only the blob's snapshots and not the blob itself +// Delete only the blob's snapshots and not the blob itself DeleteSnapshots *DeleteSnapshotsOptionType // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more information on working with - // blob snapshots, see Creating a Snapshot - // of a Blob. +// blob snapshots, see Creating a Snapshot +// of a Blob. Snapshot *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 // The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on. It's for service version 2019-10-10 - // and newer. - VersionId *string +// and newer. + VersionID *string } // BlobDeleteResponse contains the response from method Blob.Delete. @@ -571,26 +570,26 @@ type BlobDeleteResponse struct { // BlobDownloadOptions contains the optional parameters for the Blob.Download method. type BlobDownloadOptions struct { + // Return only the bytes of the blob in the specified range. + Range *string // When set to true and specified together with the Range, the service returns the CRC64 hash for the range, as long as the range is less than or equal - // to 4 MB in size. - RangeGetContentCrc64 *bool +// to 4 MB in size. + RangeGetContentCRC64 *bool // When set to true and specified together with the Range, the service returns the MD5 hash for the range, as long as the range is less than or equal to - // 4 MB in size. - RangeGetContentMd5 *bool - // Return only the bytes of the blob in the specified range. - RangeParameter *string +// 4 MB in size. + RangeGetContentMD5 *bool // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more information on working with - // blob snapshots, see Creating a Snapshot - // of a Blob. +// blob snapshots, see Creating a Snapshot +// of a Blob. Snapshot *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 // The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on. It's for service version 2019-10-10 - // and newer. - VersionId *string +// and newer. + VersionID *string } // BlobDownloadResponse contains the response from method Blob.Download. @@ -670,6 +669,9 @@ type BlobDownloadResponse struct { // EncryptionScope contains the information returned from the x-ms-encryption-scope header response. EncryptionScope *string + // IsCurrentVersion contains the information returned from the x-ms-is-current-version header response. + IsCurrentVersion *bool + // IsSealed contains the information returned from the x-ms-blob-sealed header response. IsSealed *bool @@ -689,13 +691,13 @@ type BlobDownloadResponse struct { LeaseStatus *LeaseStatusType // Metadata contains the information returned from the x-ms-meta header response. - Metadata *map[string]string + Metadata map[string]string // ObjectReplicationPolicyID contains the information returned from the x-ms-or-policy-id header response. ObjectReplicationPolicyID *string // ObjectReplicationRules contains the information returned from the x-ms-or header response. - ObjectReplicationRules *map[string]string + ObjectReplicationRules map[string]string // RawResponse contains the underlying HTTP response. RawResponse *http.Response @@ -714,45 +716,33 @@ type BlobDownloadResponse struct { } type BlobFlatListSegment struct { - BlobItems *[]BlobItemInternal `xml:"Blob"` + BlobItems *[]*BlobItemInternal `xml:"Blob"` } // BlobGetAccessControlOptions contains the optional parameters for the Blob.GetAccessControl method. type BlobGetAccessControlOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 // Optional. Valid only when Hierarchical Namespace is enabled for the account. If "true", the identity values returned in the x-ms-owner, x-ms-group, and - // x-ms-acl response headers will be transformed from Azure Active Directory Object IDs to User Principal Names. If "false", the values will be returned - // as Azure Active Directory Object IDs. The default value is false. +// x-ms-acl response headers will be transformed from Azure Active Directory Object IDs to User Principal Names. If "false", the values will be returned +// as Azure Active Directory Object IDs. The default value is false. Upn *bool } // BlobGetAccessControlResponse contains the response from method Blob.GetAccessControl. type BlobGetAccessControlResponse struct { - // ACL contains the information returned from the x-ms-acl header response. - ACL *string - // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *string - // Group contains the information returned from the x-ms-group header response. - Group *string - // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time - // Owner contains the information returned from the x-ms-owner header response. - Owner *string - - // Permissions contains the information returned from the x-ms-permissions header response. - Permissions *string - // RawResponse contains the underlying HTTP response. RawResponse *http.Response @@ -761,6 +751,18 @@ type BlobGetAccessControlResponse struct { // Version contains the information returned from the x-ms-version header response. Version *string + + // XMSACL contains the information returned from the x-ms-acl header response. + XMSACL *string + + // XMSGroup contains the information returned from the x-ms-group header response. + XMSGroup *string + + // XMSOwner contains the information returned from the x-ms-owner header response. + XMSOwner *string + + // XMSPermissions contains the information returned from the x-ms-permissions header response. + XMSPermissions *string } // BlobGetAccountInfoOptions contains the optional parameters for the Blob.GetAccountInfo method. @@ -795,17 +797,17 @@ type BlobGetAccountInfoResponse struct { // BlobGetPropertiesOptions contains the optional parameters for the Blob.GetProperties method. type BlobGetPropertiesOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more information on working with - // blob snapshots, see Creating a Snapshot - // of a Blob. +// blob snapshots, see Creating a Snapshot +// of a Blob. Snapshot *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 // The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on. It's for service version 2019-10-10 - // and newer. - VersionId *string +// and newer. + VersionID *string } // BlobGetPropertiesResponse contains the response from method Blob.GetProperties. @@ -922,13 +924,13 @@ type BlobGetPropertiesResponse struct { LeaseStatus *LeaseStatusType // Metadata contains the information returned from the x-ms-meta header response. - Metadata *map[string]string + Metadata map[string]string // ObjectReplicationPolicyID contains the information returned from the x-ms-or-policy-id header response. ObjectReplicationPolicyID *string // ObjectReplicationRules contains the information returned from the x-ms-or header response. - ObjectReplicationRules *map[string]string + ObjectReplicationRules map[string]string // RawResponse contains the underlying HTTP response. RawResponse *http.Response @@ -952,26 +954,21 @@ type BlobGetPropertiesResponse struct { // BlobGetTagsOptions contains the optional parameters for the Blob.GetTags method. type BlobGetTagsOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more information on working with - // blob snapshots, see Creating a Snapshot - // of a Blob. +// blob snapshots, see Creating a Snapshot +// of a Blob. Snapshot *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 // The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on. It's for service version 2019-10-10 - // and newer. - VersionId *string -} - -type BlobHierarchyListSegment struct { - BlobItems *[]BlobItemInternal `xml:"Blob"` - BlobPrefixes *[]BlobPrefix `xml:"BlobPrefix"` +// and newer. + VersionID *string } -// BlobHttpHeaders contains a group of parameters for the Blob.SetHTTPHeaders method. -type BlobHttpHeaders struct { +// BlobHTTPHeaders contains a group of parameters for the Blob.SetHTTPHeaders method. +type BlobHTTPHeaders struct { // Optional. Sets the blob's cache control. If specified, this property is stored with the blob and returned with a read request. BlobCacheControl *string // Optional. Sets the blob's Content-Disposition header. @@ -981,28 +978,33 @@ type BlobHttpHeaders struct { // Optional. Set the blob's content language. If specified, this property is stored with the blob and returned with a read request. BlobContentLanguage *string // Optional. An MD5 hash of the blob content. Note that this hash is not validated, as the hashes for the individual blocks were validated when each was - // uploaded. - BlobContentMd5 *[]byte +// uploaded. + BlobContentMD5 *[]byte // Optional. Sets the blob's content type. If specified, this property is stored with the blob and returned with a read request. BlobContentType *string } +type BlobHierarchyListSegment struct { + BlobItems *[]*BlobItemInternal `xml:"Blob"` + BlobPrefixes *[]*BlobPrefix `xml:"BlobPrefix"` +} + // An Azure Storage blob type BlobItemInternal struct { // Blob tags - BlobTags *BlobTags `xml:"Tags"` - Deleted *bool `xml:"Deleted"` - IsCurrentVersion *bool `xml:"IsCurrentVersion"` - Metadata *BlobMetadata `xml:"Metadata"` - Name *string `xml:"Name"` + BlobTags *BlobTags `xml:"Tags"` + Deleted *bool `xml:"Deleted"` + IsCurrentVersion *bool `xml:"IsCurrentVersion"` + Metadata *BlobMetadata `xml:"Metadata"` + Name *string `xml:"Name"` // Dictionary of - ObjectReplicationMetadata *map[string]string `xml:"ObjectReplicationMetadata"` + ObjectReplicationMetadata *map[string]*string `xml:"ObjectReplicationMetadata"` // Properties of a blob Properties *BlobPropertiesInternal `xml:"Properties"` - Snapshot *string `xml:"Snapshot"` - VersionID *string `xml:"VersionId"` + Snapshot *string `xml:"Snapshot"` + VersionID *string `xml:"VersionId"` } // UnmarshalXML implements the xml.Unmarshaller interface for type BlobItemInternal. @@ -1017,14 +1019,14 @@ func (b *BlobItemInternal) UnmarshalXML(d *xml.Decoder, start xml.StartElement) if err := d.DecodeElement(aux, &start); err != nil { return err } - b.ObjectReplicationMetadata = (*map[string]string)(aux.ObjectReplicationMetadata) + b.ObjectReplicationMetadata = (*map[string]*string)(aux.ObjectReplicationMetadata) return nil } type BlobMetadata struct { // Contains additional key/value pairs not defined in the schema. - AdditionalProperties *map[string]string - Encrypted *string `xml:"Encrypted,attr"` + AdditionalProperties *map[string]*string + Encrypted *string `xml:"Encrypted,attr"` } type BlobPrefix struct { @@ -1033,48 +1035,48 @@ type BlobPrefix struct { // Properties of a blob type BlobPropertiesInternal struct { - AccessTier *AccessTier `xml:"AccessTier"` - AccessTierChangeTime *time.Time `xml:"AccessTierChangeTime"` - AccessTierInferred *bool `xml:"AccessTierInferred"` - ArchiveStatus *ArchiveStatus `xml:"ArchiveStatus"` - BlobSequenceNumber *int64 `xml:"x-ms-blob-sequence-number"` - BlobType *BlobType `xml:"BlobType"` - CacheControl *string `xml:"Cache-Control"` - ContentDisposition *string `xml:"Content-Disposition"` - ContentEncoding *string `xml:"Content-Encoding"` - ContentLanguage *string `xml:"Content-Language"` + AccessTier *AccessTier `xml:"AccessTier"` + AccessTierChangeTime *time.Time `xml:"AccessTierChangeTime"` + AccessTierInferred *bool `xml:"AccessTierInferred"` + ArchiveStatus *ArchiveStatus `xml:"ArchiveStatus"` + BlobSequenceNumber *int64 `xml:"x-ms-blob-sequence-number"` + BlobType *BlobType `xml:"BlobType"` + CacheControl *string `xml:"Cache-Control"` + ContentDisposition *string `xml:"Content-Disposition"` + ContentEncoding *string `xml:"Content-Encoding"` + ContentLanguage *string `xml:"Content-Language"` // Size in bytes - ContentLength *int64 `xml:"Content-Length"` - ContentMD5 *[]byte `xml:"Content-MD5"` - ContentType *string `xml:"Content-Type"` - CopyCompletionTime *time.Time `xml:"CopyCompletionTime"` - CopyID *string `xml:"CopyId"` - CopyProgress *string `xml:"CopyProgress"` - CopySource *string `xml:"CopySource"` - CopyStatus *CopyStatusType `xml:"CopyStatus"` - CopyStatusDescription *string `xml:"CopyStatusDescription"` - CreationTime *time.Time `xml:"Creation-Time"` - CustomerProvidedKeySHA256 *string `xml:"CustomerProvidedKeySha256"` - DeletedTime *time.Time `xml:"DeletedTime"` - DestinationSnapshot *string `xml:"DestinationSnapshot"` + ContentLength *int64 `xml:"Content-Length"` + ContentMD5 *[]byte `xml:"Content-MD5"` + ContentType *string `xml:"Content-Type"` + CopyCompletionTime *time.Time `xml:"CopyCompletionTime"` + CopyID *string `xml:"CopyId"` + CopyProgress *string `xml:"CopyProgress"` + CopySource *string `xml:"CopySource"` + CopyStatus *CopyStatusType `xml:"CopyStatus"` + CopyStatusDescription *string `xml:"CopyStatusDescription"` + CreationTime *time.Time `xml:"Creation-Time"` + CustomerProvidedKeySHA256 *string `xml:"CustomerProvidedKeySha256"` + DeletedTime *time.Time `xml:"DeletedTime"` + DestinationSnapshot *string `xml:"DestinationSnapshot"` // The name of the encryption scope under which the blob is encrypted. - EncryptionScope *string `xml:"EncryptionScope"` - Etag *string `xml:"Etag"` - ExpiresOn *time.Time `xml:"Expiry-Time"` - IncrementalCopy *bool `xml:"IncrementalCopy"` - IsSealed *bool `xml:"Sealed"` - LastModified *time.Time `xml:"Last-Modified"` - LeaseDuration *LeaseDurationType `xml:"LeaseDuration"` - LeaseState *LeaseStateType `xml:"LeaseState"` - LeaseStatus *LeaseStatusType `xml:"LeaseStatus"` + EncryptionScope *string `xml:"EncryptionScope"` + Etag *string `xml:"Etag"` + ExpiresOn *time.Time `xml:"Expiry-Time"` + IncrementalCopy *bool `xml:"IncrementalCopy"` + IsSealed *bool `xml:"Sealed"` + LastModified *time.Time `xml:"Last-Modified"` + LeaseDuration *LeaseDurationType `xml:"LeaseDuration"` + LeaseState *LeaseStateType `xml:"LeaseState"` + LeaseStatus *LeaseStatusType `xml:"LeaseStatus"` // If an object is in rehydrate pending state then this header is returned with priority of rehydrate. Valid values are High and Standard. - RehydratePriority *RehydratePriority `xml:"RehydratePriority"` - RemainingRetentionDays *int32 `xml:"RemainingRetentionDays"` - ServerEncrypted *bool `xml:"ServerEncrypted"` - TagCount *int32 `xml:"TagCount"` + RehydratePriority *RehydratePriority `xml:"RehydratePriority"` + RemainingRetentionDays *int32 `xml:"RemainingRetentionDays"` + ServerEncrypted *bool `xml:"ServerEncrypted"` + TagCount *int32 `xml:"TagCount"` } // MarshalXML implements the xml.Marshaller interface for type BlobPropertiesInternal. @@ -1083,19 +1085,19 @@ func (b BlobPropertiesInternal) MarshalXML(e *xml.Encoder, start xml.StartElemen aux := &struct { *alias AccessTierChangeTime *timeRFC1123 `xml:"AccessTierChangeTime"` - CopyCompletionTime *timeRFC1123 `xml:"CopyCompletionTime"` - CreationTime *timeRFC1123 `xml:"Creation-Time"` - DeletedTime *timeRFC1123 `xml:"DeletedTime"` - ExpiresOn *timeRFC1123 `xml:"Expiry-Time"` - LastModified *timeRFC1123 `xml:"Last-Modified"` + CopyCompletionTime *timeRFC1123 `xml:"CopyCompletionTime"` + CreationTime *timeRFC1123 `xml:"Creation-Time"` + DeletedTime *timeRFC1123 `xml:"DeletedTime"` + ExpiresOn *timeRFC1123 `xml:"Expiry-Time"` + LastModified *timeRFC1123 `xml:"Last-Modified"` }{ - alias: (*alias)(&b), + alias: (*alias)(&b), AccessTierChangeTime: (*timeRFC1123)(b.AccessTierChangeTime), - CopyCompletionTime: (*timeRFC1123)(b.CopyCompletionTime), - CreationTime: (*timeRFC1123)(b.CreationTime), - DeletedTime: (*timeRFC1123)(b.DeletedTime), - ExpiresOn: (*timeRFC1123)(b.ExpiresOn), - LastModified: (*timeRFC1123)(b.LastModified), + CopyCompletionTime: (*timeRFC1123)(b.CopyCompletionTime), + CreationTime: (*timeRFC1123)(b.CreationTime), + DeletedTime: (*timeRFC1123)(b.DeletedTime), + ExpiresOn: (*timeRFC1123)(b.ExpiresOn), + LastModified: (*timeRFC1123)(b.LastModified), } return e.EncodeElement(aux, start) } @@ -1106,11 +1108,11 @@ func (b *BlobPropertiesInternal) UnmarshalXML(d *xml.Decoder, start xml.StartEle aux := &struct { *alias AccessTierChangeTime *timeRFC1123 `xml:"AccessTierChangeTime"` - CopyCompletionTime *timeRFC1123 `xml:"CopyCompletionTime"` - CreationTime *timeRFC1123 `xml:"Creation-Time"` - DeletedTime *timeRFC1123 `xml:"DeletedTime"` - ExpiresOn *timeRFC1123 `xml:"Expiry-Time"` - LastModified *timeRFC1123 `xml:"Last-Modified"` + CopyCompletionTime *timeRFC1123 `xml:"CopyCompletionTime"` + CreationTime *timeRFC1123 `xml:"Creation-Time"` + DeletedTime *timeRFC1123 `xml:"DeletedTime"` + ExpiresOn *timeRFC1123 `xml:"Expiry-Time"` + LastModified *timeRFC1123 `xml:"Last-Modified"` }{ alias: (*alias)(b), } @@ -1131,13 +1133,13 @@ type BlobQueryOptions struct { // the query request QueryRequest *QueryRequest // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more information on working with - // blob snapshots, see Creating a Snapshot - // of a Blob. +// blob snapshots, see Creating a Snapshot +// of a Blob. Snapshot *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -1234,7 +1236,7 @@ type BlobQueryResponse struct { LeaseStatus *LeaseStatusType // Metadata contains the information returned from the x-ms-meta header response. - Metadata *map[string]string + Metadata map[string]string // RawResponse contains the underlying HTTP response. RawResponse *http.Response @@ -1249,9 +1251,9 @@ type BlobQueryResponse struct { // BlobReleaseLeaseOptions contains the optional parameters for the Blob.ReleaseLease method. type BlobReleaseLeaseOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -1282,23 +1284,23 @@ type BlobReleaseLeaseResponse struct { // BlobRenameOptions contains the optional parameters for the Blob.Rename method. type BlobRenameOptions struct { // Optional. User-defined properties to be stored with the file or directory, in the format of a comma-separated list of name and value pairs "n1=v1, n2=v2, - // ...", where each value is base64 encoded. +// ...", where each value is base64 encoded. DirectoryProperties *string // Optional and only valid if Hierarchical Namespace is enabled for the account. Sets POSIX access permissions for the file owner, the file owning group, - // and others. Each class may be granted read, write, or execute permission. The sticky bit is also supported. Both symbolic (rwxrw-rw-) and 4-digit octal - // notation (e.g. 0766) are supported. +// and others. Each class may be granted read, write, or execute permission. The sticky bit is also supported. Both symbolic (rwxrw-rw-) and 4-digit octal +// notation (e.g. 0766) are supported. PosixPermissions *string // Only valid if Hierarchical Namespace is enabled for the account. This umask restricts permission settings for file and directory, and will only be applied - // when default Acl does not exist in parent directory. If the umask bit has set, it means that the corresponding permission will be disabled. Otherwise - // the corresponding permission will be determined by the permission. A 4-digit octal notation (e.g. 0022) is supported here. If no umask was specified, - // a default umask - 0027 will be used. +// when default Acl does not exist in parent directory. If the umask bit has set, it means that the corresponding permission will be disabled. Otherwise +// the corresponding permission will be determined by the permission. A 4-digit octal notation (e.g. 0022) is supported here. If no umask was specified, +// a default umask - 0027 will be used. PosixUmask *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // A lease ID for the source path. If specified, the source path must have an active lease and the lease ID must match. - SourceLeaseId *string + SourceLeaseID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -1332,9 +1334,9 @@ type BlobRenameResponse struct { // BlobRenewLeaseOptions contains the optional parameters for the Blob.RenewLease method. type BlobRenewLeaseOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -1372,16 +1374,16 @@ type BlobSetAccessControlOptions struct { // Optional. The owner of the blob or directory. Owner *string // Sets POSIX access control rights on files and directories. The value is a comma-separated list of access control entries. Each access control entry (ACE) - // consists of a scope, a type, a user or group identifier, and permissions in the format "[scope:][type]:[id]:[permissions]". - PosixAcl *string +// consists of a scope, a type, a user or group identifier, and permissions in the format "[scope:][type]:[id]:[permissions]". + PosixACL *string // Optional and only valid if Hierarchical Namespace is enabled for the account. Sets POSIX access permissions for the file owner, the file owning group, - // and others. Each class may be granted read, write, or execute permission. The sticky bit is also supported. Both symbolic (rwxrw-rw-) and 4-digit octal - // notation (e.g. 0766) are supported. +// and others. Each class may be granted read, write, or execute permission. The sticky bit is also supported. Both symbolic (rwxrw-rw-) and 4-digit octal +// notation (e.g. 0766) are supported. PosixPermissions *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -1411,9 +1413,9 @@ type BlobSetExpiryOptions struct { // The time to set the blob to expiry ExpiresOn *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -1444,9 +1446,9 @@ type BlobSetExpiryResponse struct { // BlobSetHTTPHeadersOptions contains the optional parameters for the Blob.SetHTTPHeaders method. type BlobSetHTTPHeadersOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -1480,14 +1482,14 @@ type BlobSetHTTPHeadersResponse struct { // BlobSetMetadataOptions contains the optional parameters for the Blob.SetMetadata method. type BlobSetMetadataOptions struct { // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the operation will copy the metadata - // from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified - // metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming - // rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information. +// from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified +// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming +// rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information. Metadata *map[string]string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -1530,19 +1532,19 @@ type BlobSetMetadataResponse struct { // BlobSetTagsOptions contains the optional parameters for the Blob.SetTags method. type BlobSetTagsOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // Blob tags Tags *BlobTags // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 // Specify the transactional crc64 for the body, to be validated by the service. - TransactionalContentCrc64 *[]byte + TransactionalContentCRC64 *[]byte // Specify the transactional md5 for the body, to be validated by the service. - TransactionalContentMd5 *[]byte + TransactionalContentMD5 *[]byte // The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on. It's for service version 2019-10-10 - // and newer. - VersionId *string +// and newer. + VersionID *string } // BlobSetTagsResponse contains the response from method Blob.SetTags. @@ -1568,17 +1570,17 @@ type BlobSetTierOptions struct { // Optional: Indicates the priority with which to rehydrate an archived blob. RehydratePriority *RehydratePriority // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more information on working with - // blob snapshots, see Creating a Snapshot - // of a Blob. +// blob snapshots, see Creating a Snapshot +// of a Blob. Snapshot *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 // The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on. It's for service version 2019-10-10 - // and newer. - VersionId *string +// and newer. + VersionID *string } // BlobSetTierResponse contains the response from method Blob.SetTier. @@ -1601,20 +1603,20 @@ type BlobStartCopyFromURLOptions struct { // Optional. Used to set blob tags in various blob operations. BlobTagsString *string // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the operation will copy the metadata - // from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified - // metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming - // rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information. +// from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified +// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming +// rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information. Metadata *map[string]string // Optional: Indicates the priority with which to rehydrate an archived blob. RehydratePriority *RehydratePriority // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // Overrides the sealed state of the destination blob. Service version 2019-12-12 and newer. SealBlob *bool // Optional. Indicates the tier to be set on the blob. Tier *AccessTier // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -1652,13 +1654,13 @@ type BlobStartCopyFromURLResponse struct { } type BlobTag struct { - Key *string `xml:"Key"` + Key *string `xml:"Key"` Value *string `xml:"Value"` } // Blob tags type BlobTags struct { - BlobTagSet *[]BlobTag `xml:"TagSet>Tag"` + BlobTagSet *[]*BlobTag `xml:"TagSet>Tag"` } // MarshalXML implements the xml.Marshaller interface for type BlobTags. @@ -1697,9 +1699,9 @@ type BlobTagsResponse struct { // BlobUndeleteOptions contains the optional parameters for the Blob.Undelete method. type BlobUndeleteOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -1727,7 +1729,7 @@ type Block struct { Name *string `xml:"Name"` // The block size in bytes. - Size *int32 `xml:"Size"` + Size *int64 `xml:"Size"` } // BlockBlobCommitBlockListOptions contains the optional parameters for the BlockBlob.CommitBlockList method. @@ -1735,21 +1737,21 @@ type BlockBlobCommitBlockListOptions struct { // Optional. Used to set blob tags in various blob operations. BlobTagsString *string // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the operation will copy the metadata - // from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified - // metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming - // rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information. +// from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified +// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming +// rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information. Metadata *map[string]string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // Optional. Indicates the tier to be set on the blob. Tier *AccessTier // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 // Specify the transactional crc64 for the body, to be validated by the service. - TransactionalContentCrc64 *[]byte + TransactionalContentCRC64 *[]byte // Specify the transactional md5 for the body, to be validated by the service. - TransactionalContentMd5 *[]byte + TransactionalContentMD5 *[]byte } // BlockBlobCommitBlockListResponse contains the response from method BlockBlob.CommitBlockList. @@ -1757,9 +1759,6 @@ type BlockBlobCommitBlockListResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string - // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. - ContentCRC64 *[]byte - // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 *[]byte @@ -1792,33 +1791,36 @@ type BlockBlobCommitBlockListResponse struct { // VersionID contains the information returned from the x-ms-version-id header response. VersionID *string + + // XMSContentCRC64 contains the information returned from the x-ms-content-crc64 header response. + XMSContentCRC64 *[]byte } // BlockBlobGetBlockListOptions contains the optional parameters for the BlockBlob.GetBlockList method. type BlockBlobGetBlockListOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more information on working with - // blob snapshots, see Creating a Snapshot - // of a Blob. +// blob snapshots, see Creating a Snapshot +// of a Blob. Snapshot *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } // BlockBlobStageBlockFromURLOptions contains the optional parameters for the BlockBlob.StageBlockFromURL method. type BlockBlobStageBlockFromURLOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // Specify the md5 calculated for the range of bytes that must be read from the copy source. - SourceContentMd5 *[]byte + SourceContentMD5 *[]byte // Specify the crc64 calculated for the range of bytes that must be read from the copy source. SourceContentcrc64 *[]byte // Bytes of source data in the specified range. SourceRange *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -1827,9 +1829,6 @@ type BlockBlobStageBlockFromURLResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string - // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. - ContentCRC64 *[]byte - // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 *[]byte @@ -1853,19 +1852,22 @@ type BlockBlobStageBlockFromURLResponse struct { // Version contains the information returned from the x-ms-version header response. Version *string + + // XMSContentCRC64 contains the information returned from the x-ms-content-crc64 header response. + XMSContentCRC64 *[]byte } // BlockBlobStageBlockOptions contains the optional parameters for the BlockBlob.StageBlock method. type BlockBlobStageBlockOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 // Specify the transactional crc64 for the body, to be validated by the service. - TransactionalContentCrc64 *[]byte + TransactionalContentCRC64 *[]byte // Specify the transactional md5 for the body, to be validated by the service. - TransactionalContentMd5 *[]byte + TransactionalContentMD5 *[]byte } // BlockBlobStageBlockResponse contains the response from method BlockBlob.StageBlock. @@ -1873,9 +1875,6 @@ type BlockBlobStageBlockResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string - // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. - ContentCRC64 *[]byte - // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 *[]byte @@ -1899,6 +1898,9 @@ type BlockBlobStageBlockResponse struct { // Version contains the information returned from the x-ms-version header response. Version *string + + // XMSContentCRC64 contains the information returned from the x-ms-content-crc64 header response. + XMSContentCRC64 *[]byte } // BlockBlobUploadOptions contains the optional parameters for the BlockBlob.Upload method. @@ -1906,19 +1908,19 @@ type BlockBlobUploadOptions struct { // Optional. Used to set blob tags in various blob operations. BlobTagsString *string // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the operation will copy the metadata - // from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified - // metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming - // rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information. +// from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified +// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming +// rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information. Metadata *map[string]string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // Optional. Indicates the tier to be set on the blob. Tier *AccessTier // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 // Specify the transactional md5 for the body, to be validated by the service. - TransactionalContentMd5 *[]byte + TransactionalContentMD5 *[]byte } // BlockBlobUploadResponse contains the response from method BlockBlob.Upload. @@ -1961,15 +1963,15 @@ type BlockBlobUploadResponse struct { } type BlockList struct { - CommittedBlocks *[]Block `xml:"CommittedBlocks>Block"` - UncommittedBlocks *[]Block `xml:"UncommittedBlocks>Block"` + CommittedBlocks *[]*Block `xml:"CommittedBlocks>Block"` + UncommittedBlocks *[]*Block `xml:"UncommittedBlocks>Block"` } // BlockListResponse is the response envelope for operations that return a BlockList type. type BlockListResponse struct { // BlobContentLength contains the information returned from the x-ms-blob-content-length header response. - BlobContentLength *int64 `xml:"BlobContentLength"` - BlockList *BlockList `xml:"BlockList"` + BlobContentLength *int64 `xml:"BlobContentLength"` + BlockList *BlockList `xml:"BlockList"` // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string `xml:"ClientRequestID"` @@ -1997,9 +1999,9 @@ type BlockListResponse struct { } type BlockLookupList struct { - Committed *[]string `xml:"Committed"` - Latest *[]string `xml:"Latest"` - Uncommitted *[]string `xml:"Uncommitted"` + Committed *[]*string `xml:"Committed"` + Latest *[]*string `xml:"Latest"` + Uncommitted *[]*string `xml:"Uncommitted"` } // MarshalXML implements the xml.Marshaller interface for type BlockLookupList. @@ -2015,22 +2017,22 @@ func (b BlockLookupList) MarshalXML(e *xml.Encoder, start xml.StartElement) erro } type ClearRange struct { - End *int64 `xml:"End"` + End *int64 `xml:"End"` Start *int64 `xml:"Start"` } // ContainerAcquireLeaseOptions contains the optional parameters for the Container.AcquireLease method. type ContainerAcquireLeaseOptions struct { // Specifies the duration of the lease, in seconds, or negative one (-1) for a lease that never expires. A non-infinite lease can be between 15 and 60 seconds. - // A lease duration cannot be changed using renew or change. +// A lease duration cannot be changed using renew or change. Duration *int32 // Proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the proposed lease ID is not in the correct format. See - // Guid Constructor (String) for a list of valid GUID string formats. - ProposedLeaseId *string +// Guid Constructor (String) for a list of valid GUID string formats. + ProposedLeaseID *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -2064,14 +2066,14 @@ type ContainerAcquireLeaseResponse struct { // ContainerBreakLeaseOptions contains the optional parameters for the Container.BreakLease method. type ContainerBreakLeaseOptions struct { // For a break operation, proposed duration the lease should continue before it is broken, in seconds, between 0 and 60. This break period is only used - // if it is shorter than the time remaining on the lease. If longer, the time remaining on the lease is used. A new lease will not be available before the - // break period has expired, but the lease may be held for longer than the break period. If this header does not appear with a break operation, a fixed-duration - // lease breaks after the remaining lease period elapses, and an infinite lease breaks immediately. +// if it is shorter than the time remaining on the lease. If longer, the time remaining on the lease is used. A new lease will not be available before the +// break period has expired, but the lease may be held for longer than the break period. If this header does not appear with a break operation, a fixed-duration +// lease breaks after the remaining lease period elapses, and an infinite lease breaks immediately. BreakPeriod *int32 // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -2105,9 +2107,9 @@ type ContainerBreakLeaseResponse struct { // ContainerChangeLeaseOptions contains the optional parameters for the Container.ChangeLease method. type ContainerChangeLeaseOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -2151,14 +2153,14 @@ type ContainerCreateOptions struct { // Specifies whether data in the container may be accessed publicly and the level of access Access *PublicAccessType // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the operation will copy the metadata - // from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified - // metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming - // rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information. +// from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified +// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming +// rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information. Metadata *map[string]string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -2189,9 +2191,9 @@ type ContainerCreateResponse struct { // ContainerDeleteOptions contains the optional parameters for the Container.Delete method. type ContainerDeleteOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -2216,9 +2218,9 @@ type ContainerDeleteResponse struct { // ContainerGetAccessPolicyOptions contains the optional parameters for the Container.GetAccessPolicy method. type ContainerGetAccessPolicyOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -2254,9 +2256,9 @@ type ContainerGetAccountInfoResponse struct { // ContainerGetPropertiesOptions contains the optional parameters for the Container.GetProperties method. type ContainerGetPropertiesOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -2299,7 +2301,7 @@ type ContainerGetPropertiesResponse struct { LeaseStatus *LeaseStatusType // Metadata contains the information returned from the x-ms-meta header response. - Metadata *map[string]string + Metadata map[string]string // RawResponse contains the underlying HTTP response. RawResponse *http.Response @@ -2316,12 +2318,12 @@ type ContainerItem struct { Deleted *bool `xml:"Deleted"` // Dictionary of - Metadata *map[string]string `xml:"Metadata"` - Name *string `xml:"Name"` + Metadata *map[string]*string `xml:"Metadata"` + Name *string `xml:"Name"` // Properties of a container Properties *ContainerProperties `xml:"Properties"` - Version *string `xml:"Version"` + Version *string `xml:"Version"` } // UnmarshalXML implements the xml.Unmarshaller interface for type ContainerItem. @@ -2336,7 +2338,7 @@ func (c *ContainerItem) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err if err := d.DecodeElement(aux, &start); err != nil { return err } - c.Metadata = (*map[string]string)(aux.Metadata) + c.Metadata = (*map[string]*string)(aux.Metadata) return nil } @@ -2345,20 +2347,20 @@ type ContainerListBlobFlatSegmentOptions struct { // Include this parameter to specify one or more datasets to include in the response. Include *[]ListBlobsIncludeItem // A string value that identifies the portion of the list of containers to be returned with the next listing operation. The operation returns the NextMarker - // value within the response body if the listing operation did not return all containers remaining to be listed with the current page. The NextMarker value - // can be used as the value for the marker parameter in a subsequent call to request the next page of list items. The marker value is opaque to the client. +// value within the response body if the listing operation did not return all containers remaining to be listed with the current page. The NextMarker value +// can be used as the value for the marker parameter in a subsequent call to request the next page of list items. The marker value is opaque to the client. Marker *string // Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value greater than 5000, the server - // will return up to 5000 items. Note that if the listing operation crosses a partition boundary, then the service will return a continuation token for - // retrieving the remainder of the results. For this reason, it is possible that the service will return fewer results than specified by maxresults, or - // than the default of 5000. +// will return up to 5000 items. Note that if the listing operation crosses a partition boundary, then the service will return a continuation token for +// retrieving the remainder of the results. For this reason, it is possible that the service will return fewer results than specified by maxresults, or +// than the default of 5000. Maxresults *int32 // Filters the results to return only containers whose name begins with the specified prefix. Prefix *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -2367,37 +2369,37 @@ type ContainerListBlobHierarchySegmentOptions struct { // Include this parameter to specify one or more datasets to include in the response. Include *[]ListBlobsIncludeItem // A string value that identifies the portion of the list of containers to be returned with the next listing operation. The operation returns the NextMarker - // value within the response body if the listing operation did not return all containers remaining to be listed with the current page. The NextMarker value - // can be used as the value for the marker parameter in a subsequent call to request the next page of list items. The marker value is opaque to the client. +// value within the response body if the listing operation did not return all containers remaining to be listed with the current page. The NextMarker value +// can be used as the value for the marker parameter in a subsequent call to request the next page of list items. The marker value is opaque to the client. Marker *string // Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value greater than 5000, the server - // will return up to 5000 items. Note that if the listing operation crosses a partition boundary, then the service will return a continuation token for - // retrieving the remainder of the results. For this reason, it is possible that the service will return fewer results than specified by maxresults, or - // than the default of 5000. +// will return up to 5000 items. Note that if the listing operation crosses a partition boundary, then the service will return a continuation token for +// retrieving the remainder of the results. For this reason, it is possible that the service will return fewer results than specified by maxresults, or +// than the default of 5000. Maxresults *int32 // Filters the results to return only containers whose name begins with the specified prefix. Prefix *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } // Properties of a container type ContainerProperties struct { - DefaultEncryptionScope *string `xml:"DefaultEncryptionScope"` - DeletedTime *time.Time `xml:"DeletedTime"` - Etag *string `xml:"Etag"` - HasImmutabilityPolicy *bool `xml:"HasImmutabilityPolicy"` - HasLegalHold *bool `xml:"HasLegalHold"` - LastModified *time.Time `xml:"Last-Modified"` - LeaseDuration *LeaseDurationType `xml:"LeaseDuration"` - LeaseState *LeaseStateType `xml:"LeaseState"` - LeaseStatus *LeaseStatusType `xml:"LeaseStatus"` - PreventEncryptionScopeOverride *bool `xml:"DenyEncryptionScopeOverride"` - PublicAccess *PublicAccessType `xml:"PublicAccess"` - RemainingRetentionDays *int32 `xml:"RemainingRetentionDays"` + DefaultEncryptionScope *string `xml:"DefaultEncryptionScope"` + DeletedTime *time.Time `xml:"DeletedTime"` + Etag *string `xml:"Etag"` + HasImmutabilityPolicy *bool `xml:"HasImmutabilityPolicy"` + HasLegalHold *bool `xml:"HasLegalHold"` + LastModified *time.Time `xml:"Last-Modified"` + LeaseDuration *LeaseDurationType `xml:"LeaseDuration"` + LeaseState *LeaseStateType `xml:"LeaseState"` + LeaseStatus *LeaseStatusType `xml:"LeaseStatus"` + PreventEncryptionScopeOverride *bool `xml:"DenyEncryptionScopeOverride"` + PublicAccess *PublicAccessType `xml:"PublicAccess"` + RemainingRetentionDays *int32 `xml:"RemainingRetentionDays"` } // MarshalXML implements the xml.Marshaller interface for type ContainerProperties. @@ -2405,11 +2407,11 @@ func (c ContainerProperties) MarshalXML(e *xml.Encoder, start xml.StartElement) type alias ContainerProperties aux := &struct { *alias - DeletedTime *timeRFC1123 `xml:"DeletedTime"` + DeletedTime *timeRFC1123 `xml:"DeletedTime"` LastModified *timeRFC1123 `xml:"Last-Modified"` }{ - alias: (*alias)(&c), - DeletedTime: (*timeRFC1123)(c.DeletedTime), + alias: (*alias)(&c), + DeletedTime: (*timeRFC1123)(c.DeletedTime), LastModified: (*timeRFC1123)(c.LastModified), } return e.EncodeElement(aux, start) @@ -2420,7 +2422,7 @@ func (c *ContainerProperties) UnmarshalXML(d *xml.Decoder, start xml.StartElemen type alias ContainerProperties aux := &struct { *alias - DeletedTime *timeRFC1123 `xml:"DeletedTime"` + DeletedTime *timeRFC1123 `xml:"DeletedTime"` LastModified *timeRFC1123 `xml:"Last-Modified"` }{ alias: (*alias)(c), @@ -2436,9 +2438,9 @@ func (c *ContainerProperties) UnmarshalXML(d *xml.Decoder, start xml.StartElemen // ContainerReleaseLeaseOptions contains the optional parameters for the Container.ReleaseLease method. type ContainerReleaseLeaseOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -2469,9 +2471,9 @@ type ContainerReleaseLeaseResponse struct { // ContainerRenewLeaseOptions contains the optional parameters for the Container.RenewLease method. type ContainerRenewLeaseOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -2509,9 +2511,9 @@ type ContainerRestoreOptions struct { // Optional. Version 2019-12-12 and later. Specifies the version of the deleted container to restore. DeletedContainerVersion *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -2538,11 +2540,11 @@ type ContainerSetAccessPolicyOptions struct { // Specifies whether data in the container may be accessed publicly and the level of access Access *PublicAccessType // the acls for the container - ContainerAcl *[]SignedIDentifier + ContainerACL *[]*SignedIdentifier // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -2573,14 +2575,14 @@ type ContainerSetAccessPolicyResponse struct { // ContainerSetMetadataOptions contains the optional parameters for the Container.SetMetadata method. type ContainerSetMetadataOptions struct { // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the operation will copy the metadata - // from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified - // metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming - // rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information. +// from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified +// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming +// rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information. Metadata *map[string]string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -2620,9 +2622,9 @@ type CorsRule struct { AllowedMethods *string `xml:"AllowedMethods"` // The origin domains that are permitted to make a request against the storage service via CORS. The origin domain is the domain from which the request - // originates. Note that the origin must be an exact - // case-sensitive match with the origin that the user age sends to the service. You can also use the wildcard character '*' to allow all origin domains - // to make requests via CORS. +// originates. Note that the origin must be an exact +// case-sensitive match with the origin that the user age sends to the service. You can also use the wildcard character '*' to allow all origin domains +// to make requests via CORS. AllowedOrigins *string `xml:"AllowedOrigins"` // The response headers that may be sent in the response to the CORS request and exposed by the browser to the request issuer @@ -2635,19 +2637,19 @@ type CorsRule struct { // CpkInfo contains a group of parameters for the Blob.Download method. type CpkInfo struct { // The algorithm used to produce the encryption key hash. Currently, the only accepted value is "AES256". Must be provided if the x-ms-encryption-key header - // is provided. +// is provided. EncryptionAlgorithm *string // Optional. Specifies the encryption key to use to encrypt the data provided in the request. If not specified, encryption is performed with the root account - // encryption key. For more information, see Encryption at Rest for Azure Storage Services. +// encryption key. For more information, see Encryption at Rest for Azure Storage Services. EncryptionKey *string // The SHA-256 hash of the provided encryption key. Must be provided if the x-ms-encryption-key header is provided. - EncryptionKeySha256 *string + EncryptionKeySHA256 *string } // CpkScopeInfo contains a group of parameters for the Blob.SetMetadata method. type CpkScopeInfo struct { // Optional. Version 2019-07-07 and later. Specifies the name of the encryption scope to use to encrypt the data provided in the request. If not specified, - // encryption is performed with the default account encryption scope. For more information, see Encryption at Rest for Azure Storage Services. +// encryption is performed with the default account encryption scope. For more information, see Encryption at Rest for Azure Storage Services. EncryptionScope *string } @@ -2660,7 +2662,13 @@ type DataLakeStorageError struct { func (e DataLakeStorageError) Error() string { msg := "" if e.DataLakeStorageErrorDetails != nil { - msg += fmt.Sprintf("DataLakeStorageErrorDetails: %v\n", *e.DataLakeStorageErrorDetails) + msg += "DataLakeStorageErrorDetails: \n" + if e.DataLakeStorageErrorDetails.Code != nil { + msg += fmt.Sprintf("\tCode: %v\n", *e.DataLakeStorageErrorDetails.Code) + } + if e.DataLakeStorageErrorDetails.Message != nil { + msg += fmt.Sprintf("\tMessage: %v\n", *e.DataLakeStorageErrorDetails.Message) + } } if msg == "" { msg = "missing error info" @@ -2698,21 +2706,21 @@ type DelimitedTextConfiguration struct { // DirectoryCreateOptions contains the optional parameters for the Directory.Create method. type DirectoryCreateOptions struct { // Optional. User-defined properties to be stored with the file or directory, in the format of a comma-separated list of name and value pairs "n1=v1, n2=v2, - // ...", where each value is base64 encoded. +// ...", where each value is base64 encoded. DirectoryProperties *string // Optional and only valid if Hierarchical Namespace is enabled for the account. Sets POSIX access permissions for the file owner, the file owning group, - // and others. Each class may be granted read, write, or execute permission. The sticky bit is also supported. Both symbolic (rwxrw-rw-) and 4-digit octal - // notation (e.g. 0766) are supported. +// and others. Each class may be granted read, write, or execute permission. The sticky bit is also supported. Both symbolic (rwxrw-rw-) and 4-digit octal +// notation (e.g. 0766) are supported. PosixPermissions *string // Only valid if Hierarchical Namespace is enabled for the account. This umask restricts permission settings for file and directory, and will only be applied - // when default Acl does not exist in parent directory. If the umask bit has set, it means that the corresponding permission will be disabled. Otherwise - // the corresponding permission will be determined by the permission. A 4-digit octal notation (e.g. 0022) is supported here. If no umask was specified, - // a default umask - 0027 will be used. +// when default Acl does not exist in parent directory. If the umask bit has set, it means that the corresponding permission will be disabled. Otherwise +// the corresponding permission will be determined by the permission. A 4-digit octal notation (e.g. 0022) is supported here. If no umask was specified, +// a default umask - 0027 will be used. PosixUmask *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -2746,13 +2754,13 @@ type DirectoryCreateResponse struct { // DirectoryDeleteOptions contains the optional parameters for the Directory.Delete method. type DirectoryDeleteOptions struct { // When renaming a directory, the number of paths that are renamed with each invocation is limited. If the number of paths to be renamed exceeds this limit, - // a continuation token is returned in this response header. When a continuation token is returned in the response, it must be specified in a subsequent - // invocation of the rename operation to continue renaming the directory. +// a continuation token is returned in this response header. When a continuation token is returned in the response, it must be specified in a subsequent +// invocation of the rename operation to continue renaming the directory. Marker *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -2780,39 +2788,27 @@ type DirectoryDeleteResponse struct { // DirectoryGetAccessControlOptions contains the optional parameters for the Directory.GetAccessControl method. type DirectoryGetAccessControlOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 // Optional. Valid only when Hierarchical Namespace is enabled for the account. If "true", the identity values returned in the x-ms-owner, x-ms-group, and - // x-ms-acl response headers will be transformed from Azure Active Directory Object IDs to User Principal Names. If "false", the values will be returned - // as Azure Active Directory Object IDs. The default value is false. +// x-ms-acl response headers will be transformed from Azure Active Directory Object IDs to User Principal Names. If "false", the values will be returned +// as Azure Active Directory Object IDs. The default value is false. Upn *bool } // DirectoryGetAccessControlResponse contains the response from method Directory.GetAccessControl. type DirectoryGetAccessControlResponse struct { - // ACL contains the information returned from the x-ms-acl header response. - ACL *string - // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *string - // Group contains the information returned from the x-ms-group header response. - Group *string - // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time - // Owner contains the information returned from the x-ms-owner header response. - Owner *string - - // Permissions contains the information returned from the x-ms-permissions header response. - Permissions *string - // RawResponse contains the underlying HTTP response. RawResponse *http.Response @@ -2821,10 +2817,22 @@ type DirectoryGetAccessControlResponse struct { // Version contains the information returned from the x-ms-version header response. Version *string + + // XMSACL contains the information returned from the x-ms-acl header response. + XMSACL *string + + // XMSGroup contains the information returned from the x-ms-group header response. + XMSGroup *string + + // XMSOwner contains the information returned from the x-ms-owner header response. + XMSOwner *string + + // XMSPermissions contains the information returned from the x-ms-permissions header response. + XMSPermissions *string } -// DirectoryHttpHeaders contains a group of parameters for the Directory.Create method. -type DirectoryHttpHeaders struct { +// DirectoryHTTPHeaders contains a group of parameters for the Directory.Create method. +type DirectoryHTTPHeaders struct { // Cache control for given resource CacheControl *string // Content disposition for given resource @@ -2840,27 +2848,27 @@ type DirectoryHttpHeaders struct { // DirectoryRenameOptions contains the optional parameters for the Directory.Rename method. type DirectoryRenameOptions struct { // Optional. User-defined properties to be stored with the file or directory, in the format of a comma-separated list of name and value pairs "n1=v1, n2=v2, - // ...", where each value is base64 encoded. +// ...", where each value is base64 encoded. DirectoryProperties *string // When renaming a directory, the number of paths that are renamed with each invocation is limited. If the number of paths to be renamed exceeds this limit, - // a continuation token is returned in this response header. When a continuation token is returned in the response, it must be specified in a subsequent - // invocation of the rename operation to continue renaming the directory. +// a continuation token is returned in this response header. When a continuation token is returned in the response, it must be specified in a subsequent +// invocation of the rename operation to continue renaming the directory. Marker *string // Optional and only valid if Hierarchical Namespace is enabled for the account. Sets POSIX access permissions for the file owner, the file owning group, - // and others. Each class may be granted read, write, or execute permission. The sticky bit is also supported. Both symbolic (rwxrw-rw-) and 4-digit octal - // notation (e.g. 0766) are supported. +// and others. Each class may be granted read, write, or execute permission. The sticky bit is also supported. Both symbolic (rwxrw-rw-) and 4-digit octal +// notation (e.g. 0766) are supported. PosixPermissions *string // Only valid if Hierarchical Namespace is enabled for the account. This umask restricts permission settings for file and directory, and will only be applied - // when default Acl does not exist in parent directory. If the umask bit has set, it means that the corresponding permission will be disabled. Otherwise - // the corresponding permission will be determined by the permission. A 4-digit octal notation (e.g. 0022) is supported here. If no umask was specified, - // a default umask - 0027 will be used. +// when default Acl does not exist in parent directory. If the umask bit has set, it means that the corresponding permission will be disabled. Otherwise +// the corresponding permission will be determined by the permission. A 4-digit octal notation (e.g. 0022) is supported here. If no umask was specified, +// a default umask - 0027 will be used. PosixUmask *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // A lease ID for the source path. If specified, the source path must have an active lease and the lease ID must match. - SourceLeaseId *string + SourceLeaseID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -2901,16 +2909,16 @@ type DirectorySetAccessControlOptions struct { // Optional. The owner of the blob or directory. Owner *string // Sets POSIX access control rights on files and directories. The value is a comma-separated list of access control entries. Each access control entry (ACE) - // consists of a scope, a type, a user or group identifier, and permissions in the format "[scope:][type]:[id]:[permissions]". - PosixAcl *string +// consists of a scope, a type, a user or group identifier, and permissions in the format "[scope:][type]:[id]:[permissions]". + PosixACL *string // Optional and only valid if Hierarchical Namespace is enabled for the account. Sets POSIX access permissions for the file owner, the file owning group, - // and others. Each class may be granted read, write, or execute permission. The sticky bit is also supported. Both symbolic (rwxrw-rw-) and 4-digit octal - // notation (e.g. 0766) are supported. +// and others. Each class may be granted read, write, or execute permission. The sticky bit is also supported. Both symbolic (rwxrw-rw-) and 4-digit octal +// notation (e.g. 0766) are supported. PosixPermissions *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -2938,16 +2946,16 @@ type DirectorySetAccessControlResponse struct { // Blob info from a Filter Blobs API call type FilterBlobItem struct { ContainerName *string `xml:"ContainerName"` - Name *string `xml:"Name"` - TagValue *string `xml:"TagValue"` + Name *string `xml:"Name"` + TagValue *string `xml:"TagValue"` } // The result of a Filter Blobs API call type FilterBlobSegment struct { - Blobs *[]FilterBlobItem `xml:"Blobs>Blob"` - NextMarker *string `xml:"NextMarker"` - ServiceEndpoint *string `xml:"ServiceEndpoint,attr"` - Where *string `xml:"Where"` + Blobs *[]*FilterBlobItem `xml:"Blobs>Blob"` + NextMarker *string `xml:"NextMarker"` + ServiceEndpoint *string `xml:"ServiceEndpoint,attr"` + Where *string `xml:"Where"` } // FilterBlobSegmentResponse is the response envelope for operations that return a FilterBlobSegment type. @@ -2974,8 +2982,8 @@ type FilterBlobSegmentResponse struct { // Geo-Replication information for the Secondary Storage Service type GeoReplication struct { // A GMT date/time value, to the second. All primary writes preceding this value are guaranteed to be available for read operations at the secondary. Primary - // writes after this point in time may or may - // not be available for reads. +// writes after this point in time may or may +// not be available for reads. LastSyncTime *time.Time `xml:"LastSyncTime"` // The status of the secondary location @@ -2989,7 +2997,7 @@ func (g GeoReplication) MarshalXML(e *xml.Encoder, start xml.StartElement) error *alias LastSyncTime *timeRFC1123 `xml:"LastSyncTime"` }{ - alias: (*alias)(&g), + alias: (*alias)(&g), LastSyncTime: (*timeRFC1123)(g.LastSyncTime), } return e.EncodeElement(aux, start) @@ -3029,18 +3037,18 @@ type KeyInfo struct { // LeaseAccessConditions contains a group of parameters for the Container.GetProperties method. type LeaseAccessConditions struct { // If specified, the operation only succeeds if the resource's lease is active and matches this ID. - LeaseId *string + LeaseID *string } // An enumeration of blobs type ListBlobsFlatSegmentResponse struct { - ContainerName *string `xml:"ContainerName,attr"` - Marker *string `xml:"Marker"` - MaxResults *int32 `xml:"MaxResults"` - NextMarker *string `xml:"NextMarker"` - Prefix *string `xml:"Prefix"` - Segment *BlobFlatListSegment `xml:"Blobs"` - ServiceEndpoint *string `xml:"ServiceEndpoint,attr"` + ContainerName *string `xml:"ContainerName,attr"` + Marker *string `xml:"Marker"` + MaxResults *int32 `xml:"MaxResults"` + NextMarker *string `xml:"NextMarker"` + Prefix *string `xml:"Prefix"` + Segment *BlobFlatListSegment `xml:"Blobs"` + ServiceEndpoint *string `xml:"ServiceEndpoint,attr"` } // ListBlobsFlatSegmentResponseResponse is the response envelope for operations that return a ListBlobsFlatSegmentResponse type. @@ -3069,14 +3077,14 @@ type ListBlobsFlatSegmentResponseResponse struct { // An enumeration of blobs type ListBlobsHierarchySegmentResponse struct { - ContainerName *string `xml:"ContainerName,attr"` - Delimiter *string `xml:"Delimiter"` - Marker *string `xml:"Marker"` - MaxResults *int32 `xml:"MaxResults"` - NextMarker *string `xml:"NextMarker"` - Prefix *string `xml:"Prefix"` - Segment *BlobHierarchyListSegment `xml:"Blobs"` - ServiceEndpoint *string `xml:"ServiceEndpoint,attr"` + ContainerName *string `xml:"ContainerName,attr"` + Delimiter *string `xml:"Delimiter"` + Marker *string `xml:"Marker"` + MaxResults *int32 `xml:"MaxResults"` + NextMarker *string `xml:"NextMarker"` + Prefix *string `xml:"Prefix"` + Segment *BlobHierarchyListSegment `xml:"Blobs"` + ServiceEndpoint *string `xml:"ServiceEndpoint,attr"` } // ListBlobsHierarchySegmentResponseResponse is the response envelope for operations that return a ListBlobsHierarchySegmentResponse type. @@ -3105,12 +3113,12 @@ type ListBlobsHierarchySegmentResponseResponse struct { // An enumeration of containers type ListContainersSegmentResponse struct { - ContainerItems *[]ContainerItem `xml:"Containers>Container"` - Marker *string `xml:"Marker"` - MaxResults *int32 `xml:"MaxResults"` - NextMarker *string `xml:"NextMarker"` - Prefix *string `xml:"Prefix"` - ServiceEndpoint *string `xml:"ServiceEndpoint,attr"` + ContainerItems *[]*ContainerItem `xml:"Containers>Container"` + Marker *string `xml:"Marker"` + MaxResults *int32 `xml:"MaxResults"` + NextMarker *string `xml:"NextMarker"` + Prefix *string `xml:"Prefix"` + ServiceEndpoint *string `xml:"ServiceEndpoint,attr"` } // ListContainersSegmentResponseResponse is the response envelope for operations that return a ListContainersSegmentResponse type. @@ -3155,7 +3163,7 @@ type Metrics struct { Enabled *bool `xml:"Enabled"` // Indicates whether metrics should generate summary statistics for called API operations. - IncludeApIs *bool `xml:"IncludeAPIs"` + IncludeAPIs *bool `xml:"IncludeAPIs"` // the retention policy which determines how long the associated data should persist RetentionPolicy *RetentionPolicy `xml:"RetentionPolicy"` @@ -3181,11 +3189,11 @@ type ModifiedAccessConditions struct { // PageBlobClearPagesOptions contains the optional parameters for the PageBlob.ClearPages method. type PageBlobClearPagesOptions struct { // Return only the bytes of the blob in the specified range. - RangeParameter *string + Range *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -3197,9 +3205,6 @@ type PageBlobClearPagesResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string - // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. - ContentCRC64 *[]byte - // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 *[]byte @@ -3220,14 +3225,17 @@ type PageBlobClearPagesResponse struct { // Version contains the information returned from the x-ms-version header response. Version *string + + // XMSContentCRC64 contains the information returned from the x-ms-content-crc64 header response. + XMSContentCRC64 *[]byte } // PageBlobCopyIncrementalOptions contains the optional parameters for the PageBlob.CopyIncremental method. type PageBlobCopyIncrementalOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -3264,21 +3272,21 @@ type PageBlobCopyIncrementalResponse struct { // PageBlobCreateOptions contains the optional parameters for the PageBlob.Create method. type PageBlobCreateOptions struct { // Set for page blobs only. The sequence number is a user-controlled value that you can use to track requests. The value of the sequence number must be - // between 0 and 2^63 - 1. +// between 0 and 2^63 - 1. BlobSequenceNumber *int64 // Optional. Used to set blob tags in various blob operations. BlobTagsString *string // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the operation will copy the metadata - // from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified - // metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming - // rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information. +// from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified +// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming +// rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information. Metadata *map[string]string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // Optional. Indicates the tier to be set on the page blob. Tier *PremiumPageBlobAccessTier // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -3324,47 +3332,47 @@ type PageBlobCreateResponse struct { // PageBlobGetPageRangesDiffOptions contains the optional parameters for the PageBlob.GetPageRangesDiff method. type PageBlobGetPageRangesDiffOptions struct { // Optional. This header is only supported in service versions 2019-04-19 and after and specifies the URL of a previous snapshot of the target blob. The - // response will only contain pages that were changed between the target blob and its previous snapshot. - PrevSnapshotUrl *url.URL +// response will only contain pages that were changed between the target blob and its previous snapshot. + PrevSnapshotURL *string // Optional in version 2015-07-08 and newer. The prevsnapshot parameter is a DateTime value that specifies that the response will contain only pages that - // were changed between target blob and previous snapshot. Changed pages include both updated and cleared pages. The target blob may be a snapshot, as long - // as the snapshot specified by prevsnapshot is the older of the two. Note that incremental snapshots are currently supported only for blobs created on - // or after January 1, 2016. +// were changed between target blob and previous snapshot. Changed pages include both updated and cleared pages. The target blob may be a snapshot, as long +// as the snapshot specified by prevsnapshot is the older of the two. Note that incremental snapshots are currently supported only for blobs created on +// or after January 1, 2016. Prevsnapshot *string // Return only the bytes of the blob in the specified range. - RangeParameter *string + Range *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more information on working with - // blob snapshots, see Creating a Snapshot - // of a Blob. +// blob snapshots, see Creating a Snapshot +// of a Blob. Snapshot *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } // PageBlobGetPageRangesOptions contains the optional parameters for the PageBlob.GetPageRanges method. type PageBlobGetPageRangesOptions struct { // Return only the bytes of the blob in the specified range. - RangeParameter *string + Range *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more information on working with - // blob snapshots, see Creating a Snapshot - // of a Blob. +// blob snapshots, see Creating a Snapshot +// of a Blob. Snapshot *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } // PageBlobResizeOptions contains the optional parameters for the PageBlob.Resize method. type PageBlobResizeOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -3398,12 +3406,12 @@ type PageBlobResizeResponse struct { // PageBlobUpdateSequenceNumberOptions contains the optional parameters for the PageBlob.UpdateSequenceNumber method. type PageBlobUpdateSequenceNumberOptions struct { // Set for page blobs only. The sequence number is a user-controlled value that you can use to track requests. The value of the sequence number must be - // between 0 and 2^63 - 1. +// between 0 and 2^63 - 1. BlobSequenceNumber *int64 // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -3437,13 +3445,13 @@ type PageBlobUpdateSequenceNumberResponse struct { // PageBlobUploadPagesFromURLOptions contains the optional parameters for the PageBlob.UploadPagesFromURL method. type PageBlobUploadPagesFromURLOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // Specify the md5 calculated for the range of bytes that must be read from the copy source. - SourceContentMd5 *[]byte + SourceContentMD5 *[]byte // Specify the crc64 calculated for the range of bytes that must be read from the copy source. SourceContentcrc64 *[]byte // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -3452,9 +3460,6 @@ type PageBlobUploadPagesFromURLResponse struct { // BlobSequenceNumber contains the information returned from the x-ms-blob-sequence-number header response. BlobSequenceNumber *int64 - // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. - ContentCRC64 *[]byte - // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 *[]byte @@ -3484,21 +3489,24 @@ type PageBlobUploadPagesFromURLResponse struct { // Version contains the information returned from the x-ms-version header response. Version *string + + // XMSContentCRC64 contains the information returned from the x-ms-content-crc64 header response. + XMSContentCRC64 *[]byte } // PageBlobUploadPagesOptions contains the optional parameters for the PageBlob.UploadPages method. type PageBlobUploadPagesOptions struct { // Return only the bytes of the blob in the specified range. - RangeParameter *string + Range *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 // Specify the transactional crc64 for the body, to be validated by the service. - TransactionalContentCrc64 *[]byte + TransactionalContentCRC64 *[]byte // Specify the transactional md5 for the body, to be validated by the service. - TransactionalContentMd5 *[]byte + TransactionalContentMD5 *[]byte } // PageBlobUploadPagesResponse contains the response from method PageBlob.UploadPages. @@ -3509,9 +3517,6 @@ type PageBlobUploadPagesResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string - // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. - ContentCRC64 *[]byte - // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 *[]byte @@ -3541,12 +3546,15 @@ type PageBlobUploadPagesResponse struct { // Version contains the information returned from the x-ms-version header response. Version *string + + // XMSContentCRC64 contains the information returned from the x-ms-content-crc64 header response. + XMSContentCRC64 *[]byte } // the list of pages type PageList struct { - ClearRange *[]ClearRange `xml:"ClearRange"` - PageRange *[]PageRange `xml:"PageRange"` + ClearRange *[]*ClearRange `xml:"ClearRange"` + PageRange *[]*PageRange `xml:"PageRange"` } // PageListResponse is the response envelope for operations that return a PageList type. @@ -3580,7 +3588,7 @@ type PageListResponse struct { } type PageRange struct { - End *int64 `xml:"End"` + End *int64 `xml:"End"` Start *int64 `xml:"Start"` } @@ -3598,8 +3606,8 @@ type QueryFormat struct { // the quick query body type QueryRequest struct { // a query statement - Expression *string `xml:"Expression"` - InputSerialization *QuerySerialization `xml:"InputSerialization"` + Expression *string `xml:"Expression"` + InputSerialization *QuerySerialization `xml:"InputSerialization"` OutputSerialization *QuerySerialization `xml:"OutputSerialization"` // the query type @@ -3644,18 +3652,18 @@ type SequenceNumberAccessConditions struct { // ServiceFilterBlobsOptions contains the optional parameters for the Service.FilterBlobs method. type ServiceFilterBlobsOptions struct { // A string value that identifies the portion of the list of containers to be returned with the next listing operation. The operation returns the NextMarker - // value within the response body if the listing operation did not return all containers remaining to be listed with the current page. The NextMarker value - // can be used as the value for the marker parameter in a subsequent call to request the next page of list items. The marker value is opaque to the client. +// value within the response body if the listing operation did not return all containers remaining to be listed with the current page. The NextMarker value +// can be used as the value for the marker parameter in a subsequent call to request the next page of list items. The marker value is opaque to the client. Marker *string // Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value greater than 5000, the server - // will return up to 5000 items. Note that if the listing operation crosses a partition boundary, then the service will return a continuation token for - // retrieving the remainder of the results. For this reason, it is possible that the service will return fewer results than specified by maxresults, or - // than the default of 5000. +// will return up to 5000 items. Note that if the listing operation crosses a partition boundary, then the service will return a continuation token for +// retrieving the remainder of the results. For this reason, it is possible that the service will return fewer results than specified by maxresults, or +// than the default of 5000. Maxresults *int32 // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 // Filters the results to return only to return only blobs whose tags match the specified expression. Where *string @@ -3677,6 +3685,9 @@ type ServiceGetAccountInfoResponse struct { // Date contains the information returned from the Date header response. Date *time.Time + // IsHierarchicalNamespaceEnabled contains the information returned from the x-ms-is-hns-enabled header response. + IsHierarchicalNamespaceEnabled *bool + // RawResponse contains the underlying HTTP response. RawResponse *http.Response @@ -3693,27 +3704,27 @@ type ServiceGetAccountInfoResponse struct { // ServiceGetPropertiesOptions contains the optional parameters for the Service.GetProperties method. type ServiceGetPropertiesOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } // ServiceGetStatisticsOptions contains the optional parameters for the Service.GetStatistics method. type ServiceGetStatisticsOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } // ServiceGetUserDelegationKeyOptions contains the optional parameters for the Service.GetUserDelegationKey method. type ServiceGetUserDelegationKeyOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -3722,29 +3733,29 @@ type ServiceListContainersSegmentOptions struct { // Include this parameter to specify that the container's metadata be returned as part of the response body. Include *[]ListContainersIncludeType // A string value that identifies the portion of the list of containers to be returned with the next listing operation. The operation returns the NextMarker - // value within the response body if the listing operation did not return all containers remaining to be listed with the current page. The NextMarker value - // can be used as the value for the marker parameter in a subsequent call to request the next page of list items. The marker value is opaque to the client. +// value within the response body if the listing operation did not return all containers remaining to be listed with the current page. The NextMarker value +// can be used as the value for the marker parameter in a subsequent call to request the next page of list items. The marker value is opaque to the client. Marker *string // Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value greater than 5000, the server - // will return up to 5000 items. Note that if the listing operation crosses a partition boundary, then the service will return a continuation token for - // retrieving the remainder of the results. For this reason, it is possible that the service will return fewer results than specified by maxresults, or - // than the default of 5000. +// will return up to 5000 items. Note that if the listing operation crosses a partition boundary, then the service will return a continuation token for +// retrieving the remainder of the results. For this reason, it is possible that the service will return fewer results than specified by maxresults, or +// than the default of 5000. Maxresults *int32 // Filters the results to return only containers whose name begins with the specified prefix. Prefix *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } // ServiceSetPropertiesOptions contains the optional parameters for the Service.SetProperties method. type ServiceSetPropertiesOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -3766,9 +3777,9 @@ type ServiceSetPropertiesResponse struct { // ServiceSubmitBatchOptions contains the optional parameters for the Service.SubmitBatch method. type ServiceSubmitBatchOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. - RequestId *string + RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting - // Timeouts for Blob Service Operations. +// Timeouts for Blob Service Operations. Timeout *int32 } @@ -3788,7 +3799,7 @@ type ServiceSubmitBatchResponse struct { } // signed identifier -type SignedIDentifier struct { +type SignedIdentifier struct { // An Access policy AccessPolicy *AccessPolicy `xml:"AccessPolicy"` @@ -3796,8 +3807,8 @@ type SignedIDentifier struct { ID *string `xml:"Id"` } -// SignedIDentifierArrayResponse is the response envelope for operations that return a []SignedIDentifier type. -type SignedIDentifierArrayResponse struct { +// SignedIdentifierArrayResponse is the response envelope for operations that return a []*SignedIdentifier type. +type SignedIdentifierArrayResponse struct { // BlobPublicAccess contains the information returned from the x-ms-blob-public-access header response. BlobPublicAccess *PublicAccessType `xml:"BlobPublicAccess"` @@ -3820,7 +3831,7 @@ type SignedIDentifierArrayResponse struct { RequestID *string `xml:"RequestID"` // a collection of signed identifiers - SignedIdentifiers *[]SignedIDentifier `xml:"SignedIdentifier"` + SignedIdentifiers []*SignedIdentifier `xml:"SignedIdentifier"` // Version contains the information returned from the x-ms-version header response. Version *string `xml:"Version"` @@ -3859,7 +3870,7 @@ type StaticWebsite struct { // Message *string `xml:"Message"` // } -// // Error implements the error interface for type StorageError. +// Error implements the error interface for type StorageError. // func (e StorageError) Error() string { // msg := "" // if e.Message != nil { @@ -3874,10 +3885,10 @@ type StaticWebsite struct { // Storage Service Properties. type StorageServiceProperties struct { // The set of CORS rules. - Cors *[]CorsRule `xml:"Cors>CorsRule"` + Cors *[]*CorsRule `xml:"Cors>CorsRule"` // The default version to use for requests to the Blob service if an incoming request's version is not specified. Possible values include version 2008-10-27 - // and all more recent versions +// and all more recent versions DefaultServiceVersion *string `xml:"DefaultServiceVersion"` // the retention policy which determines how long the associated data should persist @@ -3971,11 +3982,11 @@ func (u UserDelegationKey) MarshalXML(e *xml.Encoder, start xml.StartElement) er aux := &struct { *alias SignedExpiry *timeRFC3339 `xml:"SignedExpiry"` - SignedStart *timeRFC3339 `xml:"SignedStart"` + SignedStart *timeRFC3339 `xml:"SignedStart"` }{ - alias: (*alias)(&u), + alias: (*alias)(&u), SignedExpiry: (*timeRFC3339)(u.SignedExpiry), - SignedStart: (*timeRFC3339)(u.SignedStart), + SignedStart: (*timeRFC3339)(u.SignedStart), } return e.EncodeElement(aux, start) } @@ -3986,7 +3997,7 @@ func (u *UserDelegationKey) UnmarshalXML(d *xml.Decoder, start xml.StartElement) aux := &struct { *alias SignedExpiry *timeRFC3339 `xml:"SignedExpiry"` - SignedStart *timeRFC3339 `xml:"SignedStart"` + SignedStart *timeRFC3339 `xml:"SignedStart"` }{ alias: (*alias)(u), } @@ -4018,3 +4029,4 @@ type UserDelegationKeyResponse struct { // Version contains the information returned from the x-ms-version header response. Version *string `xml:"Version"` } + diff --git a/sdk/storage/azblob/zz_generated_pageblob.go b/sdk/storage/azblob/zz_generated_pageblob_client.go similarity index 72% rename from sdk/storage/azblob/zz_generated_pageblob.go rename to sdk/storage/azblob/zz_generated_pageblob_client.go index b96ad82981bd..6e7c0338ca78 100644 --- a/sdk/storage/azblob/zz_generated_pageblob.go +++ b/sdk/storage/azblob/zz_generated_pageblob_client.go @@ -10,69 +10,58 @@ package azblob import ( "context" "encoding/base64" + "github.com/Azure/azure-sdk-for-go/sdk/azcore" "net/http" - "net/url" "strconv" "time" - - "github.com/Azure/azure-sdk-for-go/sdk/azcore" ) type pageBlobClient struct { con *connection } -// Pipeline returns the pipeline associated with this client. -func (client pageBlobClient) Pipeline() azcore.Pipeline { - return client.con.Pipeline() -} - // ClearPages - The Clear Pages operation clears a set of pages from a page blob -func (client pageBlobClient) ClearPages(ctx context.Context, contentLength int64, pageBlobClearPagesOptions *PageBlobClearPagesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobClearPagesResponse, error) { +func (client *pageBlobClient) ClearPages(ctx context.Context, contentLength int64, pageBlobClearPagesOptions *PageBlobClearPagesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobClearPagesResponse, error) { req, err := client.clearPagesCreateRequest(ctx, contentLength, pageBlobClearPagesOptions, leaseAccessConditions, cpkInfo, cpkScopeInfo, sequenceNumberAccessConditions, modifiedAccessConditions) if err != nil { return PageBlobClearPagesResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return PageBlobClearPagesResponse{}, err } if !resp.HasStatusCode(http.StatusCreated) { return PageBlobClearPagesResponse{}, client.clearPagesHandleError(resp) } - result, err := client.clearPagesHandleResponse(resp) - if err != nil { - return PageBlobClearPagesResponse{}, err - } - return result, nil + return client.clearPagesHandleResponse(resp) } // clearPagesCreateRequest creates the ClearPages request. -func (client pageBlobClient) clearPagesCreateRequest(ctx context.Context, contentLength int64, pageBlobClearPagesOptions *PageBlobClearPagesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *pageBlobClient) clearPagesCreateRequest(ctx context.Context, contentLength int64, pageBlobClearPagesOptions *PageBlobClearPagesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "page") + reqQP := req.URL.Query() + reqQP.Set("comp", "page") if pageBlobClearPagesOptions != nil && pageBlobClearPagesOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*pageBlobClearPagesOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*pageBlobClearPagesOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-page-write", "clear") req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if pageBlobClearPagesOptions != nil && pageBlobClearPagesOptions.RangeParameter != nil { - req.Header.Set("x-ms-range", *pageBlobClearPagesOptions.RangeParameter) + if pageBlobClearPagesOptions != nil && pageBlobClearPagesOptions.Range != nil { + req.Header.Set("x-ms-range", *pageBlobClearPagesOptions.Range) } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Header.Set("x-ms-encryption-key", *cpkInfo.EncryptionKey) } - if cpkInfo != nil && cpkInfo.EncryptionKeySha256 != nil { - req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySha256) + if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { + req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySHA256) } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Header.Set("x-ms-encryption-algorithm", "AES256") @@ -105,15 +94,15 @@ func (client pageBlobClient) clearPagesCreateRequest(ctx context.Context, conten req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } req.Header.Set("x-ms-version", "2019-12-12") - if pageBlobClearPagesOptions != nil && pageBlobClearPagesOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *pageBlobClearPagesOptions.RequestId) + if pageBlobClearPagesOptions != nil && pageBlobClearPagesOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *pageBlobClearPagesOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // clearPagesHandleResponse handles the ClearPages response. -func (client pageBlobClient) clearPagesHandleResponse(resp *azcore.Response) (PageBlobClearPagesResponse, error) { +func (client *pageBlobClient) clearPagesHandleResponse(resp *azcore.Response) (PageBlobClearPagesResponse, error) { result := PageBlobClearPagesResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -126,18 +115,18 @@ func (client pageBlobClient) clearPagesHandleResponse(resp *azcore.Response) (Pa result.LastModified = &lastModified } if val := resp.Header.Get("Content-MD5"); val != "" { - contentMd5, err := base64.StdEncoding.DecodeString(val) + contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return PageBlobClearPagesResponse{}, err } - result.ContentMD5 = &contentMd5 + result.ContentMD5 = &contentMD5 } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { - contentCrc64, err := base64.StdEncoding.DecodeString(val) + xMSContentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return PageBlobClearPagesResponse{}, err } - result.ContentCRC64 = &contentCrc64 + result.XMSContentCRC64 = &xMSContentCRC64 } if val := resp.Header.Get("x-ms-blob-sequence-number"); val != "" { blobSequenceNumber, err := strconv.ParseInt(val, 10, 64) @@ -166,8 +155,8 @@ func (client pageBlobClient) clearPagesHandleResponse(resp *azcore.Response) (Pa } // clearPagesHandleError handles the ClearPages error response. -func (client pageBlobClient) clearPagesHandleError(resp *azcore.Response) error { - var err StorageError +func (client *pageBlobClient) clearPagesHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -179,38 +168,34 @@ func (client pageBlobClient) clearPagesHandleError(resp *azcore.Response) error // snapshot are transferred to the destination. The copied snapshots are complete copies of the original snapshot and can be read or copied from as usual. // This API is supported since REST version // 2016-05-31. -func (client pageBlobClient) CopyIncremental(ctx context.Context, copySource url.URL, pageBlobCopyIncrementalOptions *PageBlobCopyIncrementalOptions, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobCopyIncrementalResponse, error) { +func (client *pageBlobClient) CopyIncremental(ctx context.Context, copySource string, pageBlobCopyIncrementalOptions *PageBlobCopyIncrementalOptions, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobCopyIncrementalResponse, error) { req, err := client.copyIncrementalCreateRequest(ctx, copySource, pageBlobCopyIncrementalOptions, modifiedAccessConditions) if err != nil { return PageBlobCopyIncrementalResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return PageBlobCopyIncrementalResponse{}, err } if !resp.HasStatusCode(http.StatusAccepted) { return PageBlobCopyIncrementalResponse{}, client.copyIncrementalHandleError(resp) } - result, err := client.copyIncrementalHandleResponse(resp) - if err != nil { - return PageBlobCopyIncrementalResponse{}, err - } - return result, nil + return client.copyIncrementalHandleResponse(resp) } // copyIncrementalCreateRequest creates the CopyIncremental request. -func (client pageBlobClient) copyIncrementalCreateRequest(ctx context.Context, copySource url.URL, pageBlobCopyIncrementalOptions *PageBlobCopyIncrementalOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *pageBlobClient) copyIncrementalCreateRequest(ctx context.Context, copySource string, pageBlobCopyIncrementalOptions *PageBlobCopyIncrementalOptions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "incrementalcopy") + reqQP := req.URL.Query() + reqQP.Set("comp", "incrementalcopy") if pageBlobCopyIncrementalOptions != nil && pageBlobCopyIncrementalOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*pageBlobCopyIncrementalOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*pageBlobCopyIncrementalOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Header.Set("If-Modified-Since", modifiedAccessConditions.IfModifiedSince.Format(time.RFC1123)) } @@ -226,17 +211,17 @@ func (client pageBlobClient) copyIncrementalCreateRequest(ctx context.Context, c if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } - req.Header.Set("x-ms-copy-source", copySource.String()) + req.Header.Set("x-ms-copy-source", copySource) req.Header.Set("x-ms-version", "2019-12-12") - if pageBlobCopyIncrementalOptions != nil && pageBlobCopyIncrementalOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *pageBlobCopyIncrementalOptions.RequestId) + if pageBlobCopyIncrementalOptions != nil && pageBlobCopyIncrementalOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *pageBlobCopyIncrementalOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // copyIncrementalHandleResponse handles the CopyIncremental response. -func (client pageBlobClient) copyIncrementalHandleResponse(resp *azcore.Response) (PageBlobCopyIncrementalResponse, error) { +func (client *pageBlobClient) copyIncrementalHandleResponse(resp *azcore.Response) (PageBlobCopyIncrementalResponse, error) { result := PageBlobCopyIncrementalResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -274,8 +259,8 @@ func (client pageBlobClient) copyIncrementalHandleResponse(resp *azcore.Response } // copyIncrementalHandleError handles the CopyIncremental error response. -func (client pageBlobClient) copyIncrementalHandleError(resp *azcore.Response) error { - var err StorageError +func (client *pageBlobClient) copyIncrementalHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -283,73 +268,69 @@ func (client pageBlobClient) copyIncrementalHandleError(resp *azcore.Response) e } // Create - The Create operation creates a new page blob. -func (client pageBlobClient) Create(ctx context.Context, contentLength int64, blobContentLength int64, pageBlobCreateOptions *PageBlobCreateOptions, blobHttpHeaders *BlobHttpHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobCreateResponse, error) { - req, err := client.createCreateRequest(ctx, contentLength, blobContentLength, pageBlobCreateOptions, blobHttpHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) +func (client *pageBlobClient) Create(ctx context.Context, contentLength int64, blobContentLength int64, pageBlobCreateOptions *PageBlobCreateOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobCreateResponse, error) { + req, err := client.createCreateRequest(ctx, contentLength, blobContentLength, pageBlobCreateOptions, blobHTTPHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) if err != nil { return PageBlobCreateResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return PageBlobCreateResponse{}, err } if !resp.HasStatusCode(http.StatusCreated) { return PageBlobCreateResponse{}, client.createHandleError(resp) } - result, err := client.createHandleResponse(resp) - if err != nil { - return PageBlobCreateResponse{}, err - } - return result, nil + return client.createHandleResponse(resp) } // createCreateRequest creates the Create request. -func (client pageBlobClient) createCreateRequest(ctx context.Context, contentLength int64, blobContentLength int64, pageBlobCreateOptions *PageBlobCreateOptions, blobHttpHeaders *BlobHttpHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *pageBlobClient) createCreateRequest(ctx context.Context, contentLength int64, blobContentLength int64, pageBlobCreateOptions *PageBlobCreateOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() + reqQP := req.URL.Query() if pageBlobCreateOptions != nil && pageBlobCreateOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*pageBlobCreateOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*pageBlobCreateOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-blob-type", "PageBlob") req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) if pageBlobCreateOptions != nil && pageBlobCreateOptions.Tier != nil { req.Header.Set("x-ms-access-tier", string(*pageBlobCreateOptions.Tier)) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentType != nil { - req.Header.Set("x-ms-blob-content-type", *blobHttpHeaders.BlobContentType) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentType != nil { + req.Header.Set("x-ms-blob-content-type", *blobHTTPHeaders.BlobContentType) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentEncoding != nil { - req.Header.Set("x-ms-blob-content-encoding", *blobHttpHeaders.BlobContentEncoding) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentEncoding != nil { + req.Header.Set("x-ms-blob-content-encoding", *blobHTTPHeaders.BlobContentEncoding) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentLanguage != nil { - req.Header.Set("x-ms-blob-content-language", *blobHttpHeaders.BlobContentLanguage) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentLanguage != nil { + req.Header.Set("x-ms-blob-content-language", *blobHTTPHeaders.BlobContentLanguage) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentMd5 != nil { - req.Header.Set("x-ms-blob-content-md5", base64.StdEncoding.EncodeToString(*blobHttpHeaders.BlobContentMd5)) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentMD5 != nil { + req.Header.Set("x-ms-blob-content-md5", base64.StdEncoding.EncodeToString(*blobHTTPHeaders.BlobContentMD5)) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobCacheControl != nil { - req.Header.Set("x-ms-blob-cache-control", *blobHttpHeaders.BlobCacheControl) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobCacheControl != nil { + req.Header.Set("x-ms-blob-cache-control", *blobHTTPHeaders.BlobCacheControl) } if pageBlobCreateOptions != nil && pageBlobCreateOptions.Metadata != nil { for k, v := range *pageBlobCreateOptions.Metadata { req.Header.Set("x-ms-meta-"+k, v) } } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } - if blobHttpHeaders != nil && blobHttpHeaders.BlobContentDisposition != nil { - req.Header.Set("x-ms-blob-content-disposition", *blobHttpHeaders.BlobContentDisposition) + if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentDisposition != nil { + req.Header.Set("x-ms-blob-content-disposition", *blobHTTPHeaders.BlobContentDisposition) } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Header.Set("x-ms-encryption-key", *cpkInfo.EncryptionKey) } - if cpkInfo != nil && cpkInfo.EncryptionKeySha256 != nil { - req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySha256) + if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { + req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySHA256) } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Header.Set("x-ms-encryption-algorithm", "AES256") @@ -377,8 +358,8 @@ func (client pageBlobClient) createCreateRequest(ctx context.Context, contentLen req.Header.Set("x-ms-blob-sequence-number", strconv.FormatInt(*pageBlobCreateOptions.BlobSequenceNumber, 10)) } req.Header.Set("x-ms-version", "2019-12-12") - if pageBlobCreateOptions != nil && pageBlobCreateOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *pageBlobCreateOptions.RequestId) + if pageBlobCreateOptions != nil && pageBlobCreateOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *pageBlobCreateOptions.RequestID) } if pageBlobCreateOptions != nil && pageBlobCreateOptions.BlobTagsString != nil { req.Header.Set("x-ms-tags", *pageBlobCreateOptions.BlobTagsString) @@ -388,7 +369,7 @@ func (client pageBlobClient) createCreateRequest(ctx context.Context, contentLen } // createHandleResponse handles the Create response. -func (client pageBlobClient) createHandleResponse(resp *azcore.Response) (PageBlobCreateResponse, error) { +func (client *pageBlobClient) createHandleResponse(resp *azcore.Response) (PageBlobCreateResponse, error) { result := PageBlobCreateResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -401,11 +382,11 @@ func (client pageBlobClient) createHandleResponse(resp *azcore.Response) (PageBl result.LastModified = &lastModified } if val := resp.Header.Get("Content-MD5"); val != "" { - contentMd5, err := base64.StdEncoding.DecodeString(val) + contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return PageBlobCreateResponse{}, err } - result.ContentMD5 = &contentMd5 + result.ContentMD5 = &contentMD5 } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val @@ -443,8 +424,8 @@ func (client pageBlobClient) createHandleResponse(resp *azcore.Response) (PageBl } // createHandleError handles the Create error response. -func (client pageBlobClient) createHandleError(resp *azcore.Response) error { - var err StorageError +func (client *pageBlobClient) createHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -452,46 +433,42 @@ func (client pageBlobClient) createHandleError(resp *azcore.Response) error { } // GetPageRanges - The Get Page Ranges operation returns the list of valid page ranges for a page blob or snapshot of a page blob -func (client pageBlobClient) GetPageRanges(ctx context.Context, pageBlobGetPageRangesOptions *PageBlobGetPageRangesOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (PageListResponse, error) { +func (client *pageBlobClient) GetPageRanges(ctx context.Context, pageBlobGetPageRangesOptions *PageBlobGetPageRangesOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (PageListResponse, error) { req, err := client.getPageRangesCreateRequest(ctx, pageBlobGetPageRangesOptions, leaseAccessConditions, modifiedAccessConditions) if err != nil { return PageListResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return PageListResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return PageListResponse{}, client.getPageRangesHandleError(resp) } - result, err := client.getPageRangesHandleResponse(resp) - if err != nil { - return PageListResponse{}, err - } - return result, nil + return client.getPageRangesHandleResponse(resp) } // getPageRangesCreateRequest creates the GetPageRanges request. -func (client pageBlobClient) getPageRangesCreateRequest(ctx context.Context, pageBlobGetPageRangesOptions *PageBlobGetPageRangesOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *pageBlobClient) getPageRangesCreateRequest(ctx context.Context, pageBlobGetPageRangesOptions *PageBlobGetPageRangesOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodGet, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "pagelist") + reqQP := req.URL.Query() + reqQP.Set("comp", "pagelist") if pageBlobGetPageRangesOptions != nil && pageBlobGetPageRangesOptions.Snapshot != nil { - query.Set("snapshot", *pageBlobGetPageRangesOptions.Snapshot) + reqQP.Set("snapshot", *pageBlobGetPageRangesOptions.Snapshot) } if pageBlobGetPageRangesOptions != nil && pageBlobGetPageRangesOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*pageBlobGetPageRangesOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*pageBlobGetPageRangesOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() - if pageBlobGetPageRangesOptions != nil && pageBlobGetPageRangesOptions.RangeParameter != nil { - req.Header.Set("x-ms-range", *pageBlobGetPageRangesOptions.RangeParameter) + req.URL.RawQuery = reqQP.Encode() + if pageBlobGetPageRangesOptions != nil && pageBlobGetPageRangesOptions.Range != nil { + req.Header.Set("x-ms-range", *pageBlobGetPageRangesOptions.Range) } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Header.Set("If-Modified-Since", modifiedAccessConditions.IfModifiedSince.Format(time.RFC1123)) @@ -509,16 +486,20 @@ func (client pageBlobClient) getPageRangesCreateRequest(ctx context.Context, pag req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } req.Header.Set("x-ms-version", "2019-12-12") - if pageBlobGetPageRangesOptions != nil && pageBlobGetPageRangesOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *pageBlobGetPageRangesOptions.RequestId) + if pageBlobGetPageRangesOptions != nil && pageBlobGetPageRangesOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *pageBlobGetPageRangesOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // getPageRangesHandleResponse handles the GetPageRanges response. -func (client pageBlobClient) getPageRangesHandleResponse(resp *azcore.Response) (PageListResponse, error) { - result := PageListResponse{RawResponse: resp.Response} +func (client *pageBlobClient) getPageRangesHandleResponse(resp *azcore.Response) (PageListResponse, error) { + var val *PageList + if err := resp.UnmarshalAsXML(&val); err != nil { + return PageListResponse{}, err + } + result := PageListResponse{RawResponse: resp.Response, PageList: val} if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { @@ -552,13 +533,12 @@ func (client pageBlobClient) getPageRangesHandleResponse(resp *azcore.Response) } result.Date = &date } - err := resp.UnmarshalAsXML(&result.PageList) - return result, err + return result, nil } // getPageRangesHandleError handles the GetPageRanges error response. -func (client pageBlobClient) getPageRangesHandleError(resp *azcore.Response) error { - var err StorageError +func (client *pageBlobClient) getPageRangesHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -567,52 +547,48 @@ func (client pageBlobClient) getPageRangesHandleError(resp *azcore.Response) err // GetPageRangesDiff - The Get Page Ranges Diff operation returns the list of valid page ranges for a page blob that were changed between target blob and // previous snapshot. -func (client pageBlobClient) GetPageRangesDiff(ctx context.Context, pageBlobGetPageRangesDiffOptions *PageBlobGetPageRangesDiffOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (PageListResponse, error) { +func (client *pageBlobClient) GetPageRangesDiff(ctx context.Context, pageBlobGetPageRangesDiffOptions *PageBlobGetPageRangesDiffOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (PageListResponse, error) { req, err := client.getPageRangesDiffCreateRequest(ctx, pageBlobGetPageRangesDiffOptions, leaseAccessConditions, modifiedAccessConditions) if err != nil { return PageListResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return PageListResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return PageListResponse{}, client.getPageRangesDiffHandleError(resp) } - result, err := client.getPageRangesDiffHandleResponse(resp) - if err != nil { - return PageListResponse{}, err - } - return result, nil + return client.getPageRangesDiffHandleResponse(resp) } // getPageRangesDiffCreateRequest creates the GetPageRangesDiff request. -func (client pageBlobClient) getPageRangesDiffCreateRequest(ctx context.Context, pageBlobGetPageRangesDiffOptions *PageBlobGetPageRangesDiffOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *pageBlobClient) getPageRangesDiffCreateRequest(ctx context.Context, pageBlobGetPageRangesDiffOptions *PageBlobGetPageRangesDiffOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodGet, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "pagelist") + reqQP := req.URL.Query() + reqQP.Set("comp", "pagelist") if pageBlobGetPageRangesDiffOptions != nil && pageBlobGetPageRangesDiffOptions.Snapshot != nil { - query.Set("snapshot", *pageBlobGetPageRangesDiffOptions.Snapshot) + reqQP.Set("snapshot", *pageBlobGetPageRangesDiffOptions.Snapshot) } if pageBlobGetPageRangesDiffOptions != nil && pageBlobGetPageRangesDiffOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*pageBlobGetPageRangesDiffOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*pageBlobGetPageRangesDiffOptions.Timeout), 10)) } if pageBlobGetPageRangesDiffOptions != nil && pageBlobGetPageRangesDiffOptions.Prevsnapshot != nil { - query.Set("prevsnapshot", *pageBlobGetPageRangesDiffOptions.Prevsnapshot) + reqQP.Set("prevsnapshot", *pageBlobGetPageRangesDiffOptions.Prevsnapshot) } - req.URL.RawQuery = query.Encode() - if pageBlobGetPageRangesDiffOptions != nil && pageBlobGetPageRangesDiffOptions.PrevSnapshotUrl != nil { - req.Header.Set("x-ms-previous-snapshot-url", pageBlobGetPageRangesDiffOptions.PrevSnapshotUrl.String()) + req.URL.RawQuery = reqQP.Encode() + if pageBlobGetPageRangesDiffOptions != nil && pageBlobGetPageRangesDiffOptions.PrevSnapshotURL != nil { + req.Header.Set("x-ms-previous-snapshot-url", *pageBlobGetPageRangesDiffOptions.PrevSnapshotURL) } - if pageBlobGetPageRangesDiffOptions != nil && pageBlobGetPageRangesDiffOptions.RangeParameter != nil { - req.Header.Set("x-ms-range", *pageBlobGetPageRangesDiffOptions.RangeParameter) + if pageBlobGetPageRangesDiffOptions != nil && pageBlobGetPageRangesDiffOptions.Range != nil { + req.Header.Set("x-ms-range", *pageBlobGetPageRangesDiffOptions.Range) } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Header.Set("If-Modified-Since", modifiedAccessConditions.IfModifiedSince.Format(time.RFC1123)) @@ -630,16 +606,20 @@ func (client pageBlobClient) getPageRangesDiffCreateRequest(ctx context.Context, req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } req.Header.Set("x-ms-version", "2019-12-12") - if pageBlobGetPageRangesDiffOptions != nil && pageBlobGetPageRangesDiffOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *pageBlobGetPageRangesDiffOptions.RequestId) + if pageBlobGetPageRangesDiffOptions != nil && pageBlobGetPageRangesDiffOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *pageBlobGetPageRangesDiffOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // getPageRangesDiffHandleResponse handles the GetPageRangesDiff response. -func (client pageBlobClient) getPageRangesDiffHandleResponse(resp *azcore.Response) (PageListResponse, error) { - result := PageListResponse{RawResponse: resp.Response} +func (client *pageBlobClient) getPageRangesDiffHandleResponse(resp *azcore.Response) (PageListResponse, error) { + var val *PageList + if err := resp.UnmarshalAsXML(&val); err != nil { + return PageListResponse{}, err + } + result := PageListResponse{RawResponse: resp.Response, PageList: val} if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { @@ -673,13 +653,12 @@ func (client pageBlobClient) getPageRangesDiffHandleResponse(resp *azcore.Respon } result.Date = &date } - err := resp.UnmarshalAsXML(&result.PageList) - return result, err + return result, nil } // getPageRangesDiffHandleError handles the GetPageRangesDiff error response. -func (client pageBlobClient) getPageRangesDiffHandleError(resp *azcore.Response) error { - var err StorageError +func (client *pageBlobClient) getPageRangesDiffHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -687,46 +666,42 @@ func (client pageBlobClient) getPageRangesDiffHandleError(resp *azcore.Response) } // Resize - Resize the Blob -func (client pageBlobClient) Resize(ctx context.Context, blobContentLength int64, pageBlobResizeOptions *PageBlobResizeOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobResizeResponse, error) { +func (client *pageBlobClient) Resize(ctx context.Context, blobContentLength int64, pageBlobResizeOptions *PageBlobResizeOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobResizeResponse, error) { req, err := client.resizeCreateRequest(ctx, blobContentLength, pageBlobResizeOptions, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) if err != nil { return PageBlobResizeResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return PageBlobResizeResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return PageBlobResizeResponse{}, client.resizeHandleError(resp) } - result, err := client.resizeHandleResponse(resp) - if err != nil { - return PageBlobResizeResponse{}, err - } - return result, nil + return client.resizeHandleResponse(resp) } // resizeCreateRequest creates the Resize request. -func (client pageBlobClient) resizeCreateRequest(ctx context.Context, blobContentLength int64, pageBlobResizeOptions *PageBlobResizeOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *pageBlobClient) resizeCreateRequest(ctx context.Context, blobContentLength int64, pageBlobResizeOptions *PageBlobResizeOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "properties") + reqQP := req.URL.Query() + reqQP.Set("comp", "properties") if pageBlobResizeOptions != nil && pageBlobResizeOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*pageBlobResizeOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*pageBlobResizeOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + req.URL.RawQuery = reqQP.Encode() + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Header.Set("x-ms-encryption-key", *cpkInfo.EncryptionKey) } - if cpkInfo != nil && cpkInfo.EncryptionKeySha256 != nil { - req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySha256) + if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { + req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySHA256) } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Header.Set("x-ms-encryption-algorithm", "AES256") @@ -751,15 +726,15 @@ func (client pageBlobClient) resizeCreateRequest(ctx context.Context, blobConten } req.Header.Set("x-ms-blob-content-length", strconv.FormatInt(blobContentLength, 10)) req.Header.Set("x-ms-version", "2019-12-12") - if pageBlobResizeOptions != nil && pageBlobResizeOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *pageBlobResizeOptions.RequestId) + if pageBlobResizeOptions != nil && pageBlobResizeOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *pageBlobResizeOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // resizeHandleResponse handles the Resize response. -func (client pageBlobClient) resizeHandleResponse(resp *azcore.Response) (PageBlobResizeResponse, error) { +func (client *pageBlobClient) resizeHandleResponse(resp *azcore.Response) (PageBlobResizeResponse, error) { result := PageBlobResizeResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -798,8 +773,8 @@ func (client pageBlobClient) resizeHandleResponse(resp *azcore.Response) (PageBl } // resizeHandleError handles the Resize error response. -func (client pageBlobClient) resizeHandleError(resp *azcore.Response) error { - var err StorageError +func (client *pageBlobClient) resizeHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -807,40 +782,36 @@ func (client pageBlobClient) resizeHandleError(resp *azcore.Response) error { } // UpdateSequenceNumber - Update the sequence number of the blob -func (client pageBlobClient) UpdateSequenceNumber(ctx context.Context, sequenceNumberAction SequenceNumberActionType, pageBlobUpdateSequenceNumberOptions *PageBlobUpdateSequenceNumberOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobUpdateSequenceNumberResponse, error) { +func (client *pageBlobClient) UpdateSequenceNumber(ctx context.Context, sequenceNumberAction SequenceNumberActionType, pageBlobUpdateSequenceNumberOptions *PageBlobUpdateSequenceNumberOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobUpdateSequenceNumberResponse, error) { req, err := client.updateSequenceNumberCreateRequest(ctx, sequenceNumberAction, pageBlobUpdateSequenceNumberOptions, leaseAccessConditions, modifiedAccessConditions) if err != nil { return PageBlobUpdateSequenceNumberResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return PageBlobUpdateSequenceNumberResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return PageBlobUpdateSequenceNumberResponse{}, client.updateSequenceNumberHandleError(resp) } - result, err := client.updateSequenceNumberHandleResponse(resp) - if err != nil { - return PageBlobUpdateSequenceNumberResponse{}, err - } - return result, nil + return client.updateSequenceNumberHandleResponse(resp) } // updateSequenceNumberCreateRequest creates the UpdateSequenceNumber request. -func (client pageBlobClient) updateSequenceNumberCreateRequest(ctx context.Context, sequenceNumberAction SequenceNumberActionType, pageBlobUpdateSequenceNumberOptions *PageBlobUpdateSequenceNumberOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *pageBlobClient) updateSequenceNumberCreateRequest(ctx context.Context, sequenceNumberAction SequenceNumberActionType, pageBlobUpdateSequenceNumberOptions *PageBlobUpdateSequenceNumberOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "properties") + reqQP := req.URL.Query() + reqQP.Set("comp", "properties") if pageBlobUpdateSequenceNumberOptions != nil && pageBlobUpdateSequenceNumberOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*pageBlobUpdateSequenceNumberOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*pageBlobUpdateSequenceNumberOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + req.URL.RawQuery = reqQP.Encode() + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Header.Set("If-Modified-Since", modifiedAccessConditions.IfModifiedSince.Format(time.RFC1123)) @@ -862,15 +833,15 @@ func (client pageBlobClient) updateSequenceNumberCreateRequest(ctx context.Conte req.Header.Set("x-ms-blob-sequence-number", strconv.FormatInt(*pageBlobUpdateSequenceNumberOptions.BlobSequenceNumber, 10)) } req.Header.Set("x-ms-version", "2019-12-12") - if pageBlobUpdateSequenceNumberOptions != nil && pageBlobUpdateSequenceNumberOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *pageBlobUpdateSequenceNumberOptions.RequestId) + if pageBlobUpdateSequenceNumberOptions != nil && pageBlobUpdateSequenceNumberOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *pageBlobUpdateSequenceNumberOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // updateSequenceNumberHandleResponse handles the UpdateSequenceNumber response. -func (client pageBlobClient) updateSequenceNumberHandleResponse(resp *azcore.Response) (PageBlobUpdateSequenceNumberResponse, error) { +func (client *pageBlobClient) updateSequenceNumberHandleResponse(resp *azcore.Response) (PageBlobUpdateSequenceNumberResponse, error) { result := PageBlobUpdateSequenceNumberResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -909,8 +880,8 @@ func (client pageBlobClient) updateSequenceNumberHandleResponse(resp *azcore.Res } // updateSequenceNumberHandleError handles the UpdateSequenceNumber error response. -func (client pageBlobClient) updateSequenceNumberHandleError(resp *azcore.Response) error { - var err StorageError +func (client *pageBlobClient) updateSequenceNumberHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -918,57 +889,53 @@ func (client pageBlobClient) updateSequenceNumberHandleError(resp *azcore.Respon } // UploadPages - The Upload Pages operation writes a range of pages to a page blob -func (client pageBlobClient) UploadPages(ctx context.Context, contentLength int64, body azcore.ReadSeekCloser, pageBlobUploadPagesOptions *PageBlobUploadPagesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobUploadPagesResponse, error) { +func (client *pageBlobClient) UploadPages(ctx context.Context, contentLength int64, body azcore.ReadSeekCloser, pageBlobUploadPagesOptions *PageBlobUploadPagesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobUploadPagesResponse, error) { req, err := client.uploadPagesCreateRequest(ctx, contentLength, body, pageBlobUploadPagesOptions, leaseAccessConditions, cpkInfo, cpkScopeInfo, sequenceNumberAccessConditions, modifiedAccessConditions) if err != nil { return PageBlobUploadPagesResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return PageBlobUploadPagesResponse{}, err } if !resp.HasStatusCode(http.StatusCreated) { return PageBlobUploadPagesResponse{}, client.uploadPagesHandleError(resp) } - result, err := client.uploadPagesHandleResponse(resp) - if err != nil { - return PageBlobUploadPagesResponse{}, err - } - return result, nil + return client.uploadPagesHandleResponse(resp) } // uploadPagesCreateRequest creates the UploadPages request. -func (client pageBlobClient) uploadPagesCreateRequest(ctx context.Context, contentLength int64, body azcore.ReadSeekCloser, pageBlobUploadPagesOptions *PageBlobUploadPagesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { +func (client *pageBlobClient) uploadPagesCreateRequest(ctx context.Context, contentLength int64, body azcore.ReadSeekCloser, pageBlobUploadPagesOptions *PageBlobUploadPagesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "page") + reqQP := req.URL.Query() + reqQP.Set("comp", "page") if pageBlobUploadPagesOptions != nil && pageBlobUploadPagesOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*pageBlobUploadPagesOptions.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*pageBlobUploadPagesOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-page-write", "update") req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if pageBlobUploadPagesOptions != nil && pageBlobUploadPagesOptions.TransactionalContentMd5 != nil { - req.Header.Set("Content-MD5", base64.StdEncoding.EncodeToString(*pageBlobUploadPagesOptions.TransactionalContentMd5)) + if pageBlobUploadPagesOptions != nil && pageBlobUploadPagesOptions.TransactionalContentMD5 != nil { + req.Header.Set("Content-MD5", base64.StdEncoding.EncodeToString(*pageBlobUploadPagesOptions.TransactionalContentMD5)) } - if pageBlobUploadPagesOptions != nil && pageBlobUploadPagesOptions.TransactionalContentCrc64 != nil { - req.Header.Set("x-ms-content-crc64", base64.StdEncoding.EncodeToString(*pageBlobUploadPagesOptions.TransactionalContentCrc64)) + if pageBlobUploadPagesOptions != nil && pageBlobUploadPagesOptions.TransactionalContentCRC64 != nil { + req.Header.Set("x-ms-content-crc64", base64.StdEncoding.EncodeToString(*pageBlobUploadPagesOptions.TransactionalContentCRC64)) } - if pageBlobUploadPagesOptions != nil && pageBlobUploadPagesOptions.RangeParameter != nil { - req.Header.Set("x-ms-range", *pageBlobUploadPagesOptions.RangeParameter) + if pageBlobUploadPagesOptions != nil && pageBlobUploadPagesOptions.Range != nil { + req.Header.Set("x-ms-range", *pageBlobUploadPagesOptions.Range) } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Header.Set("x-ms-encryption-key", *cpkInfo.EncryptionKey) } - if cpkInfo != nil && cpkInfo.EncryptionKeySha256 != nil { - req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySha256) + if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { + req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySHA256) } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Header.Set("x-ms-encryption-algorithm", "AES256") @@ -1001,15 +968,15 @@ func (client pageBlobClient) uploadPagesCreateRequest(ctx context.Context, conte req.Header.Set("x-ms-if-tags", *modifiedAccessConditions.IfTags) } req.Header.Set("x-ms-version", "2019-12-12") - if pageBlobUploadPagesOptions != nil && pageBlobUploadPagesOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *pageBlobUploadPagesOptions.RequestId) + if pageBlobUploadPagesOptions != nil && pageBlobUploadPagesOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *pageBlobUploadPagesOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, req.SetBody(body, "application/octet-stream") } // uploadPagesHandleResponse handles the UploadPages response. -func (client pageBlobClient) uploadPagesHandleResponse(resp *azcore.Response) (PageBlobUploadPagesResponse, error) { +func (client *pageBlobClient) uploadPagesHandleResponse(resp *azcore.Response) (PageBlobUploadPagesResponse, error) { result := PageBlobUploadPagesResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -1022,18 +989,18 @@ func (client pageBlobClient) uploadPagesHandleResponse(resp *azcore.Response) (P result.LastModified = &lastModified } if val := resp.Header.Get("Content-MD5"); val != "" { - contentMd5, err := base64.StdEncoding.DecodeString(val) + contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return PageBlobUploadPagesResponse{}, err } - result.ContentMD5 = &contentMd5 + result.ContentMD5 = &contentMD5 } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { - contentCrc64, err := base64.StdEncoding.DecodeString(val) + xMSContentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return PageBlobUploadPagesResponse{}, err } - result.ContentCRC64 = &contentCrc64 + result.XMSContentCRC64 = &xMSContentCRC64 } if val := resp.Header.Get("x-ms-blob-sequence-number"); val != "" { blobSequenceNumber, err := strconv.ParseInt(val, 10, 64) @@ -1075,8 +1042,8 @@ func (client pageBlobClient) uploadPagesHandleResponse(resp *azcore.Response) (P } // uploadPagesHandleError handles the UploadPages error response. -func (client pageBlobClient) uploadPagesHandleError(resp *azcore.Response) error { - var err StorageError +func (client *pageBlobClient) uploadPagesHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -1084,54 +1051,50 @@ func (client pageBlobClient) uploadPagesHandleError(resp *azcore.Response) error } // UploadPagesFromURL - The Upload Pages operation writes a range of pages to a page blob where the contents are read from a URL -func (client pageBlobClient) UploadPagesFromURL(ctx context.Context, sourceUrl url.URL, sourceRange string, contentLength int64, rangeParameter string, pageBlobUploadPagesFromUrlOptions *PageBlobUploadPagesFromURLOptions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, leaseAccessConditions *LeaseAccessConditions, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (PageBlobUploadPagesFromURLResponse, error) { - req, err := client.uploadPagesFromUrlCreateRequest(ctx, sourceUrl, sourceRange, contentLength, rangeParameter, pageBlobUploadPagesFromUrlOptions, cpkInfo, cpkScopeInfo, leaseAccessConditions, sequenceNumberAccessConditions, modifiedAccessConditions, sourceModifiedAccessConditions) +func (client *pageBlobClient) UploadPagesFromURL(ctx context.Context, sourceURL string, sourceRange string, contentLength int64, rangeParam string, pageBlobUploadPagesFromURLOptions *PageBlobUploadPagesFromURLOptions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, leaseAccessConditions *LeaseAccessConditions, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (PageBlobUploadPagesFromURLResponse, error) { + req, err := client.uploadPagesFromURLCreateRequest(ctx, sourceURL, sourceRange, contentLength, rangeParam, pageBlobUploadPagesFromURLOptions, cpkInfo, cpkScopeInfo, leaseAccessConditions, sequenceNumberAccessConditions, modifiedAccessConditions, sourceModifiedAccessConditions) if err != nil { return PageBlobUploadPagesFromURLResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return PageBlobUploadPagesFromURLResponse{}, err } if !resp.HasStatusCode(http.StatusCreated) { - return PageBlobUploadPagesFromURLResponse{}, client.uploadPagesFromUrlHandleError(resp) - } - result, err := client.uploadPagesFromUrlHandleResponse(resp) - if err != nil { - return PageBlobUploadPagesFromURLResponse{}, err + return PageBlobUploadPagesFromURLResponse{}, client.uploadPagesFromURLHandleError(resp) } - return result, nil + return client.uploadPagesFromURLHandleResponse(resp) } -// uploadPagesFromUrlCreateRequest creates the UploadPagesFromURL request. -func (client pageBlobClient) uploadPagesFromUrlCreateRequest(ctx context.Context, sourceUrl url.URL, sourceRange string, contentLength int64, rangeParameter string, pageBlobUploadPagesFromUrlOptions *PageBlobUploadPagesFromURLOptions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, leaseAccessConditions *LeaseAccessConditions, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (*azcore.Request, error) { +// uploadPagesFromURLCreateRequest creates the UploadPagesFromURL request. +func (client *pageBlobClient) uploadPagesFromURLCreateRequest(ctx context.Context, sourceURL string, sourceRange string, contentLength int64, rangeParam string, pageBlobUploadPagesFromURLOptions *PageBlobUploadPagesFromURLOptions, cpkInfo *CpkInfo, cpkScopeInfo *CpkScopeInfo, leaseAccessConditions *LeaseAccessConditions, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "page") - if pageBlobUploadPagesFromUrlOptions != nil && pageBlobUploadPagesFromUrlOptions.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*pageBlobUploadPagesFromUrlOptions.Timeout), 10)) + reqQP := req.URL.Query() + reqQP.Set("comp", "page") + if pageBlobUploadPagesFromURLOptions != nil && pageBlobUploadPagesFromURLOptions.Timeout != nil { + reqQP.Set("timeout", strconv.FormatInt(int64(*pageBlobUploadPagesFromURLOptions.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-page-write", "update") - req.Header.Set("x-ms-copy-source", sourceUrl.String()) + req.Header.Set("x-ms-copy-source", sourceURL) req.Header.Set("x-ms-source-range", sourceRange) - if pageBlobUploadPagesFromUrlOptions != nil && pageBlobUploadPagesFromUrlOptions.SourceContentMd5 != nil { - req.Header.Set("x-ms-source-content-md5", base64.StdEncoding.EncodeToString(*pageBlobUploadPagesFromUrlOptions.SourceContentMd5)) + if pageBlobUploadPagesFromURLOptions != nil && pageBlobUploadPagesFromURLOptions.SourceContentMD5 != nil { + req.Header.Set("x-ms-source-content-md5", base64.StdEncoding.EncodeToString(*pageBlobUploadPagesFromURLOptions.SourceContentMD5)) } - if pageBlobUploadPagesFromUrlOptions != nil && pageBlobUploadPagesFromUrlOptions.SourceContentcrc64 != nil { - req.Header.Set("x-ms-source-content-crc64", base64.StdEncoding.EncodeToString(*pageBlobUploadPagesFromUrlOptions.SourceContentcrc64)) + if pageBlobUploadPagesFromURLOptions != nil && pageBlobUploadPagesFromURLOptions.SourceContentcrc64 != nil { + req.Header.Set("x-ms-source-content-crc64", base64.StdEncoding.EncodeToString(*pageBlobUploadPagesFromURLOptions.SourceContentcrc64)) } req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - req.Header.Set("x-ms-range", rangeParameter) + req.Header.Set("x-ms-range", rangeParam) if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Header.Set("x-ms-encryption-key", *cpkInfo.EncryptionKey) } - if cpkInfo != nil && cpkInfo.EncryptionKeySha256 != nil { - req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySha256) + if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { + req.Header.Set("x-ms-encryption-key-sha256", *cpkInfo.EncryptionKeySHA256) } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Header.Set("x-ms-encryption-algorithm", "AES256") @@ -1139,8 +1102,8 @@ func (client pageBlobClient) uploadPagesFromUrlCreateRequest(ctx context.Context if cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil { req.Header.Set("x-ms-encryption-scope", *cpkScopeInfo.EncryptionScope) } - if leaseAccessConditions != nil && leaseAccessConditions.LeaseId != nil { - req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseId) + if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { + req.Header.Set("x-ms-lease-id", *leaseAccessConditions.LeaseID) } if sequenceNumberAccessConditions != nil && sequenceNumberAccessConditions.IfSequenceNumberLessThanOrEqualTo != nil { req.Header.Set("x-ms-if-sequence-number-le", strconv.FormatInt(*sequenceNumberAccessConditions.IfSequenceNumberLessThanOrEqualTo, 10)) @@ -1179,15 +1142,15 @@ func (client pageBlobClient) uploadPagesFromUrlCreateRequest(ctx context.Context req.Header.Set("x-ms-source-if-none-match", *sourceModifiedAccessConditions.SourceIfNoneMatch) } req.Header.Set("x-ms-version", "2019-12-12") - if pageBlobUploadPagesFromUrlOptions != nil && pageBlobUploadPagesFromUrlOptions.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *pageBlobUploadPagesFromUrlOptions.RequestId) + if pageBlobUploadPagesFromURLOptions != nil && pageBlobUploadPagesFromURLOptions.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *pageBlobUploadPagesFromURLOptions.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } -// uploadPagesFromUrlHandleResponse handles the UploadPagesFromURL response. -func (client pageBlobClient) uploadPagesFromUrlHandleResponse(resp *azcore.Response) (PageBlobUploadPagesFromURLResponse, error) { +// uploadPagesFromURLHandleResponse handles the UploadPagesFromURL response. +func (client *pageBlobClient) uploadPagesFromURLHandleResponse(resp *azcore.Response) (PageBlobUploadPagesFromURLResponse, error) { result := PageBlobUploadPagesFromURLResponse{RawResponse: resp.Response} if val := resp.Header.Get("ETag"); val != "" { result.ETag = &val @@ -1200,18 +1163,18 @@ func (client pageBlobClient) uploadPagesFromUrlHandleResponse(resp *azcore.Respo result.LastModified = &lastModified } if val := resp.Header.Get("Content-MD5"); val != "" { - contentMd5, err := base64.StdEncoding.DecodeString(val) + contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return PageBlobUploadPagesFromURLResponse{}, err } - result.ContentMD5 = &contentMd5 + result.ContentMD5 = &contentMD5 } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { - contentCrc64, err := base64.StdEncoding.DecodeString(val) + xMSContentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return PageBlobUploadPagesFromURLResponse{}, err } - result.ContentCRC64 = &contentCrc64 + result.XMSContentCRC64 = &xMSContentCRC64 } if val := resp.Header.Get("x-ms-blob-sequence-number"); val != "" { blobSequenceNumber, err := strconv.ParseInt(val, 10, 64) @@ -1249,11 +1212,12 @@ func (client pageBlobClient) uploadPagesFromUrlHandleResponse(resp *azcore.Respo return result, nil } -// uploadPagesFromUrlHandleError handles the UploadPagesFromURL error response. -func (client pageBlobClient) uploadPagesFromUrlHandleError(resp *azcore.Response) error { - var err StorageError +// uploadPagesFromURLHandleError handles the UploadPagesFromURL error response. +func (client *pageBlobClient) uploadPagesFromURLHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } return azcore.NewResponseError(&err, resp.Response) } + diff --git a/sdk/storage/azblob/zz_generated_pagers.go b/sdk/storage/azblob/zz_generated_pagers.go index 90ef0b5be6ad..b6634842164b 100644 --- a/sdk/storage/azblob/zz_generated_pagers.go +++ b/sdk/storage/azblob/zz_generated_pagers.go @@ -9,22 +9,16 @@ package azblob import ( "context" - "reflect" - "github.com/Azure/azure-sdk-for-go/sdk/azcore" + "reflect" ) // ListBlobsFlatSegmentResponsePager provides iteration over ListBlobsFlatSegmentResponse pages. type ListBlobsFlatSegmentResponsePager interface { - // NextPage returns true if the pager advanced to the next page. - // Returns false if there are no more pages or an error occurred. - NextPage(context.Context) bool + azcore.Pager // Page returns the current ListBlobsFlatSegmentResponseResponse. PageResponse() ListBlobsFlatSegmentResponseResponse - - // Err returns the last error encountered while paging. - Err() error } type listBlobsFlatSegmentResponseCreateRequest func(context.Context) (*azcore.Request, error) @@ -66,20 +60,20 @@ func (p *listBlobsFlatSegmentResponsePager) NextPage(ctx context.Context) bool { return false } req, err = p.advancer(ctx, p.current) - } else { + } else { req, err = p.requester(ctx) - } + } if err != nil { p.err = err return false } - resp, err := p.pipeline.Do(req) + resp, err := p.pipeline.Do(req) if err != nil { p.err = err return false } if !resp.HasStatusCode(p.statusCodes...) { - p.err = p.errorer(resp) + p.err = p.errorer(resp) return false } result, err := p.responder(resp) @@ -97,15 +91,10 @@ func (p *listBlobsFlatSegmentResponsePager) PageResponse() ListBlobsFlatSegmentR // ListBlobsHierarchySegmentResponsePager provides iteration over ListBlobsHierarchySegmentResponse pages. type ListBlobsHierarchySegmentResponsePager interface { - // NextPage returns true if the pager advanced to the next page. - // Returns false if there are no more pages or an error occurred. - NextPage(context.Context) bool + azcore.Pager // Page returns the current ListBlobsHierarchySegmentResponseResponse. PageResponse() ListBlobsHierarchySegmentResponseResponse - - // Err returns the last error encountered while paging. - Err() error } type listBlobsHierarchySegmentResponseCreateRequest func(context.Context) (*azcore.Request, error) @@ -147,20 +136,20 @@ func (p *listBlobsHierarchySegmentResponsePager) NextPage(ctx context.Context) b return false } req, err = p.advancer(ctx, p.current) - } else { + } else { req, err = p.requester(ctx) - } + } if err != nil { p.err = err return false } - resp, err := p.pipeline.Do(req) + resp, err := p.pipeline.Do(req) if err != nil { p.err = err return false } if !resp.HasStatusCode(p.statusCodes...) { - p.err = p.errorer(resp) + p.err = p.errorer(resp) return false } result, err := p.responder(resp) @@ -178,15 +167,10 @@ func (p *listBlobsHierarchySegmentResponsePager) PageResponse() ListBlobsHierarc // ListContainersSegmentResponsePager provides iteration over ListContainersSegmentResponse pages. type ListContainersSegmentResponsePager interface { - // NextPage returns true if the pager advanced to the next page. - // Returns false if there are no more pages or an error occurred. - NextPage(context.Context) bool + azcore.Pager // Page returns the current ListContainersSegmentResponseResponse. PageResponse() ListContainersSegmentResponseResponse - - // Err returns the last error encountered while paging. - Err() error } type listContainersSegmentResponseCreateRequest func(context.Context) (*azcore.Request, error) @@ -228,20 +212,20 @@ func (p *listContainersSegmentResponsePager) NextPage(ctx context.Context) bool return false } req, err = p.advancer(ctx, p.current) - } else { + } else { req, err = p.requester(ctx) - } + } if err != nil { p.err = err return false } - resp, err := p.pipeline.Do(req) + resp, err := p.pipeline.Do(req) if err != nil { p.err = err return false } if !resp.HasStatusCode(p.statusCodes...) { - p.err = p.errorer(resp) + p.err = p.errorer(resp) return false } result, err := p.responder(resp) @@ -256,3 +240,4 @@ func (p *listContainersSegmentResponsePager) NextPage(ctx context.Context) bool func (p *listContainersSegmentResponsePager) PageResponse() ListContainersSegmentResponseResponse { return p.current } + diff --git a/sdk/storage/azblob/zz_generated_service.go b/sdk/storage/azblob/zz_generated_service_client.go similarity index 62% rename from sdk/storage/azblob/zz_generated_service.go rename to sdk/storage/azblob/zz_generated_service_client.go index 258255848a6d..095112b2bfba 100644 --- a/sdk/storage/azblob/zz_generated_service.go +++ b/sdk/storage/azblob/zz_generated_service_client.go @@ -10,78 +10,72 @@ package azblob import ( "context" "fmt" + "github.com/Azure/azure-sdk-for-go/sdk/azcore" "net/http" "strconv" "strings" "time" - - "github.com/Azure/azure-sdk-for-go/sdk/azcore" ) type serviceClient struct { con *connection } -// Pipeline returns the pipeline associated with this client. -func (client serviceClient) Pipeline() azcore.Pipeline { - return client.con.Pipeline() -} - // FilterBlobs - The Filter Blobs operation enables callers to list blobs across all containers whose tags match a given search expression. Filter blobs // searches across all containers within a storage account but can // be scoped within the expression to a single container. -func (client serviceClient) FilterBlobs(ctx context.Context, options *ServiceFilterBlobsOptions) (FilterBlobSegmentResponse, error) { +func (client *serviceClient) FilterBlobs(ctx context.Context, options *ServiceFilterBlobsOptions) (FilterBlobSegmentResponse, error) { req, err := client.filterBlobsCreateRequest(ctx, options) if err != nil { return FilterBlobSegmentResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return FilterBlobSegmentResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return FilterBlobSegmentResponse{}, client.filterBlobsHandleError(resp) } - result, err := client.filterBlobsHandleResponse(resp) - if err != nil { - return FilterBlobSegmentResponse{}, err - } - return result, nil + return client.filterBlobsHandleResponse(resp) } // filterBlobsCreateRequest creates the FilterBlobs request. -func (client serviceClient) filterBlobsCreateRequest(ctx context.Context, options *ServiceFilterBlobsOptions) (*azcore.Request, error) { +func (client *serviceClient) filterBlobsCreateRequest(ctx context.Context, options *ServiceFilterBlobsOptions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodGet, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "blobs") + reqQP := req.URL.Query() + reqQP.Set("comp", "blobs") if options != nil && options.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } if options != nil && options.Where != nil { - query.Set("where", *options.Where) + reqQP.Set("where", *options.Where) } if options != nil && options.Marker != nil { - query.Set("marker", *options.Marker) + reqQP.Set("marker", *options.Marker) } if options != nil && options.Maxresults != nil { - query.Set("maxresults", strconv.FormatInt(int64(*options.Maxresults), 10)) + reqQP.Set("maxresults", strconv.FormatInt(int64(*options.Maxresults), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-version", "2019-12-12") - if options != nil && options.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *options.RequestId) + if options != nil && options.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *options.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // filterBlobsHandleResponse handles the FilterBlobs response. -func (client serviceClient) filterBlobsHandleResponse(resp *azcore.Response) (FilterBlobSegmentResponse, error) { - result := FilterBlobSegmentResponse{RawResponse: resp.Response} +func (client *serviceClient) filterBlobsHandleResponse(resp *azcore.Response) (FilterBlobSegmentResponse, error) { + var val *FilterBlobSegment + if err := resp.UnmarshalAsXML(&val); err != nil { + return FilterBlobSegmentResponse{}, err + } + result := FilterBlobSegmentResponse{RawResponse: resp.Response, EnumerationResults: val} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } @@ -98,13 +92,12 @@ func (client serviceClient) filterBlobsHandleResponse(resp *azcore.Response) (Fi } result.Date = &date } - err := resp.UnmarshalAsXML(&result.EnumerationResults) - return result, err + return result, nil } // filterBlobsHandleError handles the FilterBlobs error response. -func (client serviceClient) filterBlobsHandleError(resp *azcore.Response) error { - var err StorageError +func (client *serviceClient) filterBlobsHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -112,43 +105,39 @@ func (client serviceClient) filterBlobsHandleError(resp *azcore.Response) error } // GetAccountInfo - Returns the sku name and account kind -func (client serviceClient) GetAccountInfo(ctx context.Context, options *ServiceGetAccountInfoOptions) (ServiceGetAccountInfoResponse, error) { +func (client *serviceClient) GetAccountInfo(ctx context.Context, options *ServiceGetAccountInfoOptions) (ServiceGetAccountInfoResponse, error) { req, err := client.getAccountInfoCreateRequest(ctx, options) if err != nil { return ServiceGetAccountInfoResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return ServiceGetAccountInfoResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return ServiceGetAccountInfoResponse{}, client.getAccountInfoHandleError(resp) } - result, err := client.getAccountInfoHandleResponse(resp) - if err != nil { - return ServiceGetAccountInfoResponse{}, err - } - return result, nil + return client.getAccountInfoHandleResponse(resp) } // getAccountInfoCreateRequest creates the GetAccountInfo request. -func (client serviceClient) getAccountInfoCreateRequest(ctx context.Context, options *ServiceGetAccountInfoOptions) (*azcore.Request, error) { +func (client *serviceClient) getAccountInfoCreateRequest(ctx context.Context, options *ServiceGetAccountInfoOptions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodGet, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("restype", "account") - query.Set("comp", "properties") - req.URL.RawQuery = query.Encode() + reqQP := req.URL.Query() + reqQP.Set("restype", "account") + reqQP.Set("comp", "properties") + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-version", "2019-12-12") req.Header.Set("Accept", "application/xml") return req, nil } // getAccountInfoHandleResponse handles the GetAccountInfo response. -func (client serviceClient) getAccountInfoHandleResponse(resp *azcore.Response) (ServiceGetAccountInfoResponse, error) { +func (client *serviceClient) getAccountInfoHandleResponse(resp *azcore.Response) (ServiceGetAccountInfoResponse, error) { result := ServiceGetAccountInfoResponse{RawResponse: resp.Response} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val @@ -172,12 +161,19 @@ func (client serviceClient) getAccountInfoHandleResponse(resp *azcore.Response) if val := resp.Header.Get("x-ms-account-kind"); val != "" { result.AccountKind = (*AccountKind)(&val) } + if val := resp.Header.Get("x-ms-is-hns-enabled"); val != "" { + isHierarchicalNamespaceEnabled, err := strconv.ParseBool(val) + if err != nil { + return ServiceGetAccountInfoResponse{}, err + } + result.IsHierarchicalNamespaceEnabled = &isHierarchicalNamespaceEnabled + } return result, nil } // getAccountInfoHandleError handles the GetAccountInfo error response. -func (client serviceClient) getAccountInfoHandleError(resp *azcore.Response) error { - var err StorageError +func (client *serviceClient) getAccountInfoHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -186,50 +182,50 @@ func (client serviceClient) getAccountInfoHandleError(resp *azcore.Response) err // GetProperties - gets the properties of a storage account's Blob service, including properties for Storage Analytics and CORS (Cross-Origin Resource Sharing) // rules. -func (client serviceClient) GetProperties(ctx context.Context, options *ServiceGetPropertiesOptions) (StorageServicePropertiesResponse, error) { +func (client *serviceClient) GetProperties(ctx context.Context, options *ServiceGetPropertiesOptions) (StorageServicePropertiesResponse, error) { req, err := client.getPropertiesCreateRequest(ctx, options) if err != nil { return StorageServicePropertiesResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return StorageServicePropertiesResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return StorageServicePropertiesResponse{}, client.getPropertiesHandleError(resp) } - result, err := client.getPropertiesHandleResponse(resp) - if err != nil { - return StorageServicePropertiesResponse{}, err - } - return result, nil + return client.getPropertiesHandleResponse(resp) } // getPropertiesCreateRequest creates the GetProperties request. -func (client serviceClient) getPropertiesCreateRequest(ctx context.Context, options *ServiceGetPropertiesOptions) (*azcore.Request, error) { +func (client *serviceClient) getPropertiesCreateRequest(ctx context.Context, options *ServiceGetPropertiesOptions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodGet, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("restype", "service") - query.Set("comp", "properties") + reqQP := req.URL.Query() + reqQP.Set("restype", "service") + reqQP.Set("comp", "properties") if options != nil && options.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-version", "2019-12-12") - if options != nil && options.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *options.RequestId) + if options != nil && options.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *options.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // getPropertiesHandleResponse handles the GetProperties response. -func (client serviceClient) getPropertiesHandleResponse(resp *azcore.Response) (StorageServicePropertiesResponse, error) { - result := StorageServicePropertiesResponse{RawResponse: resp.Response} +func (client *serviceClient) getPropertiesHandleResponse(resp *azcore.Response) (StorageServicePropertiesResponse, error) { + var val *StorageServiceProperties + if err := resp.UnmarshalAsXML(&val); err != nil { + return StorageServicePropertiesResponse{}, err + } + result := StorageServicePropertiesResponse{RawResponse: resp.Response, StorageServiceProperties: val} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } @@ -239,13 +235,12 @@ func (client serviceClient) getPropertiesHandleResponse(resp *azcore.Response) ( if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } - err := resp.UnmarshalAsXML(&result.StorageServiceProperties) - return result, err + return result, nil } // getPropertiesHandleError handles the GetProperties error response. -func (client serviceClient) getPropertiesHandleError(resp *azcore.Response) error { - var err StorageError +func (client *serviceClient) getPropertiesHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -254,50 +249,50 @@ func (client serviceClient) getPropertiesHandleError(resp *azcore.Response) erro // GetStatistics - Retrieves statistics related to replication for the Blob service. It is only available on the secondary location endpoint when read-access // geo-redundant replication is enabled for the storage account. -func (client serviceClient) GetStatistics(ctx context.Context, options *ServiceGetStatisticsOptions) (StorageServiceStatsResponse, error) { +func (client *serviceClient) GetStatistics(ctx context.Context, options *ServiceGetStatisticsOptions) (StorageServiceStatsResponse, error) { req, err := client.getStatisticsCreateRequest(ctx, options) if err != nil { return StorageServiceStatsResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return StorageServiceStatsResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return StorageServiceStatsResponse{}, client.getStatisticsHandleError(resp) } - result, err := client.getStatisticsHandleResponse(resp) - if err != nil { - return StorageServiceStatsResponse{}, err - } - return result, nil + return client.getStatisticsHandleResponse(resp) } // getStatisticsCreateRequest creates the GetStatistics request. -func (client serviceClient) getStatisticsCreateRequest(ctx context.Context, options *ServiceGetStatisticsOptions) (*azcore.Request, error) { +func (client *serviceClient) getStatisticsCreateRequest(ctx context.Context, options *ServiceGetStatisticsOptions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodGet, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("restype", "service") - query.Set("comp", "stats") + reqQP := req.URL.Query() + reqQP.Set("restype", "service") + reqQP.Set("comp", "stats") if options != nil && options.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-version", "2019-12-12") - if options != nil && options.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *options.RequestId) + if options != nil && options.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *options.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // getStatisticsHandleResponse handles the GetStatistics response. -func (client serviceClient) getStatisticsHandleResponse(resp *azcore.Response) (StorageServiceStatsResponse, error) { - result := StorageServiceStatsResponse{RawResponse: resp.Response} +func (client *serviceClient) getStatisticsHandleResponse(resp *azcore.Response) (StorageServiceStatsResponse, error) { + var val *StorageServiceStats + if err := resp.UnmarshalAsXML(&val); err != nil { + return StorageServiceStatsResponse{}, err + } + result := StorageServiceStatsResponse{RawResponse: resp.Response, StorageServiceStats: val} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } @@ -314,13 +309,12 @@ func (client serviceClient) getStatisticsHandleResponse(resp *azcore.Response) ( } result.Date = &date } - err := resp.UnmarshalAsXML(&result.StorageServiceStats) - return result, err + return result, nil } // getStatisticsHandleError handles the GetStatistics error response. -func (client serviceClient) getStatisticsHandleError(resp *azcore.Response) error { - var err StorageError +func (client *serviceClient) getStatisticsHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -328,50 +322,50 @@ func (client serviceClient) getStatisticsHandleError(resp *azcore.Response) erro } // GetUserDelegationKey - Retrieves a user delegation key for the Blob service. This is only a valid operation when using bearer token authentication. -func (client serviceClient) GetUserDelegationKey(ctx context.Context, keyInfo KeyInfo, options *ServiceGetUserDelegationKeyOptions) (UserDelegationKeyResponse, error) { +func (client *serviceClient) GetUserDelegationKey(ctx context.Context, keyInfo KeyInfo, options *ServiceGetUserDelegationKeyOptions) (UserDelegationKeyResponse, error) { req, err := client.getUserDelegationKeyCreateRequest(ctx, keyInfo, options) if err != nil { return UserDelegationKeyResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return UserDelegationKeyResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return UserDelegationKeyResponse{}, client.getUserDelegationKeyHandleError(resp) } - result, err := client.getUserDelegationKeyHandleResponse(resp) - if err != nil { - return UserDelegationKeyResponse{}, err - } - return result, nil + return client.getUserDelegationKeyHandleResponse(resp) } // getUserDelegationKeyCreateRequest creates the GetUserDelegationKey request. -func (client serviceClient) getUserDelegationKeyCreateRequest(ctx context.Context, keyInfo KeyInfo, options *ServiceGetUserDelegationKeyOptions) (*azcore.Request, error) { +func (client *serviceClient) getUserDelegationKeyCreateRequest(ctx context.Context, keyInfo KeyInfo, options *ServiceGetUserDelegationKeyOptions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPost, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("restype", "service") - query.Set("comp", "userdelegationkey") + reqQP := req.URL.Query() + reqQP.Set("restype", "service") + reqQP.Set("comp", "userdelegationkey") if options != nil && options.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-version", "2019-12-12") - if options != nil && options.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *options.RequestId) + if options != nil && options.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *options.RequestID) } req.Header.Set("Accept", "application/xml") return req, req.MarshalAsXML(keyInfo) } // getUserDelegationKeyHandleResponse handles the GetUserDelegationKey response. -func (client serviceClient) getUserDelegationKeyHandleResponse(resp *azcore.Response) (UserDelegationKeyResponse, error) { - result := UserDelegationKeyResponse{RawResponse: resp.Response} +func (client *serviceClient) getUserDelegationKeyHandleResponse(resp *azcore.Response) (UserDelegationKeyResponse, error) { + var val *UserDelegationKey + if err := resp.UnmarshalAsXML(&val); err != nil { + return UserDelegationKeyResponse{}, err + } + result := UserDelegationKeyResponse{RawResponse: resp.Response, UserDelegationKey: val} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } @@ -388,13 +382,12 @@ func (client serviceClient) getUserDelegationKeyHandleResponse(resp *azcore.Resp } result.Date = &date } - err := resp.UnmarshalAsXML(&result.UserDelegationKey) - return result, err + return result, nil } // getUserDelegationKeyHandleError handles the GetUserDelegationKey error response. -func (client serviceClient) getUserDelegationKeyHandleError(resp *azcore.Response) error { - var err StorageError +func (client *serviceClient) getUserDelegationKeyHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -402,7 +395,7 @@ func (client serviceClient) getUserDelegationKeyHandleError(resp *azcore.Respons } // ListContainersSegment - The List Containers Segment operation returns a list of the containers under the specified account -func (client serviceClient) ListContainersSegment(options *ServiceListContainersSegmentOptions) ListContainersSegmentResponsePager { +func (client *serviceClient) ListContainersSegment(options *ServiceListContainersSegmentOptions) (ListContainersSegmentResponsePager) { return &listContainersSegmentResponsePager{ pipeline: client.con.Pipeline(), requester: func(ctx context.Context) (*azcore.Request, error) { @@ -418,41 +411,45 @@ func (client serviceClient) ListContainersSegment(options *ServiceListContainers } // listContainersSegmentCreateRequest creates the ListContainersSegment request. -func (client serviceClient) listContainersSegmentCreateRequest(ctx context.Context, options *ServiceListContainersSegmentOptions) (*azcore.Request, error) { +func (client *serviceClient) listContainersSegmentCreateRequest(ctx context.Context, options *ServiceListContainersSegmentOptions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodGet, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "list") + reqQP := req.URL.Query() + reqQP.Set("comp", "list") if options != nil && options.Prefix != nil { - query.Set("prefix", *options.Prefix) + reqQP.Set("prefix", *options.Prefix) } if options != nil && options.Marker != nil { - query.Set("marker", *options.Marker) + reqQP.Set("marker", *options.Marker) } if options != nil && options.Maxresults != nil { - query.Set("maxresults", strconv.FormatInt(int64(*options.Maxresults), 10)) + reqQP.Set("maxresults", strconv.FormatInt(int64(*options.Maxresults), 10)) } if options != nil && options.Include != nil { - query.Set("include", strings.Join(strings.Fields(strings.Trim(fmt.Sprint(*options.Include), "[]")), ",")) + reqQP.Set("include", strings.Join(strings.Fields(strings.Trim(fmt.Sprint(*options.Include), "[]")), ",")) } if options != nil && options.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-version", "2019-12-12") - if options != nil && options.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *options.RequestId) + if options != nil && options.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *options.RequestID) } req.Header.Set("Accept", "application/xml") return req, nil } // listContainersSegmentHandleResponse handles the ListContainersSegment response. -func (client serviceClient) listContainersSegmentHandleResponse(resp *azcore.Response) (ListContainersSegmentResponseResponse, error) { - result := ListContainersSegmentResponseResponse{RawResponse: resp.Response} +func (client *serviceClient) listContainersSegmentHandleResponse(resp *azcore.Response) (ListContainersSegmentResponseResponse, error) { + var val *ListContainersSegmentResponse + if err := resp.UnmarshalAsXML(&val); err != nil { + return ListContainersSegmentResponseResponse{}, err + } + result := ListContainersSegmentResponseResponse{RawResponse: resp.Response, EnumerationResults: val} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } @@ -462,13 +459,12 @@ func (client serviceClient) listContainersSegmentHandleResponse(resp *azcore.Res if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } - err := resp.UnmarshalAsXML(&result.EnumerationResults) - return result, err + return result, nil } // listContainersSegmentHandleError handles the ListContainersSegment error response. -func (client serviceClient) listContainersSegmentHandleError(resp *azcore.Response) error { - var err StorageError +func (client *serviceClient) listContainersSegmentHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -477,49 +473,45 @@ func (client serviceClient) listContainersSegmentHandleError(resp *azcore.Respon // SetProperties - Sets properties for a storage account's Blob service endpoint, including properties for Storage Analytics and CORS (Cross-Origin Resource // Sharing) rules -func (client serviceClient) SetProperties(ctx context.Context, storageServiceProperties StorageServiceProperties, options *ServiceSetPropertiesOptions) (ServiceSetPropertiesResponse, error) { +func (client *serviceClient) SetProperties(ctx context.Context, storageServiceProperties StorageServiceProperties, options *ServiceSetPropertiesOptions) (ServiceSetPropertiesResponse, error) { req, err := client.setPropertiesCreateRequest(ctx, storageServiceProperties, options) if err != nil { return ServiceSetPropertiesResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return ServiceSetPropertiesResponse{}, err } if !resp.HasStatusCode(http.StatusAccepted) { return ServiceSetPropertiesResponse{}, client.setPropertiesHandleError(resp) } - result, err := client.setPropertiesHandleResponse(resp) - if err != nil { - return ServiceSetPropertiesResponse{}, err - } - return result, nil + return client.setPropertiesHandleResponse(resp) } // setPropertiesCreateRequest creates the SetProperties request. -func (client serviceClient) setPropertiesCreateRequest(ctx context.Context, storageServiceProperties StorageServiceProperties, options *ServiceSetPropertiesOptions) (*azcore.Request, error) { +func (client *serviceClient) setPropertiesCreateRequest(ctx context.Context, storageServiceProperties StorageServiceProperties, options *ServiceSetPropertiesOptions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPut, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("restype", "service") - query.Set("comp", "properties") + reqQP := req.URL.Query() + reqQP.Set("restype", "service") + reqQP.Set("comp", "properties") if options != nil && options.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.Header.Set("x-ms-version", "2019-12-12") - if options != nil && options.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *options.RequestId) + if options != nil && options.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *options.RequestID) } req.Header.Set("Accept", "application/xml") return req, req.MarshalAsXML(storageServiceProperties) } // setPropertiesHandleResponse handles the SetProperties response. -func (client serviceClient) setPropertiesHandleResponse(resp *azcore.Response) (ServiceSetPropertiesResponse, error) { +func (client *serviceClient) setPropertiesHandleResponse(resp *azcore.Response) (ServiceSetPropertiesResponse, error) { result := ServiceSetPropertiesResponse{RawResponse: resp.Response} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val @@ -534,8 +526,8 @@ func (client serviceClient) setPropertiesHandleResponse(resp *azcore.Response) ( } // setPropertiesHandleError handles the SetProperties error response. -func (client serviceClient) setPropertiesHandleError(resp *azcore.Response) error { - var err StorageError +func (client *serviceClient) setPropertiesHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } @@ -543,51 +535,47 @@ func (client serviceClient) setPropertiesHandleError(resp *azcore.Response) erro } // SubmitBatch - The Batch operation allows multiple API calls to be embedded into a single HTTP request. -func (client serviceClient) SubmitBatch(ctx context.Context, contentLength int64, multipartContentType string, body azcore.ReadSeekCloser, options *ServiceSubmitBatchOptions) (ServiceSubmitBatchResponse, error) { +func (client *serviceClient) SubmitBatch(ctx context.Context, contentLength int64, multipartContentType string, body azcore.ReadSeekCloser, options *ServiceSubmitBatchOptions) (ServiceSubmitBatchResponse, error) { req, err := client.submitBatchCreateRequest(ctx, contentLength, multipartContentType, body, options) if err != nil { return ServiceSubmitBatchResponse{}, err } - resp, err := client.Pipeline().Do(req) + resp, err := client.con.Pipeline().Do(req) if err != nil { return ServiceSubmitBatchResponse{}, err } if !resp.HasStatusCode(http.StatusOK) { return ServiceSubmitBatchResponse{}, client.submitBatchHandleError(resp) } - result, err := client.submitBatchHandleResponse(resp) - if err != nil { - return ServiceSubmitBatchResponse{}, err - } - return result, nil + return client.submitBatchHandleResponse(resp) } // submitBatchCreateRequest creates the SubmitBatch request. -func (client serviceClient) submitBatchCreateRequest(ctx context.Context, contentLength int64, multipartContentType string, body azcore.ReadSeekCloser, options *ServiceSubmitBatchOptions) (*azcore.Request, error) { +func (client *serviceClient) submitBatchCreateRequest(ctx context.Context, contentLength int64, multipartContentType string, body azcore.ReadSeekCloser, options *ServiceSubmitBatchOptions) (*azcore.Request, error) { req, err := azcore.NewRequest(ctx, http.MethodPost, client.con.Endpoint()) if err != nil { return nil, err } req.Telemetry(telemetryInfo) - query := req.URL.Query() - query.Set("comp", "batch") + reqQP := req.URL.Query() + reqQP.Set("comp", "batch") if options != nil && options.Timeout != nil { - query.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) + reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } - req.URL.RawQuery = query.Encode() + req.URL.RawQuery = reqQP.Encode() req.SkipBodyDownload() req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) req.Header.Set("Content-Type", multipartContentType) req.Header.Set("x-ms-version", "2019-12-12") - if options != nil && options.RequestId != nil { - req.Header.Set("x-ms-client-request-id", *options.RequestId) + if options != nil && options.RequestID != nil { + req.Header.Set("x-ms-client-request-id", *options.RequestID) } req.Header.Set("Accept", "application/xml") return req, req.MarshalAsXML(body) } // submitBatchHandleResponse handles the SubmitBatch response. -func (client serviceClient) submitBatchHandleResponse(resp *azcore.Response) (ServiceSubmitBatchResponse, error) { +func (client *serviceClient) submitBatchHandleResponse(resp *azcore.Response) (ServiceSubmitBatchResponse, error) { result := ServiceSubmitBatchResponse{RawResponse: resp.Response} if val := resp.Header.Get("Content-Type"); val != "" { result.ContentType = &val @@ -602,10 +590,11 @@ func (client serviceClient) submitBatchHandleResponse(resp *azcore.Response) (Se } // submitBatchHandleError handles the SubmitBatch error response. -func (client serviceClient) submitBatchHandleError(resp *azcore.Response) error { - var err StorageError +func (client *serviceClient) submitBatchHandleError(resp *azcore.Response) error { +var err StorageError if err := resp.UnmarshalAsXML(&err); err != nil { return err } return azcore.NewResponseError(&err, resp.Response) } + diff --git a/sdk/storage/azblob/zz_generated_time_rfc1123.go b/sdk/storage/azblob/zz_generated_time_rfc1123.go index c63893f602d4..497782ddbf88 100644 --- a/sdk/storage/azblob/zz_generated_time_rfc1123.go +++ b/sdk/storage/azblob/zz_generated_time_rfc1123.go @@ -7,6 +7,8 @@ package azblob + + import ( "strings" "time" diff --git a/sdk/storage/azblob/zz_generated_time_rfc3339.go b/sdk/storage/azblob/zz_generated_time_rfc3339.go index 031b634bf19c..71c91931d0c4 100644 --- a/sdk/storage/azblob/zz_generated_time_rfc3339.go +++ b/sdk/storage/azblob/zz_generated_time_rfc3339.go @@ -7,6 +7,8 @@ package azblob + + import ( "regexp" "strings" diff --git a/sdk/storage/azblob/zz_generated_xml_helper.go b/sdk/storage/azblob/zz_generated_xml_helper.go index 101ed21f08b4..97d2cec27f40 100644 --- a/sdk/storage/azblob/zz_generated_xml_helper.go +++ b/sdk/storage/azblob/zz_generated_xml_helper.go @@ -12,7 +12,8 @@ import ( "strings" ) -type additionalProperties map[string]string + +type additionalProperties map[string]*string // UnmarshalXML implements the xml.Unmarshaler interface for additionalProperties. func (ap *additionalProperties) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { @@ -29,7 +30,8 @@ func (ap *additionalProperties) UnmarshalXML(d *xml.Decoder, start xml.StartElem if *ap == nil { *ap = additionalProperties{} } - (*ap)[tokName] = string(tt) + s := string(tt) + (*ap)[tokName] = &s tokName = "" break }