feat(format): add ps1xml format definitions and module manifest

Define default Format-Table views for PveVm, PveNode, PveStorage,
PveTask, PveSnapshot, PveContainer, and PveUser. Add module manifest
with all 60+ cmdlets explicitly listed, PowerShell 5.1+ compatibility,
and prerelease tag.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Clint Branham
2026-03-17 15:47:52 -05:00
parent 76c2ad4946
commit c5d6cde6eb
2 changed files with 633 additions and 0 deletions
+446
View File
@@ -0,0 +1,446 @@
<?xml version="1.0" encoding="utf-8"?>
<Configuration>
<ViewDefinitions>
<!-- PSProxmoxVE.Core.Models.Nodes.PveNode -->
<View>
<Name>PSProxmoxVE.Core.Models.Nodes.PveNode</Name>
<ViewSelectedBy>
<TypeName>PSProxmoxVE.Core.Models.Nodes.PveNode</TypeName>
</ViewSelectedBy>
<TableControl>
<TableHeaders>
<TableColumnHeader>
<Label>Name</Label>
<Width>15</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Status</Label>
<Width>10</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>CPUs</Label>
<Width>5</Width>
<Alignment>Right</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Memory</Label>
<Width>15</Width>
<Alignment>Right</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Uptime</Label>
<Width>12</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Version</Label>
<Width>12</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
</TableHeaders>
<TableRowEntries>
<TableRowEntry>
<TableColumnItems>
<TableColumnItem>
<PropertyName>Name</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Status</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>CpuCount</PropertyName>
</TableColumnItem>
<TableColumnItem>
<ScriptBlock>[math]::Round($_.MemoryTotal / 1GB, 1).ToString() + ' GB'</ScriptBlock>
</TableColumnItem>
<TableColumnItem>
<ScriptBlock>
$ts = [TimeSpan]::FromSeconds($_.Uptime)
'{0}d {1:D2}:{2:D2}' -f [int]$ts.TotalDays, $ts.Hours, $ts.Minutes
</ScriptBlock>
</TableColumnItem>
<TableColumnItem>
<PropertyName>PveVersion</PropertyName>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
</TableControl>
</View>
<!-- PSProxmoxVE.Core.Models.Vms.PveVm -->
<View>
<Name>PSProxmoxVE.Core.Models.Vms.PveVm</Name>
<ViewSelectedBy>
<TypeName>PSProxmoxVE.Core.Models.Vms.PveVm</TypeName>
</ViewSelectedBy>
<TableControl>
<TableHeaders>
<TableColumnHeader>
<Label>VmId</Label>
<Width>8</Width>
<Alignment>Right</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Name</Label>
<Width>20</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Status</Label>
<Width>10</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Node</Label>
<Width>15</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>CPUs</Label>
<Width>5</Width>
<Alignment>Right</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Memory</Label>
<Width>12</Width>
<Alignment>Right</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Uptime</Label>
<Width>12</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
</TableHeaders>
<TableRowEntries>
<TableRowEntry>
<TableColumnItems>
<TableColumnItem>
<PropertyName>VmId</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Name</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Status</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Node</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>CpuCount</PropertyName>
</TableColumnItem>
<TableColumnItem>
<ScriptBlock>[math]::Round($_.MaxMem / 1GB, 1).ToString() + ' GB'</ScriptBlock>
</TableColumnItem>
<TableColumnItem>
<ScriptBlock>
$ts = [TimeSpan]::FromSeconds($_.Uptime)
'{0}d {1:D2}:{2:D2}' -f [int]$ts.TotalDays, $ts.Hours, $ts.Minutes
</ScriptBlock>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
</TableControl>
</View>
<!-- PSProxmoxVE.Core.Models.Containers.PveContainer -->
<View>
<Name>PSProxmoxVE.Core.Models.Containers.PveContainer</Name>
<ViewSelectedBy>
<TypeName>PSProxmoxVE.Core.Models.Containers.PveContainer</TypeName>
</ViewSelectedBy>
<TableControl>
<TableHeaders>
<TableColumnHeader>
<Label>VmId</Label>
<Width>8</Width>
<Alignment>Right</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Name</Label>
<Width>20</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Status</Label>
<Width>10</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Node</Label>
<Width>15</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Memory</Label>
<Width>12</Width>
<Alignment>Right</Alignment>
</TableColumnHeader>
</TableHeaders>
<TableRowEntries>
<TableRowEntry>
<TableColumnItems>
<TableColumnItem>
<PropertyName>VmId</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Name</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Status</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Node</PropertyName>
</TableColumnItem>
<TableColumnItem>
<ScriptBlock>[math]::Round($_.MaxMem / 1GB, 1).ToString() + ' GB'</ScriptBlock>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
</TableControl>
</View>
<!-- PSProxmoxVE.Core.Models.Storage.PveStorage -->
<View>
<Name>PSProxmoxVE.Core.Models.Storage.PveStorage</Name>
<ViewSelectedBy>
<TypeName>PSProxmoxVE.Core.Models.Storage.PveStorage</TypeName>
</ViewSelectedBy>
<TableControl>
<TableHeaders>
<TableColumnHeader>
<Label>Storage</Label>
<Width>20</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Type</Label>
<Width>12</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Content</Label>
<Width>20</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Used</Label>
<Width>12</Width>
<Alignment>Right</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Total</Label>
<Width>12</Width>
<Alignment>Right</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Active</Label>
<Width>6</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
</TableHeaders>
<TableRowEntries>
<TableRowEntry>
<TableColumnItems>
<TableColumnItem>
<PropertyName>Storage</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Type</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Content</PropertyName>
</TableColumnItem>
<TableColumnItem>
<ScriptBlock>[math]::Round($_.Used / 1GB, 1).ToString() + ' GB'</ScriptBlock>
</TableColumnItem>
<TableColumnItem>
<ScriptBlock>[math]::Round($_.Total / 1GB, 1).ToString() + ' GB'</ScriptBlock>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Active</PropertyName>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
</TableControl>
</View>
<!-- PSProxmoxVE.Core.Models.PveTask -->
<View>
<Name>PSProxmoxVE.Core.Models.PveTask</Name>
<ViewSelectedBy>
<TypeName>PSProxmoxVE.Core.Models.PveTask</TypeName>
</ViewSelectedBy>
<TableControl>
<TableHeaders>
<TableColumnHeader>
<Label>Upid</Label>
<Width>40</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Type</Label>
<Width>15</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Status</Label>
<Width>10</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>ExitStatus</Label>
<Width>15</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
</TableHeaders>
<TableRowEntries>
<TableRowEntry>
<TableColumnItems>
<TableColumnItem>
<PropertyName>Upid</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Type</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Status</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>ExitStatus</PropertyName>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
</TableControl>
</View>
<!-- PSProxmoxVE.Core.Models.PveSnapshot -->
<View>
<Name>PSProxmoxVE.Core.Models.PveSnapshot</Name>
<ViewSelectedBy>
<TypeName>PSProxmoxVE.Core.Models.PveSnapshot</TypeName>
</ViewSelectedBy>
<TableControl>
<TableHeaders>
<TableColumnHeader>
<Label>Name</Label>
<Width>20</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>SnapTime</Label>
<Width>20</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Description</Label>
<Width>30</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>VmState</Label>
<Width>8</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
</TableHeaders>
<TableRowEntries>
<TableRowEntry>
<TableColumnItems>
<TableColumnItem>
<PropertyName>Name</PropertyName>
</TableColumnItem>
<TableColumnItem>
<ScriptBlock>
if ($_.SnapTime) {
[System.DateTimeOffset]::FromUnixTimeSeconds($_.SnapTime).LocalDateTime.ToString('yyyy-MM-dd HH:mm:ss')
}
</ScriptBlock>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Description</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>VmState</PropertyName>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
</TableControl>
</View>
<!-- PSProxmoxVE.Core.Models.Users.PveUser -->
<View>
<Name>PSProxmoxVE.Core.Models.Users.PveUser</Name>
<ViewSelectedBy>
<TypeName>PSProxmoxVE.Core.Models.Users.PveUser</TypeName>
</ViewSelectedBy>
<TableControl>
<TableHeaders>
<TableColumnHeader>
<Label>UserId</Label>
<Width>25</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>FirstName</Label>
<Width>15</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>LastName</Label>
<Width>15</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Email</Label>
<Width>25</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Enabled</Label>
<Width>8</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Realm</Label>
<Width>10</Width>
<Alignment>Left</Alignment>
</TableColumnHeader>
</TableHeaders>
<TableRowEntries>
<TableRowEntry>
<TableColumnItems>
<TableColumnItem>
<PropertyName>UserId</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>FirstName</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>LastName</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Email</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Enabled</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Realm</PropertyName>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
</TableControl>
</View>
</ViewDefinitions>
</Configuration>
+187
View File
@@ -0,0 +1,187 @@
#
# Module manifest for module 'PSProxmoxVE'
#
# Generated on: 2026-03-17
#
@{
# Script module or binary module file associated with this manifest.
RootModule = 'PSProxmoxVE.dll'
# Version number of this module.
ModuleVersion = '0.1.0'
# Supported PSEditions
CompatiblePSEditions = @('Desktop', 'Core')
# ID used to uniquely identify this module
GUID = 'a3f7c2d1-84e5-4b9f-a061-3e2d8c5f1a7b'
# Author of this module
Author = 'goodolclint'
# Company or vendor of this module
CompanyName = 'Worklab'
# Copyright statement for this module
Copyright = '(c) 2026 goodolclint. All rights reserved.'
# Description of the functionality provided by this module
Description = 'PowerShell module for managing Proxmox VE environments. Supports PVE 8.x and 9.x with full VM, container, storage, network, and cluster management capabilities.'
# Minimum version of the PowerShell engine required by this module
PowerShellVersion = '5.1'
# Minimum version of the .NET Framework required by this module
DotNetFrameworkVersion = '4.8'
# Assemblies that must be loaded prior to importing this module
RequiredAssemblies = @(
'PSProxmoxVE.Core.dll',
'Newtonsoft.Json.dll'
)
# Format files (.ps1xml) to be loaded when importing this module
FormatsToProcess = @('PSProxmoxVE.format.ps1xml')
# Functions to export from this module
FunctionsToExport = @()
# Cmdlets to export from this module
CmdletsToExport = @(
# Connection
'Connect-PveServer',
'Disconnect-PveServer',
'Test-PveConnection',
# Nodes
'Get-PveNode',
'Get-PveNodeStatus',
# Virtual Machines
'Get-PveVm',
'New-PveVm',
'Remove-PveVm',
'Start-PveVm',
'Stop-PveVm',
'Suspend-PveVm',
'Resume-PveVm',
'Reset-PveVm',
'Restart-PveVm',
'Copy-PveVm',
'Move-PveVm',
'Get-PveVmConfig',
'Set-PveVmConfig',
'Resize-PveVmDisk',
# Containers
'Get-PveContainer',
'New-PveContainer',
'Remove-PveContainer',
'Start-PveContainer',
'Stop-PveContainer',
'Restart-PveContainer',
'Copy-PveContainer',
'Get-PveContainerConfig',
'Set-PveContainerConfig',
# Storage
'Get-PveStorage',
'Get-PveStorageContent',
'Send-PveIso',
'Invoke-PveStorageDownload',
'New-PveStorage',
'Remove-PveStorage',
# Snapshots
'Get-PveSnapshot',
'New-PveSnapshot',
'Remove-PveSnapshot',
'Restore-PveSnapshot',
# Networking
'Get-PveNetwork',
'New-PveNetwork',
'Set-PveNetwork',
'Remove-PveNetwork',
'Invoke-PveNetworkApply',
# SDN - Zones
'Get-PveSdnZone',
'New-PveSdnZone',
'Remove-PveSdnZone',
# SDN - VNets
'Get-PveSdnVnet',
'New-PveSdnVnet',
'Remove-PveSdnVnet',
# Users
'Get-PveUser',
'New-PveUser',
'Remove-PveUser',
'Set-PveUser',
# Roles
'Get-PveRole',
'New-PveRole',
'Remove-PveRole',
# Permissions
'Get-PvePermission',
'Set-PvePermission',
# Templates
'Get-PveTemplate',
'New-PveTemplate',
'Remove-PveTemplate',
'New-PveVmFromTemplate',
# Cloud-Init
'Get-PveCloudInitConfig',
'Set-PveCloudInitConfig',
'Invoke-PveCloudInitRegenerate',
# Tasks
'Get-PveTask',
'Wait-PveTask'
)
# Variables to export from this module
VariablesToExport = @()
# Aliases to export from this module
AliasesToExport = @()
# Private data to pass to the module specified in RootModule
PrivateData = @{
PSData = @{
# Prerelease string for the module
Prerelease = 'preview'
# Tags applied to this module
Tags = @(
'Proxmox',
'ProxmoxVE',
'PVE',
'Virtualization',
'IaC',
'Homelab',
'ProxmoxVE8',
'ProxmoxVE9'
)
# URI to the license for this module
LicenseUri = 'https://github.com/goodolclint/PSProxmoxVE/blob/main/LICENSE'
# URI to the project for this module
ProjectUri = 'https://github.com/goodolclint/PSProxmoxVE'
}
}
}