Skip to content

Commit 3513dd4

Browse files
author
Aashish Rajaram Salokhe
committed
Fixed inconsistent compliance status bug + Retrieving correct reporting data
1 parent 4821d28 commit 3513dd4

File tree

5 files changed

+53
-15
lines changed

5 files changed

+53
-15
lines changed

src/GuestConfiguration/GuestConfiguration/Cmdlets/GetAzVMGuestPolicyStatus.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public override void ExecuteCmdlet()
7777
// get all gcrp assignments first
7878
gcrpAssignments = GetAllGCRPAssignments(ResourceGroupName, VMName);
7979

80-
gcPolicyAssignmentReports = GetPolicyStatusesDetailedByInitiativeId(ResourceGroupName, VMName, InitiativeId, false, gcrpAssignments);
80+
gcPolicyAssignmentReports = GetPolicyStatusesDetailedByInitiativeId(ResourceGroupName, VMName, InitiativeId, gcrpAssignments);
8181

8282
if (gcPolicyAssignmentReports == null || gcPolicyAssignmentReports.Count() > 0)
8383
{
@@ -97,7 +97,7 @@ public override void ExecuteCmdlet()
9797
// get all gcrp assignments first
9898
gcrpAssignments = GetAllGCRPAssignments(ResourceGroupName, VMName);
9999

100-
gcPolicyAssignmentReports = GetPolicyStatusesDetailed(ResourceGroupName, VMName, gcrpAssignments, false);
100+
gcPolicyAssignmentReports = GetPolicyStatusesDetailed(ResourceGroupName, VMName, gcrpAssignments);
101101
if (gcPolicyAssignmentReports == null || gcPolicyAssignmentReports.Count() > 0)
102102
{
103103
WriteObject(gcPolicyAssignmentReports, true);

src/GuestConfiguration/GuestConfiguration/Common/GuestConfigurationCmdletBase.cs

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ namespace Microsoft.Azure.Commands.GuestConfiguration.Common
3030
using Microsoft.Azure.Commands.GuestConfiguration.Models;
3131
using Microsoft.Azure.Management.GuestConfiguration;
3232
using Microsoft.Azure.Management.GuestConfiguration.Models;
33+
using Microsoft.Azure.Management.PolicyInsights;
34+
using Microsoft.Azure.Management.PolicyInsights.Models;
3335
using GuestConfigurationErrorResponseException = Management.GuestConfiguration.Models.ErrorResponseException;
3436
using StringResources = Microsoft.Azure.Commands.GuestConfiguration.Properties.Resources;
3537
using ResourceManagerErrorResponseException = Microsoft.Azure.Management.Internal.ResourceManager.Version2018_05_01.Models.ErrorResponseException;
@@ -49,6 +51,11 @@ public abstract class GuestConfigurationCmdletBase : AzureRMCmdlet
4951
/// </summary>
5052
private IPolicyClient _policyClient;
5153

54+
/// <summary>
55+
/// Policy insights client
56+
/// </summary>
57+
private IPolicyInsightsClient _policyInsightsClient;
58+
5259
private string _initiativeId = null;
5360

5461
/// <summary>
@@ -75,11 +82,26 @@ public IPolicyClient PolicyClient
7582
}
7683
}
7784

85+
/// <summary>
86+
/// Gets or sets the policy insights client
87+
/// </summary>
88+
public IPolicyInsightsClient PolicyInsightsClient
89+
{
90+
get
91+
{
92+
return _policyInsightsClient ??
93+
(_policyInsightsClient = AzureSession.Instance.ClientFactory.CreateArmClient<PolicyInsightsClient>(DefaultContext, AzureEnvironment.Endpoint.ResourceManager));
94+
}
95+
set
96+
{
97+
_policyInsightsClient = value;
98+
}
99+
}
100+
78101
// Get all guest configuration policy assignment reports for a VM
79102
protected IEnumerable<PolicyStatusDetailed> GetPolicyStatusesDetailed(string resourceGroupName,
80103
string vmName,
81-
IEnumerable<GuestConfigurationAssignment> gcrpAssignments,
82-
bool isStatusHistoryCmdlet)
104+
IEnumerable<GuestConfigurationAssignment> gcrpAssignments)
83105
{
84106
var gcPolicyAssignmentReportList = new List<PolicyStatusDetailed>();
85107
var gcPolicySetDefinitions = GetAllGuestConfigPolicySetDefinitions();
@@ -91,7 +113,7 @@ protected IEnumerable<PolicyStatusDetailed> GetPolicyStatusesDetailed(string res
91113

92114
foreach (var gcPolicySetDefinition in gcPolicySetDefinitions)
93115
{
94-
var gcAssignmentReports = GetPolicyStatusesDetailedByInitiativeId(resourceGroupName, vmName, gcPolicySetDefinition.Id, isStatusHistoryCmdlet, gcrpAssignments);
116+
var gcAssignmentReports = GetPolicyStatusesDetailedByInitiativeId(resourceGroupName, vmName, gcPolicySetDefinition.Id, gcrpAssignments);
95117
if (gcAssignmentReports != null || gcAssignmentReports.Count() > 0)
96118
{
97119
gcPolicyAssignmentReportList.AddRange(gcAssignmentReports);
@@ -148,7 +170,7 @@ protected IEnumerable<PolicyData> GetPolicyStatuses(string resourceGroupName,
148170
var policySetDefinitions = GetAllGuestConfigPolicySetDefinitions();
149171
policySetDefinitionsArray = policySetDefinitions != null ? policySetDefinitions.ToArray() : null;
150172
}
151-
var policyStatuses = GetPolicyStatusesHelper(policySetDefinitionsArray, gcrpAssignments);
173+
var policyStatuses = GetPolicyStatusesHelper(policySetDefinitionsArray, gcrpAssignments, resourceGroupName);
152174
return policyStatuses;
153175
}
154176

@@ -177,7 +199,18 @@ protected IEnumerable<PolicyStatusDetailed> GetPolicyStatusesDetailedByInitiativ
177199
{
178200
gcrpReport = GuestConfigurationClient.GuestConfigurationAssignmentReports.Get(resourceGroupName, gcPolicyAssignment.Configuration.Name, reportGuid, vmName);
179201
}
180-
gcPolicyAssignmentReportList.Add(new PolicyStatusDetailed(gcrpReport, gcPolicyAssignment));
202+
203+
PolicyStatusDetailed policyDetailed = new PolicyStatusDetailed(gcrpReport, gcPolicyAssignment);
204+
QueryOptions queryOptions = new QueryOptions();
205+
queryOptions.Filter = string.Format("resourceGroup eq '{0}' and policyDefinitionAction eq 'deployifnotexists' and contains(ResourceId,'{1}')", resourceGroupName, vmName);
206+
queryOptions.OrderBy = "Timestamp desc";
207+
queryOptions.Top = 1;
208+
PolicyStatesQueryResults policyDbResults = PolicyInsightsClient.PolicyStates.ListQueryResultsForPolicySetDefinition("latest", DefaultContext.Subscription.Id, gcPolicyAssignment.PolicySetDefinitionName, queryOptions);
209+
if (policyDbResults.Odatacount > 0 && policyDbResults.Value[0].ComplianceState == "NonCompliant")
210+
{
211+
policyDetailed.ComplianceStatus = policyDbResults.Value[0].ComplianceState;
212+
}
213+
gcPolicyAssignmentReportList.Add(policyDetailed);
181214
}
182215

183216
return gcPolicyAssignmentReportList;
@@ -186,8 +219,7 @@ protected IEnumerable<PolicyStatusDetailed> GetPolicyStatusesDetailedByInitiativ
186219
// Get guest configuration policy status history by initiative definition name
187220
protected IEnumerable<PolicyStatusDetailed> GetPolicyStatusesDetailedByInitiativeId(string resourceGroupName,
188221
string vmName,
189-
string initiativeId,
190-
bool isStatusHistoryCmdlet,
222+
string initiativeId,
191223
IEnumerable<GuestConfigurationAssignment> gcrpAssignments)
192224
{
193225
var initiativeName = GetInitiativeNameFromId(initiativeId);
@@ -227,7 +259,7 @@ protected PolicyStatusDetailed GetPolicyStatusDetailedByReportId(string reportId
227259

228260
if (urlParameters == null || reportGuid == null)
229261
{
230-
throw new ErrorResponseException(string.Format(StringResources.InvalidReportId, reportId));
262+
throw new GuestConfigurationErrorResponseException(string.Format(StringResources.InvalidReportId, reportId));
231263
}
232264

233265
PolicyStatusDetailed policyReport = null;
@@ -268,7 +300,7 @@ private string GetInitiativeNameFromId(string initiativeId)
268300
var indexOfInitiativeName = initiativeId.LastIndexOf("/");
269301
if (indexOfInitiativeName < 0 || indexOfInitiativeName == initiativeId.Length - 1)
270302
{
271-
throw new ErrorResponseException(string.Format(StringResources.NoInitiativeNameFound, initiativeId));
303+
throw new GuestConfigurationErrorResponseException(string.Format(StringResources.NoInitiativeNameFound, initiativeId));
272304
}
273305
var initiativeName = initiativeId.Substring(indexOfInitiativeName + 1);
274306
return initiativeName;
@@ -305,7 +337,7 @@ private IEnumerable<PolicySetDefinition> GetAllGuestConfigPolicySetDefinitions()
305337
return gcPolicySetDefinitions;
306338
}
307339

308-
private IEnumerable<PolicyData> GetPolicyStatusesHelper(PolicySetDefinition[] policySetDefinitions, IEnumerable<GuestConfigurationAssignment> gcrpAssignments)
340+
private IEnumerable<PolicyData> GetPolicyStatusesHelper(PolicySetDefinition[] policySetDefinitions, IEnumerable<GuestConfigurationAssignment> gcrpAssignments, string resourceGroupName)
309341
{
310342
var gcPolicyAssignmentsList = new List<PolicyData>();
311343
foreach (var policySetDefinition in policySetDefinitions)
@@ -395,10 +427,11 @@ private IEnumerable<PolicyData> GetPolicyStatusesHelper(PolicySetDefinition[] po
395427

396428
if (!string.IsNullOrEmpty(guestConfigurationAssignmentNameInPolicy) && gcrp_AssignmentName_Assignment_Map.ContainsKey(guestConfigurationAssignmentNameInPolicy))
397429
{
430+
var assignments = PolicyClient.PolicyAssignments.ListForResourceGroup(resourceGroupName, string.Format("policyDefinitionId eq '{0}'", policySetDefinition.Id));
398431
var gcrpAsgnment = gcrp_AssignmentName_Assignment_Map[guestConfigurationAssignmentNameInPolicy];
399-
if (gcrpAsgnment != null)
432+
if (gcrpAsgnment != null && assignments.Count() > 0)
400433
{
401-
gcPolicyAssignmentsList.Add(new PolicyData(gcrpAsgnment, policyDef.DisplayName));
434+
gcPolicyAssignmentsList.Add(new PolicyData(gcrpAsgnment, policyDef.DisplayName, policySetDefinition.Name));
402435
}
403436
}
404437
}

src/GuestConfiguration/GuestConfiguration/GuestConfiguration.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
<ItemGroup>
1414
<PackageReference Include="Microsoft.Azure.Management.GuestConfiguration" Version="1.1.0" />
15+
<PackageReference Include="Microsoft.Azure.Management.PolicyInsights" Version="2.0.2" />
1516
</ItemGroup>
1617

1718
<ItemGroup>

src/GuestConfiguration/GuestConfiguration/Models/PolicyData.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,11 @@ namespace Microsoft.Azure.Commands.GuestConfiguration.Models
2020
// Contains data from Azure policy and guest configuration assignment from Guest Configuration service
2121
public class PolicyData
2222
{
23-
public PolicyData(GuestConfigurationAssignment gcrpAssignment, string policyDisplayName)
23+
public PolicyData(GuestConfigurationAssignment gcrpAssignment, string policyDisplayName, string policyDefinitionName)
2424
{
2525
this.PolicyDisplayName = policyDisplayName;
2626
this.ComplianceStatus = gcrpAssignment.Properties.ComplianceStatus;
27+
this.PolicySetDefinitionName = policyDefinitionName;
2728
this.Configuration = new ConfigurationInfo()
2829
{
2930
Name = gcrpAssignment.Properties.GuestConfiguration.Name,
@@ -41,6 +42,8 @@ public PolicyData()
4142

4243
}
4344

45+
public string PolicySetDefinitionName { get; set; }
46+
4447
public ConfigurationInfo Configuration;
4548

4649
public string PolicyDisplayName { get; set; }

src/GuestConfiguration/GuestConfiguration/Models/PolicyStatus.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public PolicyStatus(GuestConfigurationAssignmentReport gcrpReport, PolicyData gc
4040
this.ReportId = gcrpReport.Id;
4141
this.StartTime = gcrpReport.Properties.StartTime;
4242
this.EndTime = gcrpReport.Properties.EndTime;
43+
4344
this.ComplianceStatus = gcrpReport.Properties.ComplianceStatus;
4445
this.Configuration = new PolicyData.ConfigurationInfo
4546
{

0 commit comments

Comments
 (0)