fix: Apply IPAM IP address to VM cloud-init configuration
- Fix field names in frontend: ipam_ip -> ip_address, ipam_gateway -> gateway - Pass ipam_network_id to deploy API for proper network mask lookup - Extract network mask from IPAM network CIDR (e.g., /24 from 10.10.10.0/24) - Auto-fetch gateway from IPAM network if not provided - Add detailed logging for VM IP configuration - Remove hardcoded /24 mask, use actual network mask from IPAM This fixes the issue where VMs were getting DHCP instead of the static IP allocated from IPAM.
This commit is contained in:
@@ -754,15 +754,43 @@ async def deploy_vm_from_template(
|
|||||||
if error:
|
if error:
|
||||||
logger.warning(f"IPAM registration failed for manually specified IP: {error}")
|
logger.warning(f"IPAM registration failed for manually specified IP: {error}")
|
||||||
|
|
||||||
|
# Get network mask (CIDR) and gateway from IPAM network if IP is specified
|
||||||
|
network_mask = "24" # Default mask
|
||||||
|
gateway = deploy_data.gateway
|
||||||
|
|
||||||
|
# Try to get proper network mask and gateway from IPAM
|
||||||
|
if allocated_ip and (deploy_data.ipam_network_id or ipam_allocation):
|
||||||
|
try:
|
||||||
|
from ..models import IPAMNetwork
|
||||||
|
network_id = deploy_data.ipam_network_id
|
||||||
|
if ipam_allocation and hasattr(ipam_allocation, 'network_id'):
|
||||||
|
network_id = ipam_allocation.network_id
|
||||||
|
|
||||||
|
if network_id:
|
||||||
|
network = db.query(IPAMNetwork).filter(IPAMNetwork.id == network_id).first()
|
||||||
|
if network:
|
||||||
|
# Extract mask from CIDR (e.g., "10.10.10.0/24" -> "24")
|
||||||
|
if network.network and '/' in network.network:
|
||||||
|
network_mask = network.network.split('/')[1]
|
||||||
|
logger.info(f"Using network mask /{network_mask} from IPAM network {network.name}")
|
||||||
|
# Get gateway if not already specified
|
||||||
|
if not gateway and network.gateway:
|
||||||
|
gateway = network.gateway
|
||||||
|
logger.info(f"Using gateway {gateway} from IPAM network {network.name}")
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(f"Could not get network info from IPAM: {e}")
|
||||||
|
|
||||||
# Configure VM
|
# Configure VM
|
||||||
ip_config = None
|
ip_config = None
|
||||||
if allocated_ip:
|
if allocated_ip:
|
||||||
if deploy_data.gateway:
|
logger.info(f"Configuring VM {new_vmid} with IP {allocated_ip}/{network_mask}, gateway: {gateway}")
|
||||||
ip_config = f"ip={allocated_ip}/24,gw={deploy_data.gateway}"
|
if gateway:
|
||||||
|
ip_config = f"ip={allocated_ip}/{network_mask},gw={gateway}"
|
||||||
|
else:
|
||||||
|
ip_config = f"ip={allocated_ip}/{network_mask}"
|
||||||
else:
|
else:
|
||||||
ip_config = f"ip={allocated_ip}/24"
|
|
||||||
elif allocated_ip is None:
|
|
||||||
ip_config = "ip=dhcp"
|
ip_config = "ip=dhcp"
|
||||||
|
logger.info(f"Configuring VM {new_vmid} with DHCP")
|
||||||
|
|
||||||
# Combine user's SSH key with deploy request SSH keys
|
# Combine user's SSH key with deploy request SSH keys
|
||||||
ssh_keys = deploy_data.ssh_keys or ""
|
ssh_keys = deploy_data.ssh_keys or ""
|
||||||
|
|||||||
@@ -2614,9 +2614,9 @@ async function executeCreateVM(event) {
|
|||||||
start_after_create: document.getElementById('vmStartAfterCreate').checked,
|
start_after_create: document.getElementById('vmStartAfterCreate').checked,
|
||||||
onboot: document.getElementById('vmOnboot').checked,
|
onboot: document.getElementById('vmOnboot').checked,
|
||||||
enable_ha: document.getElementById('vmEnableHA').checked,
|
enable_ha: document.getElementById('vmEnableHA').checked,
|
||||||
ipam_ip: allocatedIP,
|
ip_address: allocatedIP,
|
||||||
ipam_gateway: allocatedGateway,
|
gateway: allocatedGateway,
|
||||||
ipam_allocation_id: allocationId
|
ipam_network_id: ipamNetworkId ? parseInt(ipamNetworkId) : null
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user