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
36 changes: 36 additions & 0 deletions .github/Dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Dependabot configuration for AsBuiltReport.Core
# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file

version: 2
updates:
# Monitor GitHub Actions
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
labels:
- "dependencies"
- "github-actions"
commit-message:
prefix: "ci"
include: "scope"
open-pull-requests-limit: 5

# Monitor PowerShell modules (via manifest)
- package-ecosystem: "nuget"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
labels:
- "dependencies"
- "powershell"
commit-message:
prefix: "deps"
include: "scope"
open-pull-requests-limit: 5
ignore:
# PScribo updates should be reviewed manually
- dependency-name: "PScribo"
update-types: ["version-update:semver-major"]
4 changes: 3 additions & 1 deletion AsBuiltReport.NetApp.ONTAP.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
},
"EnableDiagrams": true,
"EnableDiagramDebug": false,
"DisableDiagramMainLogo": false,
"DiagramTheme": "White",
"DiagramWaterMark": "",
"ExportDiagrams": false,
Expand Down Expand Up @@ -87,7 +88,8 @@
"NTP": true,
"DNS": true,
"EMS": true,
"Backup": true
"Backup": true,
"Web": true
},
"Security": {
"Users": true,
Expand Down
4 changes: 2 additions & 2 deletions AsBuiltReport.NetApp.ONTAP.psd1
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
RootModule = 'AsBuiltReport.NetApp.ONTAP.psm1'

# Version number of this module.
ModuleVersion = '0.6.10'
ModuleVersion = '0.6.11'

# Supported PSEditions
# CompatiblePSEditions = @()
Expand All @@ -27,7 +27,7 @@
#CompanyName = 'Unknown'

# Copyright statement for this module
Copyright = '(c) 2024 Jonathan Colon Feliciano. All rights reserved.'
Copyright = '(c) 2025 Jonathan Colon Feliciano. All rights reserved.'

# Description of the functionality provided by this module
Description = 'A PowerShell module to generate an as built report on the configuration of NetApp ONTAP.'
Expand Down
16 changes: 15 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,21 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.6.10] - Unreleased
## [0.6.11] - 2025-11-07

### Added

- Add Health Check best practices for general Ontap configurations
- Add sponsorship information
- Add Dependabot configuration for module dependencies

### Changed

- Update health check messages to use "in" instead of "on" for consistency in reporting
- Refactor Get-AbrOntapNodeAggrDiagram to handle aggregate state correctly
- Refactor Get-AbrOntapNodeAggrDiagram to handle used space calculation correctly

## [0.6.10] - 2025-10-27

### Added

Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ The **Options** schema allows certain options within the report to be toggled on
| DiagramTheme | string | White | Set the diagram theme (Black/White/Neon) |
| DiagramWaterMark | string | empty | Set the diagram watermark |
| DiagramType | true / false | true | Toggle to enable/disable the export of individual diagram diagrams |
| DisableDiagramMainLogo | true / false | false | Toggle to enable/disable the main logo in diagrams |
| EnableDiagrams | true / false | false | Toggle to enable/disable infrastructure diagrams |
| EnableDiagramsDebug | true / false | false | Toggle to enable/disable diagram debug option |
| EnableDiagramSignature | true / false | false | Toggle to enable/disable diagram signature (bottom right corner) |
Expand Down
1 change: 1 addition & 0 deletions Src/Private/Export-AbrOntapDiagram.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ function Export-AbrOntapDiagram {
'top-to-bottom'
}
}
'DisableMainDiagramLogo' = $Options.DisableDiagramMainLogo
}

if ($Options.DiagramTheme -eq 'Black') {
Expand Down
11 changes: 10 additions & 1 deletion Src/Private/Get-AbrOntapCluster.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ function Get-AbrOntapCluster {
'Overall System Health' = switch ([string]::IsNullOrEmpty($ClusterDiag.Status)) {
$true { '--' }
$false { $ClusterDiag.Status.ToUpper() }
Default { 'Unknown' }
default { 'Unknown' }
}
}
if ($Healthcheck.Cluster.Summary) {
Expand All @@ -60,6 +60,15 @@ function Get-AbrOntapCluster {
$TableParams['Caption'] = "- $($TableParams.Name)"
}
$ClusterSummary | Table @TableParams
if ($Healthcheck.Cluster.Summary -and ($ClusterSummary | Where-Object { $_.'Overall System Health' -notlike 'OK' })) {
Paragraph "Health Check:" -Bold -Underline
BlankLine
Paragraph {
Text "Best Practice:" -Bold
Text "The overall system health is not OK. It is recommended to investigate the issue further to ensure the cluster is functioning properly."
}
BlankLine
}
}
} catch {
Write-PScriboMessage -IsWarning $_.Exception.Message
Expand Down
11 changes: 10 additions & 1 deletion Src/Private/Get-AbrOntapClusterASUP.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ function Get-AbrOntapClusterASUP {

process {
try {
$AutoSupport = Get-NcAutoSupportConfig -Controller $Array
$AutoSupport = Get-NcAutoSupportConfig -Controller $Array -ErrorAction Continue
if ($AutoSupport) {
$Outobj = @()
foreach ($NodesAUTO in $AutoSupport) {
Expand All @@ -51,6 +51,15 @@ function Get-AbrOntapClusterASUP {
$TableParams['Caption'] = "- $($TableParams.Name)"
}
$Outobj | Table @TableParams
if ($Healthcheck.Cluster.AutoSupport -and ($Outobj | Where-Object { $_.'Enabled' -like 'No' })) {
Paragraph "Health Check:" -Bold -Underline
BlankLine
Paragraph {
Text "Best Practice:" -Bold
Text "AutoSupport is disabled on one or more nodes. It is recommended to enable AutoSupport to ensure proactive monitoring and issue resolution."
}
BlankLine
}
} catch {
Write-PScriboMessage -IsWarning $_.Exception.Message
}
Expand Down
4 changes: 2 additions & 2 deletions Src/Private/Get-AbrOntapClusterDiagram.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ function Get-AbrOntapClusterDiagram {

foreach ($Node in $NodeSum) {
# $ClusterHa = $ClusterHaObj | Where-Object { $_.Name -eq $Node.Node }
$ClusterHa = Get-NcClusterHa -Node $Node.Node -Controller $Array
$ClusterHa = try { Get-NcClusterHa -Node $Node.Node -Controller $Array } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }

$NodeMgmtAddress = Get-NcNetInterface -Controller $Array | Where-Object { $_.Role -eq 'node_mgmt' -and $_.HomeNode -eq $Node.Node } | Select-Object -ExpandProperty Address
$NodeInterClusterAddress = Get-NcNetInterface -Controller $Array | Where-Object { $_.Role -eq 'intercluster' -and $_.HomeNode -eq $Node.Node } | Select-Object -ExpandProperty Address
Expand All @@ -141,7 +141,7 @@ function Get-AbrOntapClusterDiagram {
"Mgmt" = switch ([string]::IsNullOrEmpty($NodeMgmtAddress)) {
$true { "Unknown" }
$false { $NodeMgmtAddress }
Default { "Unknown" }
default { "Unknown" }
}
}
}
Expand Down
32 changes: 29 additions & 3 deletions Src/Private/Get-AbrOntapClusterHA.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,13 @@ function Get-AbrOntapClusterHA {
$ClusterHa = Get-NcClusterHa -Node $Nodes.Node -Controller $Array
[PSCustomObject] @{
'Name' = $Nodes.Node
'Partner' = Switch ([string]::IsNullOrEmpty($ClusterHa.Partner)) {
'Partner' = switch ([string]::IsNullOrEmpty($ClusterHa.Partner)) {
'True' { '-' }
'False' { $ClusterHa.Partner }
default { 'Unknwon' }
}
'TakeOver Possible' = ConvertTo-TextYN $ClusterHa.TakeoverPossible
'TakeOver State' = Switch ([string]::IsNullOrEmpty($ClusterHa.TakeoverState)) {
'TakeOver State' = switch ([string]::IsNullOrEmpty($ClusterHa.TakeoverState)) {
'True' { '-' }
'False' { $ClusterHa.TakeoverState }
default { 'Unknwon' }
Expand All @@ -51,7 +51,8 @@ function Get-AbrOntapClusterHA {
}
if ($Healthcheck.Cluster.HA) {
$NodeSummary | Where-Object { $_.'TakeOver State' -like 'in_takeover' } | Set-Style -Style Warning -Property 'TakeOver State'
$NodeSummary | Where-Object { $_.'HA State' -notlike 'connected' } | Set-Style -Style Warning -Property 'HA State'
$NodeSummary | Where-Object { $_.'HA Mode' -eq 'non_ha' -and $_.'HA State' -notlike 'connected' } | Set-Style -Style Warning -Property 'HA State'
$NodeSummary | Where-Object { $_.'TakeOver Possible' -eq 'No' } | Set-Style -Style Warning -Property 'TakeOver Possible'
}

$TableParams = @{
Expand All @@ -63,6 +64,31 @@ function Get-AbrOntapClusterHA {
$TableParams['Caption'] = "- $($TableParams.Name)"
}
$NodeSummary | Table @TableParams
if ($Healthcheck.Cluster.HA -and (($NodeSummary | Where-Object { $_.'TakeOver State' -like 'in_takeover' } ) -or ($NodeSummary | Where-Object { $_.'HA Mode' -ne 'non_ha' -and $_.'HA State' -notlike 'connected' }) -or ($NodeSummary | Where-Object { $_.'TakeOver Possible' -eq 'No' }))) {
Paragraph "Health Check:" -Bold -Underline
BlankLine
if ($NodeSummary | Where-Object { $_.'TakeOver State' -like 'in_takeover' }) {
Paragraph {
Text "Best Practice:" -Bold
Text "One or more nodes are currently in takeover state. It is recommended to investigate the cause of the takeover and ensure that the affected node is restored to normal operation as soon as possible."
}
BlankLine
}
if ($NodeSummary | Where-Object { $_.'TakeOver Possible' -eq 'No' }) {
Paragraph {
Text "Best Practice:" -Bold
Text "One or more nodes have takeover capability disabled. It is recommended to enable storage failover capability to ensure high availability in case of node failures."
}
BlankLine
}
if ($NodeSummary | Where-Object { $_.'HA Mode' -ne 'non_ha' -and $_.'HA State' -notlike 'connected' }) {
Paragraph {
Text "Best Practice:" -Bold
Text "One or more nodes are operating in HA mode and are not connected. It is recommended to verify the HA configuration and connectivity to ensure high availability is properly set up."
}
BlankLine
}
}
}
} catch {
Write-PScriboMessage -IsWarning $_.Exception.Message
Expand Down
11 changes: 10 additions & 1 deletion Src/Private/Get-AbrOntapClusterLicense.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ function Get-AbrOntapClusterLicense {
$License = Get-NcLicense -Owner $Node -Controller $Array
if ($License) {
$LicenseSummary = foreach ($Licenses in $License) {
$EntitlementRisk = Try { Get-NcLicenseEntitlementRisk -Package $Licenses.Package -Controller $Array -ErrorAction SilentlyContinue } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
$EntitlementRisk = try { Get-NcLicenseEntitlementRisk -Package $Licenses.Package -Controller $Array -ErrorAction SilentlyContinue } catch { Write-PScriboMessage -IsWarning $_.Exception.Message }
[PSCustomObject] @{
'License' = $TextInfo.ToTitleCase($Licenses.Package)
'Type' = $TextInfo.ToTitleCase($Licenses.Type)
Expand All @@ -52,6 +52,15 @@ function Get-AbrOntapClusterLicense {
$TableParams['Caption'] = "- $($TableParams.Name)"
}
$LicenseSummary | Table @TableParams
if ($Healthcheck.License.RiskSummary -and ($LicenseSummary | Where-Object { $_.'Risk' -like 'medium' -or $_.'Risk' -like 'unknown' -or $_.'Risk' -like 'unlicensed' }) -or ($LicenseSummary | Where-Object { $_.'Risk' -like 'High' })) {
Paragraph "Health Check:" -Bold -Underline
BlankLine
Paragraph {
Text "Best Practice:" -Bold
Text "Review the license risk summary above. It is recommended to address any licenses with medium, high, unknown, or unlicensed risk to ensure compliance and avoid potential disruptions."
}
BlankLine
}
}
}
} catch {
Expand Down
9 changes: 9 additions & 0 deletions Src/Private/Get-AbrOntapDiskBroken.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,15 @@ function Get-AbrOntapDiskBroken {
$TableParams['Caption'] = "- $($TableParams.Name)"
}
$DiskFailed | Table @TableParams
if ($Healthcheck.Storage.DiskStatus -and ($DiskFailed)) {
Paragraph "Health Check:" -Bold -Underline
BlankLine
Paragraph {
Text "Best Practice:" -Bold
Text "Review the failed disk information above. It is recommended to replace any broken disks promptly to maintain data integrity and system performance."
}
BlankLine
}
}
} catch {
Write-PScriboMessage -IsWarning $_.Exception.Message
Expand Down
9 changes: 9 additions & 0 deletions Src/Private/Get-AbrOntapDiskShelf.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,15 @@ function Get-AbrOntapDiskShelf {
$TableParams['Caption'] = "- $($TableParams.Name)"
}
$ShelfInventory | Table @TableParams
if ($Healthcheck.Storage.ShelfStatus -and ($ShelfInventory | Where-Object { $_.'State' -like 'offline' -or $_.'State' -like 'missing' })) {
Paragraph "Health Check:" -Bold -Underline
BlankLine
Paragraph {
Text "Best Practice:" -Bold
Text "Ensure all disk shelves are online and operational. Investigate any shelves marked as offline or missing."
}
BlankLine
}
}
} catch {
Write-PScriboMessage -IsWarning $_.Exception.Message
Expand Down
9 changes: 9 additions & 0 deletions Src/Private/Get-AbrOntapDiskType.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,15 @@ function Get-AbrOntapDiskType {
$TableParams['Caption'] = "- $($TableParams.Name)"
}
$OutObj | Table @TableParams
if ($Healthcheck.Storage.DiskStatus -and ($OutObj | Where-Object { $_.'Aggregate Spare Low' -like 'Yes' })) {
Paragraph "Health Check:" -Bold -Underline
BlankLine
Paragraph {
Text "Best Practice:" -Bold
Text "Ensure that aggregate spare capacity is above the recommended threshold to maintain optimal performance and reliability."
}
BlankLine
}
}
} catch {
Write-PScriboMessage -IsWarning $_.Exception.Message
Expand Down
11 changes: 10 additions & 1 deletion Src/Private/Get-AbrOntapEfficiencyAggr.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,18 @@ function Get-AbrOntapEfficiencyAggr {
}
if ($OutObj) {
Section -Style Heading4 'HealthCheck - Volume with Disabled Deduplication' {
Paragraph "The following table provides the Volume efficiency healthcheck Information on $($ClusterInfo.ClusterName)."
Paragraph "The following table provides the Volume efficiency healthcheck Information in $($ClusterInfo.ClusterName)."
BlankLine
$OutObj | Table @TableParams
if ($Healthcheck.Storage.Efficiency) {
Paragraph "Health Check:" -Bold -Underline
BlankLine
Paragraph {
Text "Best Practice:" -Bold
Text "Ensure that deduplication is enabled on all volumes to maximize storage efficiency."
}
BlankLine
}
}
}
} catch {
Expand Down
11 changes: 10 additions & 1 deletion Src/Private/Get-AbrOntapEfficiencyVolSisStatus.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ function Get-AbrOntapEfficiencyVolSisStatus {
$Volume = $Item.Path.split('/')
$inObj = [ordered] @{
'Volume' = $Volume[2]
'State' = Switch ($Item.State) {
'State' = switch ($Item.State) {
'enabled' { 'Enabled' }
'disabled' { 'Disabled' }
default { $Item.State }
Expand All @@ -63,6 +63,15 @@ function Get-AbrOntapEfficiencyVolSisStatus {
$TableParams['Caption'] = "- $($TableParams.Name)"
}
$OutObj | Table @TableParams
if ($Healthcheck.Storage.Efficiency -and ($OutObj | Where-Object { $_.'State' -like 'Disabled' })) {
Paragraph "Health Check:" -Bold -Underline
BlankLine
Paragraph {
Text "Best Practice:" -Bold
Text "Ensure that volume deduplication is enabled on volumes where data reduction is beneficial to optimize storage efficiency."
}
BlankLine
}
}
} catch {
Write-PScriboMessage -IsWarning $_.Exception.Message
Expand Down
9 changes: 9 additions & 0 deletions Src/Private/Get-AbrOntapNetworkIfgrp.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,15 @@ function Get-AbrOntapNetworkIfgrp {
$TableParams['Caption'] = "- $($TableParams.Name)"
}
$AggregatePorts | Table @TableParams
if ($Healthcheck.Network.Port -and ($AggregatePorts | Where-Object { $_.'Port Participation' -ne "full" })) {
Paragraph "Health Check:" -Bold -Underline
BlankLine
Paragraph {
Text "Best Practice:" -Bold
Text "Ensure that all ports in the interface group are active and participating fully to maintain optimal network performance and redundancy."
}
BlankLine
}
}
} catch {
Write-PScriboMessage -IsWarning $_.Exception.Message
Expand Down
Loading
Loading