Skip to content

Commit e30353d

Browse files
authored
Use the omicron-zone-package methods for topo sorting (#1099)
I moved this logic (and tested it) in `omicron-zone-package`: oxidecomputer/omicron-package#57 This PR uses that version, to simplify how much logic Crucible needs to know
1 parent 4e4d18a commit e30353d

File tree

4 files changed

+11
-63
lines changed

4 files changed

+11
-63
lines changed

Cargo.lock

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-2
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ nix = { version = "0.26", features = [ "feature", "uio" ] }
6262
num_enum = "0.7"
6363
num-derive = "0.4"
6464
num-traits = "0.2"
65-
omicron-zone-package = "0.9.1"
65+
omicron-zone-package = "0.10.0"
6666
openapiv3 = "2.0.0"
6767
opentelemetry = "0.21.0"
6868
opentelemetry-jaeger = { version = "0.17.0" }
@@ -97,7 +97,6 @@ tokio-rustls = { version = "0.24.1" }
9797
tokio-test = "*"
9898
tokio-util = { version = "0.7", features = ["codec"]}
9999
toml = "0.8"
100-
topological-sort = "0.2.2"
101100
tracing = "0.1"
102101
tracing-opentelemetry = "0.18.0"
103102
tracing-subscriber = "0.3.18"

package/Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,4 @@ edition = "2021"
77
anyhow.workspace = true
88
omicron-zone-package.workspace = true
99
tokio.workspace = true
10-
topological-sort.workspace = true
1110
crucible-workspace-hack.workspace = true

package/src/main.rs

+7-57
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
// Copyright 2022 Oxide Computer Company
22

3-
use anyhow::{bail, Result};
3+
use anyhow::Result;
44
use omicron_zone_package::config;
5-
use omicron_zone_package::package::{PackageOutput, PackageSource};
65
use omicron_zone_package::target::Target;
7-
use std::collections::BTreeMap;
86
use std::fs::create_dir_all;
97
use std::path::Path;
10-
use topological_sort::TopologicalSort;
118

129
#[tokio::main]
1310
async fn main() -> Result<()> {
@@ -16,61 +13,14 @@ async fn main() -> Result<()> {
1613
let output_dir = Path::new("out");
1714
create_dir_all(output_dir)?;
1815

19-
// Reverse lookup of "output" -> "package creating this output".
20-
let all_packages = cfg
21-
.packages
22-
.iter()
23-
.map(|(name, package)| (package.get_output_file(name), (name, package)))
24-
.collect::<BTreeMap<_, _>>();
25-
26-
// Collect all packages, and sort them in dependency order,
27-
// so we know which ones to build first.
28-
let mut outputs = TopologicalSort::<String>::new();
29-
for (package_output, (_, package)) in &all_packages {
30-
match &package.source {
31-
PackageSource::Local { .. }
32-
| PackageSource::Prebuilt { .. }
33-
| PackageSource::Manual => {
34-
// Skip intermediate leaf packages; if necessary they'll be
35-
// added to the dependency graph by whatever composite package
36-
// actually depends on them.
37-
if !matches!(
38-
package.output,
39-
PackageOutput::Zone {
40-
intermediate_only: true
41-
}
42-
) {
43-
outputs.insert(package_output);
44-
}
45-
}
46-
PackageSource::Composite { packages: deps } => {
47-
for dep in deps {
48-
outputs.add_dependency(dep, package_output);
49-
}
50-
}
51-
}
52-
}
53-
54-
while !outputs.is_empty() {
55-
let batch = outputs.pop_all();
56-
assert!(
57-
!batch.is_empty() || outputs.is_empty(),
58-
"cyclic dependency in package manifest!"
59-
);
60-
61-
for output in &batch {
62-
println!("Creating '{output}'");
63-
64-
let Some((name, package)) = all_packages.get(output) else {
65-
bail!(
66-
"Cannot find a package to create output: '{output}' \n\
67-
\tThis can happen when building a composite package, where one of \n\
68-
\tthe 'source.packages' has not been found."
69-
);
70-
};
16+
let packages = cfg.packages_to_deploy(&Target::default());
17+
let package_iter = packages.build_order();
7118

19+
for batch in package_iter {
20+
for (name, package) in &batch {
21+
println!("Building '{name}'");
7222
package
73-
.create_for_target(&Target::default(), &name, output_dir)
23+
.create_for_target(&Target::default(), name, output_dir)
7424
.await?;
7525
}
7626
}

0 commit comments

Comments
 (0)