Skip to content

Commit 9f31e37

Browse files
authored
Omicron services need more unique ids (#2922)
1 parent a371c6a commit 9f31e37

File tree

17 files changed

+220
-79
lines changed

17 files changed

+220
-79
lines changed

common/src/sql/dbinit.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ CREATE TABLE omicron.public.service (
168168

169169
/* FK into the Sled table */
170170
sled_id UUID NOT NULL,
171+
/* For services in illumos zones, the zone's unique id (for debugging) */
172+
zone_id UUID,
171173
/* The IP address of the service. */
172174
ip INET NOT NULL,
173175
/* The UDP or TCP port on which the service listens. */

nexus/db-model/src/schema.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,7 @@ table! {
488488
time_modified -> Timestamptz,
489489

490490
sled_id -> Uuid,
491+
zone_id -> Nullable<Uuid>,
491492
ip -> Inet,
492493
port -> Int4,
493494
kind -> crate::ServiceKindEnum,

nexus/db-model/src/service.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ pub struct Service {
1818
identity: ServiceIdentity,
1919

2020
pub sled_id: Uuid,
21+
pub zone_id: Option<Uuid>,
2122
pub ip: ipv6::Ipv6Addr,
2223
pub port: SqlU16,
2324
pub kind: ServiceKind,
@@ -27,12 +28,14 @@ impl Service {
2728
pub fn new(
2829
id: Uuid,
2930
sled_id: Uuid,
31+
zone_id: Option<Uuid>,
3032
addr: SocketAddrV6,
3133
kind: ServiceKind,
3234
) -> Self {
3335
Self {
3436
identity: ServiceIdentity::new(id),
3537
sled_id,
38+
zone_id,
3639
ip: addr.ip().into(),
3740
port: addr.port().into(),
3841
kind,

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,7 +1099,8 @@ mod test {
10991099
let addr = SocketAddrV6::new(Ipv6Addr::LOCALHOST, 123, 0, 0);
11001100
let kind = ServiceKind::Nexus;
11011101

1102-
let service1 = Service::new(service1_id, sled_id, addr, kind);
1102+
let service1 =
1103+
Service::new(service1_id, sled_id, Some(service1_id), addr, kind);
11031104
let result =
11041105
datastore.service_upsert(&opctx, service1.clone()).await.unwrap();
11051106
assert_eq!(service1.id(), result.id());
@@ -1108,7 +1109,7 @@ mod test {
11081109

11091110
let service2_id =
11101111
"fe5b6e3d-dfee-47b4-8719-c54f78912c0b".parse().unwrap();
1111-
let service2 = Service::new(service2_id, sled_id, addr, kind);
1112+
let service2 = Service::new(service2_id, sled_id, None, addr, kind);
11121113
let result =
11131114
datastore.service_upsert(&opctx, service2.clone()).await.unwrap();
11141115
assert_eq!(service2.id(), result.id());
@@ -1117,7 +1118,13 @@ mod test {
11171118

11181119
let service3_id = Uuid::new_v4();
11191120
let kind = ServiceKind::Oximeter;
1120-
let service3 = Service::new(service3_id, sled_id, addr, kind);
1121+
let service3 = Service::new(
1122+
service3_id,
1123+
sled_id,
1124+
Some(Uuid::new_v4()),
1125+
addr,
1126+
kind,
1127+
);
11211128
let result =
11221129
datastore.service_upsert(&opctx, service3.clone()).await.unwrap();
11231130
assert_eq!(service3.id(), result.id());
@@ -1139,9 +1146,11 @@ mod test {
11391146
.unwrap();
11401147
assert_eq!(services[0].id(), service1.id());
11411148
assert_eq!(services[0].sled_id, service1.sled_id);
1149+
assert_eq!(services[0].zone_id, service1.zone_id);
11421150
assert_eq!(services[0].kind, service1.kind);
11431151
assert_eq!(services[1].id(), service2.id());
11441152
assert_eq!(services[1].sled_id, service2.sled_id);
1153+
assert_eq!(services[1].zone_id, service2.zone_id);
11451154
assert_eq!(services[1].kind, service2.kind);
11461155
assert_eq!(services.len(), 2);
11471156

@@ -1160,6 +1169,7 @@ mod test {
11601169
.unwrap();
11611170
assert_eq!(services[0].id(), service3.id());
11621171
assert_eq!(services[0].sled_id, service3.sled_id);
1172+
assert_eq!(services[0].zone_id, service3.zone_id);
11631173
assert_eq!(services[0].kind, service3.kind);
11641174
assert_eq!(services.len(), 1);
11651175

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

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ impl DataStore {
175175
let service_db = db::model::Service::new(
176176
service.service_id,
177177
service.sled_id,
178+
service.zone_id,
178179
service.address,
179180
service.kind.into(),
180181
);
@@ -624,9 +625,11 @@ mod test {
624625
let sled = create_test_sled(&datastore).await;
625626

626627
let nexus_ip = IpAddr::V4(Ipv4Addr::new(1, 2, 3, 4));
628+
let nexus_id = Uuid::new_v4();
627629
let services = vec![internal_params::ServicePutRequest {
628-
service_id: Uuid::new_v4(),
630+
service_id: nexus_id,
629631
sled_id: sled.id(),
632+
zone_id: Some(nexus_id),
630633
address: SocketAddrV6::new(Ipv6Addr::LOCALHOST, 123, 0, 0),
631634
kind: internal_params::ServiceKind::Nexus {
632635
external_address: nexus_ip,
@@ -718,18 +721,22 @@ mod test {
718721
// Ask for two Nexus services, with different external IPs.
719722
let nexus_ip_start = Ipv4Addr::new(1, 2, 3, 4);
720723
let nexus_ip_end = Ipv4Addr::new(1, 2, 3, 5);
724+
let nexus_id1 = Uuid::new_v4();
725+
let nexus_id2 = Uuid::new_v4();
721726
let mut services = vec![
722727
internal_params::ServicePutRequest {
723-
service_id: Uuid::new_v4(),
728+
service_id: nexus_id1,
724729
sled_id: sled.id(),
730+
zone_id: Some(nexus_id1),
725731
address: SocketAddrV6::new(Ipv6Addr::LOCALHOST, 123, 0, 0),
726732
kind: internal_params::ServiceKind::Nexus {
727733
external_address: IpAddr::V4(nexus_ip_start),
728734
},
729735
},
730736
internal_params::ServicePutRequest {
731-
service_id: Uuid::new_v4(),
737+
service_id: nexus_id2,
732738
sled_id: sled.id(),
739+
zone_id: Some(nexus_id2),
733740
address: SocketAddrV6::new(Ipv6Addr::LOCALHOST, 456, 0, 0),
734741
kind: internal_params::ServiceKind::Nexus {
735742
external_address: IpAddr::V4(nexus_ip_end),
@@ -904,9 +911,11 @@ mod test {
904911
let sled = create_test_sled(&datastore).await;
905912

906913
let nexus_ip = IpAddr::V4(Ipv4Addr::new(1, 2, 3, 4));
914+
let nexus_id = Uuid::new_v4();
907915
let services = vec![internal_params::ServicePutRequest {
908-
service_id: Uuid::new_v4(),
916+
service_id: nexus_id,
909917
sled_id: sled.id(),
918+
zone_id: Some(nexus_id),
910919
address: SocketAddrV6::new(Ipv6Addr::LOCALHOST, 123, 0, 0),
911920
kind: internal_params::ServiceKind::Nexus {
912921
external_address: nexus_ip,
@@ -957,19 +966,23 @@ mod test {
957966

958967
// Request two services which happen to be using the same IP address.
959968
let nexus_ip = IpAddr::V4(Ipv4Addr::new(1, 2, 3, 4));
969+
let nexus_id1 = Uuid::new_v4();
970+
let nexus_id2 = Uuid::new_v4();
960971

961972
let services = vec![
962973
internal_params::ServicePutRequest {
963-
service_id: Uuid::new_v4(),
974+
service_id: nexus_id1,
964975
sled_id: sled.id(),
976+
zone_id: Some(nexus_id1),
965977
address: SocketAddrV6::new(Ipv6Addr::LOCALHOST, 123, 0, 0),
966978
kind: internal_params::ServiceKind::Nexus {
967979
external_address: nexus_ip,
968980
},
969981
},
970982
internal_params::ServicePutRequest {
971-
service_id: Uuid::new_v4(),
983+
service_id: nexus_id2,
972984
sled_id: sled.id(),
985+
zone_id: Some(nexus_id2),
973986
address: SocketAddrV6::new(Ipv6Addr::LOCALHOST, 123, 0, 0),
974987
kind: internal_params::ServiceKind::Nexus {
975988
external_address: nexus_ip,

nexus/src/app/background/dns_servers.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ mod test {
233233
.values(Service::new(
234234
Uuid::new_v4(),
235235
Uuid::new_v4(),
236+
Some(Uuid::new_v4()),
236237
SocketAddrV6::new(Ipv6Addr::LOCALHOST, 1, 0, 0),
237238
ServiceKind::InternalDnsConfig,
238239
))
@@ -255,6 +256,7 @@ mod test {
255256
Service::new(
256257
Uuid::new_v4(),
257258
Uuid::new_v4(),
259+
Some(Uuid::new_v4()),
258260
SocketAddrV6::new(Ipv6Addr::LOCALHOST, i + 2, 0, 0),
259261
ServiceKind::InternalDnsConfig,
260262
)

nexus/src/app/background/init.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ pub mod test {
238238
&opctx,
239239
Uuid::new_v4(),
240240
cptestctx.sled_agent.sled_agent.id,
241+
Some(Uuid::new_v4()),
241242
new_dns_addr,
242243
ServiceKind::InternalDnsConfig.into(),
243244
)

nexus/src/app/sled.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ impl super::Nexus {
260260
opctx: &OpContext,
261261
id: Uuid,
262262
sled_id: Uuid,
263+
zone_id: Option<Uuid>,
263264
address: SocketAddrV6,
264265
kind: ServiceKind,
265266
) -> Result<(), Error> {
@@ -270,7 +271,8 @@ impl super::Nexus {
270271
"service_id" => id.to_string(),
271272
"address" => address.to_string(),
272273
);
273-
let service = db::model::Service::new(id, sled_id, address, kind);
274+
let service =
275+
db::model::Service::new(id, sled_id, zone_id, address, kind);
274276
self.db_datastore.service_upsert(opctx, service).await?;
275277

276278
if kind == ServiceKind::ExternalDnsConfig {

nexus/test-utils/src/lib.rs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,12 +220,28 @@ pub async fn test_setup_with_config<N: NexusServer>(
220220
SocketAddr::V4(_) => panic!("expected DNS server to have IPv6 address"),
221221
SocketAddr::V6(addr) => addr,
222222
};
223-
let dns_service_internal = ServicePutRequest {
223+
let dns_server_dns_address_internal = match sled_agent
224+
.dns_server
225+
.local_address()
226+
{
227+
SocketAddr::V4(_) => panic!("expected DNS server to have IPv6 address"),
228+
SocketAddr::V6(addr) => *addr,
229+
};
230+
let dns_server_zone = Uuid::new_v4();
231+
let dns_service_config = ServicePutRequest {
224232
service_id: Uuid::new_v4(),
225233
sled_id: sa_id,
234+
zone_id: Some(dns_server_zone),
226235
address: dns_server_address_internal,
227236
kind: ServiceKind::InternalDnsConfig,
228237
};
238+
let dns_service_dns = ServicePutRequest {
239+
service_id: Uuid::new_v4(),
240+
sled_id: sa_id,
241+
zone_id: Some(dns_server_zone),
242+
address: dns_server_dns_address_internal,
243+
kind: ServiceKind::InternalDns,
244+
};
229245
let dns_server_address_external = match external_dns_config_server
230246
.local_addr()
231247
{
@@ -235,12 +251,14 @@ pub async fn test_setup_with_config<N: NexusServer>(
235251
let dns_service_external = ServicePutRequest {
236252
service_id: Uuid::new_v4(),
237253
sled_id: sa_id,
254+
zone_id: Some(Uuid::new_v4()),
238255
address: dns_server_address_external,
239256
kind: ServiceKind::ExternalDnsConfig,
240257
};
241258
let nexus_service = ServicePutRequest {
242259
service_id: Uuid::new_v4(),
243260
sled_id: sa_id,
261+
zone_id: Some(Uuid::new_v4()),
244262
address: SocketAddrV6::new(
245263
match nexus_internal_addr.ip() {
246264
IpAddr::V4(addr) => addr.to_ipv6_mapped(),
@@ -260,10 +278,16 @@ pub async fn test_setup_with_config<N: NexusServer>(
260278
};
261279
let external_dns_zone_name =
262280
internal_dns::names::DNS_ZONE_EXTERNAL_TESTING.to_string();
281+
263282
let server = N::start(
264283
nexus_internal,
265284
&config,
266-
vec![dns_service_internal, dns_service_external, nexus_service],
285+
vec![
286+
dns_service_config,
287+
dns_service_dns,
288+
dns_service_external,
289+
nexus_service,
290+
],
267291
&external_dns_zone_name,
268292
)
269293
.await;

nexus/types/src/internal_api/params.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ impl fmt::Display for ServiceKind {
197197
pub struct ServicePutRequest {
198198
pub service_id: Uuid,
199199
pub sled_id: Uuid,
200+
pub zone_id: Option<Uuid>,
200201

201202
/// Address on which a service is responding to requests.
202203
pub address: SocketAddrV6,

0 commit comments

Comments
 (0)