diff --git a/src/Storage/Storage.Management/ChangeLog.md b/src/Storage/Storage.Management/ChangeLog.md index 21eb45cd852a..d427297729e3 100644 --- a/src/Storage/Storage.Management/ChangeLog.md +++ b/src/Storage/Storage.Management/ChangeLog.md @@ -18,6 +18,8 @@ - Additional information about change #1 --> ## Upcoming Release +* Refined migration of Azure Storgae File dataplane cmdlets from 'Microsoft.Azure.Storage.File 11.2.3' to 'Azure.Storage.Files.Shares 12.16.0' + - `Start-AzStorageFileCopy` ## Version 7.4.0 * Added a warning for an upcoming breaking change for removing references to "Microsoft.Azure.Storage.File" diff --git a/src/Storage/Storage.Management/help/Get-AzStorageFileContent.md b/src/Storage/Storage.Management/help/Get-AzStorageFileContent.md index 6aa3a53e8d7a..b5a8fc2da3d2 100644 --- a/src/Storage/Storage.Management/help/Get-AzStorageFileContent.md +++ b/src/Storage/Storage.Management/help/Get-AzStorageFileContent.md @@ -62,7 +62,7 @@ This command downloads a file that is named CurrentDataFile in the folder Contos ### Example 2: Downloads the files under sample file share ```powershell -Get-AzStorageFile -ShareName sample | Where-Object {$_.GetType().Name -eq "CloudFile"} | Get-AzStorageFileContent +Get-AzStorageFile -ShareName sample | Where-Object {$_.GetType().Name -eq "AzureStorageFile"} | Get-AzStorageFileContent ``` This example downloads the files under sample file share @@ -282,7 +282,7 @@ Accept wildcard characters: False ``` ### -ShareClient -CloudFileShare object indicated the share where the file would be downloaded. +ShareClient object indicated the share where the file would be downloaded. ```yaml Type: Azure.Storage.Files.Shares.ShareClient diff --git a/src/Storage/Storage.Management/help/New-AzStorageDirectory.md b/src/Storage/Storage.Management/help/New-AzStorageDirectory.md index 0f178ddb6cae..4940b1cde374 100644 --- a/src/Storage/Storage.Management/help/New-AzStorageDirectory.md +++ b/src/Storage/Storage.Management/help/New-AzStorageDirectory.md @@ -36,7 +36,7 @@ New-AzStorageDirectory [-ShareDirectoryClient] [-Path] -SrcContainerName -DestSh ### ContainerInstance ``` -Start-AzStorageFileCopy -SrcBlobName -SrcContainer -DestShareName - -DestFilePath [-Context ] [-DestContext ] [-Force] - [-ServerTimeoutPerRequest ] [-ClientTimeoutPerRequest ] - [-DefaultProfile ] [-ConcurrentTaskCount ] [-WhatIf] [-Confirm] - [] +Start-AzStorageFileCopy -SrcBlobName -SrcContainer -DestShareName + -DestFilePath [-DestContext ] [-Force] [-ServerTimeoutPerRequest ] + [-ClientTimeoutPerRequest ] [-DefaultProfile ] [-ConcurrentTaskCount ] + [-WhatIf] [-Confirm] [] ``` ### BlobInstanceFilePath ``` -Start-AzStorageFileCopy -SrcBlob -DestShareName -DestFilePath - [-Context ] [-DestContext ] [-Force] [-ServerTimeoutPerRequest ] +Start-AzStorageFileCopy -SrcBlob -DestShareName -DestFilePath + [-DestContext ] [-Force] [-ServerTimeoutPerRequest ] [-ClientTimeoutPerRequest ] [-DefaultProfile ] [-ConcurrentTaskCount ] [-WhatIf] [-Confirm] [] ``` ### BlobInstanceFileInstance ``` -Start-AzStorageFileCopy -SrcBlob [-DestShareFileClient ] - [-Context ] [-DestContext ] [-Force] [-ServerTimeoutPerRequest ] +Start-AzStorageFileCopy -SrcBlob [-DestShareFileClient ] + [-DestContext ] [-Force] [-ServerTimeoutPerRequest ] [-ClientTimeoutPerRequest ] [-DefaultProfile ] [-ConcurrentTaskCount ] [-WhatIf] [-Confirm] [] ``` @@ -59,16 +58,15 @@ Start-AzStorageFileCopy -SrcFilePath -SrcShareName -DestShareN ### ShareInstance ``` Start-AzStorageFileCopy -SrcFilePath -SrcShare -DestShareName - -DestFilePath [-Context ] [-DestContext ] [-Force] - [-ServerTimeoutPerRequest ] [-ClientTimeoutPerRequest ] - [-DefaultProfile ] [-ConcurrentTaskCount ] [-WhatIf] [-Confirm] - [] + -DestFilePath [-DestContext ] [-Force] [-ServerTimeoutPerRequest ] + [-ClientTimeoutPerRequest ] [-DefaultProfile ] [-ConcurrentTaskCount ] + [-WhatIf] [-Confirm] [] ``` ### FileInstanceToFilePath ``` Start-AzStorageFileCopy -SrcFile -DestShareName -DestFilePath - [-Context ] [-DestContext ] [-Force] [-ServerTimeoutPerRequest ] + [-DestContext ] [-Force] [-ServerTimeoutPerRequest ] [-ClientTimeoutPerRequest ] [-DefaultProfile ] [-ConcurrentTaskCount ] [-WhatIf] [-Confirm] [] ``` @@ -76,7 +74,7 @@ Start-AzStorageFileCopy -SrcFile -DestShareName -Dest ### FileInstanceToFileInstance ``` Start-AzStorageFileCopy -SrcFile [-DestShareFileClient ] - [-Context ] [-DestContext ] [-Force] [-ServerTimeoutPerRequest ] + [-DestContext ] [-Force] [-ServerTimeoutPerRequest ] [-ClientTimeoutPerRequest ] [-DefaultProfile ] [-ConcurrentTaskCount ] [-WhatIf] [-Confirm] [] ``` @@ -179,7 +177,7 @@ To obtain a context, use the New-AzStorageContext cmdlet. ```yaml Type: Microsoft.Azure.Commands.Common.Authentication.Abstractions.IStorageContext -Parameter Sets: ContainerName, ContainerInstance, BlobInstanceFilePath, BlobInstanceFileInstance, ShareName, ShareInstance, FileInstanceToFilePath, FileInstanceToFileInstance +Parameter Sets: ContainerName, ShareName Aliases: SrcContext Required: False @@ -241,7 +239,7 @@ ShareFileClient object indicated the Dest file. ```yaml Type: Azure.Storage.Files.Shares.ShareFileClient Parameter Sets: BlobInstanceFileInstance, FileInstanceToFileInstance, UriToFileInstance -Aliases: +Aliases: DestFile Required: False Position: Named @@ -330,9 +328,9 @@ Specifies a **CloudBlob** object. You can create a cloud blob or obtain one by using the Get-AzStorageBlob cmdlet. ```yaml -Type: Azure.Storage.Blobs.Specialized.BlobBaseClient +Type: Microsoft.Azure.Storage.Blob.CloudBlob Parameter Sets: BlobInstanceFilePath, BlobInstanceFileInstance -Aliases: BlobBaseClient +Aliases: ICloudBlob Required: True Position: Named @@ -361,9 +359,9 @@ Specifies a cloud blob container object. You can create cloud blob container object or use the Get-AzStorageContainer cmdlet. ```yaml -Type: Azure.Storage.Blobs.BlobContainerClient +Type: Microsoft.Azure.Storage.Blob.CloudBlobContainer Parameter Sets: ContainerInstance -Aliases: BlobContainerClient +Aliases: Required: True Position: Named @@ -388,8 +386,8 @@ Accept wildcard characters: False ``` ### -SrcFile -Specifies a **CloudFile** object. -You can create a cloud file or obtain one by using **Get-AzStorageFile**. +Specifies a **ShareFileClient** object. +You can create a ShareFileClient or obtain one by using **Get-AzStorageFile**. ```yaml Type: Azure.Storage.Files.Shares.ShareFileClient @@ -485,7 +483,7 @@ This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable ## INPUTS -### Azure.Storage.Blobs.Specialized.BlobBaseClient +### Microsoft.Azure.Storage.Blob.CloudBlob ### Azure.Storage.Files.Shares.ShareFileClient diff --git a/src/Storage/Storage/Common/StorageCloudCmdletBase.cs b/src/Storage/Storage/Common/StorageCloudCmdletBase.cs index 18cfa42f131a..bce0e5a58349 100644 --- a/src/Storage/Storage/Common/StorageCloudCmdletBase.cs +++ b/src/Storage/Storage/Common/StorageCloudCmdletBase.cs @@ -275,7 +275,7 @@ internal AzureStorageContext GetCmdletStorageContext(bool outputErrorMessage = t return context; } - internal AzureStorageContext GetCmdletStorageContext(IStorageContext inContext, bool outputErrorMessage = true) + internal AzureStorageContext GetCmdletStorageContext(IStorageContext inContext, bool outputErrorMessage = true, bool isDestContext = false) { var context = inContext as AzureStorageContext; @@ -304,8 +304,15 @@ internal AzureStorageContext GetCmdletStorageContext(IStorageContext inContext, } else { - throw new InvalidOperationException("Could not get the storage context. Please pass in a storage context with \"-Context\" parameter (can be created with New-AzStorageContext cmdlet), " + + if (isDestContext) + { + throw new InvalidOperationException("Could not get the destination storage context. Please pass in a storage context with \"-DestContext\" parameter (can be created with New-AzStorageContext cmdlet)."); + } + else + { + throw new InvalidOperationException("Could not get the storage context. Please pass in a storage context with \"-Context\" parameter (can be created with New-AzStorageContext cmdlet), " + "or set the current storage context with Set-AzCurrentStorageAccount cmdlet."); + } } } catch (Exception e) diff --git a/src/Storage/Storage/File/Cmdlet/GetAzureStorageFileContent.cs b/src/Storage/Storage/File/Cmdlet/GetAzureStorageFileContent.cs index da7d1653eb20..fc099dc02340 100644 --- a/src/Storage/Storage/File/Cmdlet/GetAzureStorageFileContent.cs +++ b/src/Storage/Storage/File/Cmdlet/GetAzureStorageFileContent.cs @@ -150,7 +150,8 @@ public override void ExecuteCmdlet() string[] path = NamingUtil.ValidatePath(this.Path, true); switch (this.ParameterSetName) { - case LocalConstants.FileParameterSetName: + case LocalConstants.FileParameterSetName: + CheckContextForObjectInput((AzureStorageContext)this.Context); fileClientToBeDownloaded = this.ShareFileClient; fileToBeDownloaded = AzureStorageFile.GetTrack1FileClient(fileClientToBeDownloaded, ((AzureStorageContext)this.Context).StorageAccount.Credentials); break; @@ -164,11 +165,13 @@ public override void ExecuteCmdlet() break; case LocalConstants.ShareParameterSetName: + CheckContextForObjectInput((AzureStorageContext)this.Context); fileClientToBeDownloaded = this.ShareClient.GetRootDirectoryClient().GetFileClient(this.Path); fileToBeDownloaded = AzureStorageFile.GetTrack1FileClient(fileClientToBeDownloaded, ((AzureStorageContext)this.Context).StorageAccount.Credentials); break; case LocalConstants.DirectoryParameterSetName: + CheckContextForObjectInput((AzureStorageContext)this.Context); fileClientToBeDownloaded = this.ShareDirectoryClient.GetFileClient(this.Path); fileToBeDownloaded = AzureStorageFile.GetTrack1FileClient(fileClientToBeDownloaded, ((AzureStorageContext)this.Context).StorageAccount.Credentials); break; diff --git a/src/Storage/Storage/File/Cmdlet/NewAzureStorageShareSasToken.cs b/src/Storage/Storage/File/Cmdlet/NewAzureStorageShareSasToken.cs index cdfc9836722c..c2e77bee7be9 100644 --- a/src/Storage/Storage/File/Cmdlet/NewAzureStorageShareSasToken.cs +++ b/src/Storage/Storage/File/Cmdlet/NewAzureStorageShareSasToken.cs @@ -101,7 +101,7 @@ public override void ExecuteCmdlet() if (Channel.StorageContext != null && Channel.StorageContext.StorageAccount != null && !Channel.StorageContext.StorageAccount.Credentials.IsSharedKey) { - throw new InvalidOperationException("Create File service SAS only supported with SharedKey credentail."); + throw new InvalidOperationException("Create File service SAS only supported with SharedKey credential."); } ShareClient share = Util.GetTrack2ShareReference(this.ShareName, diff --git a/src/Storage/Storage/File/Cmdlet/SetAzureStorageShareQuota.cs b/src/Storage/Storage/File/Cmdlet/SetAzureStorageShareQuota.cs index aa0de3ac3bc1..ad38f8366b88 100644 --- a/src/Storage/Storage/File/Cmdlet/SetAzureStorageShareQuota.cs +++ b/src/Storage/Storage/File/Cmdlet/SetAzureStorageShareQuota.cs @@ -16,11 +16,9 @@ using System.Globalization; using System.Management.Automation; using System.Security.Permissions; -using Microsoft.WindowsAzure.Commands.Common.CustomAttributes; using Microsoft.WindowsAzure.Commands.Common.Storage.ResourceModel; using Azure.Storage.Files.Shares; using Azure.Storage.Files.Shares.Models; -using System; namespace Microsoft.WindowsAzure.Commands.Storage.File.Cmdlet { diff --git a/src/Storage/Storage/File/Cmdlet/StartAzureStorageFileCopy.cs b/src/Storage/Storage/File/Cmdlet/StartAzureStorageFileCopy.cs index 4b9c6f7d61aa..fca41f84561e 100644 --- a/src/Storage/Storage/File/Cmdlet/StartAzureStorageFileCopy.cs +++ b/src/Storage/Storage/File/Cmdlet/StartAzureStorageFileCopy.cs @@ -19,12 +19,11 @@ using System.Management.Automation; using System.Security.Permissions; using System.Threading.Tasks; +using Microsoft.Azure.Storage.Blob; using Microsoft.WindowsAzure.Commands.Common.Storage.ResourceModel; using Azure.Storage.Files.Shares; using Azure; using Azure.Storage.Files.Shares.Models; -using Azure.Storage.Blobs; -using Azure.Storage.Blobs.Specialized; namespace Microsoft.WindowsAzure.Commands.Storage.File.Cmdlet { @@ -53,15 +52,15 @@ public class StartAzureStorageFileCopyCommand : StorageFileDataManagementCmdletB [Parameter(HelpMessage = "Source container instance", Mandatory = true, ParameterSetName = ContainerParameterSet)] [ValidateNotNull] - [Alias("BlobContainerClient")] - public BlobContainerClient SrcContainer { get; set; } + public CloudBlobContainer SrcContainer { get; set; } + [Alias("ICloudBlob")] [Parameter(HelpMessage = "Source blob instance", Mandatory = true, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, ParameterSetName = BlobFilePathParameterSet)] [Parameter(HelpMessage = "Source blob instance", Mandatory = true, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true, ParameterSetName = BlobFileParameterSet)] - [Alias("BlobBaseClient")] - public BlobBaseClient SrcBlob { get; set; } + [ValidateNotNull] + public CloudBlob SrcBlob { get; set; } [Parameter(HelpMessage = "Source file path", Mandatory = true, ParameterSetName = ShareNameParameterSet)] [Parameter(HelpMessage = "Source file path", Mandatory = true, ParameterSetName = ShareParameterSet)] @@ -128,18 +127,6 @@ public class StartAzureStorageFileCopyCommand : StorageFileDataManagementCmdletB Mandatory = false, ValueFromPipelineByPropertyName = true, ParameterSetName = ContainerNameParameterSet)] [Parameter(HelpMessage = "Source Azure Storage Context Object", Mandatory = false, ValueFromPipelineByPropertyName = true, ParameterSetName = ShareNameParameterSet)] - [Parameter(HelpMessage = "Source Azure Storage Context Object", - Mandatory = false, ValueFromPipelineByPropertyName = true, ParameterSetName = ContainerParameterSet)] - [Parameter(HelpMessage = "Source Azure Storage Context Object", - Mandatory = false, ValueFromPipelineByPropertyName = true, ParameterSetName = BlobFilePathParameterSet)] - [Parameter(HelpMessage = "Source Azure Storage Context Object", - Mandatory = false, ValueFromPipelineByPropertyName = true, ParameterSetName = BlobFileParameterSet)] - [Parameter(HelpMessage = "Source Azure Storage Context Object", - Mandatory = false, ValueFromPipelineByPropertyName = true, ParameterSetName = ShareParameterSet)] - [Parameter(HelpMessage = "Source Azure Storage Context Object", - Mandatory = false, ValueFromPipelineByPropertyName = true, ParameterSetName = FileFileParameterSet)] - [Parameter(HelpMessage = "Source Azure Storage Context Object", - Mandatory = false, ValueFromPipelineByPropertyName = true, ParameterSetName = FileFilePathParameterSet)] public override IStorageContext Context { get; set; } [Parameter(HelpMessage = "Destination Storage context object", ParameterSetName = ContainerNameParameterSet)] @@ -198,13 +185,8 @@ private IStorageBlobManagement GetBlobChannel() private AzureStorageContext GetSourceContext() { if (this.ParameterSetName == ContainerNameParameterSet || - this.ParameterSetName == ShareNameParameterSet || - this.ParameterSetName == ContainerParameterSet || - this.ParameterSetName == BlobFilePathParameterSet || - this.ParameterSetName == BlobFileParameterSet || - this.ParameterSetName == ShareParameterSet || - this.ParameterSetName == FileFilePathParameterSet || - this.ParameterSetName == FileFileParameterSet) + this.ParameterSetName == ShareNameParameterSet + ) { return this.GetCmdletStorageContext(); } @@ -248,14 +230,14 @@ internal IStorageFileManagement GetDestinationChannel() } else { - destChannel = new StorageFileManagement(this.GetCmdletStorageContext(DestContext)); + destChannel = new StorageFileManagement(this.GetCmdletStorageContext(DestContext, isDestContext:true)); } } else if (BlobFileParameterSet == this.ParameterSetName || FileFileParameterSet == this.ParameterSetName || UriFileParameterSet == this.ParameterSetName) { - destChannel = new StorageFileManagement(this.GetCmdletStorageContext(DestContext)); + destChannel = new StorageFileManagement(this.GetCmdletStorageContext(DestContext, isDestContext:true)); } else { @@ -314,7 +296,7 @@ public override void ExecuteCmdlet() private void StartCopyFromBlob() { - BlobBaseClient blob = null; + CloudBlob blob = null; string sourceBlobRelativeName = null; if (null != this.SrcBlob) @@ -324,7 +306,7 @@ private void StartCopyFromBlob() } else { - BlobContainerClient srcContainer = null; + CloudBlobContainer srcContainer = null; if (null != this.SrcContainer) { @@ -333,11 +315,10 @@ private void StartCopyFromBlob() else { NameUtil.ValidateContainerName(this.SrcContainerName); - srcContainer = this.blobChannel.GetBlobContainerClient(this.SrcContainerName); - + srcContainer = this.blobChannel.GetContainerReference(this.SrcContainerName); } NameUtil.ValidateBlobName(this.SrcBlobName); - blob = srcContainer.GetBlobBaseClient(this.SrcBlobName); + blob = srcContainer.GetBlobReference(this.SrcBlobName); sourceBlobRelativeName = this.SrcBlobName; } @@ -346,8 +327,8 @@ private void StartCopyFromBlob() Func taskGenerator = (taskId) => StartAsyncCopy( taskId, destFile, - () => this.ConfirmOverwrite(Util.GetSnapshotQualifiedUri(blob.Uri), Util.GetSnapshotQualifiedUri(destFile.Uri)), - () => destFile.StartCopyAsync(blob.GenerateUriWithCredentials((AzureStorageContext)this.Context), cancellationToken: this.CmdletCancellationToken)); + () => this.ConfirmOverwrite(blob.SnapshotQualifiedUri.ToString(), Util.GetSnapshotQualifiedUri(destFile.Uri)), + () => destFile.StartCopyAsync(blob.GenerateUriWithCredentials(), cancellationToken: this.CmdletCancellationToken)); this.RunTask(taskGenerator); } @@ -391,10 +372,9 @@ private void StartCopyFromFile() ShareFileClient destFile = this.GetDestFile(); - if (((AzureStorageContext)this.Context).Track2OauthToken != null - && string.Compare(sourceFile.Uri.Host, destFile.Uri.Host, ignoreCase: true) != 0) + if (!sourceFile.CanGenerateSasUri && (sourceFile.Uri.Query != null && !sourceFile.Uri.Query.Contains("sig=")) && string.Compare(sourceFile.Uri.Host, destFile.Uri.Host, ignoreCase: true) != 0) { - WriteWarning("The source File is on Azure AD credential, might cause cross account file copy fail. Please use source File based on SharedKey or SAS creadencial to avoid the failure."); + WriteWarning("The source File cannot generate SAS Uri and might cause cross account file copy failures. Please use source File based on SharedKey or SAS creadencial to avoid the failure."); } Func taskGenerator = (taskId) => StartAsyncCopy( diff --git a/src/Storage/Storage/Storage.generated.format.ps1xml b/src/Storage/Storage/Storage.generated.format.ps1xml index 3e1a424ba2c4..63138da30aa5 100644 --- a/src/Storage/Storage/Storage.generated.format.ps1xml +++ b/src/Storage/Storage/Storage.generated.format.ps1xml @@ -332,8 +332,8 @@ Microsoft.WindowsAzure.Commands.Common.Storage.ResourceModel.AzureStorageFileDirectory - if ($_.ShareFileClient -eq $null) {$_.ShareDirectoryClient.ShareName} else {$_.ShareFileClient.ShareName} - + if ($_.ShareDirectoryClient -eq $null) {$_.ShareFileClient.AccountName + ", ShareName: " + $_.ShareFileClient.ShareName} else {$_.ShareDirectoryClient.AccountName + ", ShareName: " + $_.ShareDirectoryClient.ShareName} +