Skip to content

Commit 53f3eab

Browse files
committed
Plumb target release TUF repo through planner
1 parent e6d40e7 commit 53f3eab

File tree

9 files changed

+75
-4
lines changed

9 files changed

+75
-4
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use omicron_common::api::external::{
2222
self, CreateResult, DataPageParams, Generation, ListResultVec,
2323
LookupResult, LookupType, ResourceType, TufRepoInsertStatus,
2424
};
25+
use omicron_uuid_kinds::GenericUuid;
2526
use omicron_uuid_kinds::TufRepoKind;
2627
use omicron_uuid_kinds::TypedUuid;
2728
use swrite::{SWrite, swrite};
@@ -106,8 +107,41 @@ impl DataStore {
106107
})
107108
}
108109

110+
/// Returns a TUF repo description.
111+
pub async fn update_tuf_repo_get_by_id(
112+
&self,
113+
opctx: &OpContext,
114+
repo_id: TypedUuid<TufRepoKind>,
115+
) -> LookupResult<TufRepoDescription> {
116+
opctx.authorize(authz::Action::Read, &authz::FLEET).await?;
117+
118+
use nexus_db_schema::schema::tuf_repo::dsl;
119+
120+
let conn = self.pool_connection_authorized(opctx).await?;
121+
let repo_id = repo_id.into_untyped_uuid();
122+
let repo = dsl::tuf_repo
123+
.filter(dsl::id.eq(repo_id))
124+
.select(TufRepo::as_select())
125+
.first_async::<TufRepo>(&*conn)
126+
.await
127+
.map_err(|e| {
128+
public_error_from_diesel(
129+
e,
130+
ErrorHandler::NotFoundByLookup(
131+
ResourceType::TufRepo,
132+
LookupType::ById(repo_id),
133+
),
134+
)
135+
})?;
136+
137+
let artifacts = artifacts_for_repo(repo.id.into(), &conn)
138+
.await
139+
.map_err(|e| public_error_from_diesel(e, ErrorHandler::Server))?;
140+
Ok(TufRepoDescription { repo, artifacts })
141+
}
142+
109143
/// Returns the TUF repo description corresponding to this system version.
110-
pub async fn update_tuf_repo_get(
144+
pub async fn update_tuf_repo_get_by_version(
111145
&self,
112146
opctx: &OpContext,
113147
system_version: SemverVersion,

nexus/reconfigurator/execution/src/dns.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1424,6 +1424,7 @@ mod test {
14241424
target_crucible_pantry_zone_count: CRUCIBLE_PANTRY_REDUNDANCY,
14251425
clickhouse_policy: None,
14261426
oximeter_read_policy: OximeterReadPolicy::new(1),
1427+
tuf_repo: None,
14271428
log,
14281429
}
14291430
.build()

nexus/reconfigurator/planning/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ omicron-uuid-kinds.workspace = true
2929
once_cell.workspace = true
3030
oxnet.workspace = true
3131
rand.workspace = true
32+
semver.workspace = true
3233
sled-agent-client.workspace = true
3334
slog.workspace = true
3435
slog-error-chain.workspace = true

nexus/reconfigurator/planning/src/system.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ use omicron_common::address::SLED_PREFIX;
4444
use omicron_common::address::get_sled_address;
4545
use omicron_common::api::external::ByteCount;
4646
use omicron_common::api::external::Generation;
47+
use omicron_common::api::external::TufRepoDescription;
4748
use omicron_common::disk::DiskIdentity;
4849
use omicron_common::disk::DiskVariant;
4950
use omicron_common::policy::INTERNAL_DNS_REDUNDANCY;
@@ -96,6 +97,7 @@ pub struct SystemDescription {
9697
external_dns_version: Generation,
9798
clickhouse_policy: Option<ClickhousePolicy>,
9899
oximeter_read_policy: OximeterReadPolicy,
100+
tuf_repo: Option<TufRepoDescription>,
99101
}
100102

101103
impl SystemDescription {
@@ -175,6 +177,7 @@ impl SystemDescription {
175177
external_dns_version: Generation::new(),
176178
clickhouse_policy: None,
177179
oximeter_read_policy: OximeterReadPolicy::new(1),
180+
tuf_repo: None,
178181
}
179182
}
180183

@@ -427,6 +430,7 @@ impl SystemDescription {
427430
.target_crucible_pantry_zone_count,
428431
clickhouse_policy: self.clickhouse_policy.clone(),
429432
oximeter_read_policy: self.oximeter_read_policy.clone(),
433+
tuf_repo: self.tuf_repo.clone(),
430434
};
431435
let mut builder = PlanningInputBuilder::new(
432436
policy,

nexus/reconfigurator/preparation/src/lib.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ use omicron_common::address::SLED_PREFIX;
3939
use omicron_common::api::external::Error;
4040
use omicron_common::api::external::InternalContext;
4141
use omicron_common::api::external::LookupType;
42+
use omicron_common::api::external::TufRepoDescription;
4243
use omicron_common::disk::DiskIdentity;
4344
use omicron_common::policy::BOUNDARY_NTP_REDUNDANCY;
4445
use omicron_common::policy::COCKROACHDB_REDUNDANCY;
@@ -78,6 +79,7 @@ pub struct PlanningInputFromDb<'a> {
7879
pub cockroachdb_settings: &'a CockroachDbSettings,
7980
pub clickhouse_policy: Option<ClickhousePolicy>,
8081
pub oximeter_read_policy: OximeterReadPolicy,
82+
pub tuf_repo: Option<TufRepoDescription>,
8183
pub log: &'a Logger,
8284
}
8385

@@ -140,11 +142,24 @@ impl PlanningInputFromDb<'_> {
140142
.cockroachdb_settings(opctx)
141143
.await
142144
.internal_context("fetching cockroachdb settings")?;
143-
144145
let clickhouse_policy = datastore
145146
.clickhouse_policy_get_latest(opctx)
146147
.await
147148
.internal_context("fetching clickhouse policy")?;
149+
let target_release = datastore
150+
.target_release_get_current(opctx)
151+
.await
152+
.internal_context("fetching current target release")?;
153+
let tuf_repo = match target_release.tuf_repo_id {
154+
None => None,
155+
Some(repo_id) => Some(
156+
datastore
157+
.update_tuf_repo_get_by_id(opctx, repo_id.into())
158+
.await
159+
.internal_context("fetching target release repo")?
160+
.into_external(),
161+
),
162+
};
148163

149164
let oximeter_read_policy = datastore
150165
.oximeter_read_policy_get_latest(opctx)
@@ -171,6 +186,7 @@ impl PlanningInputFromDb<'_> {
171186
cockroachdb_settings: &cockroachdb_settings,
172187
clickhouse_policy,
173188
oximeter_read_policy,
189+
tuf_repo,
174190
}
175191
.build()
176192
.internal_context("assembling planning_input")?;
@@ -194,6 +210,7 @@ impl PlanningInputFromDb<'_> {
194210
.target_crucible_pantry_zone_count,
195211
clickhouse_policy: self.clickhouse_policy.clone(),
196212
oximeter_read_policy: self.oximeter_read_policy.clone(),
213+
tuf_repo: self.tuf_repo.clone(),
197214
};
198215
let mut builder = PlanningInputBuilder::new(
199216
policy,

nexus/src/app/update.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ impl super::Nexus {
8888

8989
let tuf_repo_description = self
9090
.db_datastore
91-
.update_tuf_repo_get(opctx, system_version.into())
91+
.update_tuf_repo_get_by_version(opctx, system_version.into())
9292
.await
9393
.map_err(HttpError::from)?;
9494

nexus/src/external_api/http_entrypoints.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6573,7 +6573,7 @@ impl NexusExternalApi for NexusExternalApiImpl {
65736573
// Fetch the TUF repo metadata and update the target release.
65746574
let tuf_repo_id = nexus
65756575
.datastore()
6576-
.update_tuf_repo_get(&opctx, system_version.into())
6576+
.update_tuf_repo_get_by_version(&opctx, system_version.into())
65776577
.await?
65786578
.repo
65796579
.id;

nexus/types/src/deployment/planning_input.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use omicron_common::address::IpRange;
2323
use omicron_common::address::Ipv6Subnet;
2424
use omicron_common::address::SLED_PREFIX;
2525
use omicron_common::api::external::Generation;
26+
use omicron_common::api::external::TufRepoDescription;
2627
use omicron_common::api::internal::shared::SourceNatConfigError;
2728
use omicron_common::disk::DiskIdentity;
2829
use omicron_common::policy::SINGLE_NODE_CLICKHOUSE_REDUNDANCY;
@@ -152,6 +153,10 @@ impl PlanningInput {
152153
.unwrap_or(0)
153154
}
154155

156+
pub fn tuf_repo(&self) -> Option<&TufRepoDescription> {
157+
self.policy.tuf_repo.as_ref()
158+
}
159+
155160
pub fn service_ip_pool_ranges(&self) -> &[IpRange] {
156161
&self.policy.service_ip_pool_ranges
157162
}
@@ -918,6 +923,13 @@ pub struct Policy {
918923
/// Eventually we will only allow reads from a cluster and this policy will
919924
/// no longer exist.
920925
pub oximeter_read_policy: OximeterReadPolicy,
926+
927+
/// Desired system software release repository.
928+
///
929+
/// New zones will use artifacts in this repo as their image sources,
930+
/// and at most one extant zone may be modified to use it or replaced
931+
/// with one that does.
932+
pub tuf_repo: Option<TufRepoDescription>,
921933
}
922934

923935
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
@@ -1087,6 +1099,7 @@ impl PlanningInputBuilder {
10871099
target_crucible_pantry_zone_count: 0,
10881100
clickhouse_policy: None,
10891101
oximeter_read_policy: OximeterReadPolicy::new(1),
1102+
tuf_repo: None,
10901103
},
10911104
internal_dns_version: Generation::new(),
10921105
external_dns_version: Generation::new(),

0 commit comments

Comments
 (0)