Files
Pulse/internal/resources/platform_data.go
2025-12-12 21:31:11 +00:00

374 lines
16 KiB
Go

package resources
import "time"
// NodePlatformData contains Proxmox VE node-specific fields.
// Stored in Resource.PlatformData when Type is ResourceTypeNode.
type NodePlatformData struct {
Instance string `json:"instance"` // Proxmox instance URL
Host string `json:"host"` // Full host URL from config
GuestURL string `json:"guestURL"` // Optional guest-accessible URL
PVEVersion string `json:"pveVersion"` // Proxmox VE version
KernelVersion string `json:"kernelVersion"` // Linux kernel version
CPUInfo CPUInfo `json:"cpuInfo"` // CPU details
LoadAverage []float64 `json:"loadAverage"` // 1, 5, 15 minute load averages
// Cluster information
IsClusterMember bool `json:"isClusterMember"`
ClusterName string `json:"clusterName"`
// Connection status
ConnectionHealth string `json:"connectionHealth"`
}
// CPUInfo contains CPU hardware details.
type CPUInfo struct {
Model string `json:"model"`
Cores int `json:"cores"`
Sockets int `json:"sockets"`
}
// VMPlatformData contains Proxmox VM-specific fields.
// Stored in Resource.PlatformData when Type is ResourceTypeVM.
type VMPlatformData struct {
VMID int `json:"vmid"`
Node string `json:"node"` // Proxmox node hosting this VM
Instance string `json:"instance"` // Proxmox instance URL
CPUs int `json:"cpus"` // Number of vCPUs
Template bool `json:"template"`
Lock string `json:"lock,omitempty"` // Lock status (backup, migrate, etc.)
AgentVersion string `json:"agentVersion,omitempty"`
OSName string `json:"osName,omitempty"`
OSVersion string `json:"osVersion,omitempty"`
IPAddresses []string `json:"ipAddresses,omitempty"`
// I/O stats
NetworkIn int64 `json:"networkIn"`
NetworkOut int64 `json:"networkOut"`
DiskRead int64 `json:"diskRead"`
DiskWrite int64 `json:"diskWrite"`
// Backup info
LastBackup *time.Time `json:"lastBackup,omitempty"`
}
// ContainerPlatformData contains Proxmox LXC container-specific fields.
// Stored in Resource.PlatformData when Type is ResourceTypeContainer or ResourceTypeOCIContainer.
type ContainerPlatformData struct {
VMID int `json:"vmid"`
Node string `json:"node"` // Proxmox node hosting this container
Instance string `json:"instance"` // Proxmox instance URL
Type string `json:"type,omitempty"` // lxc or oci
CPUs int `json:"cpus"` // Number of vCPUs
Template bool `json:"template"`
Lock string `json:"lock,omitempty"`
OSName string `json:"osName,omitempty"`
IPAddresses []string `json:"ipAddresses,omitempty"`
// OCI container support (Proxmox VE 9.1+)
IsOCI bool `json:"isOci,omitempty"` // True if this is an OCI container
OSTemplate string `json:"osTemplate,omitempty"` // Template or OCI image reference if available
// I/O stats
NetworkIn int64 `json:"networkIn"`
NetworkOut int64 `json:"networkOut"`
DiskRead int64 `json:"diskRead"`
DiskWrite int64 `json:"diskWrite"`
// Backup info
LastBackup *time.Time `json:"lastBackup,omitempty"`
}
// HostPlatformData contains host-agent specific fields.
// Stored in Resource.PlatformData when Type is ResourceTypeHost.
type HostPlatformData struct {
Platform string `json:"platform,omitempty"` // linux, windows, darwin
OSName string `json:"osName,omitempty"` // e.g., "Ubuntu 22.04"
OSVersion string `json:"osVersion,omitempty"` // OS version string
KernelVersion string `json:"kernelVersion,omitempty"` // Kernel version
Architecture string `json:"architecture,omitempty"` // amd64, arm64, etc.
CPUCount int `json:"cpuCount,omitempty"` // Number of CPUs
LoadAverage []float64 `json:"loadAverage,omitempty"` // 1, 5, 15 minute loads
AgentVersion string `json:"agentVersion,omitempty"` // Pulse agent version
IsLegacy bool `json:"isLegacy,omitempty"` // Legacy agent indicator
Sensors HostSensorSummary `json:"sensors,omitempty"` // Temperature/fan sensors
RAID []HostRAIDArray `json:"raid,omitempty"` // RAID arrays
DiskIO []DiskIOStats `json:"diskIO,omitempty"` // Per-disk I/O stats
Disks []DiskInfo `json:"disks,omitempty"` // Disk usage info
Interfaces []NetworkInterface `json:"interfaces,omitempty"` // Network interfaces
// Token information
TokenID string `json:"tokenId,omitempty"`
TokenName string `json:"tokenName,omitempty"`
TokenHint string `json:"tokenHint,omitempty"`
TokenLastUsedAt *time.Time `json:"tokenLastUsedAt,omitempty"`
}
// HostSensorSummary captures sensor readings from a host.
type HostSensorSummary struct {
TemperatureCelsius map[string]float64 `json:"temperatureCelsius,omitempty"`
FanRPM map[string]float64 `json:"fanRpm,omitempty"`
Additional map[string]float64 `json:"additional,omitempty"`
}
// HostRAIDArray represents an mdadm RAID array.
type HostRAIDArray struct {
Device string `json:"device"`
Name string `json:"name,omitempty"`
Level string `json:"level"`
State string `json:"state"`
TotalDevices int `json:"totalDevices"`
ActiveDevices int `json:"activeDevices"`
WorkingDevices int `json:"workingDevices"`
FailedDevices int `json:"failedDevices"`
SpareDevices int `json:"spareDevices"`
UUID string `json:"uuid,omitempty"`
Devices []HostRAIDDevice `json:"devices"`
RebuildPercent float64 `json:"rebuildPercent"`
RebuildSpeed string `json:"rebuildSpeed,omitempty"`
}
// HostRAIDDevice represents a device in a RAID array.
type HostRAIDDevice struct {
Device string `json:"device"`
State string `json:"state"`
Slot int `json:"slot"`
}
// DiskIOStats captures I/O statistics for a disk device.
type DiskIOStats struct {
Device string `json:"device"`
ReadBytes uint64 `json:"readBytes,omitempty"`
WriteBytes uint64 `json:"writeBytes,omitempty"`
ReadOps uint64 `json:"readOps,omitempty"`
WriteOps uint64 `json:"writeOps,omitempty"`
ReadTimeMs uint64 `json:"readTimeMs,omitempty"`
WriteTimeMs uint64 `json:"writeTimeMs,omitempty"`
IOTimeMs uint64 `json:"ioTimeMs,omitempty"`
}
// DiskInfo represents disk/partition usage.
type DiskInfo struct {
Mountpoint string `json:"mountpoint,omitempty"`
Device string `json:"device,omitempty"`
Type string `json:"type,omitempty"`
Total int64 `json:"total"`
Used int64 `json:"used"`
Free int64 `json:"free"`
Usage float64 `json:"usage"`
}
// NetworkInterface represents a network interface.
type NetworkInterface struct {
Name string `json:"name"`
MAC string `json:"mac,omitempty"`
Addresses []string `json:"addresses,omitempty"`
RXBytes uint64 `json:"rxBytes,omitempty"`
TXBytes uint64 `json:"txBytes,omitempty"`
SpeedMbps *int64 `json:"speedMbps,omitempty"`
}
// DockerHostPlatformData contains Docker host-specific fields.
// Stored in Resource.PlatformData when Type is ResourceTypeDockerHost.
type DockerHostPlatformData struct {
AgentID string `json:"agentId"`
MachineID string `json:"machineId,omitempty"`
OS string `json:"os,omitempty"`
KernelVersion string `json:"kernelVersion,omitempty"`
Architecture string `json:"architecture,omitempty"`
Runtime string `json:"runtime,omitempty"` // docker, podman
RuntimeVersion string `json:"runtimeVersion,omitempty"`
DockerVersion string `json:"dockerVersion,omitempty"`
LoadAverage []float64 `json:"loadAverage,omitempty"`
AgentVersion string `json:"agentVersion,omitempty"`
CPUs int `json:"cpus"`
IsLegacy bool `json:"isLegacy,omitempty"`
Disks []DiskInfo `json:"disks,omitempty"`
Interfaces []NetworkInterface `json:"interfaces,omitempty"`
CustomDisplayName string `json:"customDisplayName,omitempty"`
Hidden bool `json:"hidden"`
PendingUninstall bool `json:"pendingUninstall"`
// Swarm information
Swarm *DockerSwarmInfo `json:"swarm,omitempty"`
// Token information
TokenID string `json:"tokenId,omitempty"`
TokenName string `json:"tokenName,omitempty"`
TokenHint string `json:"tokenHint,omitempty"`
TokenLastUsedAt *time.Time `json:"tokenLastUsedAt,omitempty"`
}
// DockerSwarmInfo captures Docker Swarm membership details.
type DockerSwarmInfo struct {
NodeID string `json:"nodeId,omitempty"`
NodeRole string `json:"nodeRole,omitempty"`
LocalState string `json:"localState,omitempty"`
ControlAvailable bool `json:"controlAvailable,omitempty"`
ClusterID string `json:"clusterId,omitempty"`
ClusterName string `json:"clusterName,omitempty"`
Scope string `json:"scope,omitempty"`
Error string `json:"error,omitempty"`
}
// DockerContainerPlatformData contains Docker container-specific fields.
// Stored in Resource.PlatformData when Type is ResourceTypeDockerContainer.
type DockerContainerPlatformData struct {
HostID string `json:"hostId"` // Parent Docker host ID
HostName string `json:"hostName"` // Parent Docker host name
Image string `json:"image"` // Container image
State string `json:"state"` // created, running, paused, restarting, exited, dead
Status string `json:"status"` // Human-readable status
Health string `json:"health"` // healthy, unhealthy, starting, none
RestartCount int `json:"restartCount"`
ExitCode int `json:"exitCode"`
CreatedAt time.Time `json:"createdAt"`
StartedAt *time.Time `json:"startedAt,omitempty"`
FinishedAt *time.Time `json:"finishedAt,omitempty"`
Labels map[string]string `json:"labels,omitempty"`
Ports []ContainerPort `json:"ports,omitempty"`
Networks []ContainerNetwork `json:"networks,omitempty"`
// Podman-specific
Podman *PodmanContainerInfo `json:"podman,omitempty"`
}
// KubernetesClusterPlatformData contains Kubernetes cluster-specific fields.
// Stored in Resource.PlatformData when Type is ResourceTypeK8sCluster.
type KubernetesClusterPlatformData struct {
AgentID string `json:"agentId"`
Server string `json:"server,omitempty"`
Context string `json:"context,omitempty"`
Version string `json:"version,omitempty"`
CustomDisplayName string `json:"customDisplayName,omitempty"`
Hidden bool `json:"hidden"`
PendingUninstall bool `json:"pendingUninstall"`
NodeCount int `json:"nodeCount,omitempty"`
PodCount int `json:"podCount,omitempty"`
DeploymentCount int `json:"deploymentCount,omitempty"`
// Token information
TokenID string `json:"tokenId,omitempty"`
TokenName string `json:"tokenName,omitempty"`
TokenHint string `json:"tokenHint,omitempty"`
TokenLastUsedAt *time.Time `json:"tokenLastUsedAt,omitempty"`
}
// KubernetesNodePlatformData contains Kubernetes node-specific fields.
// Stored in Resource.PlatformData when Type is ResourceTypeK8sNode.
type KubernetesNodePlatformData struct {
ClusterID string `json:"clusterId"`
Ready bool `json:"ready"`
Unschedulable bool `json:"unschedulable,omitempty"`
KubeletVersion string `json:"kubeletVersion,omitempty"`
ContainerRuntimeVersion string `json:"containerRuntimeVersion,omitempty"`
OSImage string `json:"osImage,omitempty"`
KernelVersion string `json:"kernelVersion,omitempty"`
Architecture string `json:"architecture,omitempty"`
CapacityCPUCores int64 `json:"capacityCpuCores,omitempty"`
CapacityMemoryBytes int64 `json:"capacityMemoryBytes,omitempty"`
CapacityPods int64 `json:"capacityPods,omitempty"`
AllocatableCPUCores int64 `json:"allocatableCpuCores,omitempty"`
AllocatableMemoryBytes int64 `json:"allocatableMemoryBytes,omitempty"`
AllocatablePods int64 `json:"allocatablePods,omitempty"`
Roles []string `json:"roles,omitempty"`
}
// KubernetesPodPlatformData contains Kubernetes pod-specific fields.
// Stored in Resource.PlatformData when Type is ResourceTypePod.
type KubernetesPodPlatformData struct {
ClusterID string `json:"clusterId"`
Namespace string `json:"namespace"`
NodeName string `json:"nodeName,omitempty"`
Phase string `json:"phase,omitempty"`
Reason string `json:"reason,omitempty"`
Message string `json:"message,omitempty"`
QoSClass string `json:"qosClass,omitempty"`
Restarts int `json:"restarts,omitempty"`
OwnerKind string `json:"ownerKind,omitempty"`
OwnerName string `json:"ownerName,omitempty"`
Containers []KubernetesPodContainerInfo `json:"containers,omitempty"`
}
// KubernetesPodContainerInfo captures per-container pod status.
type KubernetesPodContainerInfo struct {
Name string `json:"name"`
Image string `json:"image,omitempty"`
Ready bool `json:"ready"`
RestartCount int32 `json:"restartCount,omitempty"`
State string `json:"state,omitempty"`
Reason string `json:"reason,omitempty"`
Message string `json:"message,omitempty"`
}
// KubernetesDeploymentPlatformData contains Kubernetes deployment-specific fields.
// Stored in Resource.PlatformData when Type is ResourceTypeK8sDeployment.
type KubernetesDeploymentPlatformData struct {
ClusterID string `json:"clusterId"`
Namespace string `json:"namespace"`
DesiredReplicas int32 `json:"desiredReplicas,omitempty"`
UpdatedReplicas int32 `json:"updatedReplicas,omitempty"`
ReadyReplicas int32 `json:"readyReplicas,omitempty"`
AvailableReplicas int32 `json:"availableReplicas,omitempty"`
}
// ContainerPort describes a port mapping.
type ContainerPort struct {
PrivatePort int `json:"privatePort"`
PublicPort int `json:"publicPort,omitempty"`
Protocol string `json:"protocol"`
IP string `json:"ip,omitempty"`
}
// ContainerNetwork describes a container's network attachment.
type ContainerNetwork struct {
Name string `json:"name"`
IPv4 string `json:"ipv4,omitempty"`
IPv6 string `json:"ipv6,omitempty"`
}
// PodmanContainerInfo captures Podman-specific container info.
type PodmanContainerInfo struct {
PodName string `json:"podName,omitempty"`
PodID string `json:"podId,omitempty"`
Infra bool `json:"infra,omitempty"`
ComposeProject string `json:"composeProject,omitempty"`
ComposeService string `json:"composeService,omitempty"`
}
// PBSPlatformData contains PBS-specific fields.
// Stored in Resource.PlatformData when Type is ResourceTypePBS.
type PBSPlatformData struct {
Host string `json:"host"`
Version string `json:"version"`
ConnectionHealth string `json:"connectionHealth"`
MemoryUsed int64 `json:"memoryUsed"`
MemoryTotal int64 `json:"memoryTotal"`
NumDatastores int `json:"numDatastores"`
}
// DatastorePlatformData contains PBS datastore-specific fields.
// Stored in Resource.PlatformData when Type is ResourceTypeDatastore.
type DatastorePlatformData struct {
PBSInstanceID string `json:"pbsInstanceId"`
PBSInstanceName string `json:"pbsInstanceName"`
Content string `json:"content,omitempty"`
Error string `json:"error,omitempty"`
DeduplicationFactor float64 `json:"deduplicationFactor,omitempty"`
}
// StoragePlatformData contains Proxmox storage-specific fields.
// Stored in Resource.PlatformData when Type is ResourceTypeStorage.
type StoragePlatformData struct {
Instance string `json:"instance"`
Node string `json:"node"` // Primary node
Nodes []string `json:"nodes,omitempty"` // All nodes (for shared storage)
Type string `json:"type"` // zfspool, lvmthin, cephfs, etc.
Content string `json:"content"`
Shared bool `json:"shared"`
Enabled bool `json:"enabled"`
Active bool `json:"active"`
}