Skip to content

Commit eadaa75

Browse files
committed
MGMT-21985: Enable primary IPv6 clusters
1 parent 9d60bef commit eadaa75

File tree

2 files changed

+28
-56
lines changed

2 files changed

+28
-56
lines changed

src/ocp_postprocess/ip_rename.rs

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,18 @@ async fn fix_dir_resources(original_ip: &str, ip: &str, dir: &Path) -> Result<()
7373
}
7474

7575
async fn fix_dir_resources_dual_stack(original_ips: &[String], ips: &[String], dir: &Path) -> Result<()> {
76-
// Apply IPv4 replacement (original IPv4 → new IPv4)
77-
filesystem_rename::fix_filesystem_ip(&original_ips[0], &ips[0], dir)
78-
.await
79-
.context(format!("fix filesystem IPv4 in {:?}", dir))?;
76+
ensure!(
77+
original_ips.len() == ips.len(),
78+
"original IPs count ({}) must equal new IPs count ({})",
79+
original_ips.len(),
80+
ips.len()
81+
);
8082

81-
// Apply IPv6 replacement (original IPv6 → new IPv6) - both are guaranteed to be present
82-
filesystem_rename::fix_filesystem_ip(&original_ips[1], &ips[1], dir)
83-
.await
84-
.context(format!("fix filesystem IPv6 in {:?}", dir))?;
83+
for (idx, (original_ip, new_ip)) in original_ips.iter().zip(ips.iter()).enumerate() {
84+
filesystem_rename::fix_filesystem_ip(original_ip, new_ip, dir)
85+
.await
86+
.context(format!("fix filesystem IP replacement pair {} in {:?}", idx, dir))?;
87+
}
8588

8689
Ok(())
8790
}
@@ -181,31 +184,22 @@ async fn extract_original_dual_stack_ips(etcd_client: &Arc<InMemoryK8sEtcd>) ->
181184
}
182185

183186
async fn fix_etcd_resources_dual_stack(etcd_client: &Arc<InMemoryK8sEtcd>, original_ips: &[String], new_ips: &[String]) -> Result<()> {
184-
let original_ipv4 = &original_ips[0];
185-
let original_ipv6 = &original_ips[1];
186-
187-
let new_ipv4 = &new_ips[0];
188-
let new_ipv6 = new_ips.get(1).context("Second IP (IPv6) is required for dual-stack processing")?;
189-
190-
log::info!(
191-
"Applying dual-stack IP changes - IPv4: {} → {}, IPv6: {} → {}",
192-
original_ipv4,
193-
new_ipv4,
194-
original_ipv6,
195-
new_ipv6
187+
ensure!(!original_ips.is_empty(), "at least one original IP is required");
188+
ensure!(
189+
original_ips.len() == new_ips.len(),
190+
"original IPs count ({}) must equal new IPs count ({})",
191+
original_ips.len(),
192+
new_ips.len()
196193
);
197194

198-
log::info!("Applying IPv4 replacements: {} → {}", original_ipv4, new_ipv4);
195+
log::info!("Applying dual-stack IP changes");
199196

200-
fix_etcd_resources_for_ip_pair(etcd_client, original_ipv4, new_ipv4)
201-
.await
202-
.context("applying IPv4 etcd resource fixes")?;
203-
204-
log::info!("Applying IPv6 replacements: {} → {}", original_ipv6, new_ipv6);
205-
206-
fix_etcd_resources_for_ip_pair(etcd_client, original_ipv6, new_ipv6)
207-
.await
208-
.context("applying IPv6 etcd resource fixes")?;
197+
for (idx, (original_ip, new_ip)) in original_ips.iter().zip(new_ips.iter()).enumerate() {
198+
log::info!("Applying replacements pair {}: {} → {}", idx, original_ip, new_ip);
199+
fix_etcd_resources_for_ip_pair(etcd_client, original_ip, new_ip)
200+
.await
201+
.context(format!("applying etcd resource fixes for pair {}", idx))?;
202+
}
209203

210204
Ok(())
211205
}

src/ocp_postprocess/ip_rename/etcd_rename.rs

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,9 @@ use crate::{
66
use anyhow::{bail, ensure, Context, Result};
77
use futures_util::future::join_all;
88
use serde_json::Value;
9-
use std::net::{IpAddr, Ipv6Addr};
9+
use std::net::Ipv6Addr;
1010
use std::sync::Arc;
1111

12-
fn is_ipv6(ip: &str) -> Result<bool> {
13-
let addr = ip
14-
.parse::<IpAddr>()
15-
.with_context(|| format!("Failed to parse IP address: {}", ip))?;
16-
Ok(addr.is_ipv6())
17-
}
18-
1912
// Extract both original IPv4 and IPv6 IPs from dual-stack cluster node configuration
2013
pub(crate) async fn extract_original_ips(etcd_client: &Arc<InMemoryK8sEtcd>) -> Result<Vec<String>> {
2114
// Extract IPs from node addresses - works for both single-stack and dual-stack
@@ -43,40 +36,25 @@ async fn extract_original_ips_from_nodes(etcd_client: &Arc<InMemoryK8sEtcd>) ->
4336
.and_then(|a| a.as_array())
4437
.context("Node does not have /status/addresses array")?;
4538

46-
let mut original_ipv4: Option<String> = None;
47-
let mut original_ipv6: Option<String> = None;
39+
let mut result = Vec::new();
4840

4941
for address in addresses {
5042
if let (Some(addr_type), Some(addr_value)) = (
5143
address.pointer("/type").and_then(|t| t.as_str()),
5244
address.pointer("/address").and_then(|a| a.as_str()),
5345
) {
5446
if addr_type == "InternalIP" {
55-
if is_ipv6(addr_value)? {
56-
original_ipv6 = Some(addr_value.to_string());
57-
} else {
58-
original_ipv4 = Some(addr_value.to_string());
59-
}
47+
result.push(addr_value.to_string());
6048
}
6149
}
6250
}
6351

64-
let mut result = Vec::new();
65-
66-
if let Some(ipv4) = original_ipv4 {
67-
result.push(ipv4);
68-
}
69-
70-
if let Some(ipv6) = original_ipv6 {
71-
result.push(ipv6);
72-
}
73-
7452
ensure!(!result.is_empty(), "No InternalIP addresses found in node configuration");
7553

7654
if result.len() == 1 {
7755
log::info!("Found single-stack IP: {}", result[0]);
7856
} else {
79-
log::info!("Found dual-stack IPs - IPv4: {}, IPv6: {}", result[0], result[1]);
57+
log::info!("Found {} InternalIP(s) {}", result.len(), result.join(", "));
8058
}
8159

8260
Ok(result)

0 commit comments

Comments
 (0)