icinga-powershell-framework/lib/core/dev/Test-IcingaForWindowsComponent.psm1

93 lines
4 KiB
PowerShell
Raw Normal View History

2021-11-03 10:06:54 -04:00
<#
.SYNOPSIS
Test an Icinga for Windows component and validate the functionality
including the code styling
.DESCRIPTION
Test an Icinga for Windows component and validate the functionality
including the code styling
.PARAMETER Name
The name of the Icinga for Windows component and module
.PARAMETER ShowIssues
Prints a list of all code styling issues found within the module
for resolving them
.EXAMPLE
Test-IcingaForWindowsComponent -Name 'framework' -ShowIssues;
#>
function Test-IcingaForWindowsComponent()
{
param (
[string]$Name,
[switch]$ShowIssues = $FALSE
);
if ([string]::IsNullOrEmpty($Name)) {
Write-IcingaConsoleError 'Please specify the name of the component you want to test';
return;
}
[string]$ModuleName = [string]::Format('icinga-powershell-{0}', $Name.ToLower());
[string]$ModuleRoot = Get-IcingaForWindowsRootPath;
[string]$ModuleDir = Join-Path -Path $ModuleRoot -ChildPath $ModuleName;
[string]$ScriptAnalyzer = Join-Path -Path $ModuleDir -ChildPath 'PSScriptAnalyzerSettings.psd1';
[string]$ModuleManifest = (Join-Path -Path $ModuleDir -ChildPath ([string]::Format('{0}.psd1', $ModuleName)))
if ((Test-Path $ModuleDir) -eq $FALSE) {
Write-IcingaConsoleError 'A component with the name "{0}" does not exist. Use "New-IcingaForWindowsComponent" to create a new one or verify that the provided name is correct.' -Objects $Name;
return;
}
if ($null -ne (Get-Command -Name 'Invoke-ScriptAnalyzer' -ErrorAction SilentlyContinue)) {
$ScriptAnalyzerContent = Get-Content -Raw -Path $ScriptAnalyzer;
[ScriptBlock]$ScriptAnalyzerScriptBlock = [ScriptBlock]::Create('return ' + $ScriptAnalyzerContent);
$ScriptAnalyzerData = (& $ScriptAnalyzerScriptBlock);
$ScriptAnalyzerData.Add('IncludeRule', $ScriptAnalyzerData.IncludeRules);
$ScriptAnalyzerData.Add('ExcludeRule', $ScriptAnalyzerData.ExcludeRules);
$ScriptAnalyzerData.Remove('Rules');
$ScriptAnalyzerData.Remove('IncludeRules');
$ScriptAnalyzerData.Remove('ExcludeRules');
$Result = Invoke-ScriptAnalyzer -Path $ModuleDir -Recurse -ReportSummary @ScriptAnalyzerData;
if ($Result.Count -ne 0) {
if ($ShowIssues -eq $FALSE) {
Write-IcingaConsoleWarning 'Your script analyzer has found issues inside this module. Use "-ShowIssues" to print each of them, allowing you to fix them.';
} else {
Write-Host ($Result | Out-String);
}
} else {
Write-IcingaConsoleNotice 'Your module does not have any code styling errors';
}
} else {
Write-IcingaConsoleWarning 'The PowerShell ScriptAnalyzer is not installed on this system. Validating the module is not possible.';
}
try {
Import-Module -Name $ModuleDir -Force -ErrorAction Stop;
Write-IcingaConsoleNotice 'Your module was successfully loaded. No errors were detected';
}
catch {
$ErrorScriptName = $_.InvocationInfo.ScriptName;
$ErrorScriptLine = $_.InvocationInfo.Line;
$PositionMessage = $_.InvocationInfo.PositionMessage;
if (([string]$_.FullyQualifiedErrorId).Contains('System.IO.FileLoadException')) {
$ErrorScriptName = $ModuleManifest;
$ErrorScriptLine = 'Check your NestedModule argument to verify that all included modules are present and valid'
}
Write-IcingaConsoleError `
-Message 'Failed to import the module "{0}": {1}{2}{2}Module File: {3}{2}Error Line: {4}{2}Position: {5}{2}{2}Full Error: {6}' `
-Objects @(
$ModuleName,
$_.FullyQualifiedErrorId,
(New-IcingaNewLine),
$ErrorScriptName,
$ErrorScriptLine,
$PositionMessage,
$_.Exception.Message
);
}
}