Fix VPC restart with multi-CIDR networks: handle comma-separated CIDR…#12622
Fix VPC restart with multi-CIDR networks: handle comma-separated CIDR…#12622jeanvetorello wants to merge 3 commits intoapache:4.22from
Conversation
|
@blueorangutan package |
|
@blueorangutan package |
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## 4.22 #12622 +/- ##
============================================
+ Coverage 17.61% 17.92% +0.31%
- Complexity 15664 16179 +515
============================================
Files 5917 5949 +32
Lines 531402 534064 +2662
Branches 64971 65303 +332
============================================
+ Hits 93596 95751 +2155
- Misses 427252 427555 +303
- Partials 10554 10758 +204
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
|
@blueorangutan package |
There was a problem hiding this comment.
Pull request overview
Fixes VPC restart failures for multi-CIDR networks by ensuring NetworkVO.equals() does not pass a raw comma-separated CIDR list into NetUtils.isNetworkAWithinNetworkB(), which expects a single CIDR.
Changes:
- Normalize
cidrvalues inNetworkVO.equals()by extracting the first CIDR from comma-separated strings before comparing.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| return NetUtils.isNetworkAWithinNetworkB( | ||
| com.cloud.utils.StringUtils.getFirstValueFromCommaSeparatedString(cidr), | ||
| com.cloud.utils.StringUtils.getFirstValueFromCommaSeparatedString(that.cidr)); |
There was a problem hiding this comment.
equals is using NetUtils.isNetworkAWithinNetworkB(...), which is not symmetric (A within B does not imply B within A). That means NetworkVO.equals can violate the Java equals contract, and it is also inconsistent with hashCode() (which is based only on id). Consider switching equals/hashCode to be id-based like other VOs, or (if CIDR-based equality is truly intended) make the comparison symmetric and update hashCode accordingly (e.g., based on the same normalized CIDR(s) and trafficType).
engine/schema/src/main/java/com/cloud/network/dao/NetworkVO.java
Outdated
Show resolved
Hide resolved
|
@blueorangutan package |
|
@DaanHoogland a [SL] Jenkins job has been kicked to build packages. It will be bundled with no SystemVM templates. I'll keep you posted as I make progress. |
|
Packaging result [SF]: ✔️ el8 ✔️ el9 ✔️ el10 ✖️ debian ✔️ suse15. SL-JID 16776 |
|
as we discussed in the comments of #12621, we need to work on another solution can you work on the fix ? cc @jeanvetorello @sureshanaparti |
|
@jeanvetorello can you rebase this PR with 4.22 branch, and address the outstanding comments. |
… in NetworkVO.equals() When a network has multiple CIDRs (e.g. '192.168.2.0/24,160.0.0.0/24'), NetworkVO.equals() passes the raw comma-separated string to NetUtils.isNetworkAWithinNetworkB() which expects a single CIDR, causing 'cidr is not formatted correctly' error during VPC restart with cleanup=true. Extract only the first CIDR value before passing to NetUtils.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…works addCidrAndGatewayForIpv4/Ipv6 (introduced by PR apache#11249) was called for all network types without checking if the network is Public. This caused comma-separated CIDRs to be stored on Public networks, which then triggered 'cidr is not formatted correctly' errors during VPC restart. Add TrafficType.Public guard in both the VLAN creation (addCidr) and VLAN deletion (removeCidr) paths in ConfigurationManagerImpl.
5e43fac to
c9e7a8b
Compare
|
@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 ✖️ debian ✖️ suse15. SL-JID 17078 |
| } | ||
|
|
||
| return NetUtils.isNetworkAWithinNetworkB(cidr, that.cidr); | ||
| final String normalizedCidr = com.cloud.utils.StringUtils.getFirstValueFromCommaSeparatedString(cidr); |
There was a problem hiding this comment.
these changes should be reverted, I think ?
#12621
… in NetworkVO.equals()
When a network has multiple CIDRs (e.g. '192.168.2.0/24,160.0.0.0/24'), NetworkVO.equals() passes the raw comma-separated string to NetUtils.isNetworkAWithinNetworkB() which expects a single CIDR, causing 'cidr is not formatted correctly' error during VPC restart with cleanup=true.
Extract only the first CIDR value before passing to NetUtils.
Description
This PR...
Types of changes
Bug fix (non-breaking change which fixes an issue)
Bug Severity
Screenshots (if appropriate):
How Has This Been Tested?
on different VLANs assigned to the same VPC
How did you try to break this feature and the system with this change?