rybakovanton-metta opened a new issue, #12772:
URL: https://github.com/apache/cloudstack/issues/12772
##### ISSUE TYPE
* Bug Report
##### COMPONENT NAME
~~~
GuestNetworkGuru
~~~
##### CLOUDSTACK VERSION
~~~
main (4.22)
~~~
##### CONFIGURATION
- Advanced zone
- Network with `SpecifyIpRanges=true`
- Isolated network type with CIDR (e.g., 10.0.0.0/8 - private address space)
- All IPs in the zone's public pools are already allocated
##### SUMMARY
`GuestNetworkGuru.allocate()` incorrectly calls `allocateDirectIp()` for
Isolated networks with `SpecifyIpRanges=true`. The `allocateDirectIp()` method
is designed for Shared networks only and attempts to allocate IPs from
zone-wide VLAN pools. For Isolated networks with `SpecifyIpRanges=true`, this
causes `InsufficientAddressCapacityException` because Isolated networks should
allocate IPs from their own CIDR, not from VLAN pools.
##### STEPS TO REPRODUCE
1. Create an Advanced zone with VLAN ranges configured (e.g.,
10.1.1.100-10.1.1.200)
2. Create an Isolated network offering with `SpecifyIpRanges=true` and
Source NAT service enabled
3. Create an Isolated network using this offering with CIDR like 10.0.0.0/8
4. Deploy a VM in this network when all IPs in the zone's VLAN pools are
already allocated
5. The VM deployment fails with `InsufficientAddressCapacityException`
##### EXPECTED RESULTS
- For **Shared networks** with `SpecifyIpRanges=true`: IP allocation from
VLAN pools using `allocateDirectIp()`
- For **Isolated networks** with `SpecifyIpRanges=true`: IP allocation from
the network's CIDR using `acquireGuestIpAddress()`
The correct behavior should be:
1. Shared networks → use public IP pool from VLAN ranges
2. Isolated networks → use network's own CIDR for IP allocation
##### ACTUAL RESULTS
`GuestNetworkGuru.allocate()` at line 445-446:
```java
if (network.getSpecifyIpRanges()) {
_ipAddrMgr.allocateDirectIp(nic, dc, vm, network,
nic.getRequestedIPv4(), null);
}
```
This unconditionally calls `allocateDirectIp()` for ANY network with
`SpecifyIpRanges=true`, regardless of network type.
The stack trace shows:
```
WARN [c.c.n.IpAddressManagerImpl] Unable to get ip address in zone id=1,
network id=295
ERROR [c.c.v.UserVmManagerImpl] error during resource reservation and
allocation com.cloud.exception.InsufficientAddressCapacityException:
Insufficient address capacityScope=interface com.cloud.dc.DataCenter; id=1
```
##### ROOT CAUSE
`GuestNetworkGuru.allocate()` does not check the network type
(`getGuestType()`) before calling `allocateDirectIp()`. The method is only
valid for Shared networks (`GuestType.Shared`), but it's being called for
Isolated networks as well.
The fix should add a network type check:
```java
if (network.getSpecifyIpRanges()) {
if (network.getGuestType() == GuestType.Shared) {
_ipAddrMgr.allocateDirectIp(nic, dc, vm, network,
nic.getRequestedIPv4(), null);
} else {
// For Isolated/L2 networks, use acquireGuestIpAddress() to get IP
from network CIDR
}
}
```
##### FILES AFFECTED
- `server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java` -
lines 445-446
ps:
actually I'm not sure for root cause. it's a little complicated
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]