Skip to content

Commit 7ea5b5b

Browse files
authored
[Storage]Support List File V2 (#18138)
1 parent 3aa364e commit 7ea5b5b

File tree

9 files changed

+308
-108
lines changed

9 files changed

+308
-108
lines changed

src/Storage/Storage.Management.Test/ScenarioTests/StorageDataPlaneTests.ps1

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ function Test-File
5656
$file = Get-AzStorageFile -ShareName $shareName -Context $storageContext
5757
Assert-AreEqual $file.Count 1
5858
Assert-AreEqual $file[0].Name $objectName1
59+
Assert-NotNull $file[0].ListFileProperties.Properties.ETag
5960

6061
if ($Env:OS -eq "Windows_NT")
6162
{
@@ -65,16 +66,17 @@ function Test-File
6566
{
6667
Set-AzStorageFileContent -source $localSrcFile -ShareName $shareName -Path $objectName1 -Force -Context $storageContext
6768
}
68-
$file = Get-AzStorageFile -ShareName $shareName -Context $storageContext
69+
$file = Get-AzStorageFile -ShareName $shareName -Context $storageContext
6970
Assert-AreEqual $file.Count 1
7071
Assert-AreEqual $file[0].Name $objectName1
72+
Assert-NotNull $file[0].ListFileProperties.Properties.ETag
7173
if ($Env:OS -eq "Windows_NT")
7274
{
7375
$file[0].CloudFile.FetchAttributes()
7476
$localFileProperties = Get-ItemProperty $localSrcFile
75-
Assert-AreEqual $localFileProperties.CreationTime.ToUniversalTime().Ticks $file[0].CloudFile.Properties.CreationTime.ToUniversalTime().Ticks
76-
Assert-AreEqual $localFileProperties.LastWriteTime.ToUniversalTime().Ticks $file[0].CloudFile.Properties.LastWriteTime.ToUniversalTime().Ticks
77-
Assert-AreEqual $localFileProperties.Attributes.ToString() $file[0].CloudFile.Properties.NtfsAttributes.ToString()
77+
Assert-AreEqual $localFileProperties.CreationTime.ToUniversalTime().Ticks $file[0].ListFileProperties.Properties.CreatedOn.ToUniversalTime().Ticks
78+
Assert-AreEqual $localFileProperties.LastWriteTime.ToUniversalTime().Ticks $file[0].ListFileProperties.Properties.LastWrittenOn.ToUniversalTime().Ticks
79+
Assert-AreEqual $localFileProperties.Attributes.ToString() $file[0].ListFileProperties.FileAttributes.ToString()
7880
}
7981

8082
Start-AzStorageFileCopy -SrcShareName $shareName -SrcFilePath $objectName1 -DestShareName $shareName -DestFilePath $objectName2 -Force -Context $storageContext -DestContext $storageContext
@@ -103,9 +105,9 @@ function Test-File
103105
{
104106
$file = Get-AzStorageFile -ShareName $shareName -Path $objectName1 -Context $storageContext
105107
$localFileProperties = Get-ItemProperty $localSrcFile
106-
Assert-AreEqual $localFileProperties.CreationTime.ToUniversalTime().Ticks $file[0].CloudFile.Properties.CreationTime.ToUniversalTime().Ticks
107-
Assert-AreEqual $localFileProperties.LastWriteTime.ToUniversalTime().Ticks $file[0].CloudFile.Properties.LastWriteTime.ToUniversalTime().Ticks
108-
Assert-AreEqual $localFileProperties.Attributes.ToString() $file[0].CloudFile.Properties.NtfsAttributes.ToString()
108+
Assert-AreEqual $localFileProperties.CreationTime.ToUniversalTime().Ticks $file[0].FileProperties.SmbProperties.FileCreatedOn.ToUniversalTime().Ticks
109+
Assert-AreEqual $localFileProperties.LastWriteTime.ToUniversalTime().Ticks $file[0].FileProperties.SmbProperties.FileLastWrittenOn.ToUniversalTime().Ticks
110+
Assert-AreEqual $localFileProperties.Attributes.ToString() $file[0].FileProperties.SmbProperties.FileAttributes.ToString()
109111
}
110112

111113
Remove-AzStorageFile -ShareName $shareName -Path $objectName1 -Context $storageContext
@@ -115,12 +117,14 @@ function Test-File
115117

116118
$dirName = "filetestdir"
117119
New-AzStorageDirectory -ShareName $shareName -Path $dirName -Context $storageContext
118-
$file = Get-AzStorageFile -ShareName $shareName -Context $storageContext
120+
$file = Get-AzStorageShare -Name $shareName -Context $storageContext | Get-AzStorageFile -ExcludeExtendedInfo
119121
Assert-AreEqual $file.Count 2
120-
Assert-AreEqual $file[0].Name $objectName2
121-
Assert-AreEqual $file[0].GetType().Name "AzureStorageFile"
122-
Assert-AreEqual $file[1].Name $dirName
123-
Assert-AreEqual $file[1].GetType().Name "AzureStorageFileDirectory"
122+
Assert-AreEqual $file[0].Name $dirName
123+
Assert-AreEqual $file[0].GetType().Name "AzureStorageFileDirectory"
124+
Assert-Null $file[0].ListFileProperties.Properties.ETag
125+
Assert-AreEqual $file[1].Name $objectName2
126+
Assert-AreEqual $file[1].GetType().Name "AzureStorageFile"
127+
Assert-Null $file[1].ListFileProperties.Properties.ETag
124128
Get-AzStorageFile -ShareName $shareName -Path $dirName -Context $storageContext | Remove-AzStorageDirectory
125129
$file = Get-AzStorageFile -ShareName $shareName -Context $storageContext
126130
Assert-AreEqual $file.Count 1

src/Storage/Storage.Management/ChangeLog.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
- `New-AzDataLakeGen2SasToken`
2323
* Show OAuth token in debug log in debug build only
2424
- `New-AzStorageContext`
25+
* Supported return more file properties when list Azure file
26+
- `Get-AzStorageFile`
2527

2628
## Version 4.5.0
2729
* Supported DaysAfterLastTierChangeGreaterThan in Management Policy

src/Storage/Storage.Management/help/Get-AzStorageFile.md

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,23 @@ Lists directories and files for a path.
1515

1616
### ShareName (Default)
1717
```
18-
Get-AzStorageFile [-ShareName] <String> [[-Path] <String>] [-Context <IStorageContext>]
18+
Get-AzStorageFile [-ShareName] <String> [[-Path] <String>] [-ExcludeExtendedInfo] [-Context <IStorageContext>]
1919
[-ServerTimeoutPerRequest <Int32>] [-ClientTimeoutPerRequest <Int32>]
2020
[-DefaultProfile <IAzureContextContainer>] [-ConcurrentTaskCount <Int32>] [<CommonParameters>]
2121
```
2222

2323
### Share
2424
```
25-
Get-AzStorageFile [-Share] <CloudFileShare> [[-Path] <String>] [-ServerTimeoutPerRequest <Int32>]
26-
[-ClientTimeoutPerRequest <Int32>] [-DefaultProfile <IAzureContextContainer>] [-ConcurrentTaskCount <Int32>]
27-
[<CommonParameters>]
25+
Get-AzStorageFile [-Share] <CloudFileShare> [[-Path] <String>] [-ExcludeExtendedInfo]
26+
[-Context <IStorageContext>] [-ServerTimeoutPerRequest <Int32>] [-ClientTimeoutPerRequest <Int32>]
27+
[-DefaultProfile <IAzureContextContainer>] [-ConcurrentTaskCount <Int32>] [<CommonParameters>]
2828
```
2929

3030
### Directory
3131
```
32-
Get-AzStorageFile [-Directory] <CloudFileDirectory> [[-Path] <String>] [-ServerTimeoutPerRequest <Int32>]
33-
[-ClientTimeoutPerRequest <Int32>] [-DefaultProfile <IAzureContextContainer>] [-ConcurrentTaskCount <Int32>]
34-
[<CommonParameters>]
32+
Get-AzStorageFile [-Directory] <CloudFileDirectory> [[-Path] <String>] [-ExcludeExtendedInfo]
33+
[-Context <IStorageContext>] [-ServerTimeoutPerRequest <Int32>] [-ClientTimeoutPerRequest <Int32>]
34+
[-DefaultProfile <IAzureContextContainer>] [-ConcurrentTaskCount <Int32>] [<CommonParameters>]
3535
```
3636

3737
## DESCRIPTION
@@ -102,7 +102,7 @@ To obtain a Storage context, use the New-AzStorageContext cmdlet.
102102
103103
```yaml
104104
Type: Microsoft.Azure.Commands.Common.Authentication.Abstractions.IStorageContext
105-
Parameter Sets: ShareName
105+
Parameter Sets: (All)
106106
Aliases:
107107

108108
Required: False
@@ -145,6 +145,21 @@ Accept pipeline input: True (ByPropertyName, ByValue)
145145
Accept wildcard characters: False
146146
```
147147
148+
### -ExcludeExtendedInfo
149+
Not include extended file info like timestamps, ETag, attributes, permissionKey in list file and Directory.
150+
151+
```yaml
152+
Type: System.Management.Automation.SwitchParameter
153+
Parameter Sets: (All)
154+
Aliases:
155+
156+
Required: False
157+
Position: Named
158+
Default value: None
159+
Accept pipeline input: False
160+
Accept wildcard characters: False
161+
```
162+
148163
### -Path
149164
Specifies the path of a folder.
150165
If you omit the *Path* parameter, **Get-AzStorageFile** lists the directories and files in the specified file share or directory.
@@ -214,7 +229,7 @@ Accept wildcard characters: False
214229
```
215230
216231
### CommonParameters
217-
This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).
232+
This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216).
218233
219234
## INPUTS
220235

src/Storage/Storage/Common/AzureStorageFile.cs

Lines changed: 76 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,23 @@ namespace Microsoft.WindowsAzure.Commands.Common.Storage.ResourceModel
2222
using global::Azure.Storage.Files.Shares;
2323
using global::Azure.Storage;
2424
using Microsoft.WindowsAzure.Commands.Storage.Common;
25+
using global::Azure.Storage.Files.Shares.Models;
26+
using Microsoft.Azure.Storage.Auth;
2527

2628
/// <summary>
2729
/// Azure storage file object
2830
/// </summary>
2931
public class AzureStorageFile : AzureStorageBase
3032
{
3133
/// <summary>
32-
/// CloudBlob object
34+
/// File object
3335
/// </summary>
3436
[Ps1Xml(Label = "Share Uri", Target = ViewControl.Table, GroupByThis = true, ScriptBlock = "$_.CloudFile.Share.Uri")]
3537
[Ps1Xml(Label = "Name", Target = ViewControl.Table, ScriptBlock = "$_.Name", Position = 0, TableColumnWidth = 20)]
3638
public CloudFile CloudFile { get; private set; }
3739

3840
/// <summary>
39-
/// Blob length
41+
/// File length
4042
/// </summary>
4143
[Ps1Xml(Label = "Length", Target = ViewControl.Table, Position = 1, TableColumnWidth = 15)]
4244
public long Length { get; private set; }
@@ -56,7 +58,7 @@ public ShareFileClient ShareFileClient
5658
{
5759
if (privateFileClient == null)
5860
{
59-
privateFileClient = GetTrack2FileClient(this.CloudFile, (AzureStorageContext)this.Context);
61+
privateFileClient = GetTrack2FileClient(this.CloudFile, this.shareClientOptions);
6062
}
6163
return privateFileClient;
6264
}
@@ -80,20 +82,85 @@ public ShareFileClient ShareFileClient
8082
private global::Azure.Storage.Files.Shares.Models.ShareFileProperties privateFileProperties = null;
8183

8284
/// <summary>
83-
/// Azure storage file constructor
85+
/// XSCL Track2 File List properties
86+
/// </summary>
87+
public global::Azure.Storage.Files.Shares.Models.ShareFileItem ListFileProperties { get; private set; }
88+
89+
90+
private ShareClientOptions shareClientOptions { get; set; }
91+
92+
/// <summary>
93+
/// Azure storage file constructor from track1 file object
8494
/// </summary>
8595
/// <param name="file">Cloud file object</param>
86-
public AzureStorageFile(CloudFile file, AzureStorageContext storageContext)
96+
public AzureStorageFile(CloudFile file, AzureStorageContext storageContext, ShareClientOptions clientOptions = null)
8797
{
8898
Name = file.Name;
8999
CloudFile = file;
90100
Length = file.Properties.Length;
91101
LastModified = file.Properties.LastModified;
92102
Context = storageContext;
103+
shareClientOptions = clientOptions;
104+
}
105+
106+
/// <summary>
107+
/// Azure storage file constructor from Track2 list file item
108+
/// </summary>
109+
/// <param name="file">Cloud file object</param>
110+
public AzureStorageFile(ShareFileClient shareFileClient, AzureStorageContext storageContext, ShareFileItem shareFileItem, ShareClientOptions clientOptions = null)
111+
{
112+
Name = shareFileClient.Name;
113+
this.privateFileClient = shareFileClient;
114+
CloudFile = GetTrack1FileClient(shareFileClient, storageContext.StorageAccount.Credentials);
115+
if (shareFileItem != null)
116+
{
117+
ListFileProperties = shareFileItem;
118+
if (shareFileItem.FileSize != null)
119+
{
120+
Length = shareFileItem.FileSize.Value;
121+
}
122+
if (shareFileItem.Properties != null)
123+
{
124+
LastModified = shareFileItem.Properties.LastModified;
125+
}
126+
}
127+
Context = storageContext;
128+
shareClientOptions = clientOptions;
129+
}
130+
131+
/// <summary>
132+
/// Azure storage file constructor from Track2 get file properties output
133+
/// </summary>
134+
/// <param name="file">Cloud file object</param>
135+
public AzureStorageFile(ShareFileClient shareFileClient, AzureStorageContext storageContext, ShareFileProperties shareFileProperties = null, ShareClientOptions clientOptions = null)
136+
{
137+
Name = shareFileClient.Name;
138+
this.privateFileClient = shareFileClient;
139+
CloudFile = GetTrack1FileClient(shareFileClient, storageContext.StorageAccount.Credentials);
140+
if (shareFileProperties != null)
141+
{
142+
privateFileProperties = shareFileProperties;
143+
Length = shareFileProperties.ContentLength;
144+
LastModified = shareFileProperties.LastModified;
145+
}
146+
Context = storageContext;
147+
shareClientOptions = clientOptions;
148+
}
149+
150+
// Convert Track2 File object to Track 1 file object
151+
public static CloudFile GetTrack1FileClient(ShareFileClient shareFileClient, StorageCredentials credentials)
152+
{
153+
if (credentials.IsSAS) // the Uri already contains credentail.
154+
{
155+
credentials = null;
156+
}
157+
CloudFile track1CloudFile;
158+
track1CloudFile = new CloudFile(shareFileClient.Uri, credentials);
159+
return track1CloudFile;
93160
}
94161

95162
// Convert Track1 File object to Track 2 file Client
96-
public static ShareFileClient GetTrack2FileClient(CloudFile cloudFile, AzureStorageContext context)
163+
public static ShareFileClient GetTrack2FileClient(CloudFile cloudFile, ShareClientOptions clientOptions = null)
97164
{
98165
ShareFileClient fileClient;
99166
if (cloudFile.ServiceClient.Credentials.IsSAS) //SAS
@@ -109,16 +176,16 @@ public static ShareFileClient GetTrack2FileClient(CloudFile cloudFile, AzureStor
109176
{
110177
fullUri = fullUri + "?" + sas;
111178
}
112-
fileClient = new ShareFileClient(new Uri(fullUri));
179+
fileClient = new ShareFileClient(new Uri(fullUri), clientOptions);
113180
}
114181
else if (cloudFile.ServiceClient.Credentials.IsSharedKey) //Shared Key
115182
{
116183
fileClient = new ShareFileClient(cloudFile.SnapshotQualifiedUri,
117-
new StorageSharedKeyCredential(context.StorageAccountName, cloudFile.ServiceClient.Credentials.ExportBase64EncodedKey()));
184+
new StorageSharedKeyCredential(cloudFile.ServiceClient.Credentials.AccountName, cloudFile.ServiceClient.Credentials.ExportBase64EncodedKey()), clientOptions);
118185
}
119186
else //Anonymous
120187
{
121-
fileClient = new ShareFileClient(cloudFile.SnapshotQualifiedUri);
188+
fileClient = new ShareFileClient(cloudFile.SnapshotQualifiedUri, clientOptions);
122189
}
123190

124191
return fileClient;

0 commit comments

Comments
 (0)