Skip to content

Commit c4b5fb4

Browse files
committed
add transit IPs to NIC create
1 parent 61ad056 commit c4b5fb4

File tree

12 files changed

+51
-0
lines changed

12 files changed

+51
-0
lines changed

nexus/db-model/src/network_interface.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,7 @@ pub struct IncompleteNetworkInterface {
321321
pub ip: Option<std::net::IpAddr>,
322322
pub mac: Option<external::MacAddr>,
323323
pub slot: Option<u8>,
324+
pub transit_ips: Vec<IpNetwork>,
324325
}
325326

326327
impl IncompleteNetworkInterface {
@@ -334,6 +335,7 @@ impl IncompleteNetworkInterface {
334335
ip: Option<std::net::IpAddr>,
335336
mac: Option<external::MacAddr>,
336337
slot: Option<u8>,
338+
transit_ips: Vec<IpNetwork>,
337339
) -> Result<Self, external::Error> {
338340
if let Some(ip) = ip {
339341
subnet.check_requestable_addr(ip)?;
@@ -380,6 +382,7 @@ impl IncompleteNetworkInterface {
380382
ip,
381383
mac,
382384
slot,
385+
transit_ips,
383386
})
384387
}
385388

@@ -389,6 +392,7 @@ impl IncompleteNetworkInterface {
389392
subnet: VpcSubnet,
390393
identity: external::IdentityMetadataCreateParams,
391394
ip: Option<std::net::IpAddr>,
395+
transit_ips: Vec<IpNetwork>,
392396
) -> Result<Self, external::Error> {
393397
Self::new(
394398
interface_id,
@@ -399,6 +403,7 @@ impl IncompleteNetworkInterface {
399403
ip,
400404
None,
401405
None,
406+
transit_ips,
402407
)
403408
}
404409

@@ -420,6 +425,7 @@ impl IncompleteNetworkInterface {
420425
Some(ip),
421426
Some(mac),
422427
Some(slot),
428+
vec![], // Service interfaces don't use transit_ips
423429
)
424430
}
425431

@@ -440,6 +446,7 @@ impl IncompleteNetworkInterface {
440446
ip,
441447
mac,
442448
None,
449+
vec![], // Probe interfaces don't use transit_ips
443450
)
444451
}
445452
}

nexus/db-queries/src/db/datastore/vpc.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4018,6 +4018,7 @@ mod tests {
40184018
description: "A NIC...".into(),
40194019
},
40204020
None,
4021+
vec![],
40214022
)
40224023
.unwrap(),
40234024
)

nexus/db-queries/src/db/queries/network_interface.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1204,8 +1204,19 @@ impl QueryFragment<Pg> for InsertQuery {
12041204
} else {
12051205
select_from_cte(out.reborrow(), dsl::slot::NAME)?;
12061206
}
1207+
out.push_sql(" AS ");
1208+
out.push_identifier(dsl::slot::NAME)?;
12071209
out.push_sql(", ");
1210+
12081211
select_from_cte(out.reborrow(), dsl::is_primary::NAME)?;
1212+
out.push_sql(", ");
1213+
1214+
// Add transit_ips field
1215+
out.push_bind_param::<sql_types::Array<sql_types::Inet>, Vec<IpNetwork>>(
1216+
&self.interface.transit_ips,
1217+
)?;
1218+
out.push_sql(" AS ");
1219+
out.push_identifier(dsl::transit_ips::NAME)?;
12091220

12101221
Ok(())
12111222
}

nexus/src/app/network_interface.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ impl super::Nexus {
9393
db_subnet,
9494
params.identity.clone(),
9595
params.ip,
96+
params.transit_ips.iter().map(|ip| (*ip).into()).collect(),
9697
)?;
9798
self.db_datastore
9899
.instance_create_network_interface(

nexus/src/app/sagas/instance_create.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,7 @@ async fn create_custom_network_interface(
610610
db_subnet.clone(),
611611
interface_params.identity.clone(),
612612
interface_params.ip,
613+
interface_params.transit_ips.iter().map(|ip| (*ip).into()).collect(),
613614
)
614615
.map_err(ActionError::action_failed)?;
615616
datastore
@@ -682,6 +683,7 @@ async fn create_default_primary_network_interface(
682683
vpc_name: default_name.clone(),
683684
subnet_name: default_name.clone(),
684685
ip: None, // Request an IP address allocation
686+
transit_ips: vec![], // Default interfaces don't use transit IPs
685687
};
686688

687689
// Lookup authz objects, used in the call to actually create the NIC.
@@ -704,6 +706,7 @@ async fn create_default_primary_network_interface(
704706
db_subnet.clone(),
705707
interface_params.identity.clone(),
706708
interface_params.ip,
709+
interface_params.transit_ips.iter().map(|ip| (*ip).into()).collect(),
707710
)
708711
.map_err(ActionError::action_failed)?;
709712
datastore

nexus/tests/integration_tests/endpoints.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,7 @@ pub static DEMO_INSTANCE_NIC_CREATE: LazyLock<
709709
vpc_name: DEMO_VPC_NAME.clone(),
710710
subnet_name: DEMO_VPC_SUBNET_NAME.clone(),
711711
ip: None,
712+
transit_ips: vec![],
712713
});
713714
pub static DEMO_INSTANCE_NIC_PUT: LazyLock<
714715
params::InstanceNetworkInterfaceUpdate,

nexus/tests/integration_tests/instances.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2244,6 +2244,7 @@ async fn test_instance_create_saga_removes_instance_database_record(
22442244
vpc_name: default_name.clone(),
22452245
subnet_name: default_name.clone(),
22462246
ip: Some(requested_address),
2247+
transit_ips: vec![],
22472248
};
22482249
let interface_params =
22492250
params::InstanceNetworkInterfaceAttachment::Create(vec![
@@ -2325,6 +2326,7 @@ async fn test_instance_create_saga_removes_instance_database_record(
23252326
vpc_name: default_name.clone(),
23262327
subnet_name: default_name.clone(),
23272328
ip: Some(requested_address),
2329+
transit_ips: vec![],
23282330
};
23292331
let interface_params =
23302332
params::InstanceNetworkInterfaceAttachment::Create(vec![
@@ -2367,6 +2369,7 @@ async fn test_instance_with_single_explicit_ip_address(
23672369
vpc_name: default_name.clone(),
23682370
subnet_name: default_name.clone(),
23692371
ip: Some(requested_address),
2372+
transit_ips: vec![],
23702373
};
23712374
let interface_params =
23722375
params::InstanceNetworkInterfaceAttachment::Create(vec![
@@ -2476,6 +2479,7 @@ async fn test_instance_with_new_custom_network_interfaces(
24762479
vpc_name: default_name.clone(),
24772480
subnet_name: default_name.clone(),
24782481
ip: None,
2482+
transit_ips: vec![],
24792483
};
24802484
let if1_params = params::InstanceNetworkInterfaceCreate {
24812485
identity: IdentityMetadataCreateParams {
@@ -2485,6 +2489,7 @@ async fn test_instance_with_new_custom_network_interfaces(
24852489
vpc_name: default_name.clone(),
24862490
subnet_name: non_default_subnet_name.clone(),
24872491
ip: None,
2492+
transit_ips: vec![],
24882493
};
24892494
let interface_params =
24902495
params::InstanceNetworkInterfaceAttachment::Create(vec![
@@ -2665,6 +2670,7 @@ async fn test_instance_create_delete_network_interface(
26652670
vpc_name: "default".parse().unwrap(),
26662671
subnet_name: "default".parse().unwrap(),
26672672
ip: Some("172.30.0.10".parse().unwrap()),
2673+
transit_ips: vec![],
26682674
},
26692675
params::InstanceNetworkInterfaceCreate {
26702676
identity: IdentityMetadataCreateParams {
@@ -2674,6 +2680,7 @@ async fn test_instance_create_delete_network_interface(
26742680
vpc_name: "default".parse().unwrap(),
26752681
subnet_name: secondary_subnet.identity.name.clone(),
26762682
ip: Some("172.31.0.11".parse().unwrap()),
2683+
transit_ips: vec![],
26772684
},
26782685
];
26792686

@@ -2901,6 +2908,7 @@ async fn test_instance_update_network_interfaces(
29012908
vpc_name: "default".parse().unwrap(),
29022909
subnet_name: "default".parse().unwrap(),
29032910
ip: Some("172.30.0.10".parse().unwrap()),
2911+
transit_ips: vec![],
29042912
},
29052913
params::InstanceNetworkInterfaceCreate {
29062914
identity: IdentityMetadataCreateParams {
@@ -2910,6 +2918,7 @@ async fn test_instance_update_network_interfaces(
29102918
vpc_name: "default".parse().unwrap(),
29112919
subnet_name: secondary_subnet.identity.name.clone(),
29122920
ip: Some("172.31.0.11".parse().unwrap()),
2921+
transit_ips: vec![],
29132922
},
29142923
];
29152924

@@ -3472,6 +3481,7 @@ async fn test_instance_with_multiple_nics_unwinds_completely(
34723481
vpc_name: default_name.clone(),
34733482
subnet_name: default_name.clone(),
34743483
ip: Some("172.30.0.6".parse().unwrap()),
3484+
transit_ips: vec![],
34753485
};
34763486
let if1_params = params::InstanceNetworkInterfaceCreate {
34773487
identity: IdentityMetadataCreateParams {
@@ -3481,6 +3491,7 @@ async fn test_instance_with_multiple_nics_unwinds_completely(
34813491
vpc_name: default_name.clone(),
34823492
subnet_name: default_name.clone(),
34833493
ip: Some("172.30.0.7".parse().unwrap()),
3494+
transit_ips: vec![],
34843495
};
34853496
let interface_params =
34863497
params::InstanceNetworkInterfaceAttachment::Create(vec![

nexus/tests/integration_tests/internet_gateway.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,7 @@ async fn test_setup(c: &ClientTestContext) {
373373
ip: None,
374374
subnet_name: "default".parse().unwrap(),
375375
vpc_name: VPC_NAME.parse().unwrap(),
376+
transit_ips: vec![],
376377
},
377378
]);
378379
let _inst = create_instance_with(

nexus/tests/integration_tests/subnet_allocation.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ async fn create_instance_expect_failure(
4747
vpc_name: "default".parse().unwrap(),
4848
subnet_name: subnet_name.parse().unwrap(),
4949
ip: None,
50+
transit_ips: vec![],
5051
},
5152
]);
5253
let new_instance = params::InstanceCreate {
@@ -134,6 +135,7 @@ async fn test_subnet_allocation(cptestctx: &ControlPlaneTestContext) {
134135
vpc_name: "default".parse().unwrap(),
135136
subnet_name: SUBNET_NAME.parse().unwrap(),
136137
ip: None,
138+
transit_ips: vec![],
137139
},
138140
]);
139141

nexus/tests/integration_tests/vpc_routers.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,7 @@ async fn test_vpc_routers_custom_delivered_to_instance(
510510
vpc_name: vpc.name().clone(),
511511
subnet_name: subnet_name.parse().unwrap(),
512512
ip: Some(format!("192.168.{i}.10").parse().unwrap()),
513+
transit_ips: vec![],
513514
},
514515
]),
515516
vec![],

0 commit comments

Comments
 (0)