From 27c921bf76b36a0a3ef5a012876d60abb50e3946 Mon Sep 17 00:00:00 2001 From: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Date: Tue, 14 Feb 2023 21:58:52 -0500 Subject: [PATCH 01/18] PutBlobFromUrl --- sdk/storage/azblob/assets.json | 2 +- sdk/storage/azblob/blockblob/client.go | 14 +++ sdk/storage/azblob/blockblob/client_test.go | 107 ++++++++++++++++++++ sdk/storage/azblob/blockblob/models.go | 53 ++++++++++ sdk/storage/azblob/blockblob/responses.go | 3 + 5 files changed, 178 insertions(+), 1 deletion(-) diff --git a/sdk/storage/azblob/assets.json b/sdk/storage/azblob/assets.json index 11783d2a84b4..5376dd0a33da 100644 --- a/sdk/storage/azblob/assets.json +++ b/sdk/storage/azblob/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "go", "TagPrefix": "go/storage/azblob", - "Tag": "go/storage/azblob_658d0bdec9" + "Tag": "go/storage/azblob_3634e6acc9" } diff --git a/sdk/storage/azblob/blockblob/client.go b/sdk/storage/azblob/blockblob/client.go index 64a86659a782..db14e271cfef 100644 --- a/sdk/storage/azblob/blockblob/client.go +++ b/sdk/storage/azblob/blockblob/client.go @@ -165,6 +165,20 @@ func (bb *Client) Upload(ctx context.Context, body io.ReadSeekCloser, options *U return resp, err } +// PutBlobFromURL - The Put Blob from URL operation creates a new Block Blob where the contents of the blob are read from +// a given URL. Partial updates are not supported with Put Blob from URL; the content of an existing blob is overwritten +// with the content of the new blob. To perform partial updates to a block blob’s contents using a source URL, use the Put +// Block from URL API in conjunction with Put Block List. +// For more information, see https://learn.microsoft.com/rest/api/storageservices/put-blob-from-url +func (bb *Client) PutBlobFromURL(ctx context.Context, contentLength int64, copySource string, options *PutBlobFromURLOptions) (PutBlobFromURLResponse, error) { + opts, httpHeaders, leaseAccessConditions, cpkInfo, cpkSourceInfo, modifiedAccessConditions, sourceModifiedConditions := options.format() + + resp, err := bb.generated().PutBlobFromURL(ctx, contentLength, copySource, opts, httpHeaders, leaseAccessConditions, + cpkInfo, cpkSourceInfo, modifiedAccessConditions, sourceModifiedConditions) + + return resp, err +} + // StageBlock uploads the specified block to the block blob's "staging area" to be later committed by a call to CommitBlockList. // Note that the http client closes the body stream after the request is sent to the service. // For more information, see https://docs.microsoft.com/rest/api/storageservices/put-block. diff --git a/sdk/storage/azblob/blockblob/client_test.go b/sdk/storage/azblob/blockblob/client_test.go index 346b3f51ac8b..0fff6a7a120a 100644 --- a/sdk/storage/azblob/blockblob/client_test.go +++ b/sdk/storage/azblob/blockblob/client_test.go @@ -586,6 +586,113 @@ func (s *BlockBlobRecordedTestsSuite) TestUploadBlockWithImmutabilityPolicy() { _require.Nil(err) } +func (s *BlockBlobRecordedTestsSuite) TestBlobPutBlobURL() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + containerName := testcommon.GenerateContainerName(testName) + containerClient := testcommon.CreateNewContainer(context.Background(), _require, containerName, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + srcBlob := testcommon.GenerateBlobName(testName) + srcBBClient := testcommon.CreateNewBlockBlob(context.Background(), _require, srcBlob, containerClient) + + dest := testcommon.GenerateBlobName(testName) + destBBClient := testcommon.CreateNewBlockBlob(context.Background(), _require, dest, containerClient) + + content := make([]byte, 0) + body := bytes.NewReader(content) + + _, err = srcBBClient.Upload(context.Background(), streaming.NopCloser(body), nil) + _require.Nil(err) + + expiryTime, err := time.Parse(time.UnixDate, "Fri Jun 11 20:00:00 UTC 2049") + _require.Nil(err) + + credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) + if err != nil { + s.T().Fatal("Couldn't fetch credential because " + err.Error()) + } + + sasQueryParams, err := sas.AccountSignatureValues{ + Protocol: sas.ProtocolHTTPS, + ExpiryTime: expiryTime, + Permissions: to.Ptr(sas.AccountPermissions{Read: true, List: true}).String(), + ResourceTypes: to.Ptr(sas.AccountResourceTypes{Container: true, Object: true}).String(), + }.SignWithSharedKey(credential) + _require.Nil(err) + + srcBlobParts, _ := blob.ParseURL(srcBBClient.URL()) + srcBlobParts.SAS = sasQueryParams + srcBlobURLWithSAS := srcBlobParts.String() + + _, err = destBBClient.PutBlobFromURL(context.Background(), int64(len(content)), srcBlobURLWithSAS, &blockblob.PutBlobFromURLOptions{HTTPHeaders: &testcommon.BasicHeaders}) + _require.Nil(err) +} + +func (s *BlockBlobRecordedTestsSuite) TestBlobPutBlobURLWithHeaders() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + containerName := testcommon.GenerateContainerName(testName) + containerClient := testcommon.CreateNewContainer(context.Background(), _require, containerName, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + srcBlob := testcommon.GenerateBlobName(testName) + srcBBClient := testcommon.CreateNewBlockBlob(context.Background(), _require, srcBlob, containerClient) + + dest := testcommon.GenerateBlobName(testName) + destBBClient := testcommon.CreateNewBlockBlob(context.Background(), _require, dest, containerClient) + + content := make([]byte, 0) + body := bytes.NewReader(content) + + _, err = srcBBClient.Upload(context.Background(), streaming.NopCloser(body), &blockblob.UploadOptions{ + HTTPHeaders: &testcommon.BasicHeaders, + }) + _require.Nil(err) + + resp, err := srcBBClient.GetProperties(context.Background(), nil) + _require.Nil(err) + h := blob.ParseHTTPHeaders(resp) + h.BlobContentMD5 = nil // the service generates a MD5 value, omit before comparing + _require.EqualValues(h, testcommon.BasicHeaders) + + // Get source blob url with SAS for PutBlobFromURL. + expiryTime, err := time.Parse(time.UnixDate, "Fri Jun 11 20:00:00 UTC 2049") + _require.Nil(err) + + credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) + if err != nil { + s.T().Fatal("Couldn't fetch credential because " + err.Error()) + } + + sasQueryParams, err := sas.AccountSignatureValues{ + Protocol: sas.ProtocolHTTPS, + ExpiryTime: expiryTime, + Permissions: to.Ptr(sas.AccountPermissions{Read: true, List: true}).String(), + ResourceTypes: to.Ptr(sas.AccountResourceTypes{Container: true, Object: true}).String(), + }.SignWithSharedKey(credential) + _require.Nil(err) + + srcBlobParts, _ := blob.ParseURL(srcBBClient.URL()) + srcBlobParts.SAS = sasQueryParams + srcBlobURLWithSAS := srcBlobParts.String() + + _, err = destBBClient.PutBlobFromURL(context.Background(), int64(len(content)), srcBlobURLWithSAS, &blockblob.PutBlobFromURLOptions{HTTPHeaders: &testcommon.BasicHeaders}) + _require.Nil(err) + + resp, err = destBBClient.GetProperties(context.Background(), nil) + _require.Nil(err) + h = blob.ParseHTTPHeaders(resp) + h.BlobContentMD5 = nil // the service generates a MD5 value, omit before comparing + _require.EqualValues(h, testcommon.BasicHeaders) +} + func (s *BlockBlobRecordedTestsSuite) TestPutBlockListWithImmutabilityPolicy() { _require := require.New(s.T()) testName := s.T().Name() diff --git a/sdk/storage/azblob/blockblob/models.go b/sdk/storage/azblob/blockblob/models.go index 3da15aab99df..7f6677852d78 100644 --- a/sdk/storage/azblob/blockblob/models.go +++ b/sdk/storage/azblob/blockblob/models.go @@ -70,6 +70,59 @@ func (o *UploadOptions) format() (*generated.BlockBlobClientUploadOptions, *gene // --------------------------------------------------------------------------------------------------------------------- +// PutBlobFromURLOptions contains the optional parameters for the Client.PutBlobFromURL method. +type PutBlobFromURLOptions struct { + // Optional. Used to set blob tags in various blob operations. + Tags map[string]string + + // Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source. + CopySourceAuthorization *string + + // Optional, default is true. Indicates if properties from the source blob should be copied. + CopySourceBlobProperties *bool + + // Optional. Specifies a user-defined name-value pair associated with the blob. + Metadata map[string]*string + + // Specify the md5 calculated for the range of bytes that must be read from the copy source. + SourceContentMD5 []byte + + // Optional. Indicates the tier to be set on the blob. + Tier *blob.AccessTier + + // Specify the transactional md5 for the body, to be validated by the service. + TransactionalContentMD5 []byte + + HTTPHeaders *blob.HTTPHeaders + AccessConditions *blob.AccessConditions + CPKInfo *blob.CPKInfo + CPKScopeInfo *blob.CPKScopeInfo + SourceModifiedAccessConditions *blob.SourceModifiedAccessConditions +} + +func (o *PutBlobFromURLOptions) format() (*generated.BlockBlobClientPutBlobFromURLOptions, *generated.BlobHTTPHeaders, + *generated.LeaseAccessConditions, *generated.CPKInfo, *generated.CPKScopeInfo, *generated.ModifiedAccessConditions, + *generated.SourceModifiedAccessConditions) { + if o == nil { + return nil, nil, nil, nil, nil, nil, nil + } + + options := generated.BlockBlobClientPutBlobFromURLOptions{ + BlobTagsString: shared.SerializeBlobTagsToStrPtr(o.Tags), + CopySourceAuthorization: o.CopySourceAuthorization, + CopySourceBlobProperties: o.CopySourceBlobProperties, + Metadata: o.Metadata, + SourceContentMD5: o.SourceContentMD5, + Tier: o.Tier, + TransactionalContentMD5: o.TransactionalContentMD5, + } + + leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) + return &options, o.HTTPHeaders, leaseAccessConditions, o.CPKInfo, o.CPKScopeInfo, modifiedAccessConditions, o.SourceModifiedAccessConditions +} + +// --------------------------------------------------------------------------------------------------------------------- + // StageBlockOptions contains the optional parameters for the Client.StageBlock method. type StageBlockOptions struct { CPKInfo *blob.CPKInfo diff --git a/sdk/storage/azblob/blockblob/responses.go b/sdk/storage/azblob/blockblob/responses.go index 00093ec1a75c..80ece75bf01b 100644 --- a/sdk/storage/azblob/blockblob/responses.go +++ b/sdk/storage/azblob/blockblob/responses.go @@ -16,6 +16,9 @@ import ( // UploadResponse contains the response from method Client.Upload. type UploadResponse = generated.BlockBlobClientUploadResponse +// PutBlobFromURLResponse contains the response from the method Client.PutBlobFromURL +type PutBlobFromURLResponse = generated.BlockBlobClientPutBlobFromURLResponse + // StageBlockResponse contains the response from method Client.StageBlock. type StageBlockResponse = generated.BlockBlobClientStageBlockResponse From eb5a9dac3a1ad146ac8eac0bea3997c3f2b77226 Mon Sep 17 00:00:00 2001 From: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Date: Tue, 14 Feb 2023 22:02:03 -0500 Subject: [PATCH 02/18] CHANGELOG.md update --- sdk/storage/azblob/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/storage/azblob/CHANGELOG.md b/sdk/storage/azblob/CHANGELOG.md index b9828cdf0a93..b99a4a67cb3e 100644 --- a/sdk/storage/azblob/CHANGELOG.md +++ b/sdk/storage/azblob/CHANGELOG.md @@ -3,6 +3,7 @@ ## 1.0.1 (Unreleased) ### Features Added +* Added PutBlobFromURL API. For more information view [here](https://learn.microsoft.com/rest/api/storageservices/put-blob-from-url). ### Breaking Changes From ca45bb5a9798afe26f9b2a042b2a91c2f88ef502 Mon Sep 17 00:00:00 2001 From: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Date: Wed, 15 Feb 2023 12:08:13 -0500 Subject: [PATCH 03/18] Fixing params for PutBlobFromUrl --- sdk/storage/azblob/assets.json | 2 +- sdk/storage/azblob/blockblob/client.go | 3 ++- sdk/storage/azblob/blockblob/client_test.go | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/sdk/storage/azblob/assets.json b/sdk/storage/azblob/assets.json index 5376dd0a33da..36f70cfcfc4a 100644 --- a/sdk/storage/azblob/assets.json +++ b/sdk/storage/azblob/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "go", "TagPrefix": "go/storage/azblob", - "Tag": "go/storage/azblob_3634e6acc9" + "Tag": "go/storage/azblob_3798a46206" } diff --git a/sdk/storage/azblob/blockblob/client.go b/sdk/storage/azblob/blockblob/client.go index db14e271cfef..8f78849ba89d 100644 --- a/sdk/storage/azblob/blockblob/client.go +++ b/sdk/storage/azblob/blockblob/client.go @@ -170,9 +170,10 @@ func (bb *Client) Upload(ctx context.Context, body io.ReadSeekCloser, options *U // with the content of the new blob. To perform partial updates to a block blob’s contents using a source URL, use the Put // Block from URL API in conjunction with Put Block List. // For more information, see https://learn.microsoft.com/rest/api/storageservices/put-blob-from-url -func (bb *Client) PutBlobFromURL(ctx context.Context, contentLength int64, copySource string, options *PutBlobFromURLOptions) (PutBlobFromURLResponse, error) { +func (bb *Client) PutBlobFromURL(ctx context.Context, copySource string, options *PutBlobFromURLOptions) (PutBlobFromURLResponse, error) { opts, httpHeaders, leaseAccessConditions, cpkInfo, cpkSourceInfo, modifiedAccessConditions, sourceModifiedConditions := options.format() + contentLength := int64(0) resp, err := bb.generated().PutBlobFromURL(ctx, contentLength, copySource, opts, httpHeaders, leaseAccessConditions, cpkInfo, cpkSourceInfo, modifiedAccessConditions, sourceModifiedConditions) diff --git a/sdk/storage/azblob/blockblob/client_test.go b/sdk/storage/azblob/blockblob/client_test.go index 0fff6a7a120a..07eeeb706005 100644 --- a/sdk/storage/azblob/blockblob/client_test.go +++ b/sdk/storage/azblob/blockblob/client_test.go @@ -628,7 +628,7 @@ func (s *BlockBlobRecordedTestsSuite) TestBlobPutBlobURL() { srcBlobParts.SAS = sasQueryParams srcBlobURLWithSAS := srcBlobParts.String() - _, err = destBBClient.PutBlobFromURL(context.Background(), int64(len(content)), srcBlobURLWithSAS, &blockblob.PutBlobFromURLOptions{HTTPHeaders: &testcommon.BasicHeaders}) + _, err = destBBClient.PutBlobFromURL(context.Background(), srcBlobURLWithSAS, &blockblob.PutBlobFromURLOptions{HTTPHeaders: &testcommon.BasicHeaders}) _require.Nil(err) } @@ -683,7 +683,7 @@ func (s *BlockBlobRecordedTestsSuite) TestBlobPutBlobURLWithHeaders() { srcBlobParts.SAS = sasQueryParams srcBlobURLWithSAS := srcBlobParts.String() - _, err = destBBClient.PutBlobFromURL(context.Background(), int64(len(content)), srcBlobURLWithSAS, &blockblob.PutBlobFromURLOptions{HTTPHeaders: &testcommon.BasicHeaders}) + _, err = destBBClient.PutBlobFromURL(context.Background(), srcBlobURLWithSAS, &blockblob.PutBlobFromURLOptions{HTTPHeaders: &testcommon.BasicHeaders}) _require.Nil(err) resp, err = destBBClient.GetProperties(context.Background(), nil) From 6b366545da7ad06f13d9c84a189276d3ebe3130f Mon Sep 17 00:00:00 2001 From: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Date: Wed, 15 Feb 2023 16:43:31 -0500 Subject: [PATCH 04/18] Updating tests --- sdk/storage/azblob/assets.json | 2 +- sdk/storage/azblob/blockblob/client_test.go | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/sdk/storage/azblob/assets.json b/sdk/storage/azblob/assets.json index 36f70cfcfc4a..136ce0582aa2 100644 --- a/sdk/storage/azblob/assets.json +++ b/sdk/storage/azblob/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "go", "TagPrefix": "go/storage/azblob", - "Tag": "go/storage/azblob_3798a46206" + "Tag": "go/storage/azblob_f97b4c62a1" } diff --git a/sdk/storage/azblob/blockblob/client_test.go b/sdk/storage/azblob/blockblob/client_test.go index 07eeeb706005..47135e811f21 100644 --- a/sdk/storage/azblob/blockblob/client_test.go +++ b/sdk/storage/azblob/blockblob/client_test.go @@ -586,7 +586,7 @@ func (s *BlockBlobRecordedTestsSuite) TestUploadBlockWithImmutabilityPolicy() { _require.Nil(err) } -func (s *BlockBlobRecordedTestsSuite) TestBlobPutBlobURL() { +func (s *BlockBlobRecordedTestsSuite) TestBlobPutBlobFromURL() { _require := require.New(s.T()) testName := s.T().Name() svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) @@ -628,11 +628,12 @@ func (s *BlockBlobRecordedTestsSuite) TestBlobPutBlobURL() { srcBlobParts.SAS = sasQueryParams srcBlobURLWithSAS := srcBlobParts.String() - _, err = destBBClient.PutBlobFromURL(context.Background(), srcBlobURLWithSAS, &blockblob.PutBlobFromURLOptions{HTTPHeaders: &testcommon.BasicHeaders}) + pbResp, err := destBBClient.PutBlobFromURL(context.Background(), srcBlobURLWithSAS, &blockblob.PutBlobFromURLOptions{HTTPHeaders: &testcommon.BasicHeaders}) + _require.NotNil(pbResp) _require.Nil(err) } -func (s *BlockBlobRecordedTestsSuite) TestBlobPutBlobURLWithHeaders() { +func (s *BlockBlobRecordedTestsSuite) TestBlobPutBlobFromURLWithHeaders() { _require := require.New(s.T()) testName := s.T().Name() svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) @@ -683,7 +684,8 @@ func (s *BlockBlobRecordedTestsSuite) TestBlobPutBlobURLWithHeaders() { srcBlobParts.SAS = sasQueryParams srcBlobURLWithSAS := srcBlobParts.String() - _, err = destBBClient.PutBlobFromURL(context.Background(), srcBlobURLWithSAS, &blockblob.PutBlobFromURLOptions{HTTPHeaders: &testcommon.BasicHeaders}) + pbResp, err := destBBClient.PutBlobFromURL(context.Background(), srcBlobURLWithSAS, &blockblob.PutBlobFromURLOptions{HTTPHeaders: &testcommon.BasicHeaders}) + _require.NotNil(pbResp) _require.Nil(err) resp, err = destBBClient.GetProperties(context.Background(), nil) From 34f9d8319e04ce553483650ff03c84ff31660bd8 Mon Sep 17 00:00:00 2001 From: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Date: Wed, 15 Feb 2023 18:35:36 -0500 Subject: [PATCH 05/18] Tests --- sdk/storage/azblob/assets.json | 2 +- sdk/storage/azblob/blockblob/client_test.go | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/sdk/storage/azblob/assets.json b/sdk/storage/azblob/assets.json index 136ce0582aa2..d19bc657ebf5 100644 --- a/sdk/storage/azblob/assets.json +++ b/sdk/storage/azblob/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "go", "TagPrefix": "go/storage/azblob", - "Tag": "go/storage/azblob_f97b4c62a1" + "Tag": "go/storage/azblob_b4f3180962" } diff --git a/sdk/storage/azblob/blockblob/client_test.go b/sdk/storage/azblob/blockblob/client_test.go index 47135e811f21..45becddf4f6d 100644 --- a/sdk/storage/azblob/blockblob/client_test.go +++ b/sdk/storage/azblob/blockblob/client_test.go @@ -630,7 +630,11 @@ func (s *BlockBlobRecordedTestsSuite) TestBlobPutBlobFromURL() { pbResp, err := destBBClient.PutBlobFromURL(context.Background(), srcBlobURLWithSAS, &blockblob.PutBlobFromURLOptions{HTTPHeaders: &testcommon.BasicHeaders}) _require.NotNil(pbResp) - _require.Nil(err) + _require.NoError(err) + + resp, err := srcBBClient.GetProperties(context.Background(), nil) + _require.NoError(err) + _require.Equal(resp.ETag, pbResp.ETag) } func (s *BlockBlobRecordedTestsSuite) TestBlobPutBlobFromURLWithHeaders() { @@ -686,10 +690,10 @@ func (s *BlockBlobRecordedTestsSuite) TestBlobPutBlobFromURLWithHeaders() { pbResp, err := destBBClient.PutBlobFromURL(context.Background(), srcBlobURLWithSAS, &blockblob.PutBlobFromURLOptions{HTTPHeaders: &testcommon.BasicHeaders}) _require.NotNil(pbResp) - _require.Nil(err) + _require.NoError(err) resp, err = destBBClient.GetProperties(context.Background(), nil) - _require.Nil(err) + _require.NoError(err) h = blob.ParseHTTPHeaders(resp) h.BlobContentMD5 = nil // the service generates a MD5 value, omit before comparing _require.EqualValues(h, testcommon.BasicHeaders) From 39eb0ebf0aacf90fe62c7f8be6205a479a8f06d0 Mon Sep 17 00:00:00 2001 From: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Date: Wed, 15 Feb 2023 20:12:45 -0500 Subject: [PATCH 06/18] Tests, again... --- sdk/storage/azblob/blockblob/client_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/storage/azblob/blockblob/client_test.go b/sdk/storage/azblob/blockblob/client_test.go index 45becddf4f6d..fcc29a56a377 100644 --- a/sdk/storage/azblob/blockblob/client_test.go +++ b/sdk/storage/azblob/blockblob/client_test.go @@ -586,7 +586,7 @@ func (s *BlockBlobRecordedTestsSuite) TestUploadBlockWithImmutabilityPolicy() { _require.Nil(err) } -func (s *BlockBlobRecordedTestsSuite) TestBlobPutBlobFromURL() { +func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURL() { _require := require.New(s.T()) testName := s.T().Name() svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) @@ -637,7 +637,7 @@ func (s *BlockBlobRecordedTestsSuite) TestBlobPutBlobFromURL() { _require.Equal(resp.ETag, pbResp.ETag) } -func (s *BlockBlobRecordedTestsSuite) TestBlobPutBlobFromURLWithHeaders() { +func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURLWithHeaders() { _require := require.New(s.T()) testName := s.T().Name() svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) From af2f42e1e0dbc9ffe3d2471d092d420a8f98a790 Mon Sep 17 00:00:00 2001 From: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Date: Thu, 16 Feb 2023 11:44:43 -0500 Subject: [PATCH 07/18] Changing API details --- sdk/storage/azblob/blockblob/client.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sdk/storage/azblob/blockblob/client.go b/sdk/storage/azblob/blockblob/client.go index 8f78849ba89d..18737cb9793c 100644 --- a/sdk/storage/azblob/blockblob/client.go +++ b/sdk/storage/azblob/blockblob/client.go @@ -173,8 +173,7 @@ func (bb *Client) Upload(ctx context.Context, body io.ReadSeekCloser, options *U func (bb *Client) PutBlobFromURL(ctx context.Context, copySource string, options *PutBlobFromURLOptions) (PutBlobFromURLResponse, error) { opts, httpHeaders, leaseAccessConditions, cpkInfo, cpkSourceInfo, modifiedAccessConditions, sourceModifiedConditions := options.format() - contentLength := int64(0) - resp, err := bb.generated().PutBlobFromURL(ctx, contentLength, copySource, opts, httpHeaders, leaseAccessConditions, + resp, err := bb.generated().PutBlobFromURL(ctx, int64(0), copySource, opts, httpHeaders, leaseAccessConditions, cpkInfo, cpkSourceInfo, modifiedAccessConditions, sourceModifiedConditions) return resp, err From 869bacbdf8be110ccc3c42c18976cb15bcfa25d1 Mon Sep 17 00:00:00 2001 From: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Date: Tue, 21 Feb 2023 17:28:14 -0500 Subject: [PATCH 08/18] Changing name of API --- sdk/storage/azblob/CHANGELOG.md | 2 +- sdk/storage/azblob/blockblob/client.go | 4 ++-- sdk/storage/azblob/blockblob/client_test.go | 6 +++--- sdk/storage/azblob/blockblob/models.go | 6 +++--- sdk/storage/azblob/blockblob/responses.go | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sdk/storage/azblob/CHANGELOG.md b/sdk/storage/azblob/CHANGELOG.md index b99a4a67cb3e..d7974a452ffd 100644 --- a/sdk/storage/azblob/CHANGELOG.md +++ b/sdk/storage/azblob/CHANGELOG.md @@ -3,7 +3,7 @@ ## 1.0.1 (Unreleased) ### Features Added -* Added PutBlobFromURL API. For more information view [here](https://learn.microsoft.com/rest/api/storageservices/put-blob-from-url). +* UploadBlobFromURL API. For more information view [here](https://learn.microsoft.com/rest/api/storageservices/put-blob-from-url). ### Breaking Changes diff --git a/sdk/storage/azblob/blockblob/client.go b/sdk/storage/azblob/blockblob/client.go index 18737cb9793c..b2cf0c7cf02e 100644 --- a/sdk/storage/azblob/blockblob/client.go +++ b/sdk/storage/azblob/blockblob/client.go @@ -165,12 +165,12 @@ func (bb *Client) Upload(ctx context.Context, body io.ReadSeekCloser, options *U return resp, err } -// PutBlobFromURL - The Put Blob from URL operation creates a new Block Blob where the contents of the blob are read from +// UploadBlobFromURL - The Put Blob from URL operation creates a new Block Blob where the contents of the blob are read from // a given URL. Partial updates are not supported with Put Blob from URL; the content of an existing blob is overwritten // with the content of the new blob. To perform partial updates to a block blob’s contents using a source URL, use the Put // Block from URL API in conjunction with Put Block List. // For more information, see https://learn.microsoft.com/rest/api/storageservices/put-blob-from-url -func (bb *Client) PutBlobFromURL(ctx context.Context, copySource string, options *PutBlobFromURLOptions) (PutBlobFromURLResponse, error) { +func (bb *Client) UploadBlobFromURL(ctx context.Context, copySource string, options *UploadBlobFromURLOptions) (UploadBlobFromURLResponse, error) { opts, httpHeaders, leaseAccessConditions, cpkInfo, cpkSourceInfo, modifiedAccessConditions, sourceModifiedConditions := options.format() resp, err := bb.generated().PutBlobFromURL(ctx, int64(0), copySource, opts, httpHeaders, leaseAccessConditions, diff --git a/sdk/storage/azblob/blockblob/client_test.go b/sdk/storage/azblob/blockblob/client_test.go index fcc29a56a377..cd685a20c179 100644 --- a/sdk/storage/azblob/blockblob/client_test.go +++ b/sdk/storage/azblob/blockblob/client_test.go @@ -628,7 +628,7 @@ func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURL() { srcBlobParts.SAS = sasQueryParams srcBlobURLWithSAS := srcBlobParts.String() - pbResp, err := destBBClient.PutBlobFromURL(context.Background(), srcBlobURLWithSAS, &blockblob.PutBlobFromURLOptions{HTTPHeaders: &testcommon.BasicHeaders}) + pbResp, err := destBBClient.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &blockblob.UploadBlobFromURLOptions{HTTPHeaders: &testcommon.BasicHeaders}) _require.NotNil(pbResp) _require.NoError(err) @@ -667,7 +667,7 @@ func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURLWithHeaders() { h.BlobContentMD5 = nil // the service generates a MD5 value, omit before comparing _require.EqualValues(h, testcommon.BasicHeaders) - // Get source blob url with SAS for PutBlobFromURL. + // Get source blob url with SAS for UploadBlobFromURL. expiryTime, err := time.Parse(time.UnixDate, "Fri Jun 11 20:00:00 UTC 2049") _require.Nil(err) @@ -688,7 +688,7 @@ func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURLWithHeaders() { srcBlobParts.SAS = sasQueryParams srcBlobURLWithSAS := srcBlobParts.String() - pbResp, err := destBBClient.PutBlobFromURL(context.Background(), srcBlobURLWithSAS, &blockblob.PutBlobFromURLOptions{HTTPHeaders: &testcommon.BasicHeaders}) + pbResp, err := destBBClient.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &blockblob.UploadBlobFromURLOptions{HTTPHeaders: &testcommon.BasicHeaders}) _require.NotNil(pbResp) _require.NoError(err) diff --git a/sdk/storage/azblob/blockblob/models.go b/sdk/storage/azblob/blockblob/models.go index 7f6677852d78..c3b65d378f69 100644 --- a/sdk/storage/azblob/blockblob/models.go +++ b/sdk/storage/azblob/blockblob/models.go @@ -70,8 +70,8 @@ func (o *UploadOptions) format() (*generated.BlockBlobClientUploadOptions, *gene // --------------------------------------------------------------------------------------------------------------------- -// PutBlobFromURLOptions contains the optional parameters for the Client.PutBlobFromURL method. -type PutBlobFromURLOptions struct { +// UploadBlobFromURLOptions contains the optional parameters for the Client.UploadBlobFromURL method. +type UploadBlobFromURLOptions struct { // Optional. Used to set blob tags in various blob operations. Tags map[string]string @@ -100,7 +100,7 @@ type PutBlobFromURLOptions struct { SourceModifiedAccessConditions *blob.SourceModifiedAccessConditions } -func (o *PutBlobFromURLOptions) format() (*generated.BlockBlobClientPutBlobFromURLOptions, *generated.BlobHTTPHeaders, +func (o *UploadBlobFromURLOptions) format() (*generated.BlockBlobClientPutBlobFromURLOptions, *generated.BlobHTTPHeaders, *generated.LeaseAccessConditions, *generated.CPKInfo, *generated.CPKScopeInfo, *generated.ModifiedAccessConditions, *generated.SourceModifiedAccessConditions) { if o == nil { diff --git a/sdk/storage/azblob/blockblob/responses.go b/sdk/storage/azblob/blockblob/responses.go index 80ece75bf01b..917f71809779 100644 --- a/sdk/storage/azblob/blockblob/responses.go +++ b/sdk/storage/azblob/blockblob/responses.go @@ -16,8 +16,8 @@ import ( // UploadResponse contains the response from method Client.Upload. type UploadResponse = generated.BlockBlobClientUploadResponse -// PutBlobFromURLResponse contains the response from the method Client.PutBlobFromURL -type PutBlobFromURLResponse = generated.BlockBlobClientPutBlobFromURLResponse +// UploadBlobFromURLResponse contains the response from the method Client.UploadBlobFromURL +type UploadBlobFromURLResponse = generated.BlockBlobClientPutBlobFromURLResponse // StageBlockResponse contains the response from method Client.StageBlock. type StageBlockResponse = generated.BlockBlobClientStageBlockResponse From 9301d616b70094881565f17fc0e6e30404252da5 Mon Sep 17 00:00:00 2001 From: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Date: Thu, 2 Mar 2023 21:16:05 -0500 Subject: [PATCH 09/18] Clean up current tests --- sdk/storage/azblob/blockblob/client_test.go | 52 +++++++-------------- 1 file changed, 16 insertions(+), 36 deletions(-) diff --git a/sdk/storage/azblob/blockblob/client_test.go b/sdk/storage/azblob/blockblob/client_test.go index cd685a20c179..ea6fe0b3a4b5 100644 --- a/sdk/storage/azblob/blockblob/client_test.go +++ b/sdk/storage/azblob/blockblob/client_test.go @@ -586,12 +586,7 @@ func (s *BlockBlobRecordedTestsSuite) TestUploadBlockWithImmutabilityPolicy() { _require.Nil(err) } -func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURL() { - _require := require.New(s.T()) - testName := s.T().Name() - svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) - _require.NoError(err) - +func setUpPutBlobFromURLTest(testName string, _require *require.Assertions, svcClient *service.Client) (*blockblob.Client, *blockblob.Client, *bytes.Reader, time.Time) { containerName := testcommon.GenerateContainerName(testName) containerClient := testcommon.CreateNewContainer(context.Background(), _require, containerName, svcClient) defer testcommon.DeleteContainer(context.Background(), _require, containerClient) @@ -605,12 +600,23 @@ func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURL() { content := make([]byte, 0) body := bytes.NewReader(content) - _, err = srcBBClient.Upload(context.Background(), streaming.NopCloser(body), nil) + _, err := srcBBClient.Upload(context.Background(), streaming.NopCloser(body), nil) _require.Nil(err) expiryTime, err := time.Parse(time.UnixDate, "Fri Jun 11 20:00:00 UTC 2049") _require.Nil(err) + return srcBBClient, destBBClient, body, expiryTime +} + +func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURL() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + srcBBClient, destBBClient, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) + credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) if err != nil { s.T().Fatal("Couldn't fetch credential because " + err.Error()) @@ -643,33 +649,7 @@ func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURLWithHeaders() { svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) _require.NoError(err) - containerName := testcommon.GenerateContainerName(testName) - containerClient := testcommon.CreateNewContainer(context.Background(), _require, containerName, svcClient) - defer testcommon.DeleteContainer(context.Background(), _require, containerClient) - - srcBlob := testcommon.GenerateBlobName(testName) - srcBBClient := testcommon.CreateNewBlockBlob(context.Background(), _require, srcBlob, containerClient) - - dest := testcommon.GenerateBlobName(testName) - destBBClient := testcommon.CreateNewBlockBlob(context.Background(), _require, dest, containerClient) - - content := make([]byte, 0) - body := bytes.NewReader(content) - - _, err = srcBBClient.Upload(context.Background(), streaming.NopCloser(body), &blockblob.UploadOptions{ - HTTPHeaders: &testcommon.BasicHeaders, - }) - _require.Nil(err) - - resp, err := srcBBClient.GetProperties(context.Background(), nil) - _require.Nil(err) - h := blob.ParseHTTPHeaders(resp) - h.BlobContentMD5 = nil // the service generates a MD5 value, omit before comparing - _require.EqualValues(h, testcommon.BasicHeaders) - - // Get source blob url with SAS for UploadBlobFromURL. - expiryTime, err := time.Parse(time.UnixDate, "Fri Jun 11 20:00:00 UTC 2049") - _require.Nil(err) + srcBBClient, destBBClient, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) if err != nil { @@ -692,9 +672,9 @@ func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURLWithHeaders() { _require.NotNil(pbResp) _require.NoError(err) - resp, err = destBBClient.GetProperties(context.Background(), nil) + resp, err := destBBClient.GetProperties(context.Background(), nil) _require.NoError(err) - h = blob.ParseHTTPHeaders(resp) + h := blob.ParseHTTPHeaders(resp) h.BlobContentMD5 = nil // the service generates a MD5 value, omit before comparing _require.EqualValues(h, testcommon.BasicHeaders) } From 9eac3110eb64cf93efab6d2a9f9ea48d819c1864 Mon Sep 17 00:00:00 2001 From: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Date: Wed, 8 Mar 2023 16:48:20 -0500 Subject: [PATCH 10/18] Updating tests --- sdk/storage/azblob/blockblob/client_test.go | 37 ++++++++++++------- .../internal/testcommon/clients_auth.go | 6 +++ 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/sdk/storage/azblob/blockblob/client_test.go b/sdk/storage/azblob/blockblob/client_test.go index ea6fe0b3a4b5..75493666d90f 100644 --- a/sdk/storage/azblob/blockblob/client_test.go +++ b/sdk/storage/azblob/blockblob/client_test.go @@ -586,27 +586,27 @@ func (s *BlockBlobRecordedTestsSuite) TestUploadBlockWithImmutabilityPolicy() { _require.Nil(err) } -func setUpPutBlobFromURLTest(testName string, _require *require.Assertions, svcClient *service.Client) (*blockblob.Client, *blockblob.Client, *bytes.Reader, time.Time) { +func setUpPutBlobFromURLTest(testName string, _require *require.Assertions, svcClient *service.Client) (*container.Client, *blockblob.Client, *blockblob.Client, *bytes.Reader, time.Time) { containerName := testcommon.GenerateContainerName(testName) containerClient := testcommon.CreateNewContainer(context.Background(), _require, containerName, svcClient) - defer testcommon.DeleteContainer(context.Background(), _require, containerClient) - srcBlob := testcommon.GenerateBlobName(testName) + srcBlob := testcommon.GenerateBlobName("src" + testName) srcBBClient := testcommon.CreateNewBlockBlob(context.Background(), _require, srcBlob, containerClient) - dest := testcommon.GenerateBlobName(testName) + dest := testcommon.GenerateBlobName("dest" + testName) destBBClient := testcommon.CreateNewBlockBlob(context.Background(), _require, dest, containerClient) content := make([]byte, 0) body := bytes.NewReader(content) - _, err := srcBBClient.Upload(context.Background(), streaming.NopCloser(body), nil) + // create empty dest blob + _, err := destBBClient.Upload(context.Background(), streaming.NopCloser(body), nil) _require.Nil(err) expiryTime, err := time.Parse(time.UnixDate, "Fri Jun 11 20:00:00 UTC 2049") _require.Nil(err) - return srcBBClient, destBBClient, body, expiryTime + return containerClient, srcBBClient, destBBClient, body, expiryTime } func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURL() { @@ -615,7 +615,8 @@ func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURL() { svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) _require.NoError(err) - srcBBClient, destBBClient, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) + containerClient, srcBBClient, destBBClient, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) if err != nil { @@ -634,13 +635,9 @@ func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURL() { srcBlobParts.SAS = sasQueryParams srcBlobURLWithSAS := srcBlobParts.String() - pbResp, err := destBBClient.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &blockblob.UploadBlobFromURLOptions{HTTPHeaders: &testcommon.BasicHeaders}) + pbResp, err := destBBClient.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, nil) _require.NotNil(pbResp) _require.NoError(err) - - resp, err := srcBBClient.GetProperties(context.Background(), nil) - _require.NoError(err) - _require.Equal(resp.ETag, pbResp.ETag) } func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURLWithHeaders() { @@ -649,7 +646,8 @@ func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURLWithHeaders() { svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) _require.NoError(err) - srcBBClient, destBBClient, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) + containerClient, srcBBClient, destBBClient, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) if err != nil { @@ -668,7 +666,14 @@ func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURLWithHeaders() { srcBlobParts.SAS = sasQueryParams srcBlobURLWithSAS := srcBlobParts.String() - pbResp, err := destBBClient.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &blockblob.UploadBlobFromURLOptions{HTTPHeaders: &testcommon.BasicHeaders}) + options := blockblob.UploadBlobFromURLOptions{ + Tags: testcommon.BasicBlobTagsMap, + HTTPHeaders: &testcommon.BasicHeaders, + Metadata: testcommon.BasicMetadata, + Tier: &testcommon.CoolAccessTier, + } + + pbResp, err := destBBClient.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) _require.NotNil(pbResp) _require.NoError(err) @@ -677,6 +682,10 @@ func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURLWithHeaders() { h := blob.ParseHTTPHeaders(resp) h.BlobContentMD5 = nil // the service generates a MD5 value, omit before comparing _require.EqualValues(h, testcommon.BasicHeaders) + _require.EqualValues(resp.AccessTier, &testcommon.CoolAccessTier) + tagcount := int64(len(testcommon.BasicBlobTagsMap)) + _require.EqualValues(resp.TagCount, &tagcount) + _require.EqualValues(resp.Metadata, testcommon.BasicMetadata) } func (s *BlockBlobRecordedTestsSuite) TestPutBlockListWithImmutabilityPolicy() { diff --git a/sdk/storage/azblob/internal/testcommon/clients_auth.go b/sdk/storage/azblob/internal/testcommon/clients_auth.go index 62b538f958e2..bf3b26d70214 100644 --- a/sdk/storage/azblob/internal/testcommon/clients_auth.go +++ b/sdk/storage/azblob/internal/testcommon/clients_auth.go @@ -52,6 +52,12 @@ const ( FakeStorageURL = "https://fakestorage.blob.core.windows.net" ) +var ( + CoolAccessTier = blob.AccessTierCool + HotAccessTier = blob.AccessTierHot + ArchiveAccessTier = blob.AccessTierArchive +) + var ( BlobContentType = "my_type" BlobContentDisposition = "my_disposition" From bf00187296ffb54ec71cfd519f36f83ea5ca1e29 Mon Sep 17 00:00:00 2001 From: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Date: Thu, 23 Mar 2023 17:33:40 -0400 Subject: [PATCH 11/18] Tests for CPK params --- sdk/storage/azblob/blockblob/client_test.go | 86 +++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/sdk/storage/azblob/blockblob/client_test.go b/sdk/storage/azblob/blockblob/client_test.go index 75493666d90f..893d21a8280d 100644 --- a/sdk/storage/azblob/blockblob/client_test.go +++ b/sdk/storage/azblob/blockblob/client_test.go @@ -688,6 +688,92 @@ func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURLWithHeaders() { _require.EqualValues(resp.Metadata, testcommon.BasicMetadata) } +func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlWithCPK() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + containerClient, srcBBClient, destBBClient, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) + if err != nil { + s.T().Fatal("Couldn't fetch credential because " + err.Error()) + } + + sasQueryParams, err := sas.AccountSignatureValues{ + Protocol: sas.ProtocolHTTPS, + ExpiryTime: expiryTime, + Permissions: to.Ptr(sas.AccountPermissions{Read: true, List: true}).String(), + ResourceTypes: to.Ptr(sas.AccountResourceTypes{Container: true, Object: true}).String(), + }.SignWithSharedKey(credential) + _require.Nil(err) + + srcBlobParts, _ := blob.ParseURL(srcBBClient.URL()) + srcBlobParts.SAS = sasQueryParams + srcBlobURLWithSAS := srcBlobParts.String() + + options := blockblob.UploadBlobFromURLOptions{ + CPKInfo: &testcommon.TestCPKByValue, + } + + pbResp, err := destBBClient.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + _require.NotNil(pbResp) + _require.NoError(err) + + getBlobPropertiesOptions := blob.GetPropertiesOptions{ + CPKInfo: &testcommon.TestCPKByValue, + } + + getResp, err := destBBClient.GetProperties(context.Background(), &getBlobPropertiesOptions) + _require.Nil(err) + _require.EqualValues(getResp.EncryptionKeySHA256, testcommon.TestCPKByValue.EncryptionKeySHA256) +} + +func (s *BlockBlobRecordedTestsSuite) TestPutBlobFromUrlCPKScope() { + _require := require.New(s.T()) + testName := s.T().Name() + encryptionScope := testcommon.GetCPKScopeInfo(s.T()) + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + containerClient, _, destBBClient, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + bbName := testcommon.GenerateBlobName(testName) + srcBBClient := testcommon.CreateNewBlockBlobWithCPK(context.Background(), _require, bbName, containerClient, nil, &encryptionScope) + + credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) + if err != nil { + s.T().Fatal("Couldn't fetch credential because " + err.Error()) + } + + sasQueryParams, err := sas.AccountSignatureValues{ + Protocol: sas.ProtocolHTTPS, + ExpiryTime: expiryTime, + Permissions: to.Ptr(sas.AccountPermissions{Read: true, List: true}).String(), + ResourceTypes: to.Ptr(sas.AccountResourceTypes{Container: true, Object: true}).String(), + }.SignWithSharedKey(credential) + _require.Nil(err) + + srcBlobParts, _ := blob.ParseURL(srcBBClient.URL()) + srcBlobParts.SAS = sasQueryParams + srcBlobURLWithSAS := srcBlobParts.String() + + options := blockblob.UploadBlobFromURLOptions{ + CPKScopeInfo: &encryptionScope, + } + + pbResp, err := destBBClient.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + _require.NotNil(pbResp) + _require.NoError(err) + + getResp, err := destBBClient.GetProperties(context.Background(), nil) + _require.Nil(err) + _require.EqualValues(*getResp.EncryptionScope, *encryptionScope.EncryptionScope) +} + func (s *BlockBlobRecordedTestsSuite) TestPutBlockListWithImmutabilityPolicy() { _require := require.New(s.T()) testName := s.T().Name() From d182595cfa95ea996e7bdffa820d0f369735d644 Mon Sep 17 00:00:00 2001 From: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Date: Fri, 24 Mar 2023 13:38:42 -0400 Subject: [PATCH 12/18] Fixing test --- sdk/storage/azblob/blockblob/client_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/storage/azblob/blockblob/client_test.go b/sdk/storage/azblob/blockblob/client_test.go index e193ba338906..252c7e512448 100644 --- a/sdk/storage/azblob/blockblob/client_test.go +++ b/sdk/storage/azblob/blockblob/client_test.go @@ -732,7 +732,7 @@ func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlWithCPK() { _require.EqualValues(getResp.EncryptionKeySHA256, testcommon.TestCPKByValue.EncryptionKeySHA256) } -func (s *BlockBlobRecordedTestsSuite) TestPutBlobFromUrlCPKScope() { +func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlCPKScope() { _require := require.New(s.T()) testName := s.T().Name() encryptionScope := testcommon.GetCPKScopeInfo(s.T()) From 6cb019d6ade7cd28e6220e80c91f4718c7b7b026 Mon Sep 17 00:00:00 2001 From: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Date: Mon, 27 Mar 2023 12:26:54 -0400 Subject: [PATCH 13/18] Adding test, updating tests --- sdk/storage/azblob/blockblob/client_test.go | 91 +++++++++++++++++---- 1 file changed, 75 insertions(+), 16 deletions(-) diff --git a/sdk/storage/azblob/blockblob/client_test.go b/sdk/storage/azblob/blockblob/client_test.go index 252c7e512448..63ac4513fb79 100644 --- a/sdk/storage/azblob/blockblob/client_test.go +++ b/sdk/storage/azblob/blockblob/client_test.go @@ -616,7 +616,7 @@ func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURL() { svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) _require.NoError(err) - containerClient, srcBBClient, destBBClient, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) + containerClient, srcBlob, destBlob, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) defer testcommon.DeleteContainer(context.Background(), _require, containerClient) credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) @@ -632,11 +632,11 @@ func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURL() { }.SignWithSharedKey(credential) _require.Nil(err) - srcBlobParts, _ := blob.ParseURL(srcBBClient.URL()) + srcBlobParts, _ := blob.ParseURL(srcBlob.URL()) srcBlobParts.SAS = sasQueryParams srcBlobURLWithSAS := srcBlobParts.String() - pbResp, err := destBBClient.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, nil) + pbResp, err := destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, nil) _require.NotNil(pbResp) _require.NoError(err) } @@ -647,7 +647,7 @@ func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURLWithHeaders() { svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) _require.NoError(err) - containerClient, srcBBClient, destBBClient, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) + containerClient, srcBlob, destBlob, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) defer testcommon.DeleteContainer(context.Background(), _require, containerClient) credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) @@ -663,7 +663,7 @@ func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURLWithHeaders() { }.SignWithSharedKey(credential) _require.Nil(err) - srcBlobParts, _ := blob.ParseURL(srcBBClient.URL()) + srcBlobParts, _ := blob.ParseURL(srcBlob.URL()) srcBlobParts.SAS = sasQueryParams srcBlobURLWithSAS := srcBlobParts.String() @@ -674,11 +674,11 @@ func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURLWithHeaders() { Tier: &testcommon.CoolAccessTier, } - pbResp, err := destBBClient.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + pbResp, err := destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) _require.NotNil(pbResp) _require.NoError(err) - resp, err := destBBClient.GetProperties(context.Background(), nil) + resp, err := destBlob.GetProperties(context.Background(), nil) _require.NoError(err) h := blob.ParseHTTPHeaders(resp) h.BlobContentMD5 = nil // the service generates a MD5 value, omit before comparing @@ -695,7 +695,7 @@ func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlWithCPK() { svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) _require.NoError(err) - containerClient, srcBBClient, destBBClient, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) + containerClient, srcBlob, destBlob, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) defer testcommon.DeleteContainer(context.Background(), _require, containerClient) credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) @@ -711,7 +711,7 @@ func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlWithCPK() { }.SignWithSharedKey(credential) _require.Nil(err) - srcBlobParts, _ := blob.ParseURL(srcBBClient.URL()) + srcBlobParts, _ := blob.ParseURL(srcBlob.URL()) srcBlobParts.SAS = sasQueryParams srcBlobURLWithSAS := srcBlobParts.String() @@ -719,7 +719,7 @@ func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlWithCPK() { CPKInfo: &testcommon.TestCPKByValue, } - pbResp, err := destBBClient.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + pbResp, err := destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) _require.NotNil(pbResp) _require.NoError(err) @@ -727,7 +727,7 @@ func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlWithCPK() { CPKInfo: &testcommon.TestCPKByValue, } - getResp, err := destBBClient.GetProperties(context.Background(), &getBlobPropertiesOptions) + getResp, err := destBlob.GetProperties(context.Background(), &getBlobPropertiesOptions) _require.Nil(err) _require.EqualValues(getResp.EncryptionKeySHA256, testcommon.TestCPKByValue.EncryptionKeySHA256) } @@ -739,11 +739,11 @@ func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlCPKScope() { svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) _require.NoError(err) - containerClient, _, destBBClient, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) + containerClient, _, destBlob, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) defer testcommon.DeleteContainer(context.Background(), _require, containerClient) bbName := testcommon.GenerateBlobName(testName) - srcBBClient := testcommon.CreateNewBlockBlobWithCPK(context.Background(), _require, bbName, containerClient, nil, &encryptionScope) + srcBlob := testcommon.CreateNewBlockBlobWithCPK(context.Background(), _require, bbName, containerClient, nil, &encryptionScope) credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) if err != nil { @@ -758,7 +758,7 @@ func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlCPKScope() { }.SignWithSharedKey(credential) _require.Nil(err) - srcBlobParts, _ := blob.ParseURL(srcBBClient.URL()) + srcBlobParts, _ := blob.ParseURL(srcBlob.URL()) srcBlobParts.SAS = sasQueryParams srcBlobURLWithSAS := srcBlobParts.String() @@ -766,15 +766,74 @@ func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlCPKScope() { CPKScopeInfo: &encryptionScope, } - pbResp, err := destBBClient.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + pbResp, err := destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) _require.NotNil(pbResp) _require.NoError(err) - getResp, err := destBBClient.GetProperties(context.Background(), nil) + getResp, err := destBlob.GetProperties(context.Background(), nil) _require.Nil(err) _require.EqualValues(*getResp.EncryptionScope, *encryptionScope.EncryptionScope) } +func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlSourceContentMD5() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + if err != nil { + s.Fail("Unable to fetch service client because " + err.Error()) + } + + contentSize := 1 * 1024 * 1024 // 1MB + r, sourceData := testcommon.GenerateData(contentSize) + sourceDataMD5Value := md5.Sum(sourceData) + + containerClient, _, destBlob, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) + if err != nil { + s.T().Fatal("Couldn't fetch credential because " + err.Error()) + } + + srcBlob := containerClient.NewBlockBlobClient("srcBlob") + + _, err = srcBlob.Upload(context.Background(), r, nil) + _require.Nil(err) + + // Get source blob url with SAS for UploadBlobFromURL. + sasQueryParams, err := sas.AccountSignatureValues{ + Protocol: sas.ProtocolHTTPS, + ExpiryTime: expiryTime, + Permissions: to.Ptr(sas.AccountPermissions{Read: true, List: true}).String(), + ResourceTypes: to.Ptr(sas.AccountResourceTypes{Container: true, Object: true}).String(), + }.SignWithSharedKey(credential) + _require.Nil(err) + + srcBlobParts, _ := blob.ParseURL(srcBlob.URL()) + srcBlobParts.SAS = sasQueryParams + srcBlobURLWithSAS := srcBlobParts.String() + + sourceContentMD5 := sourceDataMD5Value[:] + options := blockblob.UploadBlobFromURLOptions{ + SourceContentMD5: sourceContentMD5, + } + resp, err := destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + _require.Nil(err) + _require.NotEqual(*resp.ETag, "") + _require.NotEqual(*resp.RequestID, "") + _require.NotEqual(*resp.Version, "") + _require.Equal((*resp.Date).IsZero(), false) + _require.EqualValues(resp.ContentMD5, sourceDataMD5Value[:]) + + // Try UploadBlobFromURL with bad MD5 + _, badMD5 := testcommon.GetRandomDataAndReader(16) + options2 := blockblob.UploadBlobFromURLOptions{ + SourceContentMD5: badMD5, + } + _, err = destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options2) + _require.NotNil(err) +} + func (s *BlockBlobRecordedTestsSuite) TestPutBlockListWithImmutabilityPolicy() { _require := require.New(s.T()) testName := s.T().Name() From ea9d1ce865ce02a6f0854d204b8c4a585aaf4ba6 Mon Sep 17 00:00:00 2001 From: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Date: Tue, 28 Mar 2023 19:26:46 -0400 Subject: [PATCH 14/18] Adding tests, updating tests --- sdk/storage/azblob/blockblob/client_test.go | 421 +++++++++++++++++--- sdk/storage/azblob/blockblob/models.go | 7 +- 2 files changed, 368 insertions(+), 60 deletions(-) diff --git a/sdk/storage/azblob/blockblob/client_test.go b/sdk/storage/azblob/blockblob/client_test.go index 63ac4513fb79..41e8377300b5 100644 --- a/sdk/storage/azblob/blockblob/client_test.go +++ b/sdk/storage/azblob/blockblob/client_test.go @@ -587,7 +587,7 @@ func (s *BlockBlobRecordedTestsSuite) TestUploadBlockWithImmutabilityPolicy() { _require.Nil(err) } -func setUpPutBlobFromURLTest(testName string, _require *require.Assertions, svcClient *service.Client) (*container.Client, *blockblob.Client, *blockblob.Client, *bytes.Reader, time.Time) { +func setUpPutBlobFromURLTest(s *BlockBlobUnrecordedTestsSuite, testName string, _require *require.Assertions, svcClient *service.Client) (*container.Client, *blockblob.Client, *blockblob.Client, string) { containerName := testcommon.GenerateContainerName(testName) containerClient := testcommon.CreateNewContainer(context.Background(), _require, containerName, svcClient) @@ -607,18 +607,6 @@ func setUpPutBlobFromURLTest(testName string, _require *require.Assertions, svcC expiryTime, err := time.Parse(time.UnixDate, "Fri Jun 11 20:00:00 UTC 2049") _require.Nil(err) - return containerClient, srcBBClient, destBBClient, body, expiryTime -} - -func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURL() { - _require := require.New(s.T()) - testName := s.T().Name() - svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) - _require.NoError(err) - - containerClient, srcBlob, destBlob, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) - defer testcommon.DeleteContainer(context.Background(), _require, containerClient) - credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) if err != nil { s.T().Fatal("Couldn't fetch credential because " + err.Error()) @@ -632,40 +620,35 @@ func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURL() { }.SignWithSharedKey(credential) _require.Nil(err) - srcBlobParts, _ := blob.ParseURL(srcBlob.URL()) + srcBlobParts, _ := blob.ParseURL(srcBBClient.URL()) srcBlobParts.SAS = sasQueryParams srcBlobURLWithSAS := srcBlobParts.String() - pbResp, err := destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, nil) - _require.NotNil(pbResp) - _require.NoError(err) + return containerClient, srcBBClient, destBBClient, srcBlobURLWithSAS } -func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromURLWithHeaders() { +func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromURL() { _require := require.New(s.T()) testName := s.T().Name() svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) _require.NoError(err) - containerClient, srcBlob, destBlob, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) + containerClient, _, destBlob, srcBlobURLWithSAS := setUpPutBlobFromURLTest(s, testName, _require, svcClient) defer testcommon.DeleteContainer(context.Background(), _require, containerClient) - credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) - if err != nil { - s.T().Fatal("Couldn't fetch credential because " + err.Error()) - } + pbResp, err := destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, nil) + _require.NotNil(pbResp) + _require.NoError(err) +} - sasQueryParams, err := sas.AccountSignatureValues{ - Protocol: sas.ProtocolHTTPS, - ExpiryTime: expiryTime, - Permissions: to.Ptr(sas.AccountPermissions{Read: true, List: true}).String(), - ResourceTypes: to.Ptr(sas.AccountResourceTypes{Container: true, Object: true}).String(), - }.SignWithSharedKey(credential) - _require.Nil(err) +func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromURLWithHeaders() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) - srcBlobParts, _ := blob.ParseURL(srcBlob.URL()) - srcBlobParts.SAS = sasQueryParams - srcBlobURLWithSAS := srcBlobParts.String() + containerClient, _, destBlob, srcBlobURLWithSAS := setUpPutBlobFromURLTest(s, testName, _require, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) options := blockblob.UploadBlobFromURLOptions{ Tags: testcommon.BasicBlobTagsMap, @@ -695,26 +678,9 @@ func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlWithCPK() { svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) _require.NoError(err) - containerClient, srcBlob, destBlob, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) + containerClient, _, destBlob, srcBlobURLWithSAS := setUpPutBlobFromURLTest(s, testName, _require, svcClient) defer testcommon.DeleteContainer(context.Background(), _require, containerClient) - credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) - if err != nil { - s.T().Fatal("Couldn't fetch credential because " + err.Error()) - } - - sasQueryParams, err := sas.AccountSignatureValues{ - Protocol: sas.ProtocolHTTPS, - ExpiryTime: expiryTime, - Permissions: to.Ptr(sas.AccountPermissions{Read: true, List: true}).String(), - ResourceTypes: to.Ptr(sas.AccountResourceTypes{Container: true, Object: true}).String(), - }.SignWithSharedKey(credential) - _require.Nil(err) - - srcBlobParts, _ := blob.ParseURL(srcBlob.URL()) - srcBlobParts.SAS = sasQueryParams - srcBlobURLWithSAS := srcBlobParts.String() - options := blockblob.UploadBlobFromURLOptions{ CPKInfo: &testcommon.TestCPKByValue, } @@ -739,11 +705,13 @@ func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlCPKScope() { svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) _require.NoError(err) - containerClient, _, destBlob, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) + containerClient, _, destBlob, _ := setUpPutBlobFromURLTest(s, testName, _require, svcClient) defer testcommon.DeleteContainer(context.Background(), _require, containerClient) bbName := testcommon.GenerateBlobName(testName) srcBlob := testcommon.CreateNewBlockBlobWithCPK(context.Background(), _require, bbName, containerClient, nil, &encryptionScope) + expiryTime, err := time.Parse(time.UnixDate, "Fri Jun 11 20:00:00 UTC 2049") + _require.Nil(err) credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) if err != nil { @@ -787,7 +755,7 @@ func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlSourceContentMD5() { r, sourceData := testcommon.GenerateData(contentSize) sourceDataMD5Value := md5.Sum(sourceData) - containerClient, _, destBlob, _, expiryTime := setUpPutBlobFromURLTest(testName, _require, svcClient) + containerClient, srcBlob, destBlob, _ := setUpPutBlobFromURLTest(s, testName, _require, svcClient) defer testcommon.DeleteContainer(context.Background(), _require, containerClient) credential, err := testcommon.GetGenericSharedKeyCredential(testcommon.TestAccountDefault) @@ -795,11 +763,11 @@ func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlSourceContentMD5() { s.T().Fatal("Couldn't fetch credential because " + err.Error()) } - srcBlob := containerClient.NewBlockBlobClient("srcBlob") - _, err = srcBlob.Upload(context.Background(), r, nil) _require.Nil(err) + expiryTime, err := time.Parse(time.UnixDate, "Fri Jun 11 20:00:00 UTC 2049") + _require.Nil(err) // Get source blob url with SAS for UploadBlobFromURL. sasQueryParams, err := sas.AccountSignatureValues{ Protocol: sas.ProtocolHTTPS, @@ -834,6 +802,349 @@ func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlSourceContentMD5() { _require.NotNil(err) } +func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlSourceIfMatchTrue() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + containerClient, srcBlob, destBlob, srcBlobURLWithSAS := setUpPutBlobFromURLTest(s, testName, _require, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + resp, err := srcBlob.GetProperties(context.Background(), nil) + _require.Nil(err) + + options := blockblob.UploadBlobFromURLOptions{ + SourceModifiedAccessConditions: &blob.SourceModifiedAccessConditions{ + SourceIfMatch: resp.ETag, + }, + } + + _, err = destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + _require.Nil(err) + + _, err = destBlob.GetProperties(context.Background(), nil) + _require.Nil(err) +} + +func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlSourceIfMatchFalse() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + containerClient, _, destBlob, srcBlobURLWithSAS := setUpPutBlobFromURLTest(s, testName, _require, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + randomEtag := azcore.ETag("a") + accessConditions := blob.SourceModifiedAccessConditions{ + SourceIfMatch: &randomEtag, + } + options := blockblob.UploadBlobFromURLOptions{ + SourceModifiedAccessConditions: &accessConditions, + } + + _, err = destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + _require.NotNil(err) + testcommon.ValidateBlobErrorCode(_require, err, bloberror.SourceConditionNotMet) +} + +func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlSourceIfNoneMatchTrue() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + containerClient, srcBlob, destBlob, srcBlobURLWithSAS := setUpPutBlobFromURLTest(s, testName, _require, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + _, err = srcBlob.GetProperties(context.Background(), nil) + _require.Nil(err) + + options := blockblob.UploadBlobFromURLOptions{ + SourceModifiedAccessConditions: &blob.SourceModifiedAccessConditions{ + SourceIfNoneMatch: to.Ptr(azcore.ETag("a")), + }, + } + _, err = destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + _require.Nil(err) + + _, err = destBlob.GetProperties(context.Background(), nil) + _require.Nil(err) +} + +func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlSourceIfNoneMatchFalse() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + containerClient, srcBlob, destBlob, srcBlobURLWithSAS := setUpPutBlobFromURLTest(s, testName, _require, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + resp, err := srcBlob.GetProperties(context.Background(), nil) + _require.Nil(err) + + options := blockblob.UploadBlobFromURLOptions{ + SourceModifiedAccessConditions: &blob.SourceModifiedAccessConditions{ + SourceIfNoneMatch: resp.ETag, + }, + } + + _, err = destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + _require.NotNil(err) + testcommon.ValidateBlobErrorCode(_require, err, bloberror.CannotVerifyCopySource) + _require.ErrorContains(err, "304") +} + +func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlDestIfModifiedSinceTrue() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + containerClient, srcBlob, destBlob, srcBlobURLWithSAS := setUpPutBlobFromURLTest(s, testName, _require, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + cResp, err := srcBlob.Upload(context.Background(), streaming.NopCloser(strings.NewReader(testcommon.BlockBlobDefaultData)), nil) + _require.Nil(err) + + currentTime := testcommon.GetRelativeTimeFromAnchor(cResp.Date, -10) + + options := blockblob.UploadBlobFromURLOptions{ + AccessConditions: &blob.AccessConditions{ + ModifiedAccessConditions: &blob.ModifiedAccessConditions{ + IfModifiedSince: ¤tTime, + }, + }, + } + + _, err = destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + _require.Nil(err) + + _, err = destBlob.GetProperties(context.Background(), nil) + _require.Nil(err) +} + +func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlDestIfModifiedSinceFalse() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + containerClient, srcBlob, destBlob, srcBlobURLWithSAS := setUpPutBlobFromURLTest(s, testName, _require, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + cResp, err := srcBlob.Upload(context.Background(), streaming.NopCloser(strings.NewReader(testcommon.BlockBlobDefaultData)), nil) + _require.Nil(err) + + currentTime := testcommon.GetRelativeTimeFromAnchor(cResp.Date, 10) + options := blockblob.UploadBlobFromURLOptions{ + AccessConditions: &blob.AccessConditions{ + ModifiedAccessConditions: &blob.ModifiedAccessConditions{ + IfModifiedSince: ¤tTime, + }, + }, + } + _, err = destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + testcommon.ValidateBlobErrorCode(_require, err, bloberror.ConditionNotMet) +} + +func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlDestIfUnmodifiedSinceTrue() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + containerClient, srcBlob, destBlob, srcBlobURLWithSAS := setUpPutBlobFromURLTest(s, testName, _require, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + cResp, err := srcBlob.Upload(context.Background(), streaming.NopCloser(strings.NewReader(testcommon.BlockBlobDefaultData)), nil) + _require.Nil(err) + + currentTime := testcommon.GetRelativeTimeFromAnchor(cResp.Date, 10) + + options := blockblob.UploadBlobFromURLOptions{ + AccessConditions: &blob.AccessConditions{ + ModifiedAccessConditions: &blob.ModifiedAccessConditions{ + IfUnmodifiedSince: ¤tTime, + }, + }, + } + _, err = destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + _require.Nil(err) + + _, err = destBlob.GetProperties(context.Background(), nil) + _require.Nil(err) +} + +func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlDestIfUnmodifiedSinceFalse() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + containerClient, srcBlob, destBlob, srcBlobURLWithSAS := setUpPutBlobFromURLTest(s, testName, _require, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + cResp, err := srcBlob.Upload(context.Background(), streaming.NopCloser(strings.NewReader(testcommon.BlockBlobDefaultData)), nil) + _require.Nil(err) + + currentTime := testcommon.GetRelativeTimeFromAnchor(cResp.Date, -10) + + options := blockblob.UploadBlobFromURLOptions{ + AccessConditions: &blob.AccessConditions{ + ModifiedAccessConditions: &blob.ModifiedAccessConditions{ + IfUnmodifiedSince: ¤tTime, + }, + }, + } + + _, err = destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + _require.NotNil(err) +} + +func (s *BlockBlobUnrecordedTestsSuite) TestBlobPutBlobFromUrlDestIfMatchTrue() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + containerClient, _, destBlob, srcBlobURLWithSAS := setUpPutBlobFromURLTest(s, testName, _require, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + resp, err := destBlob.GetProperties(context.Background(), nil) + _require.Nil(err) + + options := blockblob.UploadBlobFromURLOptions{ + AccessConditions: &blob.AccessConditions{ + ModifiedAccessConditions: &blob.ModifiedAccessConditions{ + IfMatch: resp.ETag, + }, + }, + } + + _, err = destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + _require.Nil(err) + + resp, err = destBlob.GetProperties(context.Background(), nil) + _require.Nil(err) +} + +func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlDestIfMatchFalse() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + containerClient, _, destBlob, srcBlobURLWithSAS := setUpPutBlobFromURLTest(s, testName, _require, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + resp, err := destBlob.GetProperties(context.Background(), nil) + _require.Nil(err) + + options := blockblob.UploadBlobFromURLOptions{ + AccessConditions: &blob.AccessConditions{ + ModifiedAccessConditions: &blob.ModifiedAccessConditions{ + IfMatch: resp.ETag, + }, + }, + } + metadata := make(map[string]*string) + metadata["bla"] = to.Ptr("bla") + _, err = destBlob.SetMetadata(context.Background(), metadata, nil) + _require.Nil(err) + + _, err = destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + _require.NotNil(err) + testcommon.ValidateBlobErrorCode(_require, err, bloberror.ConditionNotMet) +} + +func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlDestIfNoneMatchTrue() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + containerClient, _, destBlob, srcBlobURLWithSAS := setUpPutBlobFromURLTest(s, testName, _require, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + resp, err := destBlob.GetProperties(context.Background(), nil) + _require.Nil(err) + + options := blockblob.UploadBlobFromURLOptions{ + AccessConditions: &blob.AccessConditions{ + ModifiedAccessConditions: &blob.ModifiedAccessConditions{ + IfNoneMatch: resp.ETag, + }, + }, + } + + _, err = destBlob.SetMetadata(context.Background(), nil, nil) // SetMetadata chances the blob's etag + _require.Nil(err) + + _, err = destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + _require.Nil(err) + + resp, err = destBlob.GetProperties(context.Background(), nil) + _require.Nil(err) +} + +func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromUrlDestIfNoneMatchFalse() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + containerClient, _, destBlob, srcBlobURLWithSAS := setUpPutBlobFromURLTest(s, testName, _require, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + resp, err := destBlob.GetProperties(context.Background(), nil) + _require.Nil(err) + + options := blockblob.UploadBlobFromURLOptions{ + AccessConditions: &blob.AccessConditions{ + ModifiedAccessConditions: &blob.ModifiedAccessConditions{ + IfNoneMatch: resp.ETag, + }, + }, + } + + _, err = destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + _require.NotNil(err) + testcommon.ValidateBlobErrorCode(_require, err, bloberror.ConditionNotMet) +} + +func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromURLCopySourceFalse() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + containerClient, srcBlob, destBlob, srcBlobURLWithSAS := setUpPutBlobFromURLTest(s, testName, _require, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + _, err = srcBlob.SetTier(context.Background(), testcommon.CoolAccessTier, nil) + _require.Nil(err) + + resp, err := srcBlob.GetProperties(context.Background(), nil) + _require.Nil(err) + _require.Equal(resp.AccessTier, to.Ptr("Cool")) + + // CopySourceBlobProperties is true by default, trying false here + options := blockblob.UploadBlobFromURLOptions{ + CopySourceBlobProperties: to.Ptr(false), + } + + pbResp, err := destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + _require.NoError(err) + _require.NotNil(pbResp) + + resp, err = destBlob.GetProperties(context.Background(), nil) + _require.NoError(err) + _require.NotEqual(resp.AccessTier, to.Ptr("Cool")) +} + func (s *BlockBlobRecordedTestsSuite) TestPutBlockListWithImmutabilityPolicy() { _require := require.New(s.T()) testName := s.T().Name() diff --git a/sdk/storage/azblob/blockblob/models.go b/sdk/storage/azblob/blockblob/models.go index c3b65d378f69..ba1b9ee9f67b 100644 --- a/sdk/storage/azblob/blockblob/models.go +++ b/sdk/storage/azblob/blockblob/models.go @@ -84,15 +84,13 @@ type UploadBlobFromURLOptions struct { // Optional. Specifies a user-defined name-value pair associated with the blob. Metadata map[string]*string - // Specify the md5 calculated for the range of bytes that must be read from the copy source. + // Optional. Specifies the md5 calculated for the range of bytes that must be read from the copy source. SourceContentMD5 []byte // Optional. Indicates the tier to be set on the blob. Tier *blob.AccessTier - // Specify the transactional md5 for the body, to be validated by the service. - TransactionalContentMD5 []byte - + // Additional optional headers HTTPHeaders *blob.HTTPHeaders AccessConditions *blob.AccessConditions CPKInfo *blob.CPKInfo @@ -114,7 +112,6 @@ func (o *UploadBlobFromURLOptions) format() (*generated.BlockBlobClientPutBlobFr Metadata: o.Metadata, SourceContentMD5: o.SourceContentMD5, Tier: o.Tier, - TransactionalContentMD5: o.TransactionalContentMD5, } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) From 3c0d2253bc007a4335e7ba3493b6d1cd9529115c Mon Sep 17 00:00:00 2001 From: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Date: Wed, 29 Mar 2023 18:48:33 -0400 Subject: [PATCH 15/18] Testing with token cred --- sdk/storage/azblob/blockblob/client_test.go | 28 +++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/sdk/storage/azblob/blockblob/client_test.go b/sdk/storage/azblob/blockblob/client_test.go index 41e8377300b5..c086d1d7f6b4 100644 --- a/sdk/storage/azblob/blockblob/client_test.go +++ b/sdk/storage/azblob/blockblob/client_test.go @@ -14,6 +14,7 @@ import ( "encoding/binary" "errors" "fmt" + "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "hash/crc64" "io" "math/rand" @@ -1145,6 +1146,33 @@ func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromURLCopySourceFalse() { _require.NotEqual(resp.AccessTier, to.Ptr("Cool")) } +func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromURLCopySourceAuth() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + // Getting OAuth + cred, err := azidentity.NewDefaultAzureCredential(nil) + _require.NoError(err) + + containerClient, _, destBlob, srcBlobURLWithSAS := setUpPutBlobFromURLTest(s, testName, _require, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + // Getting token + token, err := cred.GetToken(context.Background(), policy.TokenRequestOptions{}) + _require.NoError(err) + + options := blockblob.UploadBlobFromURLOptions{ + CopySourceAuthorization: to.Ptr(token.Token), + } + + pbResp, err := destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + _require.NoError(err) + _require.NotNil(pbResp) + +} + func (s *BlockBlobRecordedTestsSuite) TestPutBlockListWithImmutabilityPolicy() { _require := require.New(s.T()) testName := s.T().Name() From 3c78838ab951663eb69c0114654a4c7586dd6b54 Mon Sep 17 00:00:00 2001 From: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Date: Tue, 4 Apr 2023 14:44:10 -0400 Subject: [PATCH 16/18] Fixing AAD test --- sdk/storage/azblob/assets.json | 2 +- sdk/storage/azblob/blockblob/client_test.go | 25 +++++++++++----- .../internal/testcommon/clients_auth.go | 30 ++++++++++++++++++- 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/sdk/storage/azblob/assets.json b/sdk/storage/azblob/assets.json index 96a9c9aa5055..753d8e294894 100644 --- a/sdk/storage/azblob/assets.json +++ b/sdk/storage/azblob/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "go", "TagPrefix": "go/storage/azblob", - "Tag": "go/storage/azblob_5d20008f59" + "Tag": "go/storage/azblob_3c02178316" } diff --git a/sdk/storage/azblob/blockblob/client_test.go b/sdk/storage/azblob/blockblob/client_test.go index dcb641db9b9e..e57a430d1eb0 100644 --- a/sdk/storage/azblob/blockblob/client_test.go +++ b/sdk/storage/azblob/blockblob/client_test.go @@ -1146,28 +1146,39 @@ func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromURLCopySourceFalse() { _require.NotEqual(resp.AccessTier, to.Ptr("Cool")) } -func (s *BlockBlobUnrecordedTestsSuite) TestPutBlobFromURLCopySourceAuth() { +func (s *BlockBlobRecordedTestsSuite) TestPutBlobFromURLCopySourceAuth() { _require := require.New(s.T()) testName := s.T().Name() - svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _, svcCred, err := testcommon.GetServiceClientCred(s.T(), testcommon.TestAccountDefault, nil) _require.NoError(err) - // Getting OAuth + // Getting AAD Authentication cred, err := azidentity.NewDefaultAzureCredential(nil) _require.NoError(err) - containerClient, _, destBlob, srcBlobURLWithSAS := setUpPutBlobFromURLTest(s, testName, _require, svcClient) + containerName := testcommon.GenerateContainerName(testName) + containerClient := testcommon.CreateContainerCred(context.Background(), _require, containerName, svcCred, cred) defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + // Create source and destination blobs + srcBBClient := testcommon.CreateNewBlockBlob(context.Background(), _require, "src "+testName, containerClient) + destBBClient := testcommon.CreateNewBlockBlob(context.Background(), _require, "dest"+testName, containerClient) + + // create empty dest blob + content := make([]byte, 0) + body := bytes.NewReader(content) + _, err = destBBClient.Upload(context.Background(), streaming.NopCloser(body), nil) + _require.Nil(err) + // Getting token - token, err := cred.GetToken(context.Background(), policy.TokenRequestOptions{}) + token, err := cred.GetToken(context.Background(), policy.TokenRequestOptions{Scopes: []string{"https://storage.azure.com/.default"}}) _require.NoError(err) options := blockblob.UploadBlobFromURLOptions{ - CopySourceAuthorization: to.Ptr(token.Token), + CopySourceAuthorization: to.Ptr("Bearer " + token.Token), } - pbResp, err := destBlob.UploadBlobFromURL(context.Background(), srcBlobURLWithSAS, &options) + pbResp, err := destBBClient.UploadBlobFromURL(context.Background(), srcBBClient.URL(), &options) _require.NoError(err) _require.NotNil(pbResp) diff --git a/sdk/storage/azblob/internal/testcommon/clients_auth.go b/sdk/storage/azblob/internal/testcommon/clients_auth.go index 9d13b6731e16..df3d5905ce11 100644 --- a/sdk/storage/azblob/internal/testcommon/clients_auth.go +++ b/sdk/storage/azblob/internal/testcommon/clients_auth.go @@ -139,6 +139,24 @@ func GetServiceClient(t *testing.T, accountType TestAccountType, options *servic return serviceClient, err } +func GetServiceClientCred(t *testing.T, accountType TestAccountType, options *service.ClientOptions) (*service.Client, *azblob.SharedKeyCredential, error) { + if options == nil { + options = &service.ClientOptions{} + } + + SetClientOptions(t, &options.ClientOptions) + + cred, err := GetGenericSharedKeyCredential(accountType) + if err != nil { + return nil, nil, err + } + + serviceClient, err := service.NewClientWithSharedKeyCredential("https://"+cred.AccountName()+".blob.core.windows.net/", cred, options) + + // Returns SharedKeyCredential + return serviceClient, cred, err +} + func GetServiceClientNoCredential(t *testing.T, sasUrl string, options *service.ClientOptions) (*service.Client, error) { if options == nil { options = &service.ClientOptions{} @@ -207,7 +225,17 @@ func CreateNewContainer(ctx context.Context, _require *require.Assertions, conta _, err := containerClient.Create(ctx, nil) _require.Nil(err) - // _require.Equal(cResp.RawResponse.StatusCode, 201) + + return containerClient +} + +func CreateContainerCred(ctx context.Context, _require *require.Assertions, containerName string, svcCred *service.SharedKeyCredential, cred *azidentity.DefaultAzureCredential) *container.Client { + containerURL := fmt.Sprintf("https://%s.blob.core.windows.net/%s", svcCred.AccountName(), containerName) + + containerClient, err := container.NewClient(containerURL, cred, nil) + _, err = containerClient.Create(context.Background(), nil) + _require.Nil(err) + return containerClient } From ac9b72dd7fc31386f094f324eac6882fe8aa431e Mon Sep 17 00:00:00 2001 From: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Date: Tue, 4 Apr 2023 14:58:27 -0400 Subject: [PATCH 17/18] Fixing ineffectual assignment --- sdk/storage/azblob/internal/testcommon/clients_auth.go | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/storage/azblob/internal/testcommon/clients_auth.go b/sdk/storage/azblob/internal/testcommon/clients_auth.go index df3d5905ce11..9eabe7f39f9c 100644 --- a/sdk/storage/azblob/internal/testcommon/clients_auth.go +++ b/sdk/storage/azblob/internal/testcommon/clients_auth.go @@ -233,6 +233,7 @@ func CreateContainerCred(ctx context.Context, _require *require.Assertions, cont containerURL := fmt.Sprintf("https://%s.blob.core.windows.net/%s", svcCred.AccountName(), containerName) containerClient, err := container.NewClient(containerURL, cred, nil) + _require.Nil(err) _, err = containerClient.Create(context.Background(), nil) _require.Nil(err) From 1b8649a18f3adcc4749493f0047ac872e6539de7 Mon Sep 17 00:00:00 2001 From: siminsavani-msft <77068571+siminsavani-msft@users.noreply.github.com> Date: Tue, 4 Apr 2023 15:22:37 -0400 Subject: [PATCH 18/18] Update recordings --- sdk/storage/azblob/assets.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/storage/azblob/assets.json b/sdk/storage/azblob/assets.json index 753d8e294894..8e31e22ae3eb 100644 --- a/sdk/storage/azblob/assets.json +++ b/sdk/storage/azblob/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "go", "TagPrefix": "go/storage/azblob", - "Tag": "go/storage/azblob_3c02178316" + "Tag": "go/storage/azblob_2d480c1412" }