Pool Management - FreshPerf/PVE4J GitHub Wiki
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.
- Listing Pools
- Creating Pools
- Pool Information
- Managing Pool Members
- Updating Pools
- Deleting Pools
- Pool Resource Usage
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();
}try {
proxmox.getPools()
.create("production")
.execute();
System.out.println("Pool 'production' created!");
} catch (ProxmoxAPIError | InterruptedException e) {
e.printStackTrace();
}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();
}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();
}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();
}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();
}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();
}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();
}try {
proxmox.getPools()
.get("production")
.removeStorage(List.of("old-storage"))
.execute();
System.out.println("Storage removed from pool!");
} catch (ProxmoxAPIError | InterruptedException e) {
e.printStackTrace();
}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();
}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();
}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.
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();
}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);
}- Access Control - Configure permissions for pools
- VM Management - Complete VM operations guide
- Container Management - LXC container operations
- Storage Management - Storage operations