Private/Get-AzLocalNetworkSettingsFromJson.ps1
|
Function Get-AzLocalNetworkSettingsFromJson { <# .SYNOPSIS Loads network settings from a JSON file or JSON string for non-interactive deployments. .DESCRIPTION Parses a JSON file path or inline JSON string containing network settings and validates the required fields. Expected JSON structure: { "subnetMask": "255.255.255.0", "defaultGateway": "10.0.0.1", "startingIPAddress": "10.0.0.10", "endingIPAddress": "10.0.0.50", "nodeIPAddresses": ["10.0.0.100", "10.0.0.101"] } #> [OutputType([PSCustomObject])] [CmdletBinding()] param ( [Parameter(Mandatory = $true, Position = 0)] [string]$NetworkSettingsJson, [Parameter(Mandatory = $true, Position = 1)] [string]$TypeOfDeployment, [Parameter(Mandatory = $false, Position = 2)] [int]$NodeCount = 0 ) # Determine effective node count for validation switch ($TypeOfDeployment) { "SingleNode" { $expectedNodes = 1 } default { $expectedNodes = $NodeCount } } # Load JSON from file path or inline string if (Test-Path $NetworkSettingsJson -ErrorAction SilentlyContinue) { Write-Verbose "Loading network settings from file: $NetworkSettingsJson" try { $jsonContent = Get-Content $NetworkSettingsJson -Raw -ErrorAction Stop $settings = $jsonContent | ConvertFrom-Json -ErrorAction Stop } catch { Write-AzLocalLog "Failed to read or parse network settings file '$NetworkSettingsJson'." -Level Error throw "Failed to parse network settings file. $($_.Exception.Message)" } } else { Write-Verbose "Parsing inline network settings JSON..." try { $settings = $NetworkSettingsJson | ConvertFrom-Json -ErrorAction Stop } catch { Write-AzLocalLog "Failed to parse network settings JSON string." -Level Error throw "Failed to parse network settings JSON. $($_.Exception.Message)" } } # Validate required fields $requiredFields = @('subnetMask', 'defaultGateway', 'startingIPAddress', 'endingIPAddress', 'nodeIPAddresses') foreach ($field in $requiredFields) { if (-not $settings.PSObject.Properties[$field]) { Write-AzLocalLog "Network settings JSON is missing required field '$field'." -Level Error throw "Network settings JSON is missing required field '$field'." } } # Validate IP address formats try { [System.Net.IPAddress]::Parse($settings.subnetMask) | Out-Null [System.Net.IPAddress]::Parse($settings.defaultGateway) | Out-Null [System.Net.IPAddress]::Parse($settings.startingIPAddress) | Out-Null [System.Net.IPAddress]::Parse($settings.endingIPAddress) | Out-Null } catch { Write-AzLocalLog "Invalid IP address format in network settings JSON." -Level Error throw "Invalid IP address in network settings JSON. $($_.Exception.Message)" } # Validate node IP addresses $nodeIPs = @($settings.nodeIPAddresses) if ($nodeIPs.Count -ne $expectedNodes) { Write-AzLocalLog "Network settings JSON contains $($nodeIPs.Count) node IP addresses but $TypeOfDeployment deployment requires $expectedNodes." -Level Error throw "Expected $expectedNodes node IP addresses for $TypeOfDeployment deployment, but found $($nodeIPs.Count)." } foreach ($nodeIP in $nodeIPs) { try { [System.Net.IPAddress]::Parse($nodeIP) | Out-Null } catch { Write-AzLocalLog "Invalid node IP address '$nodeIP' in network settings JSON." -Level Error throw "Invalid node IP address '$nodeIP'. $($_.Exception.Message)" } } Write-AzLocalLog "Network settings loaded from JSON successfully." -Level Success return [PsCustomObject][Ordered]@{ subnetMask = $settings.subnetMask defaultGateway = $settings.defaultGateway startingIPAddress = $settings.startingIPAddress endingIPAddress = $settings.endingIPAddress nodeIPAddresses = $nodeIPs } } |