Skip to content

Commit 65f18f8

Browse files
authored
Merge pull request #5734 from sergey-shandar/sergey-vmss-disks
New-AzureRmVM/VMSS: DataDiskSizeInGb parameter
2 parents 37ad7df + cf90b17 commit 65f18f8

File tree

12 files changed

+145
-32
lines changed

12 files changed

+145
-32
lines changed

src/ResourceManager/Common/Commands.Common.Strategies/Extensions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ namespace Microsoft.Azure.Commands.Common.Strategies
2121
{
2222
public static class Extensions
2323
{
24+
public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> v)
25+
=> v ?? Enumerable.Empty<T>();
26+
2427
public static TValue GetOrNull<TKey, TValue>(
2528
this IDictionary<TKey, TValue> dictionary, TKey key)
2629
where TValue : class

src/ResourceManager/Compute/Commands.Compute/Commands.Compute.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,9 @@
270270
<Compile Include="Strategies\Client.cs" />
271271
<Compile Include="Strategies\ComputeRp\AvailabilitySetStrategy.cs" />
272272
<Compile Include="Strategies\ComputeRp\ComputeStrategy.cs" />
273+
<Compile Include="Strategies\ComputeRp\DataDiskStrategy.cs" />
273274
<Compile Include="Strategies\ComputeRp\ImageAndOsType.cs" />
275+
<Compile Include="Strategies\ComputeRp\ImageDataDiskStrategy.cs" />
274276
<Compile Include="Strategies\ComputeRp\ImageEx.cs" />
275277
<Compile Include="Strategies\ComputeRp\Images.cs" />
276278
<Compile Include="Strategies\ComputeRp\ApiEntityReferenceStrategy.cs" />

src/ResourceManager/Compute/Commands.Compute/Manual/VirtualMachineScaleSetCreateOrUpdateMethod.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ public partial class NewAzureRmVmss : ComputeAutomationBaseCmdlet
114114
[Parameter(ParameterSetName = SimpleParameterSet, Mandatory = false)]
115115
public int[] NatBackendPort { get; set; }
116116

117+
[Parameter(ParameterSetName = SimpleParameterSet, Mandatory = false)]
118+
public int[] DataDiskSizeInGb { get; set; }
119+
117120
const int FirstPortRangeStart = 50000;
118121

119122
sealed class Parameters : IParameters<VirtualMachineScaleSet>
@@ -218,7 +221,8 @@ public async Task<ResourceConfig<VirtualMachineScaleSet>> CreateConfigAsync()
218221
instanceCount: _cmdlet.InstanceCount,
219222
upgradeMode: _cmdlet.MyInvocation.BoundParameters.ContainsKey(nameof(UpgradePolicyMode))
220223
? _cmdlet.UpgradePolicyMode
221-
: (UpgradeMode?)null);
224+
: (UpgradeMode?)null,
225+
dataDisks: _cmdlet.DataDiskSizeInGb);
222226
}
223227
}
224228

src/ResourceManager/Compute/Commands.Compute/Strategies/ComputeRp/ComputeStrategy.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,13 @@ public static ResourceStrategy<TModel> Create<TModel, TOperations>(
4343

4444
public static string GetConnectionString(
4545
this ImageAndOsType imageAndOsType, string fqdn, string user, string port = null)
46-
{
47-
var url = fqdn + (port == null ? string.Empty : ":" + port);
48-
return imageAndOsType.OsType == OperatingSystemTypes.Windows
49-
? "mstsc /v:" + url
50-
: "ssh " + (user == null ? string.Empty : user + "@") + url;
51-
}
46+
=> imageAndOsType.OsType == OperatingSystemTypes.Windows
47+
? "mstsc /v:"
48+
+ fqdn
49+
+ (port == null ? string.Empty : ":" + port)
50+
: "ssh "
51+
+ (user == null ? string.Empty : user + "@")
52+
+ fqdn
53+
+ (port == null ? string.Empty : " -p " + port);
5254
}
5355
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using Microsoft.Azure.Commands.Common.Strategies;
2+
using Microsoft.Azure.Management.Compute.Models;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
7+
namespace Microsoft.Azure.Commands.Compute.Strategies.ComputeRp
8+
{
9+
static class DataDiskStrategy
10+
{
11+
static IList<T> CreateDataDisks<T>(
12+
IEnumerable<int> imageDataDiskLuns,
13+
IEnumerable<int> dataDiskSizes,
14+
Func<DiskCreateOptionTypes, int, int?, T> createDataDisk)
15+
{
16+
if (dataDiskSizes == null)
17+
{
18+
return null;
19+
}
20+
imageDataDiskLuns = imageDataDiskLuns.EmptyIfNull();
21+
var firstLun = imageDataDiskLuns
22+
.Select(v => v + 1)
23+
.Concat(new[] { 0 })
24+
.Max();
25+
return imageDataDiskLuns
26+
.Select(lun => createDataDisk(DiskCreateOptionTypes.FromImage, lun, null))
27+
.Concat(dataDiskSizes.Select((size, i) => createDataDisk(
28+
DiskCreateOptionTypes.Empty,
29+
i + firstLun,
30+
size)))
31+
.ToList();
32+
}
33+
34+
public static IList<DataDisk> CreateDataDisks(
35+
IEnumerable<int> imageDataDiskLuns,
36+
IEnumerable<int> dataDiskSizes)
37+
=> CreateDataDisks(
38+
imageDataDiskLuns,
39+
dataDiskSizes,
40+
(createOption, lun, size) => new DataDisk
41+
{
42+
CreateOption = createOption,
43+
Lun = lun,
44+
DiskSizeGB = size,
45+
});
46+
47+
public static IList<VirtualMachineScaleSetDataDisk> CreateVmssDataDisks(
48+
IEnumerable<int> dataDisks,
49+
IEnumerable<int> dataDiskSizes)
50+
=> CreateDataDisks(
51+
dataDisks,
52+
dataDiskSizes,
53+
(createOption, lun, size) => new VirtualMachineScaleSetDataDisk
54+
{
55+
CreateOption = createOption,
56+
Lun = lun,
57+
DiskSizeGB = size,
58+
});
59+
}
60+
}

src/ResourceManager/Compute/Commands.Compute/Strategies/ComputeRp/ImageAndOsType.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// ----------------------------------------------------------------------------------
1414

1515
using Microsoft.Azure.Management.Compute.Models;
16+
using System.Collections.Generic;
1617

1718
namespace Microsoft.Azure.Commands.Compute.Strategies.ComputeRp
1819
{
@@ -22,10 +23,13 @@ sealed class ImageAndOsType
2223

2324
public ImageReference Image { get; }
2425

25-
public ImageAndOsType(OperatingSystemTypes osType, ImageReference image)
26+
public IList<int> DataDiskLuns { get; }
27+
28+
public ImageAndOsType(OperatingSystemTypes osType, ImageReference image, IList<int> dataDiskLuns)
2629
{
2730
OsType = osType;
2831
Image = image;
32+
DataDiskLuns = dataDiskLuns;
2933
}
3034
}
3135
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using Microsoft.Azure.Management.Compute.Models;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
6+
namespace Microsoft.Azure.Commands.Compute.Strategies.ComputeRp
7+
{
8+
static class ImageDataDiskStrategy
9+
{
10+
static IList<int> GetLuns<T>(this IEnumerable<T> imageDataDisks, Func<T, int?> getLun)
11+
=> imageDataDisks.Select(idd => getLun(idd) ?? 0).ToList();
12+
13+
public static IList<int> GetLuns(this IEnumerable<ImageDataDisk> imageDataDisks)
14+
=> imageDataDisks.GetLuns(idd => idd.Lun);
15+
16+
public static IList<int> GetLuns(this IEnumerable<DataDiskImage> imageDataDisks)
17+
=> imageDataDisks.GetLuns(idd => idd.Lun);
18+
}
19+
}

src/ResourceManager/Compute/Commands.Compute/Strategies/ComputeRp/ImageEx.cs

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,11 @@ public static async Task<ImageAndOsType> UpdateImageAndOsTypeAsync(
8282
}
8383
var imageModel = await compute.VirtualMachineImages.GetAsync(
8484
location, image.Publisher, image.Offer, image.Sku, image.Version);
85-
return new ImageAndOsType(imageModel.OsDiskImage.OperatingSystem, image);
86-
}
85+
return new ImageAndOsType(
86+
imageModel.OsDiskImage.OperatingSystem,
87+
image,
88+
imageModel.DataDiskImages.GetLuns());
89+
}
8790
else if (imageName.Contains("/"))
8891
{
8992
var resourceId = ResourceId.TryParse(imageName);
@@ -99,22 +102,13 @@ public static async Task<ImageAndOsType> UpdateImageAndOsTypeAsync(
99102
throw new ArgumentException(Resources.ComputeMismatchSubscription);
100103
}
101104

102-
var localImage = await compute.Images.GetAsync(
103-
resourceGroupName: resourceId.ResourceGroupName,
104-
imageName: resourceId.Name);
105-
106-
return new ImageAndOsType(
107-
localImage.StorageProfile.OsDisk.OsType,
108-
new ImageReference { Id = localImage.Id });
105+
return await compute.GetImageAndOsTypeAsync(resourceId.ResourceGroupName, resourceId.Name);
109106
}
110107
else
111108
{
112109
try
113110
{
114-
var localImage = await compute.Images.GetAsync(resourceGroupName, imageName);
115-
return new ImageAndOsType(
116-
localImage.StorageProfile.OsDisk.OsType,
117-
new ImageReference { Id = localImage.Id });
111+
return await compute.GetImageAndOsTypeAsync(resourceGroupName, imageName);
118112
}
119113
catch
120114
{
@@ -130,7 +124,8 @@ public static async Task<ImageAndOsType> UpdateImageAndOsTypeAsync(
130124
osAndMap.Key == "Windows"
131125
? OperatingSystemTypes.Windows
132126
: OperatingSystemTypes.Linux,
133-
nameAndImage.Value)))
127+
nameAndImage.Value,
128+
null)))
134129
.FirstOrDefault();
135130

136131
if (result == null)
@@ -141,5 +136,15 @@ public static async Task<ImageAndOsType> UpdateImageAndOsTypeAsync(
141136
return result;
142137
}
143138
}
139+
140+
static async Task<ImageAndOsType> GetImageAndOsTypeAsync(
141+
this ComputeManagementClient compute, string resourceGroupName, string name)
142+
{
143+
var localImage = await compute.Images.GetAsync(resourceGroupName, name);
144+
return new ImageAndOsType(
145+
localImage.StorageProfile.OsDisk.OsType,
146+
new ImageReference { Id = localImage.Id },
147+
localImage.StorageProfile.DataDisks.GetLuns());
148+
}
144149
}
145150
}

src/ResourceManager/Compute/Commands.Compute/Strategies/ComputeRp/VirtualMachineScaleSetStrategy.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ internal static ResourceConfig<VirtualMachineScaleSet> CreateVirtualMachineScale
4747
string adminPassword,
4848
string vmSize,
4949
int instanceCount,
50-
UpgradeMode? upgradeMode)
50+
UpgradeMode? upgradeMode,
51+
IEnumerable<int> dataDisks)
5152
=> Strategy.CreateResourceConfig(
5253
resourceGroup: resourceGroup,
5354
name: name,
@@ -82,7 +83,9 @@ internal static ResourceConfig<VirtualMachineScaleSet> CreateVirtualMachineScale
8283
},
8384
StorageProfile = new VirtualMachineScaleSetStorageProfile
8485
{
85-
ImageReference = imageAndOsType?.Image
86+
ImageReference = imageAndOsType?.Image,
87+
DataDisks = DataDiskStrategy.CreateVmssDataDisks(
88+
imageAndOsType?.DataDiskLuns, dataDisks)
8689
},
8790
NetworkProfile = new VirtualMachineScaleSetNetworkProfile
8891
{

src/ResourceManager/Compute/Commands.Compute/Strategies/ComputeRp/VirtualMachineStrategy.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
using Microsoft.Azure.Management.Internal.Resources.Models;
1818
using Microsoft.Azure.Management.Internal.Network.Version2017_10_01.Models;
1919
using Microsoft.Azure.Commands.Common.Strategies;
20+
using System.Collections.Generic;
2021

2122
namespace Microsoft.Azure.Commands.Compute.Strategies.ComputeRp
2223
{
@@ -43,7 +44,8 @@ public static ResourceConfig<VirtualMachine> CreateVirtualMachineConfig(
4344
string adminUsername,
4445
string adminPassword,
4546
string size,
46-
ResourceConfig<AvailabilitySet> availabilitySet)
47+
ResourceConfig<AvailabilitySet> availabilitySet,
48+
IEnumerable<int> dataDisks)
4749
=> Strategy.CreateResourceConfig(
4850
resourceGroup: resourceGroup,
4951
name: name,
@@ -70,7 +72,9 @@ public static ResourceConfig<VirtualMachine> CreateVirtualMachineConfig(
7072
},
7173
StorageProfile = new StorageProfile
7274
{
73-
ImageReference = imageAndOsType?.Image
75+
ImageReference = imageAndOsType?.Image,
76+
DataDisks = DataDiskStrategy.CreateDataDisks(
77+
imageAndOsType?.DataDiskLuns, dataDisks)
7478
},
7579
AvailabilitySet = engine.GetReference(availabilitySet)
7680
});
@@ -82,7 +86,8 @@ public static ResourceConfig<VirtualMachine> CreateVirtualMachineConfig(
8286
OperatingSystemTypes osType,
8387
ResourceConfig<Disk> disk,
8488
string size,
85-
ResourceConfig<AvailabilitySet> availabilitySet)
89+
ResourceConfig<AvailabilitySet> availabilitySet,
90+
IEnumerable<int> dataDisks)
8691
=> Strategy.CreateResourceConfig(
8792
resourceGroup: resourceGroup,
8893
name: name,
@@ -107,7 +112,8 @@ public static ResourceConfig<VirtualMachine> CreateVirtualMachineConfig(
107112
CreateOption = DiskCreateOptionTypes.Attach,
108113
OsType = osType,
109114
ManagedDisk = engine.GetReference(disk, StorageAccountTypes.PremiumLRS),
110-
}
115+
},
116+
DataDisks = DataDiskStrategy.CreateDataDisks(null, dataDisks)
111117
},
112118
AvailabilitySet = engine.GetReference(availabilitySet)
113119
});

src/ResourceManager/Compute/Commands.Compute/Strategies/StrategyCmdlet.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using Microsoft.Azure.Commands.Common.Strategies;
2-
using System;
32
using System.Threading;
43
using System.Threading.Tasks;
54

src/ResourceManager/Compute/Commands.Compute/VirtualMachine/Operation/NewAzureVMCommand.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
using Microsoft.Azure.Management.Compute;
2929
using Microsoft.Azure.Management.Compute.Models;
3030
using Microsoft.Azure.Management.Internal.Network.Version2017_10_01;
31-
using Microsoft.Azure.Management.Internal.Network.Version2017_10_01.Models;
3231
using Microsoft.Azure.Management.Internal.Resources;
3332
using Microsoft.Azure.Management.Internal.Resources.Models;
3433
using Microsoft.Azure.Management.Storage;
@@ -211,6 +210,10 @@ public class NewAzureVMCommand : VirtualMachineBaseCmdlet
211210
[Parameter(Mandatory = false, HelpMessage = "Run cmdlet in the background")]
212211
public SwitchParameter AsJob { get; set; }
213212

213+
[Parameter(ParameterSetName = SimpleParameterSet, Mandatory = false)]
214+
[Parameter(ParameterSetName = DiskFileParameterSet, Mandatory = false)]
215+
public int[] DataDiskSizeInGb { get; set; }
216+
214217
public override void ExecuteCmdlet()
215218
{
216219
switch (ParameterSetName)
@@ -293,7 +296,8 @@ public async Task<ResourceConfig<VirtualMachine>> CreateConfigAsync()
293296
adminPassword:
294297
new NetworkCredential(string.Empty, _cmdlet.Credential.Password).Password,
295298
size: _cmdlet.Size,
296-
availabilitySet: availabilitySet);
299+
availabilitySet: availabilitySet,
300+
dataDisks: _cmdlet.DataDiskSizeInGb);
297301
}
298302
else
299303
{
@@ -307,7 +311,8 @@ public async Task<ResourceConfig<VirtualMachine>> CreateConfigAsync()
307311
osType: ImageAndOsType.OsType,
308312
disk: disk,
309313
size: _cmdlet.Size,
310-
availabilitySet: availabilitySet);
314+
availabilitySet: availabilitySet,
315+
dataDisks: _cmdlet.DataDiskSizeInGb);
311316
}
312317
}
313318
}
@@ -341,6 +346,7 @@ async Task StrategyExecuteCmdletAsync(IAsyncCmdlet asyncCmdlet)
341346
}
342347
parameters.ImageAndOsType = new ImageAndOsType(
343348
Linux ? OperatingSystemTypes.Linux : OperatingSystemTypes.Windows,
349+
null,
344350
null);
345351
var storageClient = AzureSession.Instance.ClientFactory.CreateArmClient<StorageManagementClient>(
346352
DefaultProfile.DefaultContext,

0 commit comments

Comments
 (0)