Management ip address resolution - #13603
Conversation
|
Congratulations on your first Pull Request and welcome to the Apache CloudStack community! If you have any issues or are unsure about any anything please check our Contribution Guide (https://github.com/apache/cloudstack/blob/main/CONTRIBUTING.md)
|
DaanHoogland
left a comment
There was a problem hiding this comment.
thanks @EduFrazao , clgtm.
|
also @EduFrazao , I marked it for 24 as you based the PR off main. please rebase if you need it on 22.2 or somewhere else. |
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## 4.22 #13603 +/- ##
============================================
- Coverage 17.69% 17.69% -0.01%
+ Complexity 15833 15831 -2
============================================
Files 5925 5925
Lines 533534 533596 +62
Branches 65273 65286 +13
============================================
- Hits 94421 94411 -10
- Misses 428434 428508 +74
+ Partials 10679 10677 -2
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Thank you very mutch. |
- By explicit definition of the management ip address on agent.properties - By using OS routing table to determine the source address used to connect to any of avaliable management servers. - Fallback to current methods.
0a2c926 to
9e1f3be
Compare
looks like it is still based on main. let me know if you want it on 4.22 or 4.20 and if you need help with that. (quick preview: something like |
813ea6e to
9e1f3be
Compare
|
@DaanHoogland rebase fixed.. |
|
@blueorangutan package |
|
@DaanHoogland a [SL] Jenkins job has been kicked to build packages. It will be bundled with KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress. |
|
Packaging result [SF]: ✔️ el8 ✔️ el9 ✔️ el10 ✔️ debian ✔️ suse15. SL-JID 18691 |
|
[SF] Trillian test result (tid-16648)
|
There was a problem hiding this comment.
Pull request overview
This PR aims to make KVM agent “private/management” IP selection deterministic when the configured management NIC has no IP (e.g., IP is on a bridge member/veth), preventing the agent from reporting an incorrect private IP to management servers.
Changes:
- Pass additional agent.properties values into KVM resource configuration (management server host list and an optional explicit private IP).
- Add two new private-NIC discovery strategies in
ServerResourceBase: explicit private IP mapping to a NIC, and route-based source-IP discovery via UDP socket. - Introduce a new agent property
private.network.addressto optionally pin the management/private IP.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 5 comments.
| File | Description |
|---|---|
| plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java | Adds agent.properties-derived config values into the resource params map used by base configuration. |
| core/src/main/java/com/cloud/resource/ServerResourceBase.java | Adds explicit-IP and route-lookup based private NIC discovery before the existing iteration fallback. |
| agent/src/main/java/com/cloud/agent/properties/AgentProperties.java | Adds a new agent property definition for explicitly setting the private NIC IP address. |
Suppressed comments (2)
core/src/main/java/com/cloud/resource/ServerResourceBase.java:182
- Avoid catching Throwable here; it can hide serious JVM errors and drops the stack trace. Catch Exception and pass the throwable to the logger so failures in route lookup can be diagnosed.
} catch (Throwable e) {
// Logging only, if this method was unable to find a valid interface, iteration will be tested
logger.debug(String.format("Unable to use routing table to determine private management interface: [%s]", e.getMessage()));
}
core/src/main/java/com/cloud/resource/ServerResourceBase.java:87
- New private-NIC resolution behaviors (private.network.address override and route-lookup discovery) are introduced here but there are no accompanying unit tests (ServerResourceBaseTest currently covers only defineResourceNetworkInterfaces/isValidNic/iteration-based discovery). Adding tests for: (1) selecting NIC by configured IP; (2) falling back to route lookup when the configured NIC has no usable address; and (3) falling back to simple iteration when route lookup fails, would help prevent regressions.
if (privateNic == null) {
checkForPrivateInterfaceDefinedByIp(params);
}
if (privateNic == null) {
tryToAutoDiscoverResourcePrivateNetworkInterfaceByRouteLookup(params);
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| defineResourceNetworkInterfaces(params); | ||
|
|
||
| if (privateNic == null) { | ||
| checkForPrivateInterfaceDefinedByIp(params); | ||
| } | ||
| if (privateNic == null) { | ||
| tryToAutoDiscoverResourcePrivateNetworkInterfaceByRouteLookup(params); | ||
| } | ||
| if (privateNic == null) { | ||
| tryToAutoDiscoverResourcePrivateNetworkInterface(); | ||
| } |
| final String ifAddr = (String) params.get("private.network.address"); | ||
| if (ifAddr != null) { | ||
| logger.debug(String.format("Trying to use private address to resolve interface: [%s]", ifAddr)); |
| } else { | ||
| logger.info(String.format("Unable to found private NIC with defined ip [%s]", ifAddr)); | ||
| } | ||
| } catch (Throwable e) { | ||
| // Logging only, if this method was unable to find a valid interface, iteration will be tested | ||
| logger.info(String.format("Unable to use private address to get the management interface: [%s]", e.getMessage())); | ||
| } |
| * Private NIC device address. If this property is commented, it will be autodetected on service startup.<br> | ||
| * Data type: String.<br> | ||
| * Default value: <code>cloudbr1</code> |
| params.put(AgentProperties.HOST.getName(), AgentPropertiesFileHandler.getPropertyValue(AgentProperties.HOST)); | ||
| params.put(AgentProperties.PRIVATE_NETWORK_DEVICE_ADDRESS.getName(), AgentPropertiesFileHandler.getPropertyValue(AgentProperties.PRIVATE_NETWORK_DEVICE_ADDRESS)); |
Description
This PR solves a situation when the management network interface does not have a defined IP address.
When this interface is a bridge, the management ip can be placed directly in the bridge (more common) and sometimes in virtual interfaces linked to it.
On this scenarios, the cloudstack agent iterates over all interfaces and select the first one with a valid ip address.
This brings unpredictable behavior, like choosing wrong interface address, and publishing this address to management servers, causing problems with migrations, guest consoles for example.
I've added two new ways to search for the correct management address:
If the above methods don't work, the actual behavior is used without changes.
Fixes: #13519
Types of changes
Feature/Enhancement Scale or Bug Severity
Feature/Enhancement Scale
Bug Severity
Screenshots (if appropriate):
How Has This Been Tested?
I have two hipervisors in production with this changes. Whitout it, I can't make my cluster to work well, cause I can't do migrations and open guest instances terminal
To test it I used both the explicit configuration and route based detection for several days, marking servers for maintenance, rebooting hypervisors and management servers.
How did you try to break this feature and the system with this change?
Configuring an invalid Ip address as management address. The setting was ignored as expected, because no interface was found with it. System fallback to another methods.