Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 2 additions & 23 deletions src/DockerUpdateGuard/Components/Pages/MyImageDetail.razor
Original file line number Diff line number Diff line change
Expand Up @@ -47,28 +47,7 @@
</MudPaper>
</MudItem>
<MudItem xs="12" md="6">
<MudPaper Class="summary-card" Elevation="0">
<span class="summary-label">Vulnerability assessment</span>
<MudChip T="string" Size="Size.Small" Color="@GetVulnerabilityAssessmentColor(_detail.VulnerabilityAssessment.Status, _detail.VulnerabilityAssessment.SeveritySummary)">@_detail.VulnerabilityAssessment.Status</MudChip>
<VulnerabilitySeverityChips Summary="_detail.VulnerabilityAssessment.SeveritySummary" />
@if (_detail.VulnerabilityAssessment.NewFindingCount > 0)
{
<MudChip T="string" Size="Size.Small" Color="Color.Error">@($"+{_detail.VulnerabilityAssessment.NewFindingCount} new")</MudChip>
}
@if (_detail.VulnerabilityAssessment.ResolvedFindingCount > 0)
{
<MudChip T="string" Size="Size.Small" Color="Color.Success">@($"−{_detail.VulnerabilityAssessment.ResolvedFindingCount} resolved")</MudChip>
}
<span class="table-secondary">@($"{_detail.VulnerabilityAssessment.Source} · {_detail.VulnerabilityAssessment.ActiveFindingCount} active")</span>
@if (_detail.VulnerabilityAssessment.ActiveFindingCount > 0)
{
<span class="table-secondary">@($"{_detail.VulnerabilityAssessment.FixableFindingCount} of {_detail.VulnerabilityAssessment.ActiveFindingCount} active findings have a fix available")</span>
}
@if (string.IsNullOrWhiteSpace(_detail.VulnerabilityAssessment.Message) == false)
{
<span class="table-secondary">@_detail.VulnerabilityAssessment.Message</span>
}
</MudPaper>
<VulnerabilityAssessmentCard Assessment="_detail.VulnerabilityAssessment" />
</MudItem>
@if (string.IsNullOrWhiteSpace(_detail.BaseRuntimeAlertSummary) == false)
{
Expand Down Expand Up @@ -155,7 +134,7 @@
<MudTd DataLabel="Base Image">@ImageReferenceFormatter.GetReference(context.ImageReference)</MudTd>
<MudTd DataLabel="Source">@ImageReferenceFormatter.GetReference(context.SourceReference ?? string.Empty)</MudTd>
<MudTd DataLabel="Vulnerabilities">
<MudChip T="string" Size="Size.Small" Color="@GetVulnerabilityAssessmentColor(context.VulnerabilityAssessment.Status, context.VulnerabilityAssessment.SeveritySummary)">@context.VulnerabilityAssessment.Status</MudChip>
<MudChip T="string" Size="Size.Small" Color="@VulnerabilityDisplayFormatter.GetStatusColor(context.VulnerabilityAssessment.Status, context.VulnerabilityAssessment.SeveritySummary)">@context.VulnerabilityAssessment.Status</MudChip>
<VulnerabilitySeverityChips Summary="context.VulnerabilityAssessment.SeveritySummary" />
<span class="table-secondary">@($"{context.VulnerabilityAssessment.ActiveFindingCount} active · {context.VulnerabilityAssessment.Source}")</span>
</MudTd>
Expand Down
11 changes: 0 additions & 11 deletions src/DockerUpdateGuard/Components/Pages/MyImageDetail.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -82,17 +82,6 @@ internal static Color GetScanStatusColor(string status)
};
}

/// <summary>
/// Resolve the chip color for a vulnerability assessment status
/// </summary>
/// <param name="status">Status label</param>
/// <param name="severitySummary">Severity summary of the active findings</param>
/// <returns>Chip color</returns>
internal static Color GetVulnerabilityAssessmentColor(string status, VulnerabilitySeveritySummaryViewData? severitySummary)
{
return VulnerabilityDisplayFormatter.GetStatusColor(status, severitySummary);
}

#endregion // Static methods

#region Methods
Expand Down
25 changes: 2 additions & 23 deletions src/DockerUpdateGuard/Components/Pages/ObservedImageDetail.razor
Original file line number Diff line number Diff line change
Expand Up @@ -50,28 +50,7 @@
</MudPaper>
</MudItem>
<MudItem xs="12" md="6">
<MudPaper Class="summary-card" Elevation="0">
<span class="summary-label">Vulnerability assessment</span>
<MudChip T="string" Size="Size.Small" Color="@GetVulnerabilityAssessmentColor(_detail.VulnerabilityAssessment.Status, _detail.VulnerabilityAssessment.SeveritySummary)">@_detail.VulnerabilityAssessment.Status</MudChip>
<VulnerabilitySeverityChips Summary="_detail.VulnerabilityAssessment.SeveritySummary" />
@if (_detail.VulnerabilityAssessment.NewFindingCount > 0)
{
<MudChip T="string" Size="Size.Small" Color="Color.Error">@($"+{_detail.VulnerabilityAssessment.NewFindingCount} new")</MudChip>
}
@if (_detail.VulnerabilityAssessment.ResolvedFindingCount > 0)
{
<MudChip T="string" Size="Size.Small" Color="Color.Success">@($"−{_detail.VulnerabilityAssessment.ResolvedFindingCount} resolved")</MudChip>
}
<span class="table-secondary">@($"{_detail.VulnerabilityAssessment.Source} · {_detail.VulnerabilityAssessment.ActiveFindingCount} active")</span>
@if (_detail.VulnerabilityAssessment.ActiveFindingCount > 0)
{
<span class="table-secondary">@($"{_detail.VulnerabilityAssessment.FixableFindingCount} of {_detail.VulnerabilityAssessment.ActiveFindingCount} active findings have a fix available")</span>
}
@if (string.IsNullOrWhiteSpace(_detail.VulnerabilityAssessment.Message) == false)
{
<span class="table-secondary">@_detail.VulnerabilityAssessment.Message</span>
}
</MudPaper>
<VulnerabilityAssessmentCard Assessment="_detail.VulnerabilityAssessment" />
</MudItem>
@if (string.IsNullOrWhiteSpace(_detail.BaseRuntimeAlertSummary) == false)
{
Expand Down Expand Up @@ -163,7 +142,7 @@
<MudTd DataLabel="Base Image">@ImageReferenceFormatter.GetReference(context.ImageReference)</MudTd>
<MudTd DataLabel="Source">@ImageReferenceFormatter.GetReference(context.SourceReference ?? string.Empty)</MudTd>
<MudTd DataLabel="Vulnerabilities">
<MudChip T="string" Size="Size.Small" Color="@GetVulnerabilityAssessmentColor(context.VulnerabilityAssessment.Status, context.VulnerabilityAssessment.SeveritySummary)">@context.VulnerabilityAssessment.Status</MudChip>
<MudChip T="string" Size="Size.Small" Color="@VulnerabilityDisplayFormatter.GetStatusColor(context.VulnerabilityAssessment.Status, context.VulnerabilityAssessment.SeveritySummary)">@context.VulnerabilityAssessment.Status</MudChip>
<VulnerabilitySeverityChips Summary="context.VulnerabilityAssessment.SeveritySummary" />
<span class="table-secondary">@($"{context.VulnerabilityAssessment.ActiveFindingCount} active · {context.VulnerabilityAssessment.Source}")</span>
</MudTd>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,17 +82,6 @@ private static Color GetScanStatusColor(string status)
};
}

/// <summary>
/// Resolve the chip color for a vulnerability assessment status
/// </summary>
/// <param name="status">Status label</param>
/// <param name="severitySummary">Severity summary of the active findings</param>
/// <returns>Chip color</returns>
private static Color GetVulnerabilityAssessmentColor(string status, VulnerabilitySeveritySummaryViewData? severitySummary)
{
return VulnerabilityDisplayFormatter.GetStatusColor(status, severitySummary);
}

/// <summary>
/// Resolve the chip color for a base-runtime alert
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,32 +102,7 @@
</MudItem>
}
<MudItem xs="12" md="6">
<MudPaper Class="summary-card" Elevation="0">
<span class="summary-label">Vulnerability assessment</span>
<MudChip T="string" Size="Size.Small" Color="@GetVulnerabilityStatusColor(_detail.VulnerabilityAssessment.Status, _detail.VulnerabilityAssessment.SeveritySummary)">@_detail.VulnerabilityAssessment.Status</MudChip>
<VulnerabilitySeverityChips Summary="_detail.VulnerabilityAssessment.SeveritySummary" />
@if (_detail.VulnerabilityAssessment.NewFindingCount > 0)
{
<MudChip T="string" Size="Size.Small" Color="Color.Error">@($"+{_detail.VulnerabilityAssessment.NewFindingCount} new")</MudChip>
}
@if (_detail.VulnerabilityAssessment.ResolvedFindingCount > 0)
{
<MudChip T="string" Size="Size.Small" Color="Color.Success">@($"−{_detail.VulnerabilityAssessment.ResolvedFindingCount} resolved")</MudChip>
}
<span class="table-secondary">@($"{_detail.VulnerabilityAssessment.Source} · {_detail.VulnerabilityAssessment.ActiveFindingCount} active")</span>
@if (_detail.VulnerabilityAssessment.ActiveFindingCount > 0)
{
<span class="table-secondary">@($"{_detail.VulnerabilityAssessment.FixableFindingCount} of {_detail.VulnerabilityAssessment.ActiveFindingCount} active findings have a fix available")</span>
}
@if (_detail.VulnerabilityAssessment.CheckedAtUtc is DateTimeOffset checkedAtUtc)
{
<span class="table-secondary">Checked @checkedAtUtc.ToLocalTime().ToString("g")</span>
}
@if (string.IsNullOrWhiteSpace(_detail.VulnerabilityAssessment.Message) == false)
{
<span class="table-secondary">@_detail.VulnerabilityAssessment.Message</span>
}
</MudPaper>
<VulnerabilityAssessmentCard Assessment="_detail.VulnerabilityAssessment" ShowCheckedAt="true" />
</MudItem>
@if (_detail.ActiveBaseImageVulnerabilityFindingCount > 0)
{
Expand Down Expand Up @@ -167,7 +142,7 @@
<MudTd DataLabel="Base Image">@ImageReferenceFormatter.GetReference(context.ImageReference)</MudTd>
<MudTd DataLabel="Source">@ImageReferenceFormatter.GetReference(context.SourceReference ?? string.Empty)</MudTd>
<MudTd DataLabel="Vulnerabilities">
<MudChip T="string" Size="Size.Small" Color="@GetVulnerabilityStatusColor(context.VulnerabilityAssessment.Status, context.VulnerabilityAssessment.SeveritySummary)">@context.VulnerabilityAssessment.Status</MudChip>
<MudChip T="string" Size="Size.Small" Color="@VulnerabilityDisplayFormatter.GetStatusColor(context.VulnerabilityAssessment.Status, context.VulnerabilityAssessment.SeveritySummary)">@context.VulnerabilityAssessment.Status</MudChip>
<VulnerabilitySeverityChips Summary="context.VulnerabilityAssessment.SeveritySummary" />
<span class="table-secondary">@($"{context.VulnerabilityAssessment.ActiveFindingCount} active · {context.VulnerabilityAssessment.Source}")</span>
</MudTd>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,22 +108,6 @@ private static Color GetUpdateStateColor(string? status)
};
}

/// <summary>
/// Resolve the chip color for a vulnerability status
/// </summary>
/// <param name="status">Vulnerability status</param>
/// <param name="severitySummary">Severity summary of the active findings</param>
/// <returns>Chip color</returns>
private static Color GetVulnerabilityStatusColor(string? status, VulnerabilitySeveritySummaryViewData? severitySummary)
{
if (string.IsNullOrWhiteSpace(status))
{
return Color.Default;
}

return VulnerabilityDisplayFormatter.GetStatusColor(status, severitySummary);
}

/// <summary>
/// Resolve the chip color for a scan status
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
@if (Assessment is not null)
{
<MudPaper Class="summary-card" Elevation="0">
<span class="summary-label">Vulnerability assessment</span>
<MudChip T="string" Size="Size.Small" Color="@VulnerabilityDisplayFormatter.GetStatusColor(Assessment.Status, Assessment.SeveritySummary)">@Assessment.Status</MudChip>
<VulnerabilitySeverityChips Summary="Assessment.SeveritySummary" />
@if (Assessment.NewFindingCount > 0)
{
<MudChip T="string" Size="Size.Small" Color="Color.Error">@($"+{Assessment.NewFindingCount} new")</MudChip>
}
@if (Assessment.ResolvedFindingCount > 0)
{
<MudChip T="string" Size="Size.Small" Color="Color.Success">@($"−{Assessment.ResolvedFindingCount} resolved")</MudChip>
}
<span class="table-secondary">@($"{Assessment.Source} · {Assessment.ActiveFindingCount} active")</span>
@if (Assessment.ActiveFindingCount > 0)
{
<span class="table-secondary">@($"{Assessment.FixableFindingCount} of {Assessment.ActiveFindingCount} active findings have a fix available")</span>
}
@if (ShowCheckedAt && Assessment.CheckedAtUtc is DateTimeOffset checkedAtUtc)
{
<span class="table-secondary">Checked @checkedAtUtc.ToLocalTime().ToString("g")</span>
}
@if (string.IsNullOrWhiteSpace(Assessment.Message) == false)
{
<span class="table-secondary">@Assessment.Message</span>
}
</MudPaper>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using DockerUpdateGuard.UI;

using Microsoft.AspNetCore.Components;

namespace DockerUpdateGuard.Components.Shared;

/// <summary>
/// Summary card that renders the vulnerability assessment of a container or an image
/// </summary>
public partial class VulnerabilityAssessmentCard
{
#region Properties

/// <summary>
/// Vulnerability assessment to render
/// </summary>
[Parameter]
public VulnerabilityAssessmentViewData? Assessment { get; set; }

/// <summary>
/// Whether the timestamp of the last check is rendered
/// </summary>
[Parameter]
public bool ShowCheckedAt { get; set; }

#endregion // Properties
}
32 changes: 0 additions & 32 deletions src/Tests/DockerUpdateGuard.Tests/MyImageDetailTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,6 @@ public class MyImageDetailTests
private static readonly MethodInfo _getScanStatusColorMethod = typeof(MyImageDetail).GetMethod("GetScanStatusColor", BindingFlags.NonPublic | BindingFlags.Static)
?? throw new InvalidOperationException("MyImageDetail must expose the non-public static GetScanStatusColor method");

/// <summary>
/// Non-public vulnerability-assessment chip color resolver
/// </summary>
private static readonly MethodInfo _getVulnerabilityAssessmentColorMethod = typeof(MyImageDetail).GetMethod("GetVulnerabilityAssessmentColor", BindingFlags.NonPublic | BindingFlags.Static)
?? throw new InvalidOperationException("MyImageDetail must expose the non-public static GetVulnerabilityAssessmentColor method");

#endregion // Fields

#region Methods
Expand Down Expand Up @@ -67,32 +61,6 @@ public void MyImageDetailGetScanStatusColorKnownStatusReturnsExpectedColor(strin
$"Scan status '{status}' must map to Color.{expectedColor}");
}

/// <summary>
/// Verify vulnerability assessment chip colors map to expected MudBlazor color values
/// </summary>
/// <param name="status">Vulnerability assessment status string</param>
/// <param name="expectedColor">Expected chip color</param>
[TestMethod]
[DataRow("Findings Detected", Color.Warning)]
[DataRow("FINDINGS DETECTED", Color.Warning)]
[DataRow("No Findings", Color.Success)]
[DataRow("NO FINDINGS", Color.Success)]
[DataRow("Failed", Color.Error)]
[DataRow("FAILED", Color.Error)]
[DataRow("Not Configured", Color.Default)]
[DataRow("NOT CONFIGURED", Color.Default)]
[DataRow("Unsupported", Color.Default)]
[DataRow("UNSUPPORTED", Color.Default)]
[DataRow("anything-else", Color.Info)]
public void MyImageDetailGetVulnerabilityAssessmentColorKnownStatusReturnsExpectedColor(string status, Color expectedColor)
{
var color = (Color)_getVulnerabilityAssessmentColorMethod.Invoke(null, [status, null])!;

Assert.AreEqual(expectedColor,
color,
$"Vulnerability assessment status '{status}' must map to Color.{expectedColor}");
}

/// <summary>
/// Verify the vulnerability assessment card shows the fixable finding count and the update-finding hint chip
/// </summary>
Expand Down
Loading
Loading