diff --git a/Cargo.lock b/Cargo.lock index 8716fb9ece..e936e9b545 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2324,6 +2324,7 @@ dependencies = [ "hickory-resolver", "hickory-server", "http 1.1.0", + "internal-dns-types", "omicron-test-utils", "omicron-workspace-hack", "openapi-lint", @@ -2351,6 +2352,7 @@ version = "0.1.0" dependencies = [ "chrono", "dropshot", + "internal-dns-types", "omicron-workspace-hack", "schemars", "serde", @@ -2360,10 +2362,10 @@ dependencies = [ name = "dns-service-client" version = "0.1.0" dependencies = [ - "anyhow", "chrono", "expectorate", "http 1.1.0", + "internal-dns-types", "omicron-workspace-hack", "progenitor", "reqwest 0.12.7", @@ -4392,19 +4394,34 @@ dependencies = [ ] [[package]] -name = "internal-dns" +name = "internal-dns-cli" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap", + "dropshot", + "hickory-resolver", + "internal-dns-resolver", + "internal-dns-types", + "omicron-common", + "omicron-workspace-hack", + "slog", + "tokio", +] + +[[package]] +name = "internal-dns-resolver" version = "0.1.0" dependencies = [ "anyhow", "assert_matches", - "chrono", "dns-server", "dns-service-client", "dropshot", "expectorate", "futures", "hickory-resolver", - "hyper 1.4.1", + "internal-dns-types", "omicron-common", "omicron-test-utils", "omicron-uuid-kinds", @@ -4418,22 +4435,21 @@ dependencies = [ "tempfile", "thiserror", "tokio", - "uuid", ] [[package]] -name = "internal-dns-cli" +name = "internal-dns-types" version = "0.1.0" dependencies = [ "anyhow", - "clap", - "dropshot", - "hickory-resolver", - "internal-dns", + "chrono", + "expectorate", "omicron-common", + "omicron-uuid-kinds", "omicron-workspace-hack", - "slog", - "tokio", + "schemars", + "serde", + "serde_json", ] [[package]] @@ -5472,7 +5488,8 @@ dependencies = [ "gateway-client", "hyper-rustls 0.26.0", "illumos-utils", - "internal-dns", + "internal-dns-resolver", + "internal-dns-types", "ipnetwork", "itertools 0.13.0", "macaddr", @@ -5672,10 +5689,10 @@ dependencies = [ "clickhouse-admin-types", "cockroach-admin-client", "diesel", - "dns-service-client", "futures", "httptest", - "internal-dns", + "internal-dns-resolver", + "internal-dns-types", "ipnet", "newtype-uuid", "nexus-config", @@ -5717,7 +5734,7 @@ dependencies = [ "expectorate", "gateway-client", "indexmap 2.5.0", - "internal-dns", + "internal-dns-resolver", "ipnet", "maplit", "nexus-config", @@ -5841,7 +5858,8 @@ dependencies = [ "http-body-util", "hyper 1.4.1", "illumos-utils", - "internal-dns", + "internal-dns-resolver", + "internal-dns-types", "nexus-client", "nexus-config", "nexus-db-queries", @@ -5891,13 +5909,12 @@ dependencies = [ "cookie", "derive-where", "derive_more", - "dns-service-client", "dropshot", "futures", "gateway-client", "http 1.1.0", "humantime", - "internal-dns", + "internal-dns-types", "ipnetwork", "newtype-uuid", "newtype_derive", @@ -6460,7 +6477,8 @@ dependencies = [ "assert_matches", "dropshot", "futures", - "internal-dns", + "internal-dns-resolver", + "internal-dns-types", "live-tests-macros", "nexus-client", "nexus-config", @@ -6544,7 +6562,8 @@ dependencies = [ "hyper 1.4.1", "hyper-rustls 0.26.0", "illumos-utils", - "internal-dns", + "internal-dns-resolver", + "internal-dns-types", "ipnetwork", "itertools 0.13.0", "macaddr", @@ -6663,7 +6682,8 @@ dependencies = [ "http 1.1.0", "humantime", "indicatif", - "internal-dns", + "internal-dns-resolver", + "internal-dns-types", "ipnetwork", "itertools 0.13.0", "multimap", @@ -6832,7 +6852,8 @@ dependencies = [ "hyper-staticfile", "illumos-utils", "installinator-common", - "internal-dns", + "internal-dns-resolver", + "internal-dns-types", "ipnetwork", "itertools 0.13.0", "key-manager", @@ -7406,7 +7427,8 @@ dependencies = [ "expectorate", "futures", "httpmock", - "internal-dns", + "internal-dns-resolver", + "internal-dns-types", "nexus-client", "nexus-types", "omicron-common", @@ -7534,7 +7556,8 @@ dependencies = [ "chrono", "clap", "dropshot", - "internal-dns", + "internal-dns-resolver", + "internal-dns-types", "nexus-client", "omicron-common", "omicron-test-utils", @@ -8870,11 +8893,11 @@ dependencies = [ "camino", "camino-tempfile", "clap", - "dns-service-client", "dropshot", "expectorate", "humantime", "indexmap 2.5.0", + "internal-dns-types", "nexus-client", "nexus-db-queries", "nexus-inventory", @@ -12548,7 +12571,8 @@ dependencies = [ "installinator-api", "installinator-client", "installinator-common", - "internal-dns", + "internal-dns-resolver", + "internal-dns-types", "itertools 0.13.0", "maplit", "omicron-certificates", diff --git a/Cargo.toml b/Cargo.toml index d54b00fec0..ea0a46d49c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -50,8 +50,9 @@ members = [ "installinator-api", "installinator-common", "installinator", - "internal-dns-cli", - "internal-dns", + "internal-dns/cli", + "internal-dns/resolver", + "internal-dns/types", "ipcc", "key-manager", "live-tests", @@ -173,8 +174,9 @@ default-members = [ "installinator-api", "installinator-common", "installinator", - "internal-dns-cli", - "internal-dns", + "internal-dns/cli", + "internal-dns/resolver", + "internal-dns/types", "ipcc", "key-manager", "live-tests", @@ -401,7 +403,8 @@ installinator = { path = "installinator" } installinator-api = { path = "installinator-api" } installinator-client = { path = "clients/installinator-client" } installinator-common = { path = "installinator-common" } -internal-dns = { path = "internal-dns" } +internal-dns-resolver = { path = "internal-dns/resolver" } +internal-dns-types = { path = "internal-dns/types" } ipcc = { path = "ipcc" } ipnet = "2.9" itertools = "0.13.0" diff --git a/clients/dns-service-client/Cargo.toml b/clients/dns-service-client/Cargo.toml index cdaef701bd..d6fde92315 100644 --- a/clients/dns-service-client/Cargo.toml +++ b/clients/dns-service-client/Cargo.toml @@ -8,10 +8,10 @@ license = "MPL-2.0" workspace = true [dependencies] -anyhow.workspace = true chrono.workspace = true expectorate.workspace = true http.workspace = true +internal-dns-types.workspace = true progenitor.workspace = true reqwest = { workspace = true, features = ["json", "rustls-tls", "stream"] } schemars.workspace = true diff --git a/clients/dns-service-client/src/lib.rs b/clients/dns-service-client/src/lib.rs index 316c4787b0..0f3360ab10 100644 --- a/clients/dns-service-client/src/lib.rs +++ b/clients/dns-service-client/src/lib.rs @@ -2,13 +2,6 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. -mod diff; - -use crate::Error as DnsConfigError; -use anyhow::ensure; -pub use diff::DnsDiff; -use std::collections::HashMap; - progenitor::generate_api!( spec = "../../openapi/dns-server.json", inner_type = slog::Logger, @@ -23,23 +16,32 @@ progenitor::generate_api!( post_hook = (|log: &slog::Logger, result: &Result<_, _>| { slog::debug!(log, "client response"; "result" => ?result); }), + replace = { + DnsConfig = internal_dns_types::config::DnsConfig, + DnsConfigParams = internal_dns_types::config::DnsConfigParams, + DnsConfigZone = internal_dns_types::config::DnsConfigZone, + DnsRecord = internal_dns_types::config::DnsRecord, + Srv = internal_dns_types::config::Srv, + } ); +pub type DnsError = crate::Error; + pub const ERROR_CODE_UPDATE_IN_PROGRESS: &'static str = "UpdateInProgress"; pub const ERROR_CODE_BAD_UPDATE_GENERATION: &'static str = "BadUpdateGeneration"; /// Returns whether an error from this client should be retried -pub fn is_retryable(error: &DnsConfigError) -> bool { +pub fn is_retryable(error: &DnsError) -> bool { let response_value = match error { - DnsConfigError::CommunicationError(_) => return true, - DnsConfigError::InvalidRequest(_) - | DnsConfigError::InvalidResponsePayload(_, _) - | DnsConfigError::UnexpectedResponse(_) - | DnsConfigError::InvalidUpgrade(_) - | DnsConfigError::ResponseBodyError(_) - | DnsConfigError::PreHookError(_) => return false, - DnsConfigError::ErrorResponse(response_value) => response_value, + DnsError::CommunicationError(_) => return true, + DnsError::InvalidRequest(_) + | DnsError::InvalidResponsePayload(_, _) + | DnsError::UnexpectedResponse(_) + | DnsError::InvalidUpgrade(_) + | DnsError::ResponseBodyError(_) + | DnsError::PreHookError(_) => return false, + DnsError::ErrorResponse(response_value) => response_value, }; let status_code = response_value.status(); @@ -89,62 +91,3 @@ pub fn is_retryable(error: &DnsConfigError) -> bool { false } - -type DnsRecords = HashMap>; - -impl types::DnsConfigParams { - /// Given a high-level DNS configuration, return a reference to its sole - /// DNS zone. - /// - /// # Errors - /// - /// Returns an error if there are 0 or more than one zones in this - /// configuration. - pub fn sole_zone(&self) -> Result<&types::DnsConfigZone, anyhow::Error> { - ensure!( - self.zones.len() == 1, - "expected exactly one DNS zone, but found {}", - self.zones.len() - ); - Ok(&self.zones[0]) - } -} - -impl Ord for types::DnsRecord { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - use types::DnsRecord; - match (self, other) { - // Same kinds: compare the items in them - (DnsRecord::A(addr1), DnsRecord::A(addr2)) => addr1.cmp(addr2), - (DnsRecord::Aaaa(addr1), DnsRecord::Aaaa(addr2)) => { - addr1.cmp(addr2) - } - (DnsRecord::Srv(srv1), DnsRecord::Srv(srv2)) => srv1 - .target - .cmp(&srv2.target) - .then_with(|| srv1.port.cmp(&srv2.port)), - - // Different kinds: define an arbitrary order among the kinds. - // We could use std::mem::discriminant() here but it'd be nice if - // this were stable over time. - // We define (arbitrarily): A < Aaaa < Srv - (DnsRecord::A(_), DnsRecord::Aaaa(_) | DnsRecord::Srv(_)) => { - std::cmp::Ordering::Less - } - (DnsRecord::Aaaa(_), DnsRecord::Srv(_)) => std::cmp::Ordering::Less, - - // Anything else will result in "Greater". But let's be explicit. - (DnsRecord::Aaaa(_), DnsRecord::A(_)) - | (DnsRecord::Srv(_), DnsRecord::A(_)) - | (DnsRecord::Srv(_), DnsRecord::Aaaa(_)) => { - std::cmp::Ordering::Greater - } - } - } -} - -impl PartialOrd for types::DnsRecord { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} diff --git a/clients/nexus-client/src/lib.rs b/clients/nexus-client/src/lib.rs index 97f6373e29..f28a8e97bb 100644 --- a/clients/nexus-client/src/lib.rs +++ b/clients/nexus-client/src/lib.rs @@ -31,6 +31,9 @@ progenitor::generate_api!( Blueprint = nexus_types::deployment::Blueprint, Certificate = omicron_common::api::internal::nexus::Certificate, DatasetKind = omicron_common::api::internal::shared::DatasetKind, + DnsConfigParams = nexus_types::internal_api::params::DnsConfigParams, + DnsConfigZone = nexus_types::internal_api::params::DnsConfigZone, + DnsRecord = nexus_types::internal_api::params::DnsRecord, Generation = omicron_common::api::external::Generation, ImportExportPolicy = omicron_common::api::external::ImportExportPolicy, MacAddr = omicron_common::api::external::MacAddr, @@ -41,6 +44,7 @@ progenitor::generate_api!( OmicronPhysicalDiskConfig = nexus_types::disk::OmicronPhysicalDiskConfig, OmicronPhysicalDisksConfig = nexus_types::disk::OmicronPhysicalDisksConfig, RecoverySiloConfig = nexus_sled_agent_shared::recovery_silo::RecoverySiloConfig, + Srv = nexus_types::internal_api::params::Srv, TypedUuidForCollectionKind = omicron_uuid_kinds::CollectionUuid, TypedUuidForDemoSagaKind = omicron_uuid_kinds::DemoSagaUuid, TypedUuidForDownstairsKind = omicron_uuid_kinds::TypedUuid, diff --git a/dev-tools/ls-apis/api-manifest.toml b/dev-tools/ls-apis/api-manifest.toml index 65dc28d7b2..c9a2430fa7 100644 --- a/dev-tools/ls-apis/api-manifest.toml +++ b/dev-tools/ls-apis/api-manifest.toml @@ -387,18 +387,6 @@ mg-admin-client, which isn't true. It'd be nice to remove this. Most clients put those conversions into the client rather than omicron_common. """ -[[dependency_filter_rules]] -ancestor = "internal-dns" -client = "dns-service-client" -evaluation = "bogus" -note = """ -internal-dns depends on dns-service-client to use its types. They're only used -when configuring DNS, which is only done in a couple of components. But many -other components use internal-dns solely to read DNS. This dependency makes it -look like everything uses the DNS server API, but that's not true. We should -consider splitting this crate in two to eliminate this false positive. -""" - [[dependency_filter_rules]] ancestor = "nexus-types" client = "gateway-client" @@ -412,7 +400,8 @@ ancestor = "nexus-types" client = "dns-service-client" evaluation = "bogus" note = """ -nexus-types depends on dns-service-client for defining some types. +Past versions of nexus-types that are still referenced in the dependency tree +depended on dns-service-client for defining some types. """ [[dependency_filter_rules]] diff --git a/dev-tools/omdb/Cargo.toml b/dev-tools/omdb/Cargo.toml index 3e942523b4..78bceb8cc0 100644 --- a/dev-tools/omdb/Cargo.toml +++ b/dev-tools/omdb/Cargo.toml @@ -27,7 +27,8 @@ gateway-client.workspace = true gateway-messages.workspace = true gateway-test-utils.workspace = true humantime.workspace = true -internal-dns.workspace = true +internal-dns-resolver.workspace = true +internal-dns-types.workspace = true itertools.workspace = true nexus-client.workspace = true nexus-config.workspace = true diff --git a/dev-tools/omdb/src/bin/omdb/db.rs b/dev-tools/omdb/src/bin/omdb/db.rs index be068f0912..ac41d751bc 100644 --- a/dev-tools/omdb/src/bin/omdb/db.rs +++ b/dev-tools/omdb/src/bin/omdb/db.rs @@ -45,6 +45,7 @@ use gateway_client::types::SpType; use indicatif::ProgressBar; use indicatif::ProgressDrawTarget; use indicatif::ProgressStyle; +use internal_dns_types::names::ServiceName; use ipnetwork::IpNetwork; use nexus_config::PostgresConfigWithUrl; use nexus_db_model::Dataset; @@ -221,10 +222,7 @@ impl DbUrlOptions { ); eprintln!("note: (override with --db-url or OMDB_DB_URL)"); let addrs = omdb - .dns_lookup_all( - log.clone(), - internal_dns::ServiceName::Cockroach, - ) + .dns_lookup_all(log.clone(), ServiceName::Cockroach) .await?; format!( diff --git a/dev-tools/omdb/src/bin/omdb/main.rs b/dev-tools/omdb/src/bin/omdb/main.rs index f1a13310ca..f5c5d3f907 100644 --- a/dev-tools/omdb/src/bin/omdb/main.rs +++ b/dev-tools/omdb/src/bin/omdb/main.rs @@ -41,6 +41,7 @@ use clap::ColorChoice; use clap::Parser; use clap::Subcommand; use futures::StreamExt; +use internal_dns_types::names::ServiceName; use omicron_common::address::Ipv6Subnet; use std::net::SocketAddr; use std::net::SocketAddrV6; @@ -151,7 +152,7 @@ impl Omdb { async fn dns_lookup_all( &self, log: slog::Logger, - service_name: internal_dns::ServiceName, + service_name: ServiceName, ) -> Result, anyhow::Error> { let resolver = self.dns_resolver(log).await?; resolver @@ -165,7 +166,7 @@ impl Omdb { async fn dns_lookup_one( &self, log: slog::Logger, - service_name: internal_dns::ServiceName, + service_name: ServiceName, ) -> Result { let addrs = self.dns_lookup_all(log, service_name).await?; ensure!( @@ -222,10 +223,10 @@ impl Omdb { async fn dns_resolver( &self, log: slog::Logger, - ) -> Result { + ) -> Result { match &self.dns_server { Some(dns_server) => { - internal_dns::resolver::Resolver::new_from_addrs( + internal_dns_resolver::Resolver::new_from_addrs( log, &[*dns_server], ) @@ -258,7 +259,7 @@ impl Omdb { "note: (if this is not right, use --dns-server \ to specify an alternate DNS server)", ); - internal_dns::resolver::Resolver::new_from_subnet(log, subnet) + internal_dns_resolver::Resolver::new_from_subnet(log, subnet) .with_context(|| { format!( "creating DNS resolver for subnet {}", diff --git a/dev-tools/omdb/src/bin/omdb/mgs.rs b/dev-tools/omdb/src/bin/omdb/mgs.rs index 6b7c8b2641..0db1731ca6 100644 --- a/dev-tools/omdb/src/bin/omdb/mgs.rs +++ b/dev-tools/omdb/src/bin/omdb/mgs.rs @@ -21,6 +21,7 @@ use gateway_client::types::SpIgnitionInfo; use gateway_client::types::SpIgnitionSystemType; use gateway_client::types::SpState; use gateway_client::types::SpType; +use internal_dns_types::names::ServiceName; use tabled::Tabled; mod dashboard; @@ -75,7 +76,7 @@ impl MgsArgs { let addr = omdb .dns_lookup_one( log.clone(), - internal_dns::ServiceName::ManagementGatewayService, + ServiceName::ManagementGatewayService, ) .await?; format!("http://{}", addr) diff --git a/dev-tools/omdb/src/bin/omdb/nexus.rs b/dev-tools/omdb/src/bin/omdb/nexus.rs index 797e4a9dd6..326a6b6384 100644 --- a/dev-tools/omdb/src/bin/omdb/nexus.rs +++ b/dev-tools/omdb/src/bin/omdb/nexus.rs @@ -22,6 +22,7 @@ use clap::Subcommand; use clap::ValueEnum; use futures::future::try_join; use futures::TryStreamExt; +use internal_dns_types::names::ServiceName; use itertools::Itertools; use nexus_client::types::ActivationReason; use nexus_client::types::BackgroundTask; @@ -391,10 +392,7 @@ impl NexusArgs { "note: Nexus URL not specified. Will pick one from DNS." ); let addr = omdb - .dns_lookup_one( - log.clone(), - internal_dns::ServiceName::Nexus, - ) + .dns_lookup_one(log.clone(), ServiceName::Nexus) .await?; format!("http://{}", addr) } diff --git a/dev-tools/omdb/src/bin/omdb/oximeter.rs b/dev-tools/omdb/src/bin/omdb/oximeter.rs index c068110b4c..cc1efd126f 100644 --- a/dev-tools/omdb/src/bin/omdb/oximeter.rs +++ b/dev-tools/omdb/src/bin/omdb/oximeter.rs @@ -10,6 +10,7 @@ use anyhow::Context; use clap::Args; use clap::Subcommand; use futures::TryStreamExt; +use internal_dns_types::names::ServiceName; use oximeter_client::types::ProducerEndpoint; use oximeter_client::Client; use slog::Logger; @@ -55,10 +56,7 @@ impl OximeterArgs { "note: Oximeter URL not specified. Will pick one from DNS." ); let addr = omdb - .dns_lookup_one( - log.clone(), - internal_dns::ServiceName::Oximeter, - ) + .dns_lookup_one(log.clone(), ServiceName::Oximeter) .await?; format!("http://{}", addr) } diff --git a/dev-tools/omdb/src/bin/omdb/oxql.rs b/dev-tools/omdb/src/bin/omdb/oxql.rs index 89ddae9cf2..28f405e067 100644 --- a/dev-tools/omdb/src/bin/omdb/oxql.rs +++ b/dev-tools/omdb/src/bin/omdb/oxql.rs @@ -10,6 +10,7 @@ use crate::helpers::CONNECTION_OPTIONS_HEADING; use crate::Omdb; use anyhow::Context; use clap::Args; +use internal_dns_types::names::ServiceName; use oximeter_db::{ self, shells::oxql::{self, ShellOptions}, @@ -86,7 +87,7 @@ impl OxqlArgs { Ok(SocketAddr::V6( omdb.dns_lookup_one( log.clone(), - internal_dns::ServiceName::Clickhouse, + ServiceName::Clickhouse, ) .await .context("failed looking up ClickHouse internal DNS entry")?, diff --git a/dev-tools/reconfigurator-cli/Cargo.toml b/dev-tools/reconfigurator-cli/Cargo.toml index e3dcff6769..51cec2cdd9 100644 --- a/dev-tools/reconfigurator-cli/Cargo.toml +++ b/dev-tools/reconfigurator-cli/Cargo.toml @@ -15,10 +15,10 @@ anyhow.workspace = true assert_matches.workspace = true camino.workspace = true clap.workspace = true -dns-service-client.workspace = true dropshot.workspace = true humantime.workspace = true indexmap.workspace = true +internal-dns-types.workspace = true nexus-inventory.workspace = true nexus-reconfigurator-planning.workspace = true nexus-sled-agent-shared.workspace = true diff --git a/dev-tools/reconfigurator-cli/src/main.rs b/dev-tools/reconfigurator-cli/src/main.rs index 783891610e..67ae6d802d 100644 --- a/dev-tools/reconfigurator-cli/src/main.rs +++ b/dev-tools/reconfigurator-cli/src/main.rs @@ -10,8 +10,8 @@ use clap::CommandFactory; use clap::FromArgMatches; use clap::ValueEnum; use clap::{Args, Parser, Subcommand}; -use dns_service_client::DnsDiff; use indexmap::IndexMap; +use internal_dns_types::diff::DnsDiff; use nexus_inventory::CollectionBuilder; use nexus_reconfigurator_planning::blueprint_builder::BlueprintBuilder; use nexus_reconfigurator_planning::blueprint_builder::EnsureMultiple; diff --git a/dns-server-api/Cargo.toml b/dns-server-api/Cargo.toml index c87af14e0d..dfa384763e 100644 --- a/dns-server-api/Cargo.toml +++ b/dns-server-api/Cargo.toml @@ -10,6 +10,7 @@ workspace = true [dependencies] chrono.workspace = true dropshot.workspace = true +internal-dns-types.workspace = true omicron-workspace-hack.workspace = true schemars.workspace = true serde.workspace = true diff --git a/dns-server-api/src/lib.rs b/dns-server-api/src/lib.rs index 2c59caf0c5..8449293e5f 100644 --- a/dns-server-api/src/lib.rs +++ b/dns-server-api/src/lib.rs @@ -89,14 +89,8 @@ //! in-progress one. How large do we allow that queue to grow? At some point //! we'll need to stop queueing them. So why bother at all? -use std::{ - collections::HashMap, - net::{Ipv4Addr, Ipv6Addr}, -}; - use dropshot::{HttpError, HttpResponseOk, RequestContext}; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; +use internal_dns_types::config::{DnsConfig, DnsConfigParams}; #[dropshot::api_description] pub trait DnsServerApi { @@ -119,42 +113,3 @@ pub trait DnsServerApi { rq: dropshot::TypedBody, ) -> Result; } - -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] -pub struct DnsConfigParams { - pub generation: u64, - pub time_created: chrono::DateTime, - pub zones: Vec, -} - -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] -pub struct DnsConfig { - pub generation: u64, - pub time_created: chrono::DateTime, - pub time_applied: chrono::DateTime, - pub zones: Vec, -} - -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] -pub struct DnsConfigZone { - pub zone_name: String, - pub records: HashMap>, -} - -#[allow(clippy::upper_case_acronyms)] -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq)] -#[serde(tag = "type", content = "data")] -pub enum DnsRecord { - A(Ipv4Addr), - AAAA(Ipv6Addr), - SRV(SRV), -} - -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq)] -#[serde(rename = "Srv")] -pub struct SRV { - pub prio: u16, - pub weight: u16, - pub port: u16, - pub target: String, -} diff --git a/dns-server/Cargo.toml b/dns-server/Cargo.toml index b4516b8b77..b3e7839162 100644 --- a/dns-server/Cargo.toml +++ b/dns-server/Cargo.toml @@ -20,6 +20,7 @@ hickory-proto.workspace = true hickory-resolver.workspace = true hickory-server.workspace = true http.workspace = true +internal-dns-types.workspace = true pretty-hex.workspace = true schemars.workspace = true serde.workspace = true diff --git a/dns-server/src/bin/dnsadm.rs b/dns-server/src/bin/dnsadm.rs index 76ba9bc2d4..1c6a446124 100644 --- a/dns-server/src/bin/dnsadm.rs +++ b/dns-server/src/bin/dnsadm.rs @@ -16,11 +16,12 @@ use anyhow::ensure; use anyhow::Context; use anyhow::Result; use clap::{Args, Parser, Subcommand}; -use dns_service_client::types::DnsConfig; -use dns_service_client::{ - types::{DnsConfigParams, DnsConfigZone, DnsRecord, Srv}, - Client, -}; +use dns_service_client::Client; +use internal_dns_types::config::DnsConfig; +use internal_dns_types::config::DnsConfigParams; +use internal_dns_types::config::DnsConfigZone; +use internal_dns_types::config::DnsRecord; +use internal_dns_types::config::Srv; use slog::{Drain, Logger}; use std::collections::BTreeMap; use std::collections::HashMap; diff --git a/dns-server/src/dns_server.rs b/dns-server/src/dns_server.rs index 4ecbe382c8..34750719c1 100644 --- a/dns-server/src/dns_server.rs +++ b/dns-server/src/dns_server.rs @@ -12,7 +12,6 @@ use crate::storage::QueryError; use crate::storage::Store; use anyhow::anyhow; use anyhow::Context; -use dns_server_api::DnsRecord; use hickory_proto::op::Header; use hickory_proto::op::ResponseCode; use hickory_proto::rr::rdata::SRV; @@ -26,6 +25,8 @@ use hickory_resolver::Name; use hickory_server::authority::MessageRequest; use hickory_server::authority::MessageResponse; use hickory_server::authority::MessageResponseBuilder; +use internal_dns_types::config::DnsRecord; +use internal_dns_types::config::Srv; use pretty_hex::*; use serde::Deserialize; use slog::{debug, error, info, o, trace, Logger}; @@ -231,7 +232,7 @@ fn dns_record_to_record( Ok(a) } - DnsRecord::AAAA(addr) => { + DnsRecord::Aaaa(addr) => { let mut aaaa = Record::new(); aaaa.set_name(name.clone()) .set_rr_type(RecordType::AAAA) @@ -239,7 +240,7 @@ fn dns_record_to_record( Ok(aaaa) } - DnsRecord::SRV(dns_server_api::SRV { prio, weight, port, target }) => { + DnsRecord::Srv(Srv { prio, weight, port, target }) => { let tgt = Name::from_str(&target).map_err(|error| { RequestError::ServFail(anyhow!( "serialization failed due to bad SRV target {:?}: {:#}", diff --git a/dns-server/src/http_server.rs b/dns-server/src/http_server.rs index f9f56d9326..87d576258f 100644 --- a/dns-server/src/http_server.rs +++ b/dns-server/src/http_server.rs @@ -5,11 +5,12 @@ //! Dropshot server for configuring DNS namespace use crate::storage::{self, UpdateError}; -use dns_server_api::{DnsConfig, DnsConfigParams, DnsServerApi}; +use dns_server_api::DnsServerApi; use dns_service_client::{ ERROR_CODE_BAD_UPDATE_GENERATION, ERROR_CODE_UPDATE_IN_PROGRESS, }; use dropshot::RequestContext; +use internal_dns_types::config::{DnsConfig, DnsConfigParams}; pub struct Context { store: storage::Store, diff --git a/dns-server/src/lib.rs b/dns-server/src/lib.rs index 8abd3b945e..88549e9982 100644 --- a/dns-server/src/lib.rs +++ b/dns-server/src/lib.rs @@ -52,6 +52,7 @@ use hickory_resolver::config::Protocol; use hickory_resolver::config::ResolverConfig; use hickory_resolver::config::ResolverOpts; use hickory_resolver::TokioAsyncResolver; +use internal_dns_types::config::DnsConfigParams; use slog::o; use std::net::SocketAddr; @@ -148,7 +149,7 @@ impl TransientServer { pub async fn initialize_with_config( &self, log: &slog::Logger, - dns_config: &dns_service_client::types::DnsConfigParams, + dns_config: &DnsConfigParams, ) -> Result<(), anyhow::Error> { let dns_config_client = dns_service_client::Client::new( &format!("http://{}", self.dropshot_server.local_addr()), diff --git a/dns-server/src/storage.rs b/dns-server/src/storage.rs index b3141f6751..6c58af4978 100644 --- a/dns-server/src/storage.rs +++ b/dns-server/src/storage.rs @@ -94,9 +94,11 @@ use anyhow::{anyhow, Context}; use camino::Utf8PathBuf; -use dns_server_api::{DnsConfig, DnsConfigParams, DnsConfigZone, DnsRecord}; use hickory_proto::rr::LowerName; use hickory_resolver::Name; +use internal_dns_types::config::{ + DnsConfig, DnsConfigParams, DnsConfigZone, DnsRecord, +}; use serde::{Deserialize, Serialize}; use sled::transaction::ConflictableTransactionError; use slog::{debug, error, info, o, warn}; @@ -781,11 +783,11 @@ mod test { use anyhow::Context; use camino::Utf8PathBuf; use camino_tempfile::Utf8TempDir; - use dns_server_api::DnsConfigParams; - use dns_server_api::DnsConfigZone; - use dns_server_api::DnsRecord; use hickory_proto::rr::LowerName; use hickory_resolver::Name; + use internal_dns_types::config::DnsConfigParams; + use internal_dns_types::config::DnsConfigZone; + use internal_dns_types::config::DnsRecord; use omicron_test_utils::dev::test_setup_log; use std::collections::BTreeSet; use std::collections::HashMap; @@ -897,7 +899,7 @@ mod test { expect(&tc.store, "gen8_name.zone8.internal", Expect::NoZone); // Update to generation 1, which contains one zone with one name. - let dummy_record = DnsRecord::AAAA(Ipv6Addr::LOCALHOST); + let dummy_record = DnsRecord::Aaaa(Ipv6Addr::LOCALHOST); let update1 = DnsConfigParams { time_created: chrono::Utc::now(), generation: 1, @@ -1066,7 +1068,7 @@ mod test { assert!(config.zones.is_empty()); // Make one normal update. - let dummy_record = DnsRecord::AAAA(Ipv6Addr::LOCALHOST); + let dummy_record = DnsRecord::Aaaa(Ipv6Addr::LOCALHOST); let update1 = DnsConfigParams { time_created: chrono::Utc::now(), generation: 1, @@ -1188,7 +1190,7 @@ mod test { let after = chrono::Utc::now(); // Concurrently attempt another update. - let dummy_record = DnsRecord::AAAA(Ipv6Addr::LOCALHOST); + let dummy_record = DnsRecord::Aaaa(Ipv6Addr::LOCALHOST); let update2 = DnsConfigParams { time_created: chrono::Utc::now(), generation: 1, diff --git a/dns-server/tests/basic_test.rs b/dns-server/tests/basic_test.rs index fa5bfea468..c72bb4b3ac 100644 --- a/dns-server/tests/basic_test.rs +++ b/dns-server/tests/basic_test.rs @@ -4,10 +4,7 @@ use anyhow::{Context, Result}; use camino_tempfile::Utf8TempDir; -use dns_service_client::{ - types::{DnsConfigParams, DnsConfigZone, DnsRecord, Srv}, - Client, -}; +use dns_service_client::Client; use dropshot::{test_util::LogContext, HandlerTaskMode}; use hickory_resolver::error::ResolveErrorKind; use hickory_resolver::TokioAsyncResolver; @@ -15,6 +12,9 @@ use hickory_resolver::{ config::{NameServerConfig, Protocol, ResolverConfig, ResolverOpts}, proto::op::ResponseCode, }; +use internal_dns_types::config::{ + DnsConfigParams, DnsConfigZone, DnsRecord, Srv, +}; use omicron_test_utils::dev::test_setup_log; use slog::o; use std::{ diff --git a/internal-dns-cli/Cargo.toml b/internal-dns/cli/Cargo.toml similarity index 82% rename from internal-dns-cli/Cargo.toml rename to internal-dns/cli/Cargo.toml index 3e34c21622..93375ef7a0 100644 --- a/internal-dns-cli/Cargo.toml +++ b/internal-dns/cli/Cargo.toml @@ -12,7 +12,8 @@ anyhow.workspace = true clap.workspace = true dropshot.workspace = true hickory-resolver.workspace = true -internal-dns.workspace = true +internal-dns-resolver.workspace = true +internal-dns-types.workspace = true omicron-common.workspace = true slog.workspace = true tokio.workspace = true diff --git a/internal-dns-cli/src/bin/dnswait.rs b/internal-dns/cli/src/bin/dnswait.rs similarity index 85% rename from internal-dns-cli/src/bin/dnswait.rs rename to internal-dns/cli/src/bin/dnswait.rs index f9875e71a0..8d7c0e2683 100644 --- a/internal-dns-cli/src/bin/dnswait.rs +++ b/internal-dns/cli/src/bin/dnswait.rs @@ -8,8 +8,8 @@ use anyhow::Context; use anyhow::Result; use clap::Parser; use clap::ValueEnum; -use internal_dns::resolver::ResolveError; -use internal_dns::resolver::Resolver; +use internal_dns_resolver::ResolveError; +use internal_dns_resolver::Resolver; use slog::{info, warn}; use std::net::SocketAddr; @@ -40,15 +40,17 @@ enum ServiceName { ClickhouseServer, } -impl From for internal_dns::ServiceName { +impl From for internal_dns_types::names::ServiceName { fn from(value: ServiceName) -> Self { match value { - ServiceName::Cockroach => internal_dns::ServiceName::Cockroach, + ServiceName::Cockroach => { + internal_dns_types::names::ServiceName::Cockroach + } ServiceName::ClickhouseServer => { - internal_dns::ServiceName::ClickhouseServer + internal_dns_types::names::ServiceName::ClickhouseServer } ServiceName::ClickhouseKeeper => { - internal_dns::ServiceName::ClickhouseKeeper + internal_dns_types::names::ServiceName::ClickhouseKeeper } } } @@ -79,7 +81,8 @@ async fn main() -> Result<()> { let result = omicron_common::backoff::retry_notify( omicron_common::backoff::retry_policy_internal_service(), || async { - let dns_name = internal_dns::ServiceName::from(opt.srv_name); + let dns_name = + internal_dns_types::names::ServiceName::from(opt.srv_name); resolver.lookup_srv(dns_name).await.map_err(|error| match error { ResolveError::Resolve(_) | ResolveError::NotFound(_) diff --git a/internal-dns/Cargo.toml b/internal-dns/resolver/Cargo.toml similarity index 90% rename from internal-dns/Cargo.toml rename to internal-dns/resolver/Cargo.toml index c12035e2cb..f8b518a0ae 100644 --- a/internal-dns/Cargo.toml +++ b/internal-dns/resolver/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "internal-dns" +name = "internal-dns-resolver" version = "0.1.0" edition = "2021" license = "MPL-2.0" @@ -8,26 +8,24 @@ license = "MPL-2.0" workspace = true [dependencies] -anyhow.workspace = true -chrono.workspace = true -dns-service-client.workspace = true futures.workspace = true -hyper.workspace = true +hickory-resolver.workspace = true +internal-dns-types.workspace = true omicron-common.workspace = true -omicron-uuid-kinds.workspace = true +omicron-workspace-hack.workspace = true reqwest = { workspace = true, features = ["rustls-tls", "stream"] } slog.workspace = true thiserror.workspace = true -hickory-resolver.workspace = true -uuid.workspace = true -omicron-workspace-hack.workspace = true [dev-dependencies] +anyhow.workspace = true assert_matches.workspace = true dropshot.workspace = true dns-server.workspace = true +dns-service-client.workspace = true expectorate.workspace = true omicron-test-utils.workspace = true +omicron-uuid-kinds.workspace = true progenitor.workspace = true serde = { workspace = true, features = ["derive"] } serde_json.workspace = true diff --git a/internal-dns/resolver/src/lib.rs b/internal-dns/resolver/src/lib.rs new file mode 100644 index 0000000000..795e2ea998 --- /dev/null +++ b/internal-dns/resolver/src/lib.rs @@ -0,0 +1,9 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +//! A resolver for internal DNS names (see RFD 248). + +mod resolver; + +pub use resolver::*; diff --git a/internal-dns/src/resolver.rs b/internal-dns/resolver/src/resolver.rs similarity index 98% rename from internal-dns/src/resolver.rs rename to internal-dns/resolver/src/resolver.rs index 5675575a18..7e1ca96569 100644 --- a/internal-dns/src/resolver.rs +++ b/internal-dns/resolver/src/resolver.rs @@ -7,21 +7,20 @@ use hickory_resolver::config::{ }; use hickory_resolver::lookup::SrvLookup; use hickory_resolver::TokioAsyncResolver; +use internal_dns_types::names::ServiceName; use omicron_common::address::{ get_internal_dns_server_addresses, Ipv6Subnet, AZ_PREFIX, DNS_PORT, }; use slog::{debug, error, info, trace}; use std::net::{IpAddr, Ipv6Addr, SocketAddr, SocketAddrV6}; -pub type DnsError = dns_service_client::Error; - #[derive(Debug, Clone, thiserror::Error)] pub enum ResolveError { #[error(transparent)] Resolve(#[from] hickory_resolver::error::ResolveError), #[error("Record not found for SRV key: {}", .0.dns_name())] - NotFound(crate::ServiceName), + NotFound(ServiceName), #[error("Record not found for {0}")] NotFoundByString(String), @@ -161,7 +160,7 @@ impl Resolver { /// need to be looked up to find A/AAAA records. pub async fn lookup_srv( &self, - srv: crate::ServiceName, + srv: ServiceName, ) -> Result, ResolveError> { let name = srv.srv_name(); trace!(self.log, "lookup_srv"; "dns_name" => &name); @@ -181,7 +180,7 @@ impl Resolver { pub async fn lookup_all_ipv6( &self, - srv: crate::ServiceName, + srv: ServiceName, ) -> Result, ResolveError> { let name = srv.srv_name(); trace!(self.log, "lookup_all_ipv6 srv"; "dns_name" => &name); @@ -217,7 +216,7 @@ impl Resolver { // API that can be improved upon later. pub async fn lookup_socket_v6( &self, - service: crate::ServiceName, + service: ServiceName, ) -> Result { let name = service.srv_name(); trace!(self.log, "lookup_socket_v6 srv"; "dns_name" => &name); @@ -241,7 +240,7 @@ impl Resolver { /// targets and return a list of [`SocketAddrV6`]. pub async fn lookup_all_socket_v6( &self, - service: crate::ServiceName, + service: ServiceName, ) -> Result, ResolveError> { let name = service.srv_name(); trace!(self.log, "lookup_all_socket_v6 srv"; "dns_name" => &name); @@ -286,7 +285,7 @@ impl Resolver { pub async fn lookup_ip( &self, - srv: crate::ServiceName, + srv: ServiceName, ) -> Result { let name = srv.srv_name(); debug!(self.log, "lookup srv"; "dns_name" => &name); @@ -366,15 +365,16 @@ impl Resolver { mod test { use super::ResolveError; use super::Resolver; - use crate::DNS_ZONE; - use crate::{DnsConfigBuilder, ServiceName}; use anyhow::Context; use assert_matches::assert_matches; - use dns_service_client::types::DnsConfigParams; use dropshot::{ endpoint, ApiDescription, HandlerTaskMode, HttpError, HttpResponseOk, RequestContext, }; + use internal_dns_types::config::DnsConfigBuilder; + use internal_dns_types::config::DnsConfigParams; + use internal_dns_types::names::ServiceName; + use internal_dns_types::names::DNS_ZONE; use omicron_test_utils::dev::test_setup_log; use omicron_uuid_kinds::OmicronZoneUuid; use slog::{o, Logger}; @@ -811,7 +811,7 @@ mod test { // // We'll use the SRV record for Nexus, even though it's just our // standalone test server. - let dns_name = crate::ServiceName::Nexus.srv_name(); + let dns_name = ServiceName::Nexus.srv_name(); let reqwest_client = reqwest::ClientBuilder::new() .dns_resolver(resolver.clone().into()) .build() @@ -891,7 +891,7 @@ mod test { // // We'll use the SRV record for Nexus, even though it's just our // standalone test server. - let dns_name = crate::ServiceName::Nexus.srv_name(); + let dns_name = ServiceName::Nexus.srv_name(); let reqwest_client = reqwest::ClientBuilder::new() .dns_resolver(resolver.clone().into()) .build() diff --git a/internal-dns/tests/output/test-server.json b/internal-dns/resolver/tests/output/test-server.json similarity index 100% rename from internal-dns/tests/output/test-server.json rename to internal-dns/resolver/tests/output/test-server.json diff --git a/internal-dns/types/Cargo.toml b/internal-dns/types/Cargo.toml new file mode 100644 index 0000000000..612aafde04 --- /dev/null +++ b/internal-dns/types/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "internal-dns-types" +version = "0.1.0" +edition = "2021" + +[lints] +workspace = true + +[dependencies] +anyhow.workspace = true +chrono.workspace = true +omicron-common.workspace = true +omicron-workspace-hack.workspace = true +omicron-uuid-kinds.workspace = true +schemars.workspace = true +serde.workspace = true + +[dev-dependencies] +expectorate.workspace = true +serde_json.workspace = true diff --git a/internal-dns/src/config.rs b/internal-dns/types/src/config.rs similarity index 91% rename from internal-dns/src/config.rs rename to internal-dns/types/src/config.rs index 29a718c2fa..a7f223caee 100644 --- a/internal-dns/src/config.rs +++ b/internal-dns/types/src/config.rs @@ -63,12 +63,13 @@ use crate::names::{ServiceName, BOUNDARY_NTP_DNS_NAME, DNS_ZONE}; use anyhow::{anyhow, ensure}; use core::fmt; -use dns_service_client::types::{DnsConfigParams, DnsConfigZone, DnsRecord}; use omicron_common::address::{CLICKHOUSE_ADMIN_PORT, CLICKHOUSE_TCP_PORT}; use omicron_common::api::external::Generation; use omicron_uuid_kinds::{OmicronZoneUuid, SledUuid}; -use std::collections::BTreeMap; -use std::net::Ipv6Addr; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use std::collections::{BTreeMap, HashMap}; +use std::net::{Ipv4Addr, Ipv6Addr}; /// Used to construct the DNS name for a control plane host #[derive(Clone, Debug, PartialEq, PartialOrd)] @@ -175,7 +176,7 @@ impl Zone { Host::Zone(self.clone()) } - pub(crate) fn dns_name(&self) -> String { + pub fn dns_name(&self) -> String { self.to_host().dns_name() } } @@ -523,7 +524,7 @@ impl DnsConfigBuilder { let records = zone2port .into_iter() .map(|(zone, port)| { - DnsRecord::Srv(dns_service_client::types::Srv { + DnsRecord::Srv(Srv { prio: 0, weight: 0, port, @@ -542,7 +543,7 @@ impl DnsConfigBuilder { let records = sled2port .into_iter() .map(|(sled, port)| { - DnsRecord::Srv(dns_service_client::types::Srv { + DnsRecord::Srv(Srv { prio: 0, weight: 0, port, @@ -578,10 +579,115 @@ impl DnsConfigBuilder { } } +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +pub struct DnsConfigParams { + pub generation: u64, + pub time_created: chrono::DateTime, + pub zones: Vec, +} + +impl DnsConfigParams { + /// Given a high-level DNS configuration, return a reference to its sole + /// DNS zone. + /// + /// # Errors + /// + /// Returns an error if there are 0 or more than one zones in this + /// configuration. + pub fn sole_zone(&self) -> Result<&DnsConfigZone, anyhow::Error> { + ensure!( + self.zones.len() == 1, + "expected exactly one DNS zone, but found {}", + self.zones.len() + ); + Ok(&self.zones[0]) + } +} + +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] +pub struct DnsConfig { + pub generation: u64, + pub time_created: chrono::DateTime, + pub time_applied: chrono::DateTime, + pub zones: Vec, +} + +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +pub struct DnsConfigZone { + pub zone_name: String, + pub records: HashMap>, +} + +#[derive( + Clone, + Debug, + Serialize, + Deserialize, + JsonSchema, + PartialEq, + Eq, + PartialOrd, + Ord, +)] +#[serde(tag = "type", content = "data")] +pub enum DnsRecord { + A(Ipv4Addr), + // The renames are because openapi-lint complains about `Aaaa` and `Srv` + // not being in screaming snake case. `Aaaa` and `Srv` are the idiomatic + // Rust casings, though. + #[serde(rename = "AAAA")] + Aaaa(Ipv6Addr), + #[serde(rename = "SRV")] + Srv(Srv), +} + +// The `From` and `From` implementations are very slightly +// dubious, because a v4 or v6 address could also theoretically map to a DNS +// PTR record +// (https://www.cloudflare.com/learning/dns/dns-records/dns-ptr-record/). +// However, we don't support PTR records at the moment, so this is fine. Would +// certainly be worth revisiting if we do in the future, though. + +impl From for DnsRecord { + fn from(ip: Ipv4Addr) -> Self { + DnsRecord::A(ip) + } +} + +impl From for DnsRecord { + fn from(ip: Ipv6Addr) -> Self { + DnsRecord::Aaaa(ip) + } +} + +impl From for DnsRecord { + fn from(srv: Srv) -> Self { + DnsRecord::Srv(srv) + } +} + +#[derive( + Clone, + Debug, + Serialize, + Deserialize, + JsonSchema, + PartialEq, + Eq, + PartialOrd, + Ord, +)] +pub struct Srv { + pub prio: u16, + pub weight: u16, + pub port: u16, + pub target: String, +} + #[cfg(test)] mod test { use super::{DnsConfigBuilder, Host, ServiceName}; - use crate::{config::Zone, DNS_ZONE}; + use crate::{config::Zone, names::DNS_ZONE}; use omicron_uuid_kinds::{OmicronZoneUuid, SledUuid}; use std::{collections::BTreeMap, io::Write, net::Ipv6Addr}; diff --git a/clients/dns-service-client/src/diff.rs b/internal-dns/types/src/diff.rs similarity index 97% rename from clients/dns-service-client/src/diff.rs rename to internal-dns/types/src/diff.rs index 2ae7036c86..85cd38642f 100644 --- a/clients/dns-service-client/src/diff.rs +++ b/internal-dns/types/src/diff.rs @@ -2,12 +2,13 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. -use crate::types::DnsConfigZone; -use crate::types::DnsRecord; -use crate::types::Srv; -use crate::DnsRecords; use anyhow::ensure; use std::collections::BTreeSet; +use std::collections::HashMap; + +use crate::config::DnsConfigZone; +use crate::config::DnsRecord; +use crate::config::Srv; #[derive(Debug)] enum NameDiff<'a> { @@ -17,6 +18,8 @@ enum NameDiff<'a> { Unchanged(&'a str, &'a [DnsRecord]), } +type DnsRecords = HashMap>; + /// Compare the DNS records contained in two sets of DNS configuration #[derive(Debug)] pub struct DnsDiff<'a> { @@ -216,8 +219,8 @@ impl<'a> std::fmt::Display for DnsDiff<'a> { #[cfg(test)] mod test { use super::DnsDiff; - use crate::types::DnsConfigZone; - use crate::types::DnsRecord; + use crate::config::DnsConfigZone; + use crate::config::DnsRecord; use std::collections::HashMap; use std::net::Ipv4Addr; diff --git a/internal-dns/src/lib.rs b/internal-dns/types/src/lib.rs similarity index 51% rename from internal-dns/src/lib.rs rename to internal-dns/types/src/lib.rs index cc84b6aa76..5dfccd324e 100644 --- a/internal-dns/src/lib.rs +++ b/internal-dns/types/src/lib.rs @@ -2,13 +2,8 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. -//! Working with Omicron-internal DNS (see RFD 248) +//! Common types for internal DNS resolution. pub mod config; +pub mod diff; pub mod names; -pub mod resolver; - -// We export these names out to the root for compatibility. -pub use config::DnsConfigBuilder; -pub use names::ServiceName; -pub use names::DNS_ZONE; diff --git a/internal-dns/src/names.rs b/internal-dns/types/src/names.rs similarity index 100% rename from internal-dns/src/names.rs rename to internal-dns/types/src/names.rs diff --git a/clients/dns-service-client/tests/output/diff_example_different.out b/internal-dns/types/tests/output/diff_example_different.out similarity index 100% rename from clients/dns-service-client/tests/output/diff_example_different.out rename to internal-dns/types/tests/output/diff_example_different.out diff --git a/clients/dns-service-client/tests/output/diff_example_different_reversed.out b/internal-dns/types/tests/output/diff_example_different_reversed.out similarity index 100% rename from clients/dns-service-client/tests/output/diff_example_different_reversed.out rename to internal-dns/types/tests/output/diff_example_different_reversed.out diff --git a/clients/dns-service-client/tests/output/diff_example_empty.out b/internal-dns/types/tests/output/diff_example_empty.out similarity index 100% rename from clients/dns-service-client/tests/output/diff_example_empty.out rename to internal-dns/types/tests/output/diff_example_empty.out diff --git a/internal-dns/tests/output/internal-dns-zone.txt b/internal-dns/types/tests/output/internal-dns-zone.txt similarity index 89% rename from internal-dns/tests/output/internal-dns-zone.txt rename to internal-dns/types/tests/output/internal-dns-zone.txt index d87805f677..b23553130c 100644 --- a/internal-dns/tests/output/internal-dns-zone.txt +++ b/internal-dns/types/tests/output/internal-dns-zone.txt @@ -72,10 +72,10 @@ builder: "non_trivial" { "type": "SRV", "data": { - "port": 127, "prio": 0, - "target": "001de000-c04e-4000-8000-000000000002.host.control-plane.oxide.internal", - "weight": 0 + "weight": 0, + "port": 127, + "target": "001de000-c04e-4000-8000-000000000002.host.control-plane.oxide.internal" } } ], @@ -83,19 +83,19 @@ builder: "non_trivial" { "type": "SRV", "data": { - "port": 123, "prio": 0, - "target": "001de000-c04e-4000-8000-000000000001.host.control-plane.oxide.internal", - "weight": 0 + "weight": 0, + "port": 123, + "target": "001de000-c04e-4000-8000-000000000001.host.control-plane.oxide.internal" } }, { "type": "SRV", "data": { - "port": 124, "prio": 0, - "target": "001de000-c04e-4000-8000-000000000002.host.control-plane.oxide.internal", - "weight": 0 + "weight": 0, + "port": 124, + "target": "001de000-c04e-4000-8000-000000000002.host.control-plane.oxide.internal" } } ], @@ -103,19 +103,19 @@ builder: "non_trivial" { "type": "SRV", "data": { - "port": 125, "prio": 0, - "target": "001de000-c04e-4000-8000-000000000002.host.control-plane.oxide.internal", - "weight": 0 + "weight": 0, + "port": 125, + "target": "001de000-c04e-4000-8000-000000000002.host.control-plane.oxide.internal" } }, { "type": "SRV", "data": { - "port": 126, "prio": 0, - "target": "001de000-c04e-4000-8000-000000000003.host.control-plane.oxide.internal", - "weight": 0 + "weight": 0, + "port": 126, + "target": "001de000-c04e-4000-8000-000000000003.host.control-plane.oxide.internal" } } ], @@ -123,10 +123,10 @@ builder: "non_trivial" { "type": "SRV", "data": { - "port": 123, "prio": 0, - "target": "001de000-51ed-4000-8000-000000000001.sled.control-plane.oxide.internal", - "weight": 0 + "weight": 0, + "port": 123, + "target": "001de000-51ed-4000-8000-000000000001.sled.control-plane.oxide.internal" } } ], diff --git a/live-tests/Cargo.toml b/live-tests/Cargo.toml index f731f248d0..ac0b39a5a5 100644 --- a/live-tests/Cargo.toml +++ b/live-tests/Cargo.toml @@ -17,7 +17,8 @@ anyhow.workspace = true assert_matches.workspace = true dropshot.workspace = true futures.workspace = true -internal-dns.workspace = true +internal-dns-resolver.workspace = true +internal-dns-types.workspace = true live-tests-macros.workspace = true nexus-client.workspace = true nexus-config.workspace = true diff --git a/live-tests/tests/common/mod.rs b/live-tests/tests/common/mod.rs index 28f677f5ed..360e07235a 100644 --- a/live-tests/tests/common/mod.rs +++ b/live-tests/tests/common/mod.rs @@ -6,8 +6,8 @@ pub mod reconfigurator; use anyhow::{anyhow, ensure, Context}; use dropshot::test_util::LogContext; -use internal_dns::resolver::Resolver; -use internal_dns::ServiceName; +use internal_dns_resolver::Resolver; +use internal_dns_types::names::ServiceName; use nexus_config::PostgresConfigWithUrl; use nexus_db_queries::context::OpContext; use nexus_db_queries::db::DataStore; @@ -105,7 +105,7 @@ fn create_resolver(log: &slog::Logger) -> Result { // default value used here. let subnet = Ipv6Subnet::new("fd00:1122:3344:0100::".parse().unwrap()); eprintln!("note: using DNS server for subnet {}", subnet.net()); - internal_dns::resolver::Resolver::new_from_subnet(log.clone(), subnet) + internal_dns_resolver::Resolver::new_from_subnet(log.clone(), subnet) .with_context(|| { format!("creating DNS resolver for subnet {}", subnet.net()) }) diff --git a/nexus/Cargo.toml b/nexus/Cargo.toml index 1fc4d00abf..3b7737e76f 100644 --- a/nexus/Cargo.toml +++ b/nexus/Cargo.toml @@ -40,7 +40,8 @@ http.workspace = true http-body-util.workspace = true hyper.workspace = true illumos-utils.workspace = true -internal-dns.workspace = true +internal-dns-resolver.workspace = true +internal-dns-types.workspace = true ipnetwork.workspace = true itertools.workspace = true macaddr.workspace = true diff --git a/nexus/db-queries/Cargo.toml b/nexus/db-queries/Cargo.toml index 2059180c59..3aac52f2b6 100644 --- a/nexus/db-queries/Cargo.toml +++ b/nexus/db-queries/Cargo.toml @@ -22,7 +22,7 @@ diesel.workspace = true diesel-dtrace.workspace = true dropshot.workspace = true futures.workspace = true -internal-dns.workspace = true +internal-dns-types.workspace = true ipnetwork.workspace = true macaddr.workspace = true once_cell.workspace = true @@ -78,7 +78,7 @@ expectorate.workspace = true hyper-rustls.workspace = true gateway-client.workspace = true illumos-utils.workspace = true -internal-dns.workspace = true +internal-dns-resolver.workspace = true itertools.workspace = true nexus-inventory.workspace = true nexus-reconfigurator-planning.workspace = true diff --git a/nexus/db-queries/src/db/datastore/rack.rs b/nexus/db-queries/src/db/datastore/rack.rs index 7f1e252a06..534854d2df 100644 --- a/nexus/db-queries/src/db/datastore/rack.rs +++ b/nexus/db-queries/src/db/datastore/rack.rs @@ -1007,6 +1007,7 @@ mod test { use crate::db::model::IpPoolRange; use crate::db::model::Sled; use async_bb8_diesel::AsyncSimpleConnection; + use internal_dns_types::names::DNS_ZONE; use nexus_config::NUM_INITIAL_RESERVED_IP_ADDRESSES; use nexus_db_model::{DnsGroup, Generation, InitialDnsGroup, SledUpdate}; use nexus_inventory::now_db_precision; @@ -1077,14 +1078,14 @@ mod test { service_ip_pool_ranges: vec![], internal_dns: InitialDnsGroup::new( DnsGroup::Internal, - internal_dns::DNS_ZONE, + DNS_ZONE, "test suite", "test suite", HashMap::new(), ), external_dns: InitialDnsGroup::new( DnsGroup::External, - internal_dns::DNS_ZONE, + DNS_ZONE, "test suite", "test suite", HashMap::new(), @@ -1104,7 +1105,7 @@ mod test { }, recovery_silo_fq_dns_name: format!( "test-silo.sys.{}", - internal_dns::DNS_ZONE + DNS_ZONE ), recovery_user_id: "test-user".parse().unwrap(), // empty string password @@ -1782,7 +1783,7 @@ mod test { ]; let internal_dns = InitialDnsGroup::new( DnsGroup::Internal, - internal_dns::DNS_ZONE, + DNS_ZONE, "test suite", "initial test suite internal rev", HashMap::from([("nexus".to_string(), internal_records.clone())]), @@ -1924,10 +1925,7 @@ mod test { .unwrap(); assert_eq!(dns_config_internal.generation, 1); assert_eq!(dns_config_internal.zones.len(), 1); - assert_eq!( - dns_config_internal.zones[0].zone_name, - internal_dns::DNS_ZONE - ); + assert_eq!(dns_config_internal.zones[0].zone_name, DNS_ZONE); assert_eq!( dns_config_internal.zones[0].records, HashMap::from([("nexus".to_string(), internal_records)]), diff --git a/nexus/db-queries/src/db/pool.rs b/nexus/db-queries/src/db/pool.rs index dccee6fa3f..aed194fbf3 100644 --- a/nexus/db-queries/src/db/pool.rs +++ b/nexus/db-queries/src/db/pool.rs @@ -8,6 +8,7 @@ use super::Config as DbConfig; use crate::db::pool_connection::{DieselPgConnector, DieselPgConnectorArgs}; +use internal_dns_types::names::ServiceName; use qorb::backend; use qorb::policy::Policy; use qorb::resolver::{AllBackends, Resolver}; @@ -58,7 +59,7 @@ fn make_dns_resolver( bootstrap_dns: Vec, ) -> qorb::resolver::BoxedResolver { Box::new(DnsResolver::new( - service::Name(internal_dns::ServiceName::Cockroach.srv_name()), + service::Name(ServiceName::Cockroach.srv_name()), bootstrap_dns, DnsResolverConfig { hardcoded_ttl: Some(tokio::time::Duration::MAX), diff --git a/nexus/reconfigurator/execution/Cargo.toml b/nexus/reconfigurator/execution/Cargo.toml index 86de9f044e..e3ccddf846 100644 --- a/nexus/reconfigurator/execution/Cargo.toml +++ b/nexus/reconfigurator/execution/Cargo.toml @@ -16,10 +16,10 @@ clickhouse-admin-api.workspace = true clickhouse-admin-client.workspace = true clickhouse-admin-types.workspace = true cockroach-admin-client.workspace = true -dns-service-client.workspace = true chrono.workspace = true futures.workspace = true -internal-dns.workspace = true +internal-dns-resolver.workspace = true +internal-dns-types.workspace = true newtype-uuid.workspace = true nexus-config.workspace = true nexus-db-model.workspace = true diff --git a/nexus/reconfigurator/execution/src/dns.rs b/nexus/reconfigurator/execution/src/dns.rs index 1aba020339..eea54a246c 100644 --- a/nexus/reconfigurator/execution/src/dns.rs +++ b/nexus/reconfigurator/execution/src/dns.rs @@ -5,7 +5,7 @@ //! Propagates DNS changes in a given blueprint use crate::Sled; -use dns_service_client::DnsDiff; +use internal_dns_types::diff::DnsDiff; use nexus_db_model::DnsGroup; use nexus_db_queries::context::OpContext; use nexus_db_queries::db::datastore::Discoverability; @@ -304,13 +304,12 @@ mod test { use crate::test_utils::overridables_for_test; use crate::test_utils::realize_blueprint_and_expect; use crate::Sled; - use dns_service_client::DnsDiff; - use internal_dns::config::Host; - use internal_dns::config::Zone; - use internal_dns::names::BOUNDARY_NTP_DNS_NAME; - use internal_dns::resolver::Resolver; - use internal_dns::ServiceName; - use internal_dns::DNS_ZONE; + use internal_dns_resolver::Resolver; + use internal_dns_types::config::Host; + use internal_dns_types::config::Zone; + use internal_dns_types::names::ServiceName; + use internal_dns_types::names::BOUNDARY_NTP_DNS_NAME; + use internal_dns_types::names::DNS_ZONE; use nexus_db_model::DnsGroup; use nexus_db_model::Silo; use nexus_db_queries::authn; @@ -1468,8 +1467,8 @@ mod test { let (new_name, &[DnsRecord::Aaaa(_)]) = new_records[0] else { panic!("did not find expected AAAA record for new Nexus zone"); }; - let new_zone_host = internal_dns::config::Host::for_zone( - internal_dns::config::Zone::Other(new_zone_id), + let new_zone_host = internal_dns_types::config::Host::for_zone( + internal_dns_types::config::Zone::Other(new_zone_id), ); assert!(new_zone_host.fqdn().starts_with(new_name)); diff --git a/nexus/reconfigurator/execution/src/lib.rs b/nexus/reconfigurator/execution/src/lib.rs index e46eda470f..e160ddc9a0 100644 --- a/nexus/reconfigurator/execution/src/lib.rs +++ b/nexus/reconfigurator/execution/src/lib.rs @@ -7,7 +7,7 @@ //! See `nexus_reconfigurator_planning` crate-level docs for background. use anyhow::{anyhow, Context}; -use internal_dns::resolver::Resolver; +use internal_dns_resolver::Resolver; use nexus_db_queries::context::OpContext; use nexus_db_queries::db::DataStore; use nexus_types::deployment::execution::*; diff --git a/nexus/reconfigurator/execution/src/omicron_zones.rs b/nexus/reconfigurator/execution/src/omicron_zones.rs index b42ce32f76..b594c5599b 100644 --- a/nexus/reconfigurator/execution/src/omicron_zones.rs +++ b/nexus/reconfigurator/execution/src/omicron_zones.rs @@ -12,8 +12,8 @@ use cockroach_admin_client::types::NodeDecommission; use cockroach_admin_client::types::NodeId; use futures::stream; use futures::StreamExt; -use internal_dns::resolver::Resolver; -use internal_dns::ServiceName; +use internal_dns_resolver::Resolver; +use internal_dns_types::names::ServiceName; use nexus_db_queries::context::OpContext; use nexus_db_queries::db::datastore::CollectorReassignment; use nexus_db_queries::db::DataStore; diff --git a/nexus/reconfigurator/execution/src/test_utils.rs b/nexus/reconfigurator/execution/src/test_utils.rs index 9d48d52049..4e7521dce1 100644 --- a/nexus/reconfigurator/execution/src/test_utils.rs +++ b/nexus/reconfigurator/execution/src/test_utils.rs @@ -6,7 +6,7 @@ use std::net::Ipv6Addr; -use internal_dns::resolver::Resolver; +use internal_dns_resolver::Resolver; use nexus_db_queries::{context::OpContext, db::DataStore}; use nexus_types::deployment::{ execution::{EventBuffer, Overridables}, diff --git a/nexus/reconfigurator/planning/Cargo.toml b/nexus/reconfigurator/planning/Cargo.toml index 42a89c35df..9607e26394 100644 --- a/nexus/reconfigurator/planning/Cargo.toml +++ b/nexus/reconfigurator/planning/Cargo.toml @@ -13,7 +13,7 @@ chrono.workspace = true debug-ignore.workspace = true gateway-client.workspace = true indexmap.workspace = true -internal-dns.workspace = true +internal-dns-resolver.workspace = true ipnet.workspace = true nexus-config.workspace = true nexus-inventory.workspace = true diff --git a/nexus/src/app/background/init.rs b/nexus/src/app/background/init.rs index 69221779ee..fdd2fb7c90 100644 --- a/nexus/src/app/background/init.rs +++ b/nexus/src/app/background/init.rs @@ -857,7 +857,7 @@ pub struct BackgroundTasksData { pub nexus_id: OmicronZoneUuid, /// internal DNS DNS resolver, used when tasks need to contact other /// internal services - pub resolver: internal_dns::resolver::Resolver, + pub resolver: internal_dns_resolver::Resolver, /// handle to saga subsystem for starting sagas pub saga_starter: Arc, /// Oximeter producer registry (for metrics) @@ -874,7 +874,7 @@ fn init_dns( opctx: &OpContext, datastore: Arc, dns_group: DnsGroup, - resolver: internal_dns::resolver::Resolver, + resolver: internal_dns_resolver::Resolver, config: &DnsTasksConfig, task_config: &Activator, task_servers: &Activator, @@ -949,12 +949,14 @@ pub mod test { use crate::app::saga::StartSaga; use dropshot::HandlerTaskMode; use futures::FutureExt; + use internal_dns_types::names::ServiceName; use nexus_db_model::DnsGroup; use nexus_db_queries::context::OpContext; use nexus_db_queries::db::datastore::DnsVersionUpdateBuilder; use nexus_db_queries::db::DataStore; use nexus_test_utils_macros::nexus_test; use nexus_types::internal_api::params as nexus_params; + use nexus_types::internal_api::params::DnsRecord; use omicron_common::api::external::Error; use omicron_test_utils::dev::poll; use std::net::SocketAddr; @@ -1057,8 +1059,7 @@ pub mod test { .expect("failed to get initial DNS server config"); assert_eq!(config.generation, 1); - let internal_dns_srv_name = - internal_dns::ServiceName::InternalDns.dns_name(); + let internal_dns_srv_name = ServiceName::InternalDns.dns_name(); let initial_srv_record = { let zone = @@ -1067,7 +1068,7 @@ pub mod test { panic!("zone must have a record for {internal_dns_srv_name}") }; match record.get(0) { - Some(dns_service_client::types::DnsRecord::Srv(srv)) => srv, + Some(DnsRecord::Srv(srv)) => srv, record => panic!( "expected a SRV record for {internal_dns_srv_name}, found \ {record:?}" diff --git a/nexus/src/app/background/tasks/bfd.rs b/nexus/src/app/background/tasks/bfd.rs index 67b15ee3d3..c37d3e5c58 100644 --- a/nexus/src/app/background/tasks/bfd.rs +++ b/nexus/src/app/background/tasks/bfd.rs @@ -12,7 +12,8 @@ use crate::app::{ use crate::app::background::BackgroundTask; use futures::future::BoxFuture; use futures::FutureExt; -use internal_dns::{resolver::Resolver, ServiceName}; +use internal_dns_resolver::Resolver; +use internal_dns_types::names::ServiceName; use mg_admin_client::types::{BfdPeerConfig, SessionMode}; use nexus_db_model::{BfdMode, BfdSession}; use nexus_db_queries::{context::OpContext, db::DataStore}; diff --git a/nexus/src/app/background/tasks/blueprint_execution.rs b/nexus/src/app/background/tasks/blueprint_execution.rs index 5a005a5e47..f229632f2f 100644 --- a/nexus/src/app/background/tasks/blueprint_execution.rs +++ b/nexus/src/app/background/tasks/blueprint_execution.rs @@ -7,7 +7,7 @@ use crate::app::background::{Activator, BackgroundTask}; use futures::future::BoxFuture; use futures::FutureExt; -use internal_dns::resolver::Resolver; +use internal_dns_resolver::Resolver; use nexus_db_queries::context::OpContext; use nexus_db_queries::db::DataStore; use nexus_reconfigurator_execution::RealizeBlueprintOutput; diff --git a/nexus/src/app/background/tasks/dns_config.rs b/nexus/src/app/background/tasks/dns_config.rs index 1b0f627870..192724a89c 100644 --- a/nexus/src/app/background/tasks/dns_config.rs +++ b/nexus/src/app/background/tasks/dns_config.rs @@ -5,9 +5,9 @@ //! Background task for keeping track of DNS configuration use crate::app::background::BackgroundTask; -use dns_service_client::types::DnsConfigParams; use futures::future::BoxFuture; use futures::FutureExt; +use internal_dns_types::config::DnsConfigParams; use nexus_db_model::DnsGroup; use nexus_db_queries::context::OpContext; use nexus_db_queries::db::DataStore; diff --git a/nexus/src/app/background/tasks/dns_propagation.rs b/nexus/src/app/background/tasks/dns_propagation.rs index c680a6f010..9dd698fa37 100644 --- a/nexus/src/app/background/tasks/dns_propagation.rs +++ b/nexus/src/app/background/tasks/dns_propagation.rs @@ -7,11 +7,11 @@ use super::dns_servers::DnsServersList; use crate::app::background::BackgroundTask; use anyhow::Context; -use dns_service_client::types::DnsConfigParams; use futures::future::BoxFuture; use futures::stream; use futures::FutureExt; use futures::StreamExt; +use internal_dns_types::config::DnsConfigParams; use nexus_db_queries::context::OpContext; use serde_json::json; use std::collections::BTreeMap; @@ -180,12 +180,12 @@ mod test { use super::DnsPropagator; use crate::app::background::tasks::dns_servers::DnsServersList; use crate::app::background::BackgroundTask; - use dns_service_client::types::DnsConfigParams; use httptest::matchers::request; use httptest::responders::status_code; use httptest::Expectation; use nexus_db_queries::context::OpContext; use nexus_test_utils_macros::nexus_test; + use nexus_types::internal_api::params::DnsConfigParams; use serde::Deserialize; use serde_json::json; use std::collections::BTreeMap; diff --git a/nexus/src/app/background/tasks/dns_servers.rs b/nexus/src/app/background/tasks/dns_servers.rs index 9d99460917..3b1e32a237 100644 --- a/nexus/src/app/background/tasks/dns_servers.rs +++ b/nexus/src/app/background/tasks/dns_servers.rs @@ -7,8 +7,8 @@ use crate::app::background::BackgroundTask; use futures::future::BoxFuture; use futures::FutureExt; -use internal_dns::names::ServiceName; -use internal_dns::resolver::Resolver; +use internal_dns_resolver::Resolver; +use internal_dns_types::names::ServiceName; use nexus_db_model::DnsGroup; use nexus_db_queries::context::OpContext; use serde::Serialize; diff --git a/nexus/src/app/background/tasks/inventory_collection.rs b/nexus/src/app/background/tasks/inventory_collection.rs index 1e2d3bda1f..2c95092a5e 100644 --- a/nexus/src/app/background/tasks/inventory_collection.rs +++ b/nexus/src/app/background/tasks/inventory_collection.rs @@ -9,7 +9,7 @@ use anyhow::ensure; use anyhow::Context; use futures::future::BoxFuture; use futures::FutureExt; -use internal_dns::ServiceName; +use internal_dns_types::names::ServiceName; use nexus_db_queries::context::OpContext; use nexus_db_queries::db::DataStore; use nexus_inventory::InventoryError; @@ -23,7 +23,7 @@ use tokio::sync::watch; /// Background task that reads inventory for the rack pub struct InventoryCollector { datastore: Arc, - resolver: internal_dns::resolver::Resolver, + resolver: internal_dns_resolver::Resolver, creator: String, nkeep: u32, disable: bool, @@ -33,7 +33,7 @@ pub struct InventoryCollector { impl InventoryCollector { pub fn new( datastore: Arc, - resolver: internal_dns::resolver::Resolver, + resolver: internal_dns_resolver::Resolver, creator: &str, nkeep: u32, disable: bool, @@ -99,7 +99,7 @@ impl BackgroundTask for InventoryCollector { async fn inventory_activate( opctx: &OpContext, datastore: &DataStore, - resolver: &internal_dns::resolver::Resolver, + resolver: &internal_dns_resolver::Resolver, creator: &str, nkeep: u32, disabled: bool, @@ -221,7 +221,7 @@ mod test { datastore.clone(), ); - let resolver = internal_dns::resolver::Resolver::new_from_addrs( + let resolver = internal_dns_resolver::Resolver::new_from_addrs( cptestctx.logctx.log.clone(), &[cptestctx.internal_dns.dns_server.local_address()], ) diff --git a/nexus/src/app/background/tasks/nat_cleanup.rs b/nexus/src/app/background/tasks/nat_cleanup.rs index 675f4fc809..f8bfdc0bd9 100644 --- a/nexus/src/app/background/tasks/nat_cleanup.rs +++ b/nexus/src/app/background/tasks/nat_cleanup.rs @@ -13,8 +13,8 @@ use crate::app::background::BackgroundTask; use chrono::{Duration, Utc}; use futures::future::BoxFuture; use futures::FutureExt; -use internal_dns::resolver::Resolver; -use internal_dns::ServiceName; +use internal_dns_resolver::Resolver; +use internal_dns_types::names::ServiceName; use nexus_db_queries::context::OpContext; use nexus_db_queries::db::DataStore; use serde_json::json; diff --git a/nexus/src/app/background/tasks/sync_service_zone_nat.rs b/nexus/src/app/background/tasks/sync_service_zone_nat.rs index 4fbef3ae2e..6ef11e608d 100644 --- a/nexus/src/app/background/tasks/sync_service_zone_nat.rs +++ b/nexus/src/app/background/tasks/sync_service_zone_nat.rs @@ -12,8 +12,8 @@ use crate::app::background::BackgroundTask; use anyhow::Context; use futures::future::BoxFuture; use futures::FutureExt; -use internal_dns::resolver::Resolver; -use internal_dns::ServiceName; +use internal_dns_resolver::Resolver; +use internal_dns_types::names::ServiceName; use nexus_db_model::Ipv4NatValues; use nexus_db_queries::context::OpContext; use nexus_db_queries::db::lookup::LookupPath; diff --git a/nexus/src/app/background/tasks/sync_switch_configuration.rs b/nexus/src/app/background/tasks/sync_switch_configuration.rs index 3d3ad84627..49dbfb2e52 100644 --- a/nexus/src/app/background/tasks/sync_switch_configuration.rs +++ b/nexus/src/app/background/tasks/sync_switch_configuration.rs @@ -14,8 +14,8 @@ use crate::app::{ use oxnet::Ipv4Net; use slog::o; -use internal_dns::resolver::Resolver; -use internal_dns::ServiceName; +use internal_dns_resolver::Resolver; +use internal_dns_types::names::ServiceName; use ipnetwork::IpNetwork; use nexus_db_model::{ AddressLotBlock, BgpConfig, BootstoreConfig, LoopbackAddress, diff --git a/nexus/src/app/instance_network.rs b/nexus/src/app/instance_network.rs index 8cd0a34fbf..dc4162d353 100644 --- a/nexus/src/app/instance_network.rs +++ b/nexus/src/app/instance_network.rs @@ -261,7 +261,7 @@ pub(crate) async fn boundary_switches( pub(crate) async fn instance_ensure_dpd_config( datastore: &DataStore, log: &slog::Logger, - resolver: &internal_dns::resolver::Resolver, + resolver: &internal_dns_resolver::Resolver, opctx: &OpContext, opctx_alloc: &OpContext, instance_id: InstanceUuid, @@ -538,7 +538,7 @@ pub(crate) async fn probe_ensure_dpd_config( pub(crate) async fn instance_delete_dpd_config( datastore: &DataStore, log: &slog::Logger, - resolver: &internal_dns::resolver::Resolver, + resolver: &internal_dns_resolver::Resolver, opctx: &OpContext, opctx_alloc: &OpContext, authz_instance: &authz::Instance, @@ -574,7 +574,7 @@ pub(crate) async fn instance_delete_dpd_config( pub(crate) async fn probe_delete_dpd_config( datastore: &DataStore, log: &slog::Logger, - resolver: &internal_dns::resolver::Resolver, + resolver: &internal_dns_resolver::Resolver, opctx: &OpContext, opctx_alloc: &OpContext, probe_id: Uuid, @@ -659,7 +659,7 @@ pub(crate) async fn probe_delete_dpd_config( /// e.g. a rapid reattach or a reallocated ephemeral IP. pub(crate) async fn delete_dpd_config_by_entry( datastore: &DataStore, - resolver: &internal_dns::resolver::Resolver, + resolver: &internal_dns_resolver::Resolver, log: &slog::Logger, opctx: &OpContext, opctx_alloc: &OpContext, @@ -730,7 +730,7 @@ async fn external_ip_delete_dpd_config_inner( async fn notify_dendrite_nat_state( datastore: &DataStore, log: &slog::Logger, - resolver: &internal_dns::resolver::Resolver, + resolver: &internal_dns_resolver::Resolver, opctx_alloc: &OpContext, instance_id: Option, fail_fast: bool, diff --git a/nexus/src/app/mod.rs b/nexus/src/app/mod.rs index 050828880a..6bc4750259 100644 --- a/nexus/src/app/mod.rs +++ b/nexus/src/app/mod.rs @@ -15,7 +15,7 @@ use crate::populate::PopulateStatus; use crate::DropshotServer; use ::oximeter::types::ProducerRegistry; use anyhow::anyhow; -use internal_dns::ServiceName; +use internal_dns_types::names::ServiceName; use nexus_config::NexusConfig; use nexus_config::RegionAllocationStrategy; use nexus_config::Tunables; @@ -187,7 +187,7 @@ pub struct Nexus { samael_max_issue_delay: std::sync::Mutex>, /// DNS resolver for internal services - internal_resolver: internal_dns::resolver::Resolver, + internal_resolver: internal_dns_resolver::Resolver, /// DNS resolver Nexus uses to resolve an external host external_resolver: Arc, @@ -217,7 +217,7 @@ impl Nexus { pub(crate) async fn new_with_id( rack_id: Uuid, log: Logger, - resolver: internal_dns::resolver::Resolver, + resolver: internal_dns_resolver::Resolver, pool: db::Pool, producer_registry: &ProducerRegistry, config: &NexusConfig, @@ -932,7 +932,7 @@ impl Nexus { *mid } - pub fn resolver(&self) -> &internal_dns::resolver::Resolver { + pub fn resolver(&self) -> &internal_dns_resolver::Resolver { &self.internal_resolver } @@ -993,7 +993,7 @@ pub enum Unimpl { } pub(crate) async fn dpd_clients( - resolver: &internal_dns::resolver::Resolver, + resolver: &internal_dns_resolver::Resolver, log: &slog::Logger, ) -> Result, String> { let mappings = switch_zone_address_mappings(resolver, log).await?; @@ -1020,7 +1020,7 @@ pub(crate) async fn dpd_clients( } async fn switch_zone_address_mappings( - resolver: &internal_dns::resolver::Resolver, + resolver: &internal_dns_resolver::Resolver, log: &slog::Logger, ) -> Result, String> { let switch_zone_addresses = match resolver diff --git a/nexus/src/app/oximeter.rs b/nexus/src/app/oximeter.rs index b935c95349..770b5ac61b 100644 --- a/nexus/src/app/oximeter.rs +++ b/nexus/src/app/oximeter.rs @@ -7,8 +7,8 @@ use crate::external_api::params::ResourceMetrics; use crate::internal_api::params::OximeterInfo; use dropshot::PaginationParams; -use internal_dns::resolver::{ResolveError, Resolver}; -use internal_dns::ServiceName; +use internal_dns_resolver::{ResolveError, Resolver}; +use internal_dns_types::names::ServiceName; use nexus_db_queries::context::OpContext; use nexus_db_queries::db; use nexus_db_queries::db::DataStore; diff --git a/nexus/src/app/rack.rs b/nexus/src/app/rack.rs index bc85a2f78d..9a361d564d 100644 --- a/nexus/src/app/rack.rs +++ b/nexus/src/app/rack.rs @@ -9,6 +9,7 @@ use crate::external_api::params::CertificateCreate; use crate::external_api::shared::ServiceUsingCertificate; use crate::internal_api::params::RackInitializationRequest; use gateway_client::types::SpType; +use internal_dns_types::names::DNS_ZONE; use ipnetwork::{IpNetwork, Ipv6Network}; use nexus_db_model::DnsGroup; use nexus_db_model::InitialDnsGroup; @@ -177,7 +178,7 @@ impl super::Nexus { .internal_dns_zone_config .zones .into_iter() - .find(|z| z.zone_name == internal_dns::DNS_ZONE) + .find(|z| z.zone_name == DNS_ZONE) .ok_or_else(|| { Error::invalid_request( "expected initial DNS config to include control plane zone", diff --git a/nexus/src/app/sagas/common_storage.rs b/nexus/src/app/sagas/common_storage.rs index d37370506c..0e2927d719 100644 --- a/nexus/src/app/sagas/common_storage.rs +++ b/nexus/src/app/sagas/common_storage.rs @@ -8,7 +8,7 @@ use super::*; use crate::Nexus; use crucible_pantry_client::types::VolumeConstructionRequest; -use internal_dns::ServiceName; +use internal_dns_types::names::ServiceName; use nexus_db_queries::authz; use nexus_db_queries::context::OpContext; use nexus_db_queries::db; diff --git a/nexus/src/context.rs b/nexus/src/context.rs index a2a50958e4..a630f53576 100644 --- a/nexus/src/context.rs +++ b/nexus/src/context.rs @@ -221,7 +221,7 @@ impl ServerContext { az_subnet ); let resolver = - internal_dns::resolver::Resolver::new_from_subnet( + internal_dns_resolver::Resolver::new_from_subnet( log.new(o!("component" => "DnsResolver")), az_subnet, ) @@ -231,7 +231,7 @@ impl ServerContext { ( resolver, - internal_dns::resolver::Resolver::servers_from_subnet( + internal_dns_resolver::Resolver::servers_from_subnet( az_subnet, ), ) @@ -242,14 +242,11 @@ impl ServerContext { "Setting up resolver using DNS address: {:?}", address ); - let resolver = - internal_dns::resolver::Resolver::new_from_addrs( - log.new(o!("component" => "DnsResolver")), - &[address], - ) - .map_err(|e| { - format!("Failed to create DNS resolver: {}", e) - })?; + let resolver = internal_dns_resolver::Resolver::new_from_addrs( + log.new(o!("component" => "DnsResolver")), + &[address], + ) + .map_err(|e| format!("Failed to create DNS resolver: {}", e))?; (resolver, vec![address]) } diff --git a/nexus/test-utils/Cargo.toml b/nexus/test-utils/Cargo.toml index aa5a3096c4..c22a03a2f9 100644 --- a/nexus/test-utils/Cargo.toml +++ b/nexus/test-utils/Cargo.toml @@ -25,7 +25,8 @@ http.workspace = true http-body-util.workspace = true hyper.workspace = true illumos-utils.workspace = true -internal-dns.workspace = true +internal-dns-resolver.workspace = true +internal-dns-types.workspace = true nexus-client.workspace = true nexus-config.workspace = true nexus-db-queries.workspace = true diff --git a/nexus/test-utils/src/lib.rs b/nexus/test-utils/src/lib.rs index e80f8c0ae0..d69abbd93e 100644 --- a/nexus/test-utils/src/lib.rs +++ b/nexus/test-utils/src/lib.rs @@ -9,7 +9,6 @@ use anyhow::Context; use anyhow::Result; use camino::Utf8Path; use chrono::Utc; -use dns_service_client::types::DnsConfigParams; use dropshot::test_util::ClientTestContext; use dropshot::test_util::LogContext; use dropshot::ConfigLogging; @@ -23,6 +22,9 @@ use hickory_resolver::config::Protocol; use hickory_resolver::config::ResolverConfig; use hickory_resolver::config::ResolverOpts; use hickory_resolver::TokioAsyncResolver; +use internal_dns_types::config::DnsConfigBuilder; +use internal_dns_types::names::ServiceName; +use internal_dns_types::names::DNS_ZONE_EXTERNAL_TESTING; use nexus_config::Database; use nexus_config::DpdConfig; use nexus_config::InternalDns; @@ -45,6 +47,7 @@ use nexus_types::deployment::OmicronZoneExternalFloatingIp; use nexus_types::external_api::views::SledState; use nexus_types::internal_api::params::DatasetCreateRequest; use nexus_types::internal_api::params::DatasetPutRequest; +use nexus_types::internal_api::params::DnsConfigParams; use omicron_common::address::DNS_OPTE_IPV4_SUBNET; use omicron_common::address::NEXUS_OPTE_IPV4_SUBNET; use omicron_common::api::external::Generation; @@ -203,7 +206,7 @@ pub async fn test_setup( struct RackInitRequestBuilder { datasets: Vec, - internal_dns_config: internal_dns::DnsConfigBuilder, + internal_dns_config: DnsConfigBuilder, mac_addrs: Box + Send>, } @@ -211,7 +214,7 @@ impl RackInitRequestBuilder { fn new() -> Self { Self { datasets: vec![], - internal_dns_config: internal_dns::DnsConfigBuilder::new(), + internal_dns_config: DnsConfigBuilder::new(), mac_addrs: Box::new(MacAddr::iter_system()), } } @@ -220,7 +223,7 @@ impl RackInitRequestBuilder { &mut self, zone_id: OmicronZoneUuid, address: SocketAddrV6, - service_name: internal_dns::ServiceName, + service_name: ServiceName, ) { let zone = self .internal_dns_config @@ -240,7 +243,7 @@ impl RackInitRequestBuilder { dataset_id: Uuid, address: SocketAddrV6, kind: DatasetKind, - service_name: internal_dns::ServiceName, + service_name: ServiceName, ) { self.datasets.push(DatasetCreateRequest { zpool_id: zpool_id.into_untyped_uuid(), @@ -280,7 +283,7 @@ impl RackInitRequestBuilder { .host_zone_clickhouse( OmicronZoneUuid::from_untyped_uuid(dataset_id), *address.ip(), - internal_dns::ServiceName::Clickhouse, + ServiceName::Clickhouse, address.port(), ) .expect("Failed to setup ClickHouse DNS"); @@ -448,7 +451,7 @@ impl<'a, N: NexusServer> ControlPlaneTestContextBuilder<'a, N> { dataset_id, address, DatasetKind::Cockroach, - internal_dns::ServiceName::Cockroach, + ServiceName::Cockroach, ); let pool_name = illumos_utils::zpool::ZpoolName::new_external(zpool_id) .to_string() @@ -692,7 +695,7 @@ impl<'a, N: NexusServer> ControlPlaneTestContextBuilder<'a, N> { self.rack_init_builder.add_service_to_dns( nexus_id, address, - internal_dns::ServiceName::Nexus, + ServiceName::Nexus, ); self.blueprint_zones.push(BlueprintZoneConfig { @@ -778,8 +781,7 @@ impl<'a, N: NexusServer> ControlPlaneTestContextBuilder<'a, N> { ); // Create a recovery silo - let external_dns_zone_name = - internal_dns::names::DNS_ZONE_EXTERNAL_TESTING.to_string(); + let external_dns_zone_name = DNS_ZONE_EXTERNAL_TESTING.to_string(); let silo_name: Name = "test-suite-silo".parse().unwrap(); let user_name = UserId::try_from("test-privileged".to_string()).unwrap(); @@ -1019,7 +1021,7 @@ impl<'a, N: NexusServer> ControlPlaneTestContextBuilder<'a, N> { self.rack_init_builder.add_service_to_dns( zone_id, address, - internal_dns::ServiceName::CruciblePantry, + ServiceName::CruciblePantry, ); self.blueprint_zones.push(BlueprintZoneConfig { disposition: BlueprintZoneDisposition::InService, @@ -1055,7 +1057,7 @@ impl<'a, N: NexusServer> ControlPlaneTestContextBuilder<'a, N> { self.rack_init_builder.add_service_to_dns( zone_id, dropshot_address, - internal_dns::ServiceName::ExternalDns, + ServiceName::ExternalDns, ); let zpool_id = ZpoolUuid::new_v4(); @@ -1118,7 +1120,7 @@ impl<'a, N: NexusServer> ControlPlaneTestContextBuilder<'a, N> { self.rack_init_builder.add_service_to_dns( zone_id, http_address, - internal_dns::ServiceName::InternalDns, + ServiceName::InternalDns, ); let zpool_id = ZpoolUuid::new_v4(); diff --git a/nexus/tests/integration_tests/certificates.rs b/nexus/tests/integration_tests/certificates.rs index e855a7e57b..ea3979c7b9 100644 --- a/nexus/tests/integration_tests/certificates.rs +++ b/nexus/tests/integration_tests/certificates.rs @@ -10,7 +10,7 @@ use dropshot::HttpErrorResponseBody; use futures::TryStreamExt; use http::method::Method; use http::StatusCode; -use internal_dns::names::DNS_ZONE_EXTERNAL_TESTING; +use internal_dns_types::names::DNS_ZONE_EXTERNAL_TESTING; use nexus_test_utils::http_testing::AuthnMode; use nexus_test_utils::http_testing::NexusRequest; use nexus_test_utils::load_test_config; diff --git a/nexus/tests/integration_tests/console_api.rs b/nexus/tests/integration_tests/console_api.rs index 479baf2fec..505821abe2 100644 --- a/nexus/tests/integration_tests/console_api.rs +++ b/nexus/tests/integration_tests/console_api.rs @@ -12,7 +12,7 @@ use std::env::current_dir; use crate::integration_tests::saml::SAML_RESPONSE_IDP_DESCRIPTOR; use base64::Engine; -use internal_dns::names::DNS_ZONE_EXTERNAL_TESTING; +use internal_dns_types::names::DNS_ZONE_EXTERNAL_TESTING; use nexus_db_queries::authn::{USER_TEST_PRIVILEGED, USER_TEST_UNPRIVILEGED}; use nexus_db_queries::db::fixed_data::silo::DEFAULT_SILO; use nexus_db_queries::db::identity::{Asset, Resource}; diff --git a/nexus/tests/integration_tests/endpoints.rs b/nexus/tests/integration_tests/endpoints.rs index 45be9c912b..d6f83063a0 100644 --- a/nexus/tests/integration_tests/endpoints.rs +++ b/nexus/tests/integration_tests/endpoints.rs @@ -10,7 +10,7 @@ use crate::integration_tests::unauthorized::HTTP_SERVER; use chrono::Utc; use http::method::Method; -use internal_dns::names::DNS_ZONE_EXTERNAL_TESTING; +use internal_dns_types::names::DNS_ZONE_EXTERNAL_TESTING; use nexus_db_queries::authn; use nexus_db_queries::db::fixed_data::silo::DEFAULT_SILO; use nexus_db_queries::db::identity::Resource; diff --git a/nexus/types/Cargo.toml b/nexus/types/Cargo.toml index f85cdd41ac..5f21652feb 100644 --- a/nexus/types/Cargo.toml +++ b/nexus/types/Cargo.toml @@ -42,9 +42,8 @@ update-engine.workspace = true uuid.workspace = true api_identity.workspace = true -dns-service-client.workspace = true gateway-client.workspace = true -internal-dns.workspace = true +internal-dns-types.workspace = true nexus-sled-agent-shared.workspace = true omicron-common.workspace = true omicron-passwords.workspace = true diff --git a/nexus/types/src/deployment/execution/dns.rs b/nexus/types/src/deployment/execution/dns.rs index eff944ff47..a813452ccd 100644 --- a/nexus/types/src/deployment/execution/dns.rs +++ b/nexus/types/src/deployment/execution/dns.rs @@ -7,7 +7,7 @@ use std::{ net::IpAddr, }; -use internal_dns::{DnsConfigBuilder, ServiceName}; +use internal_dns_types::{config::DnsConfigBuilder, names::ServiceName}; use omicron_common::api::external::Name; use omicron_uuid_kinds::SledUuid; diff --git a/nexus/types/src/internal_api/params.rs b/nexus/types/src/internal_api/params.rs index c803f003f1..77677687a3 100644 --- a/nexus/types/src/internal_api/params.rs +++ b/nexus/types/src/internal_api/params.rs @@ -180,7 +180,7 @@ pub struct RackInitializationRequest { /// x.509 Certificates used to encrypt communication with the external API. pub certs: Vec, /// initial internal DNS config - pub internal_dns_zone_config: dns_service_client::types::DnsConfigParams, + pub internal_dns_zone_config: internal_dns_types::config::DnsConfigParams, /// delegated DNS name for external DNS pub external_dns_zone_name: String, /// configuration for the initial (recovery) Silo @@ -193,10 +193,10 @@ pub struct RackInitializationRequest { pub allowed_source_ips: AllowedSourceIps, } -pub type DnsConfigParams = dns_service_client::types::DnsConfigParams; -pub type DnsConfigZone = dns_service_client::types::DnsConfigZone; -pub type DnsRecord = dns_service_client::types::DnsRecord; -pub type Srv = dns_service_client::types::Srv; +pub type DnsConfigParams = internal_dns_types::config::DnsConfigParams; +pub type DnsConfigZone = internal_dns_types::config::DnsConfigZone; +pub type DnsRecord = internal_dns_types::config::DnsRecord; +pub type Srv = internal_dns_types::config::Srv; /// Message used to notify Nexus that this oximeter instance is up and running. #[derive(Debug, Clone, Copy, JsonSchema, Serialize, Deserialize)] diff --git a/openapi/nexus-internal.json b/openapi/nexus-internal.json index 9226b9d319..7d762ecc5b 100644 --- a/openapi/nexus-internal.json +++ b/openapi/nexus-internal.json @@ -3062,7 +3062,6 @@ ] }, "DnsConfigParams": { - "description": "DnsConfigParams\n\n
JSON schema\n\n```json { \"type\": \"object\", \"required\": [ \"generation\", \"time_created\", \"zones\" ], \"properties\": { \"generation\": { \"type\": \"integer\", \"format\": \"uint64\", \"minimum\": 0.0 }, \"time_created\": { \"type\": \"string\", \"format\": \"date-time\" }, \"zones\": { \"type\": \"array\", \"items\": { \"$ref\": \"#/components/schemas/DnsConfigZone\" } } } } ```
", "type": "object", "properties": { "generation": { @@ -3088,7 +3087,6 @@ ] }, "DnsConfigZone": { - "description": "DnsConfigZone\n\n
JSON schema\n\n```json { \"type\": \"object\", \"required\": [ \"records\", \"zone_name\" ], \"properties\": { \"records\": { \"type\": \"object\", \"additionalProperties\": { \"type\": \"array\", \"items\": { \"$ref\": \"#/components/schemas/DnsRecord\" } } }, \"zone_name\": { \"type\": \"string\" } } } ```
", "type": "object", "properties": { "records": { @@ -3110,7 +3108,6 @@ ] }, "DnsRecord": { - "description": "DnsRecord\n\n
JSON schema\n\n```json { \"oneOf\": [ { \"type\": \"object\", \"required\": [ \"data\", \"type\" ], \"properties\": { \"data\": { \"type\": \"string\", \"format\": \"ipv4\" }, \"type\": { \"type\": \"string\", \"enum\": [ \"A\" ] } } }, { \"type\": \"object\", \"required\": [ \"data\", \"type\" ], \"properties\": { \"data\": { \"type\": \"string\", \"format\": \"ipv6\" }, \"type\": { \"type\": \"string\", \"enum\": [ \"AAAA\" ] } } }, { \"type\": \"object\", \"required\": [ \"data\", \"type\" ], \"properties\": { \"data\": { \"$ref\": \"#/components/schemas/Srv\" }, \"type\": { \"type\": \"string\", \"enum\": [ \"SRV\" ] } } } ] } ```
", "oneOf": [ { "type": "object", @@ -5327,7 +5324,6 @@ ] }, "Srv": { - "description": "Srv\n\n
JSON schema\n\n```json { \"type\": \"object\", \"required\": [ \"port\", \"prio\", \"target\", \"weight\" ], \"properties\": { \"port\": { \"type\": \"integer\", \"format\": \"uint16\", \"minimum\": 0.0 }, \"prio\": { \"type\": \"integer\", \"format\": \"uint16\", \"minimum\": 0.0 }, \"target\": { \"type\": \"string\" }, \"weight\": { \"type\": \"integer\", \"format\": \"uint16\", \"minimum\": 0.0 } } } ```
", "type": "object", "properties": { "port": { diff --git a/oximeter/collector/Cargo.toml b/oximeter/collector/Cargo.toml index f8f8e147ec..a70ddd51cd 100644 --- a/oximeter/collector/Cargo.toml +++ b/oximeter/collector/Cargo.toml @@ -15,7 +15,8 @@ chrono.workspace = true clap.workspace = true dropshot.workspace = true futures.workspace = true -internal-dns.workspace = true +internal-dns-resolver.workspace = true +internal-dns-types.workspace = true nexus-types.workspace = true omicron-common.workspace = true oximeter.workspace = true diff --git a/oximeter/collector/src/agent.rs b/oximeter/collector/src/agent.rs index 60d5a7766b..7b1574ca1f 100644 --- a/oximeter/collector/src/agent.rs +++ b/oximeter/collector/src/agent.rs @@ -14,8 +14,8 @@ use anyhow::anyhow; use chrono::DateTime; use chrono::Utc; use futures::TryStreamExt; -use internal_dns::resolver::Resolver; -use internal_dns::ServiceName; +use internal_dns_resolver::Resolver; +use internal_dns_types::names::ServiceName; use nexus_client::types::IdSortMode; use omicron_common::backoff; use omicron_common::backoff::BackoffError; diff --git a/oximeter/collector/src/lib.rs b/oximeter/collector/src/lib.rs index 0576c7d532..fa3d755dca 100644 --- a/oximeter/collector/src/lib.rs +++ b/oximeter/collector/src/lib.rs @@ -11,9 +11,9 @@ use dropshot::ConfigLogging; use dropshot::HttpError; use dropshot::HttpServer; use dropshot::HttpServerStarter; -use internal_dns::resolver::ResolveError; -use internal_dns::resolver::Resolver; -use internal_dns::ServiceName; +use internal_dns_resolver::ResolveError; +use internal_dns_resolver::Resolver; +use internal_dns_types::names::ServiceName; use omicron_common::api::internal::nexus::ProducerEndpoint; use omicron_common::backoff; use omicron_common::FileKv; diff --git a/oximeter/producer/Cargo.toml b/oximeter/producer/Cargo.toml index dfac555a49..cc1036a824 100644 --- a/oximeter/producer/Cargo.toml +++ b/oximeter/producer/Cargo.toml @@ -11,6 +11,8 @@ workspace = true [dependencies] chrono.workspace = true dropshot.workspace = true +internal-dns-resolver.workspace = true +internal-dns-types.workspace = true nexus-client.workspace = true omicron-common.workspace = true oximeter.workspace = true @@ -22,7 +24,6 @@ tokio.workspace = true thiserror.workspace = true uuid.workspace = true omicron-workspace-hack.workspace = true -internal-dns.workspace = true [dev-dependencies] anyhow.workspace = true diff --git a/oximeter/producer/src/lib.rs b/oximeter/producer/src/lib.rs index e9223b62f3..4bde5f69ff 100644 --- a/oximeter/producer/src/lib.rs +++ b/oximeter/producer/src/lib.rs @@ -15,9 +15,9 @@ use dropshot::HttpServer; use dropshot::HttpServerStarter; use dropshot::Path; use dropshot::RequestContext; -use internal_dns::resolver::ResolveError; -use internal_dns::resolver::Resolver; -use internal_dns::ServiceName; +use internal_dns_resolver::ResolveError; +use internal_dns_resolver::Resolver; +use internal_dns_types::names::ServiceName; use nexus_client::types::ProducerEndpoint as ApiProducerEndpoint; use omicron_common::api::internal::nexus::ProducerEndpoint; use omicron_common::backoff; diff --git a/schema/rss-service-plan-v4.json b/schema/rss-service-plan-v4.json index 0b29ffdd38..8b9260c208 100644 --- a/schema/rss-service-plan-v4.json +++ b/schema/rss-service-plan-v4.json @@ -459,7 +459,6 @@ } }, "DnsConfigParams": { - "description": "DnsConfigParams\n\n
JSON schema\n\n```json { \"type\": \"object\", \"required\": [ \"generation\", \"time_created\", \"zones\" ], \"properties\": { \"generation\": { \"type\": \"integer\", \"format\": \"uint64\", \"minimum\": 0.0 }, \"time_created\": { \"type\": \"string\", \"format\": \"date-time\" }, \"zones\": { \"type\": \"array\", \"items\": { \"$ref\": \"#/components/schemas/DnsConfigZone\" } } } } ```
", "type": "object", "required": [ "generation", @@ -485,7 +484,6 @@ } }, "DnsConfigZone": { - "description": "DnsConfigZone\n\n
JSON schema\n\n```json { \"type\": \"object\", \"required\": [ \"records\", \"zone_name\" ], \"properties\": { \"records\": { \"type\": \"object\", \"additionalProperties\": { \"type\": \"array\", \"items\": { \"$ref\": \"#/components/schemas/DnsRecord\" } } }, \"zone_name\": { \"type\": \"string\" } } } ```
", "type": "object", "required": [ "records", @@ -507,7 +505,6 @@ } }, "DnsRecord": { - "description": "DnsRecord\n\n
JSON schema\n\n```json { \"oneOf\": [ { \"type\": \"object\", \"required\": [ \"data\", \"type\" ], \"properties\": { \"data\": { \"type\": \"string\", \"format\": \"ipv4\" }, \"type\": { \"type\": \"string\", \"enum\": [ \"A\" ] } } }, { \"type\": \"object\", \"required\": [ \"data\", \"type\" ], \"properties\": { \"data\": { \"type\": \"string\", \"format\": \"ipv6\" }, \"type\": { \"type\": \"string\", \"enum\": [ \"AAAA\" ] } } }, { \"type\": \"object\", \"required\": [ \"data\", \"type\" ], \"properties\": { \"data\": { \"$ref\": \"#/components/schemas/Srv\" }, \"type\": { \"type\": \"string\", \"enum\": [ \"SRV\" ] } } } ] } ```
", "oneOf": [ { "type": "object", @@ -922,7 +919,6 @@ } }, "Srv": { - "description": "Srv\n\n
JSON schema\n\n```json { \"type\": \"object\", \"required\": [ \"port\", \"prio\", \"target\", \"weight\" ], \"properties\": { \"port\": { \"type\": \"integer\", \"format\": \"uint16\", \"minimum\": 0.0 }, \"prio\": { \"type\": \"integer\", \"format\": \"uint16\", \"minimum\": 0.0 }, \"target\": { \"type\": \"string\" }, \"weight\": { \"type\": \"integer\", \"format\": \"uint16\", \"minimum\": 0.0 } } } ```
", "type": "object", "required": [ "port", diff --git a/sled-agent/Cargo.toml b/sled-agent/Cargo.toml index 3208f1c031..360ba7f499 100644 --- a/sled-agent/Cargo.toml +++ b/sled-agent/Cargo.toml @@ -40,7 +40,8 @@ hyper-staticfile.workspace = true gateway-client.workspace = true illumos-utils.workspace = true installinator-common.workspace = true -internal-dns.workspace = true +internal-dns-resolver.workspace = true +internal-dns-types.workspace = true ipnetwork.workspace = true itertools.workspace = true key-manager.workspace = true diff --git a/sled-agent/src/bootstrap/early_networking.rs b/sled-agent/src/bootstrap/early_networking.rs index f147d3144f..9685780a0e 100644 --- a/sled-agent/src/bootstrap/early_networking.rs +++ b/sled-agent/src/bootstrap/early_networking.rs @@ -12,8 +12,8 @@ use dpd_client::Client as DpdClient; use futures::future; use gateway_client::Client as MgsClient; use http::StatusCode; -use internal_dns::resolver::{ResolveError, Resolver as DnsResolver}; -use internal_dns::ServiceName; +use internal_dns_resolver::{ResolveError, Resolver as DnsResolver}; +use internal_dns_types::names::ServiceName; use mg_admin_client::types::BfdPeerConfig as MgBfdPeerConfig; use mg_admin_client::types::BgpPeerConfig as MgBgpPeerConfig; use mg_admin_client::types::ImportExportPolicy as MgImportExportPolicy; diff --git a/sled-agent/src/bootstrap/server.rs b/sled-agent/src/bootstrap/server.rs index fe480142ca..d52da69e0e 100644 --- a/sled-agent/src/bootstrap/server.rs +++ b/sled-agent/src/bootstrap/server.rs @@ -32,7 +32,7 @@ use illumos_utils::dladm; use illumos_utils::zfs; use illumos_utils::zone; use illumos_utils::zone::Zones; -use internal_dns::resolver::Resolver; +use internal_dns_resolver::Resolver; use omicron_common::address::{Ipv6Subnet, AZ_PREFIX}; use omicron_common::ledger; use omicron_common::ledger::Ledger; diff --git a/sled-agent/src/fakes/nexus.rs b/sled-agent/src/fakes/nexus.rs index 3efd6951f9..1a40dbcfbe 100644 --- a/sled-agent/src/fakes/nexus.rs +++ b/sled-agent/src/fakes/nexus.rs @@ -12,7 +12,8 @@ use dropshot::{ endpoint, ApiDescription, FreeformBody, HttpError, HttpResponseOk, HttpResponseUpdatedNoContent, Path, RequestContext, TypedBody, }; -use internal_dns::ServiceName; +use internal_dns_types::config::DnsConfigBuilder; +use internal_dns_types::names::ServiceName; use nexus_client::types::SledAgentInfo; use omicron_common::api::external::Error; use omicron_common::api::internal::nexus::{SledVmmState, UpdateArtifactId}; @@ -168,7 +169,7 @@ pub async fn start_dns_server( nexus: &dropshot::HttpServer, ) -> dns_server::TransientServer { let dns = dns_server::TransientServer::new(log).await.unwrap(); - let mut dns_config_builder = internal_dns::DnsConfigBuilder::new(); + let mut dns_config_builder = DnsConfigBuilder::new(); let nexus_addr = match nexus.local_addr() { std::net::SocketAddr::V6(addr) => addr, diff --git a/sled-agent/src/instance.rs b/sled-agent/src/instance.rs index 75db80661c..8a4c5cf669 100644 --- a/sled-agent/src/instance.rs +++ b/sled-agent/src/instance.rs @@ -102,7 +102,7 @@ pub enum Error { InvalidHostname(&'static str), #[error("Error resolving DNS name: {0}")] - ResolveError(#[from] internal_dns::resolver::ResolveError), + ResolveError(#[from] internal_dns_resolver::ResolveError), #[error("Propolis job with ID {0} is registered but not running")] VmNotRunning(PropolisUuid), @@ -1761,7 +1761,7 @@ mod tests { use illumos_utils::zone::MockZones; use illumos_utils::zone::__mock_MockZones::__boot::Context as MockZonesBootContext; use illumos_utils::zone::__mock_MockZones::__id::Context as MockZonesIdContext; - use internal_dns::resolver::Resolver; + use internal_dns_resolver::Resolver; use omicron_common::api::external::{ ByteCount, Generation, Hostname, InstanceCpuCount, }; diff --git a/sled-agent/src/nexus.rs b/sled-agent/src/nexus.rs index 9f7a4372aa..d1646823bb 100644 --- a/sled-agent/src/nexus.rs +++ b/sled-agent/src/nexus.rs @@ -7,8 +7,8 @@ use omicron_common::disk::DiskVariant; use omicron_uuid_kinds::SledUuid; use crate::vmm_reservoir::VmmReservoirManagerHandle; -use internal_dns::resolver::Resolver; -use internal_dns::ServiceName; +use internal_dns_resolver::Resolver; +use internal_dns_types::names::ServiceName; use nexus_client::types::SledAgentInfo; use omicron_common::address::NEXUS_INTERNAL_PORT; use sled_hardware::HardwareManager; @@ -47,50 +47,6 @@ pub(crate) fn make_nexus_client_with_port( ) } -pub fn d2n_params( - params: &dns_service_client::types::DnsConfigParams, -) -> nexus_client::types::DnsConfigParams { - nexus_client::types::DnsConfigParams { - generation: params.generation, - time_created: params.time_created, - zones: params.zones.iter().map(d2n_zone).collect(), - } -} - -fn d2n_zone( - zone: &dns_service_client::types::DnsConfigZone, -) -> nexus_client::types::DnsConfigZone { - nexus_client::types::DnsConfigZone { - zone_name: zone.zone_name.clone(), - records: zone - .records - .iter() - .map(|(n, r)| (n.clone(), r.iter().map(d2n_record).collect())) - .collect(), - } -} - -fn d2n_record( - record: &dns_service_client::types::DnsRecord, -) -> nexus_client::types::DnsRecord { - match record { - dns_service_client::types::DnsRecord::A(addr) => { - nexus_client::types::DnsRecord::A(*addr) - } - dns_service_client::types::DnsRecord::Aaaa(addr) => { - nexus_client::types::DnsRecord::Aaaa(*addr) - } - dns_service_client::types::DnsRecord::Srv(srv) => { - nexus_client::types::DnsRecord::Srv(nexus_client::types::Srv { - port: srv.port, - prio: srv.prio, - target: srv.target.clone(), - weight: srv.weight, - }) - } - } -} - // Although it is a bit awkward to define these conversions here, it frees us // from depending on sled_storage/sled_hardware in the nexus_client crate. diff --git a/sled-agent/src/rack_setup/plan/service.rs b/sled-agent/src/rack_setup/plan/service.rs index e8e39939d5..db864b4333 100644 --- a/sled-agent/src/rack_setup/plan/service.rs +++ b/sled-agent/src/rack_setup/plan/service.rs @@ -5,10 +5,11 @@ //! Plan generation for "where should services be initialized". use camino::Utf8PathBuf; -use dns_service_client::types::DnsConfigParams; use illumos_utils::zpool::ZpoolName; -use internal_dns::config::{Host, Zone}; -use internal_dns::ServiceName; +use internal_dns_types::config::{ + DnsConfigBuilder, DnsConfigParams, Host, Zone, +}; +use internal_dns_types::names::ServiceName; use nexus_sled_agent_shared::inventory::{ Inventory, OmicronZoneDataset, SledRole, }; @@ -386,7 +387,7 @@ impl Plan { config: &Config, mut sled_info: Vec, ) -> Result { - let mut dns_builder = internal_dns::DnsConfigBuilder::new(); + let mut dns_builder = DnsConfigBuilder::new(); let mut svc_port_builder = ServicePortBuilder::new(config); // Scrimlets get DNS records for running Dendrite. diff --git a/sled-agent/src/rack_setup/service.rs b/sled-agent/src/rack_setup/service.rs index ef08c48061..fd1d2bd55b 100644 --- a/sled-agent/src/rack_setup/service.rs +++ b/sled-agent/src/rack_setup/service.rs @@ -70,7 +70,6 @@ use crate::bootstrap::early_networking::{ EarlyNetworkSetup, EarlyNetworkSetupError, }; use crate::bootstrap::rss_handle::BootstrapAgentHandle; -use crate::nexus::d2n_params; use crate::rack_setup::plan::service::{ Plan as ServicePlan, PlanError as ServicePlanError, }; @@ -81,8 +80,9 @@ use anyhow::{bail, Context}; use bootstore::schemes::v0 as bootstore; use camino::Utf8PathBuf; use chrono::Utc; -use internal_dns::resolver::{DnsError, Resolver as DnsResolver}; -use internal_dns::ServiceName; +use dns_service_client::DnsError; +use internal_dns_resolver::Resolver as DnsResolver; +use internal_dns_types::names::ServiceName; use nexus_client::{ types as NexusTypes, Client as NexusClient, Error as NexusError, }; @@ -200,7 +200,7 @@ pub enum SetupServiceError { Dendrite(String), #[error("Error during DNS lookup: {0}")] - DnsResolver(#[from] internal_dns::resolver::ResolveError), + DnsResolver(#[from] internal_dns_resolver::ResolveError), #[error("Bootstore error: {0}")] Bootstore(#[from] bootstore::NodeRequestError), @@ -931,7 +931,7 @@ impl ServiceInner { datasets, internal_services_ip_pool_ranges, certs: config.external_certificates.clone(), - internal_dns_zone_config: d2n_params(&service_plan.dns_config), + internal_dns_zone_config: service_plan.dns_config.clone(), external_dns_zone_name: config.external_dns_zone_name.clone(), recovery_silo: config.recovery_silo.clone(), rack_network_config, diff --git a/sled-agent/src/server.rs b/sled-agent/src/server.rs index b8deb2f1cb..6709e2d75f 100644 --- a/sled-agent/src/server.rs +++ b/sled-agent/src/server.rs @@ -10,7 +10,7 @@ use super::sled_agent::SledAgent; use crate::long_running_tasks::LongRunningTaskHandles; use crate::nexus::make_nexus_client; use crate::services::ServiceManager; -use internal_dns::resolver::Resolver; +use internal_dns_resolver::Resolver; use omicron_uuid_kinds::SledUuid; use sled_agent_types::sled::StartSledAgentRequest; use slog::Logger; diff --git a/sled-agent/src/services.rs b/sled-agent/src/services.rs index 506995d1c7..6096a81d1d 100644 --- a/sled-agent/src/services.rs +++ b/sled-agent/src/services.rs @@ -57,9 +57,9 @@ use illumos_utils::zfs::ZONE_ZFS_RAMDISK_DATASET_MOUNTPOINT; use illumos_utils::zone::AddressRequest; use illumos_utils::zpool::{PathInPool, ZpoolName}; use illumos_utils::{execute, PFEXEC}; -use internal_dns::names::BOUNDARY_NTP_DNS_NAME; -use internal_dns::names::DNS_ZONE; -use internal_dns::resolver::Resolver; +use internal_dns_resolver::Resolver; +use internal_dns_types::names::BOUNDARY_NTP_DNS_NAME; +use internal_dns_types::names::DNS_ZONE; use itertools::Itertools; use nexus_config::{ConfigDropshotWithTls, DeploymentConfig}; use nexus_sled_agent_shared::inventory::{ @@ -267,7 +267,7 @@ pub enum Error { ExecutionError(#[from] illumos_utils::ExecutionError), #[error("Error resolving DNS name: {0}")] - ResolveError(#[from] internal_dns::resolver::ResolveError), + ResolveError(#[from] internal_dns_resolver::ResolveError), #[error("Serde error: {0}")] SerdeError(#[from] serde_json::Error), diff --git a/sled-agent/src/sim/server.rs b/sled-agent/src/sim/server.rs index 03efa56369..5ebe56ae19 100644 --- a/sled-agent/src/sim/server.rs +++ b/sled-agent/src/sim/server.rs @@ -8,7 +8,6 @@ use super::config::Config; use super::http_entrypoints::api as http_api; use super::sled_agent::SledAgent; use super::storage::PantryServer; -use crate::nexus::d2n_params; use crate::nexus::NexusClient; use crate::rack_setup::service::build_initial_blueprint_from_sled_configs; use crate::rack_setup::SledConfig; @@ -19,7 +18,9 @@ use crate::rack_setup::{ use anyhow::anyhow; use crucible_agent_client::types::State as RegionState; use illumos_utils::zpool::ZpoolName; -use internal_dns::ServiceName; +use internal_dns_types::config::DnsConfigBuilder; +use internal_dns_types::names::ServiceName; +use internal_dns_types::names::DNS_ZONE_EXTERNAL_TESTING; use nexus_client::types as NexusTypes; use nexus_client::types::{IpRange, Ipv4Range, Ipv6Range}; use nexus_config::NUM_INITIAL_RESERVED_IP_ADDRESSES; @@ -334,7 +335,7 @@ pub async fn run_standalone_server( } else { dns_server::TransientServer::new(&log).await? }; - let mut dns_config_builder = internal_dns::DnsConfigBuilder::new(); + let mut dns_config_builder = DnsConfigBuilder::new(); // Start the Crucible Pantry let pantry_server = server.start_pantry().await; @@ -554,9 +555,8 @@ pub async fn run_standalone_server( datasets, internal_services_ip_pool_ranges, certs, - internal_dns_zone_config: d2n_params(&dns_config), - external_dns_zone_name: internal_dns::names::DNS_ZONE_EXTERNAL_TESTING - .to_owned(), + internal_dns_zone_config: dns_config, + external_dns_zone_name: DNS_ZONE_EXTERNAL_TESTING.to_owned(), recovery_silo, external_port_count: NexusTypes::ExternalPortDiscovery::Static( HashMap::new(), diff --git a/sled-agent/src/sled_agent.rs b/sled-agent/src/sled_agent.rs index 1b68381828..d21c3b8d39 100644 --- a/sled-agent/src/sled_agent.rs +++ b/sled-agent/src/sled_agent.rs @@ -145,7 +145,7 @@ pub enum Error { Hardware(String), #[error("Error resolving DNS name: {0}")] - ResolveError(#[from] internal_dns::resolver::ResolveError), + ResolveError(#[from] internal_dns_resolver::ResolveError), #[error(transparent)] ZpoolList(#[from] illumos_utils::zpool::ListError), diff --git a/wicketd/Cargo.toml b/wicketd/Cargo.toml index adb0e43036..3145add700 100644 --- a/wicketd/Cargo.toml +++ b/wicketd/Cargo.toml @@ -31,7 +31,8 @@ http-body-util.workspace = true hubtools.workspace = true hyper.workspace = true illumos-utils.workspace = true -internal-dns.workspace = true +internal-dns-resolver.workspace = true +internal-dns-types.workspace = true itertools.workspace = true once_cell.workspace = true oxnet.workspace = true diff --git a/wicketd/src/context.rs b/wicketd/src/context.rs index 8f4dfb451b..307898200b 100644 --- a/wicketd/src/context.rs +++ b/wicketd/src/context.rs @@ -12,7 +12,7 @@ use crate::MgsHandle; use anyhow::anyhow; use anyhow::bail; use anyhow::Result; -use internal_dns::resolver::Resolver; +use internal_dns_resolver::Resolver; use sled_hardware_types::Baseboard; use slog::info; use std::net::Ipv6Addr; diff --git a/wicketd/src/http_entrypoints.rs b/wicketd/src/http_entrypoints.rs index 3f460f1e37..ada8422de4 100644 --- a/wicketd/src/http_entrypoints.rs +++ b/wicketd/src/http_entrypoints.rs @@ -20,7 +20,7 @@ use dropshot::RequestContext; use dropshot::StreamingBody; use dropshot::TypedBody; use http::StatusCode; -use internal_dns::resolver::Resolver; +use internal_dns_resolver::Resolver; use omicron_common::api::internal::shared::SwitchLocation; use omicron_uuid_kinds::RackInitUuid; use omicron_uuid_kinds::RackResetUuid; diff --git a/wicketd/src/lib.rs b/wicketd/src/lib.rs index 430b94985f..1ef7df610d 100644 --- a/wicketd/src/lib.rs +++ b/wicketd/src/lib.rs @@ -26,7 +26,7 @@ pub(crate) use context::ServerContext; use display_error_chain::DisplayErrorChain; use dropshot::{ConfigDropshot, HandlerTaskMode, HttpServer}; pub use installinator_progress::{IprUpdateTracker, RunningUpdateState}; -use internal_dns::resolver::Resolver; +use internal_dns_resolver::Resolver; use mgs::make_mgs_client; pub(crate) use mgs::{MgsHandle, MgsManager}; use nexus_proxy::NexusTcpProxy; diff --git a/wicketd/src/nexus_proxy.rs b/wicketd/src/nexus_proxy.rs index 33ff02a945..b55a449853 100644 --- a/wicketd/src/nexus_proxy.rs +++ b/wicketd/src/nexus_proxy.rs @@ -4,8 +4,8 @@ //! TCP proxy to expose Nexus's external API via the techport. -use internal_dns::resolver::Resolver; -use internal_dns::ServiceName; +use internal_dns_resolver::Resolver; +use internal_dns_types::names::ServiceName; use omicron_common::address::NEXUS_TECHPORT_EXTERNAL_PORT; use slog::info; use slog::o;