use super::*;
pub(super) fn warn_old_incus(client: &Client) {
if let Some(m) = client.oci_unsupported() {
eprintln!("isb serve: WARNING: {m}");
}
}
pub(super) fn ensure(client: &Client, store: &Store) {
match crate::org::ensure_default(client, &mut |l| eprintln!("isb serve: default org: {l}")) {
Ok(true) => eprintln!(
"isb serve: created the default org (incus project {})",
crate::org::DEFAULT_ORG_PROJECT
),
Ok(false) => {}
Err(e) => eprintln!("isb serve: WARNING: the default org: {e}"),
}
watch_service_names(client);
let stacks: Vec<String> = store
.load_all()
.unwrap_or_default()
.into_iter()
.filter(|d| d.org.is_default())
.map(|d| d.name)
.collect();
let stray = stray_default_stacks(client, &stacks);
if !stray.is_empty() {
eprintln!(
"isb serve: WARNING: default-org stack(s) {} have instances in incus' default project, which is not an org: they run afresh in {} (new volumes), and the old instances and volumes there are left for you to move or delete",
stray.join(", "),
crate::org::DEFAULT_ORG_PROJECT
);
}
}
fn watch_service_names(client: &Client) {
let client = client.clone();
let spawned = std::thread::Builder::new()
.name("service-names".into())
.spawn(move || {
let mut said = std::collections::BTreeSet::new();
loop {
let mut lines = Vec::new();
let _ = crate::org::ensure_all_service_names(&client, &mut |l| {
lines.push(l.to_string());
});
for l in lines {
if said.insert(l.clone()) {
eprintln!("isb serve: {l}");
}
}
std::thread::sleep(std::time::Duration::from_secs(60));
}
});
if let Err(e) = spawned {
eprintln!("isb serve: WARNING: cannot watch service names: {e}");
}
}
fn stray_default_stacks(client: &Client, stacks: &[String]) -> Vec<String> {
if stacks.is_empty() {
return Vec::new();
}
let key = format!("user.{}", crate::stack::LABEL_STACK);
let Ok(v) = client
.clone()
.project("default")
.get("/1.0/instances?recursion=1")
else {
return Vec::new();
};
let mut out: Vec<String> = v
.as_array()
.into_iter()
.flatten()
.filter_map(|i| i["config"][&key].as_str())
.filter(|s| stacks.iter().any(|n| n == s))
.map(String::from)
.collect();
out.sort();
out.dedup();
out
}