Skip to content

Commit 3dd3adf

Browse files
committed
Merge pull request #102 from dscsolutions/dscstatus
Adding new dsc extension status cmdlet
2 parents d4d0e42 + 2bef41c commit 3dd3adf

10 files changed

+854
-66
lines changed

src/ServiceManagement/Compute/Commands.ServiceManagement.Extensions.Test/Commands.ServiceManagement.Extensions.Test.csproj

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,12 @@
3232
<DebugType>pdbonly</DebugType>
3333
<Optimize>true</Optimize>
3434
<OutputPath>bin\Release\</OutputPath>
35-
<DefineConstants>TRACE</DefineConstants>
35+
<DefineConstants>TRACE;SIGN</DefineConstants>
3636
<ErrorReport>prompt</ErrorReport>
3737
<WarningLevel>4</WarningLevel>
38+
<DelaySign>true</DelaySign>
39+
<SignAssembly>true</SignAssembly>
40+
<AssemblyOriginatorKeyFile>MSSharedLibKey.snk</AssemblyOriginatorKeyFile>
3841
</PropertyGroup>
3942
<ItemGroup>
4043
<Reference Include="Hyak.Common">
@@ -70,6 +73,10 @@
7073
<Reference Include="Microsoft.Threading.Tasks.Extensions.Desktop">
7174
<HintPath>..\..\..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.Desktop.dll</HintPath>
7275
</Reference>
76+
<Reference Include="Microsoft.WindowsAzure.Management.Compute, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
77+
<SpecificVersion>False</SpecificVersion>
78+
<HintPath>..\..\..\packages\Microsoft.WindowsAzure.Management.Compute.8.0.0\lib\net40\Microsoft.WindowsAzure.Management.Compute.dll</HintPath>
79+
</Reference>
7380
<Reference Include="Microsoft.WindowsAzure.Management">
7481
<HintPath>..\..\..\packages\Microsoft.WindowsAzure.Management.4.0.0\lib\net40\Microsoft.WindowsAzure.Management.dll</HintPath>
7582
</Reference>
@@ -91,6 +98,10 @@
9198
<HintPath>..\..\..\packages\Microsoft.Net.Http.2.2.28\lib\net45\System.Net.Http.Primitives.dll</HintPath>
9299
</Reference>
93100
<Reference Include="System.Net.Http.WebRequest" />
101+
<Reference Include="xunit, Version=1.9.2.1705, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
102+
<SpecificVersion>False</SpecificVersion>
103+
<HintPath>..\..\..\packages\xunit.1.9.2\lib\net20\xunit.dll</HintPath>
104+
</Reference>
94105
</ItemGroup>
95106
<Choose>
96107
<When Condition="('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'">
@@ -107,19 +118,29 @@
107118
<ItemGroup>
108119
<Compile Include="DSC\DscExtensionConfigurationParsingHelperTests.cs" />
109120
<Compile Include="DSC\DscExtensionSettingsSerializerTests.cs" />
121+
<Compile Include="DSC\UnitTests\GetAzureVmDscExtensionStatusUnitTest.cs" />
110122
<Compile Include="Properties\AssemblyInfo.cs" />
111123
</ItemGroup>
112124
<ItemGroup>
125+
<ProjectReference Include="..\..\..\Common\Commands.Common\Commands.Common.csproj">
126+
<Project>{5EE72C53-1720-4309-B54B-5FB79703195F}</Project>
127+
<Name>Commands.Common</Name>
128+
</ProjectReference>
113129
<ProjectReference Include="..\..\..\Common\Commands.ScenarioTests.Common\Commands.ScenarioTests.Common.csproj">
114130
<Project>{C1BDA476-A5CC-4394-914D-48B0EC31A710}</Project>
115131
<Name>Commands.ScenarioTests.Common</Name>
116132
</ProjectReference>
133+
<ProjectReference Include="..\..\Services\Commands.Utilities\Commands.Utilities.csproj">
134+
<Project>{4900EC4E-8DEB-4412-9108-0BC52F81D457}</Project>
135+
<Name>Commands.Utilities</Name>
136+
</ProjectReference>
117137
<ProjectReference Include="..\Commands.ServiceManagement\Commands.ServiceManagement.csproj">
118138
<Project>{e1ca72ba-8374-45f6-904d-fd34ecdf5b6f}</Project>
119139
<Name>Commands.ServiceManagement</Name>
120140
</ProjectReference>
121141
</ItemGroup>
122142
<ItemGroup>
143+
<None Include="MSSharedLibKey.snk" />
123144
<None Include="packages.config" />
124145
<None Include="Resources\DSC\Configurations\CorporateClientConfiguration.ps1" />
125146
<None Include="Resources\DSC\Configurations\DomainControllerConfiguration.ps1" />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,272 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using Microsoft.WindowsAzure.Commands.ServiceManagement.IaaS.Extensions;
5+
using Microsoft.WindowsAzure.Commands.ServiceManagement.Model;
6+
using Xunit;
7+
8+
namespace Microsoft.WindowsAzure.Commands.ServiceManagement.Extensions.Test.DSC.UnitTests
9+
{
10+
using NSM = Management.Compute.Models;
11+
12+
public class GetAzureVmDscExtensionStatusUnitTest
13+
{
14+
private readonly GetAzureVmDscExtensionStatusCommand getAzureVmDscExtensionStatusCmdlet;
15+
private const string ServiceName = "dsc-service";
16+
17+
public GetAzureVmDscExtensionStatusUnitTest()
18+
{
19+
getAzureVmDscExtensionStatusCmdlet = new GetAzureVmDscExtensionStatusCommand();
20+
}
21+
22+
[Fact]
23+
public void TestGetService()
24+
{
25+
//when service name is passed as argument in the cmdlet
26+
getAzureVmDscExtensionStatusCmdlet.GetService(ServiceName, null);
27+
Assert.Equal(ServiceName, getAzureVmDscExtensionStatusCmdlet.Service);
28+
29+
//when vm object is passed as argument in the cmdlet
30+
getAzureVmDscExtensionStatusCmdlet.GetService("", GetAzureVM(ServiceName, ServiceName));
31+
Assert.Equal(ServiceName, getAzureVmDscExtensionStatusCmdlet.Service);
32+
}
33+
34+
[Fact]
35+
public void TestGetVirtualMachineDscStatusContextListWithServiceName()
36+
{
37+
getAzureVmDscExtensionStatusCmdlet.Service = ServiceName;
38+
39+
// service has multiple vm's
40+
var roles = new List<NSM.Role> {CreateRole("dscmachine01"), CreateRole("dscmachine02")};
41+
var roleInstances = new List<NSM.RoleInstance>
42+
{
43+
CreateRoleInstance("dscmachine01"),
44+
CreateRoleInstance("dscmachine02")
45+
};
46+
47+
var deploymentResponse = CreateDeploymentGetResponse(ServiceName, roles, roleInstances);
48+
var dscExtensionStatusContexts =
49+
getAzureVmDscExtensionStatusCmdlet
50+
.GetVirtualMachineDscStatusContextList(deploymentResponse);
51+
Assert.Null(getAzureVmDscExtensionStatusCmdlet.Name);
52+
Assert.Null(getAzureVmDscExtensionStatusCmdlet.VmName);
53+
Assert.NotNull(dscExtensionStatusContexts);
54+
Assert.Equal(dscExtensionStatusContexts.Count, 2);
55+
56+
}
57+
58+
[Fact]
59+
public void TestGetVirtualMachineDscStatusContextListWithServiceNameAndVmName()
60+
{
61+
getAzureVmDscExtensionStatusCmdlet.Service = ServiceName;
62+
getAzureVmDscExtensionStatusCmdlet.Name = "dscmachine01";
63+
64+
// service has multiple vm's
65+
var roles = new List<NSM.Role> {CreateRole("dscmachine01"), CreateRole("dscmachine02")};
66+
var roleInstances = new List<NSM.RoleInstance>
67+
{
68+
CreateRoleInstance("dscmachine01"),
69+
CreateRoleInstance("dscmachine02")
70+
};
71+
72+
var deploymentResponse = CreateDeploymentGetResponse(ServiceName, roles, roleInstances);
73+
var dscExtensionStatusContexts =
74+
getAzureVmDscExtensionStatusCmdlet
75+
.GetVirtualMachineDscStatusContextList(deploymentResponse);
76+
Assert.NotNull(getAzureVmDscExtensionStatusCmdlet.Name);
77+
Assert.Null(getAzureVmDscExtensionStatusCmdlet.VmName);
78+
Assert.NotNull(dscExtensionStatusContexts);
79+
Assert.Equal(dscExtensionStatusContexts.Count, 1);
80+
81+
}
82+
83+
[Fact]
84+
public void TestGetVirtualMachineDscStatusContextListWithServiceNameAndIncorrectVmName()
85+
{
86+
getAzureVmDscExtensionStatusCmdlet.Service = ServiceName;
87+
getAzureVmDscExtensionStatusCmdlet.Name = "some-blah";
88+
89+
// service has multiple vm's
90+
var roles = new List<NSM.Role> {CreateRole("dscmachine01"), CreateRole("dscmachine02")};
91+
var roleInstances = new List<NSM.RoleInstance>
92+
{
93+
CreateRoleInstance("dscmachine01"),
94+
CreateRoleInstance("dscmachine02")
95+
};
96+
97+
var deploymentResponse = CreateDeploymentGetResponse(ServiceName, roles, roleInstances);
98+
var dscExtensionStatusContexts =
99+
getAzureVmDscExtensionStatusCmdlet
100+
.GetVirtualMachineDscStatusContextList(deploymentResponse);
101+
Assert.NotNull(getAzureVmDscExtensionStatusCmdlet.Name);
102+
Assert.Null(getAzureVmDscExtensionStatusCmdlet.VmName);
103+
Assert.Equal(dscExtensionStatusContexts.Count, 0);
104+
105+
}
106+
107+
[Fact]
108+
public void TestGetVirtualMachineDscStatusContextListWithVm()
109+
{
110+
getAzureVmDscExtensionStatusCmdlet.Service = ServiceName;
111+
getAzureVmDscExtensionStatusCmdlet.VmName = "dscmachine02";
112+
113+
// service has multiple vm's
114+
var roles = new List<NSM.Role> {CreateRole("dscmachine02")};
115+
var roleInstances = new List<NSM.RoleInstance> {CreateRoleInstance("dscmachine02")};
116+
117+
var deploymentResponse = CreateDeploymentGetResponse(ServiceName, roles, roleInstances);
118+
var dscExtensionStatusContexts =
119+
getAzureVmDscExtensionStatusCmdlet
120+
.GetVirtualMachineDscStatusContextList(deploymentResponse);
121+
Assert.Null(getAzureVmDscExtensionStatusCmdlet.Name);
122+
Assert.NotNull(getAzureVmDscExtensionStatusCmdlet.VmName);
123+
Assert.Equal(dscExtensionStatusContexts.Count, 1);
124+
}
125+
126+
[Fact]
127+
public void TestCreateDscStatusContext()
128+
{
129+
getAzureVmDscExtensionStatusCmdlet.Service = ServiceName;
130+
131+
var roles = new List<NSM.Role> {CreateRole("dscmachine02")};
132+
var roleInstances = new List<NSM.RoleInstance> {CreateRoleInstance("dscmachine02")};
133+
var context =
134+
getAzureVmDscExtensionStatusCmdlet.CreateDscStatusContext(
135+
roles[0], roleInstances[0]);
136+
Assert.NotNull(context);
137+
Assert.Equal(context.Name, "dscmachine02");
138+
Assert.Equal(context.StatusCode, 1);
139+
Assert.Equal(context.ServiceName, ServiceName);
140+
Assert.Equal(context.Status, "Success");
141+
Assert.Equal(context.StatusMessage, "Dsc Configuration was applied successful");
142+
Assert.Equal(context.DscConfigurationLog.Count(), GetFormattedMessage().Count());
143+
}
144+
145+
private IPersistentVM GetAzureVM(String roleName, String serviceName)
146+
{
147+
var vm = new PersistentVM {RoleName = roleName};
148+
var vmContext = new PersistentVMRoleContext
149+
{
150+
DeploymentName = roleName,
151+
Name = roleName,
152+
ServiceName = serviceName,
153+
VM = vm
154+
};
155+
156+
return vmContext;
157+
}
158+
159+
private NSM.DeploymentGetResponse CreateDeploymentGetResponse(string serviceName, IList<NSM.Role> roles,
160+
IList<NSM.RoleInstance> roleInstances)
161+
{
162+
var response = new NSM.DeploymentGetResponse
163+
{
164+
Name = serviceName,
165+
Configuration = "config",
166+
Status = Management.Compute.Models.DeploymentStatus.Starting,
167+
PersistentVMDowntime = new NSM.PersistentVMDowntime
168+
{
169+
EndTime = DateTime.Now,
170+
StartTime = DateTime.Now,
171+
Status = "",
172+
},
173+
LastModifiedTime = DateTime.Now,
174+
Roles = roles,
175+
RoleInstances = roleInstances
176+
};
177+
178+
return response;
179+
}
180+
181+
private NSM.RoleInstance CreateRoleInstance(String roleName)
182+
{
183+
var roleInstance = new NSM.RoleInstance
184+
{
185+
RoleName = roleName,
186+
ResourceExtensionStatusList = CreateResourceExtensionStatus()
187+
};
188+
return roleInstance;
189+
}
190+
191+
private NSM.Role CreateRole(String roleName)
192+
{
193+
var role = new NSM.Role
194+
{
195+
RoleName = roleName
196+
};
197+
198+
return role;
199+
}
200+
201+
private List<NSM.ResourceExtensionStatus> CreateResourceExtensionStatus()
202+
{
203+
var resourceExtensionStatusList = new List<NSM.ResourceExtensionStatus>();
204+
205+
var resourceBgiExtensionStatus = new NSM.ResourceExtensionStatus
206+
{
207+
HandlerName = "BGIInfo"
208+
};
209+
var resourceDscExtensionStatus = new NSM.ResourceExtensionStatus
210+
{
211+
HandlerName = "Microsoft.Powershell.DSC",
212+
ExtensionSettingStatus = CreateExtensionSettingStatus()
213+
};
214+
215+
resourceExtensionStatusList.Add(resourceBgiExtensionStatus);
216+
resourceExtensionStatusList.Add(resourceDscExtensionStatus);
217+
218+
return resourceExtensionStatusList;
219+
}
220+
221+
private NSM.ResourceExtensionConfigurationStatus CreateExtensionSettingStatus()
222+
{
223+
var extensionSettingStatus = new NSM.ResourceExtensionConfigurationStatus
224+
{
225+
Code = 1,
226+
Status = "Success",
227+
FormattedMessage = new NSM.GuestAgentFormattedMessage
228+
{
229+
Message = "Dsc Configuration was applied successful"
230+
},
231+
Timestamp = new DateTime(),
232+
SubStatusList = CreateResourceExtensionSubStatus(1, CreateGuestAgentFormattedMessage())
233+
};
234+
235+
return extensionSettingStatus;
236+
}
237+
238+
private List<NSM.ResourceExtensionSubStatus> CreateResourceExtensionSubStatus(int code,
239+
NSM.GuestAgentFormattedMessage formattedMessage)
240+
{
241+
var resourceExtensionSubStatusList = new List<NSM.ResourceExtensionSubStatus>();
242+
var resourceExtensionSubStatus = new NSM.ResourceExtensionSubStatus
243+
{
244+
Code = code,
245+
FormattedMessage = formattedMessage,
246+
Status = "Success",
247+
Name = "DSC Status"
248+
};
249+
resourceExtensionSubStatusList.Add(resourceExtensionSubStatus);
250+
return resourceExtensionSubStatusList;
251+
}
252+
253+
private NSM.GuestAgentFormattedMessage CreateGuestAgentFormattedMessage()
254+
{
255+
var formattedMessage = new NSM.GuestAgentFormattedMessage
256+
{
257+
Message =
258+
"[ESPARMAR-2012R2]:LCM:[Start Set]\r\n[ESPARMAR-2012R2]:LCM:[Start Resource] " +
259+
"[[WindowsFeature]IIS]\r\n[ESPARMAR-2012R2]:LCM:[Start Test] [[WindowsFeature]IIS]\r\n[ESPARMAR-2012R2]"
260+
};
261+
return formattedMessage;
262+
}
263+
264+
private IEnumerable<string> GetFormattedMessage()
265+
{
266+
const string message = "[ESPARMAR-2012R2]:LCM:[Start Set]\r\n[ESPARMAR-2012R2]:LCM:[Start Resource] " +
267+
"[[WindowsFeature]IIS]\r\n[ESPARMAR-2012R2]:LCM:[Start Test] [[WindowsFeature]IIS]\r\n[ESPARMAR-2012R2]";
268+
269+
return message.Split(new[] {"\r\n", "\n"}, StringSplitOptions.None);
270+
}
271+
}
272+
}

src/ServiceManagement/Compute/Commands.ServiceManagement/Commands.ServiceManagement.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@
206206
<Compile Include="IaaS\Extensions\DSC\DscPrivateSettings.cs" />
207207
<Compile Include="IaaS\Extensions\DSC\DscPublicSettings.cs" />
208208
<Compile Include="IaaS\Extensions\DSC\DscSettingsSerializer.cs" />
209+
<Compile Include="IaaS\Extensions\DSC\GetAzureVMDscExtensionStatus.cs" />
209210
<Compile Include="IaaS\Extensions\DSC\GetDscResourceException.cs" />
210211
<Compile Include="IaaS\Extensions\DSC\RemoveAzureVMDscExtension.cs" />
211212
<Compile Include="IaaS\Extensions\DSC\GetAzureVMDscExtension.cs" />
@@ -216,6 +217,7 @@
216217
<Compile Include="IaaS\Extensions\DSC\ConfigurationParseResult.cs" />
217218
<Compile Include="IaaS\Extensions\DSC\ServiceManagementBaseCmdletExtentions.cs" />
218219
<Compile Include="IaaS\Extensions\DSC\PublishAzureVMDscConfiguration.cs" />
220+
<Compile Include="IaaS\Extensions\DSC\VirtualMachineDscExtensionStatusContext.cs" />
219221
<Compile Include="IaaS\Extensions\MicrosoftAntimalware\GetAzureVMMicrosoftAntimalwareExtension.cs" />
220222
<Compile Include="IaaS\Extensions\MicrosoftAntimalware\RemoveAzureVMMicrosoftAntimalwareExtension.cs" />
221223
<Compile Include="IaaS\Extensions\MicrosoftAntimalware\SetAzureVMMicrosoftAntimalwareExtension.cs" />

src/ServiceManagement/Compute/Commands.ServiceManagement/IaaS/Extensions/DSC/GetAzureVMDscExtension.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ internal void ExecuteCommand()
6868
State = r.State,
6969
RoleName = VM.GetInstance().RoleName,
7070
PublicConfiguration = PublicConfiguration,
71-
PrivateConfiguration = SecureStringHelper.GetSecureString(PrivateConfiguration),
71+
PrivateConfiguration = SecureStringHelper.GetSecureString(PrivateConfiguration)
7272
};
7373

7474
if (publicSettings == null)
@@ -95,6 +95,7 @@ protected override void ProcessRecord()
9595
base.ProcessRecord();
9696
ExecuteCommand();
9797
}
98+
9899
}
99100
}
100101

0 commit comments

Comments
 (0)