Pool Management - FreshPerf/PVE4J GitHub Wiki

Pool Management

This guide covers resource pool management using PVE4J. Resource pools in Proxmox allow you to group VMs, containers, and storage for easier management and permission delegation.

Table of Contents

Listing Pools

List All Resource Pools

import fr.freshperf.pve4j.entities.pools.PvePool;
import java.util.List;

try {
    List<PvePool> pools = proxmox.getPools()
            .list()
            .execute();
    
    for (PvePool pool : pools) {
        System.out.printf("Pool: %s, Comment: %s%n",
                pool.getPoolid(), 
                pool.getComment());
    }
} catch (ProxmoxAPIError | InterruptedException e) {
    e.printStackTrace();
}

Creating Pools

Simple Pool Creation

try {
    proxmox.getPools()
            .create("production")
            .execute();
    
    System.out.println("Pool 'production' created!");
} catch (ProxmoxAPIError | InterruptedException e) {
    e.printStackTrace();
}

Create Pool with Description

import fr.freshperf.pve4j.entities.pools.PvePoolCreateOptions;

try {
    PvePoolCreateOptions options = PvePoolCreateOptions.builder()
            .comment("Production environment resources")
            .build();
    
    proxmox.getPools()
            .create("production", options)
            .execute();
    
    System.out.println("Pool 'production' created with description!");
} catch (ProxmoxAPIError | InterruptedException e) {
    e.printStackTrace();
}

Pool Information

Get Pool Details

import fr.freshperf.pve4j.entities.pools.PvePoolDetails;
import fr.freshperf.pve4j.entities.pools.PvePoolMember;

try {
    PvePoolDetails details = proxmox.getPools()
            .get("production")
            .getDetails()
            .execute();
    
    System.out.println("Comment: " + details.getComment());
    System.out.println("Members:");
    
    for (PvePoolMember member : details.getMembers()) {
        System.out.printf("  - %s: %s (Type: %s, Node: %s)%n",
                member.getId(),
                member.getName(),
                member.getType(),
                member.getNode());
    }
} catch (ProxmoxAPIError | InterruptedException e) {
    e.printStackTrace();
}

Get Pool Members by Type

Filter members to only show specific types:

try {
    // Get only VMs in the pool
    PvePoolDetails vmDetails = proxmox.getPools()
            .get("production")
            .getDetails("qemu")
            .execute();
    
    System.out.println("VMs in pool:");
    for (PvePoolMember member : vmDetails.getMembers()) {
        System.out.printf("  - VMID: %d, Name: %s, Status: %s%n",
                member.getVmid(),
                member.getName(),
                member.getStatus());
    }
    
    // Get only containers in the pool
    PvePoolDetails lxcDetails = proxmox.getPools()
            .get("production")
            .getDetails("lxc")
            .execute();
    
    // Get only storage in the pool
    PvePoolDetails storageDetails = proxmox.getPools()
            .get("production")
            .getDetails("storage")
            .execute();
    
} catch (ProxmoxAPIError | InterruptedException e) {
    e.printStackTrace();
}

Managing Pool Members

Add VMs to a Pool

import java.util.List;

try {
    // Add single VM
    proxmox.getPools()
            .get("production")
            .addVms(List.of(100))
            .execute();
    
    System.out.println("VM 100 added to pool!");
    
    // Add multiple VMs
    proxmox.getPools()
            .get("production")
            .addVms(List.of(101, 102, 103))
            .execute();
    
    System.out.println("VMs 101, 102, 103 added to pool!");
    
} catch (ProxmoxAPIError | InterruptedException e) {
    e.printStackTrace();
}

Remove VMs from a Pool

try {
    // Remove single VM
    proxmox.getPools()
            .get("production")
            .removeVms(List.of(100))
            .execute();
    
    System.out.println("VM 100 removed from pool!");
    
    // Remove multiple VMs
    proxmox.getPools()
            .get("production")
            .removeVms(List.of(101, 102))
            .execute();
    
    System.out.println("VMs 101, 102 removed from pool!");
    
} catch (ProxmoxAPIError | InterruptedException e) {
    e.printStackTrace();
}

Add Storage to a Pool

try {
    proxmox.getPools()
            .get("production")
            .addStorage(List.of("local-lvm", "nfs-storage"))
            .execute();
    
    System.out.println("Storage added to pool!");
} catch (ProxmoxAPIError | InterruptedException e) {
    e.printStackTrace();
}

Remove Storage from a Pool

try {
    proxmox.getPools()
            .get("production")
            .removeStorage(List.of("old-storage"))
            .execute();
    
    System.out.println("Storage removed from pool!");
} catch (ProxmoxAPIError | InterruptedException e) {
    e.printStackTrace();
}

Updating Pools

Update Pool Description

import fr.freshperf.pve4j.entities.pools.PvePoolUpdateOptions;

try {
    PvePoolUpdateOptions options = PvePoolUpdateOptions.builder()
            .comment("Production environment - Critical systems")
            .build();
    
    proxmox.getPools()
            .get("production")
            .update(options)
            .execute();
    
    System.out.println("Pool description updated!");
} catch (ProxmoxAPIError | InterruptedException e) {
    e.printStackTrace();
}

Complex Update (Add VMs and Storage)

try {
    PvePoolUpdateOptions options = PvePoolUpdateOptions.builder()
            .comment("Updated production pool")
            .vms(List.of(104, 105))
            .storage(List.of("new-storage"))
            .delete(false)  // Add (not remove) the specified resources
            .build();
    
    proxmox.getPools()
            .get("production")
            .update(options)
            .execute();
    
    System.out.println("Pool updated with new resources!");
} catch (ProxmoxAPIError | InterruptedException e) {
    e.printStackTrace();
}

Deleting Pools

Delete a Pool

try {
    proxmox.getPools()
            .get("old-pool")
            .delete()
            .execute();
    
    System.out.println("Pool deleted!");
} catch (ProxmoxAPIError | InterruptedException e) {
    e.printStackTrace();
}

Note: Deleting a pool does not delete the VMs, containers, or storage in it. They simply become unassigned.

Pool Resource Usage

Display Pool Resource Usage

try {
    PvePoolDetails details = proxmox.getPools()
            .get("production")
            .getDetails()
            .execute();
    
    long totalMemory = 0;
    long usedMemory = 0;
    int totalCores = 0;
    
    for (PvePoolMember member : details.getMembers()) {
        if ("qemu".equals(member.getType()) || "lxc".equals(member.getType())) {
            if (member.getMaxmem() != null) {
                totalMemory += member.getMaxmem();
            }
            if (member.getMem() != null) {
                usedMemory += member.getMem();
            }
            if (member.getMaxcpu() != null) {
                totalCores += member.getMaxcpu();
            }
        }
    }
    
    System.out.printf("Pool 'production' resources:%n");
    System.out.printf("  Total Memory: %.2f GB%n", totalMemory / (1024.0 * 1024 * 1024));
    System.out.printf("  Used Memory: %.2f GB%n", usedMemory / (1024.0 * 1024 * 1024));
    System.out.printf("  Total CPU Cores: %d%n", totalCores);
    
} catch (ProxmoxAPIError | InterruptedException e) {
    e.printStackTrace();
}

Pool Summary

public void printPoolSummary(Proxmox proxmox, String poolId) 
        throws ProxmoxAPIError, InterruptedException {
    
    PvePoolDetails details = proxmox.getPools()
            .get(poolId)
            .getDetails()
            .execute();
    
    int vmCount = 0;
    int lxcCount = 0;
    int storageCount = 0;
    int runningCount = 0;
    
    for (PvePoolMember member : details.getMembers()) {
        switch (member.getType()) {
            case "qemu" -> {
                vmCount++;
                if ("running".equals(member.getStatus())) runningCount++;
            }
            case "lxc" -> {
                lxcCount++;
                if ("running".equals(member.getStatus())) runningCount++;
            }
            case "storage" -> storageCount++;
        }
    }
    
    System.out.printf("Pool '%s' Summary:%n", poolId);
    System.out.printf("  Description: %s%n", details.getComment());
    System.out.printf("  VMs: %d%n", vmCount);
    System.out.printf("  Containers: %d%n", lxcCount);
    System.out.printf("  Storage: %d%n", storageCount);
    System.out.printf("  Running: %d%n", runningCount);
}

Next Steps

⚠️ **GitHub.com Fallback** ⚠️