diff --git a/nexus/src/db/datastore.rs b/nexus/src/db/datastore.rs index 38c6b43d14f..3313598aeb2 100644 --- a/nexus/src/db/datastore.rs +++ b/nexus/src/db/datastore.rs @@ -239,7 +239,7 @@ impl DataStore { .do_update() .set(( dsl::time_modified.eq(Utc::now()), - dsl::pool_id.eq(excluded(dsl::id)), + dsl::pool_id.eq(excluded(dsl::pool_id)), dsl::ip.eq(excluded(dsl::ip)), dsl::port.eq(excluded(dsl::port)), dsl::kind.eq(excluded(dsl::kind)), diff --git a/nexus/src/nexus.rs b/nexus/src/nexus.rs index ff352301657..0de77a45af8 100644 --- a/nexus/src/nexus.rs +++ b/nexus/src/nexus.rs @@ -286,7 +286,7 @@ impl Nexus { address: SocketAddr, kind: DatasetKind, ) -> Result<(), Error> { - info!(self.log, "upserting dataset"; "zpool_id" => zpool_id.to_string(), "dataset_id" => id.to_string()); + info!(self.log, "upserting dataset"; "zpool_id" => zpool_id.to_string(), "dataset_id" => id.to_string(), "address" => address.to_string()); let dataset = db::model::Dataset::new(id, zpool_id, address, kind); self.db_datastore.dataset_upsert(dataset).await?; Ok(()) diff --git a/nexus/test-utils/src/lib.rs b/nexus/test-utils/src/lib.rs index dba247c3250..6be1f1e2c36 100644 --- a/nexus/test-utils/src/lib.rs +++ b/nexus/test-utils/src/lib.rs @@ -17,7 +17,7 @@ use oximeter_collector::Oximeter; use oximeter_producer::Server as ProducerServer; use slog::o; use slog::Logger; -use std::net::SocketAddr; +use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use std::path::Path; use std::time::Duration; use uuid::Uuid; @@ -183,7 +183,10 @@ pub async fn start_sled_agent( }, /* TODO-cleanup this is unused */ log: ConfigLogging::StderrTerminal { level: ConfigLoggingLevel::Debug }, - storage: sim::ConfigStorage::default(), + storage: sim::ConfigStorage { + zpools: vec![], + ip: IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), + }, }; sim::Server::start(&config, &log).await diff --git a/sled-agent/src/bin/sled-agent-sim.rs b/sled-agent/src/bin/sled-agent-sim.rs index 286f27681ee..3cd7a84384f 100644 --- a/sled-agent/src/bin/sled-agent-sim.rs +++ b/sled-agent/src/bin/sled-agent-sim.rs @@ -78,6 +78,7 @@ async fn do_run() -> Result<(), CmdError> { storage: ConfigStorage { // Create 10 "virtual" U.2s, with 1 TB of storage. zpools: vec![ConfigZpool { size: 1 << 40 }; 10], + ip: args.sled_agent_addr.ip(), }, }; diff --git a/sled-agent/src/sim/config.rs b/sled-agent/src/sim/config.rs index 5926791793c..7c3f24266f8 100644 --- a/sled-agent/src/sim/config.rs +++ b/sled-agent/src/sim/config.rs @@ -10,7 +10,7 @@ use dropshot::ConfigDropshot; use dropshot::ConfigLogging; use serde::Deserialize; use serde::Serialize; -use std::net::SocketAddr; +use std::net::{IpAddr, SocketAddr}; use uuid::Uuid; /** @@ -43,9 +43,10 @@ pub struct ConfigZpool { } /// Configuration describing simulated storage. -#[derive(Clone, Default, Debug, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] pub struct ConfigStorage { pub zpools: Vec, + pub ip: IpAddr, } /** diff --git a/sled-agent/src/sim/server.rs b/sled-agent/src/sim/server.rs index c741cb1f4f3..6187f1ed50e 100644 --- a/sled-agent/src/sim/server.rs +++ b/sled-agent/src/sim/server.rs @@ -50,8 +50,7 @@ impl Server { "server" => config.id.clone().to_string() )); let sled_agent = Arc::new(SledAgent::new_simulated_with_id( - &config.id, - config.sim_mode, + &config, sa_log, Arc::clone(&nexus_client), )); diff --git a/sled-agent/src/sim/sled_agent.rs b/sled-agent/src/sim/sled_agent.rs index 71e0c692152..400df346ecd 100644 --- a/sled-agent/src/sim/sled_agent.rs +++ b/sled-agent/src/sim/sled_agent.rs @@ -19,7 +19,7 @@ use std::sync::Arc; use uuid::Uuid; use super::collection::SimCollection; -use super::config::SimMode; +use super::config::Config; use super::disk::SimDisk; use super::instance::SimInstance; use super::storage::{CrucibleData, Storage}; @@ -48,11 +48,12 @@ impl SledAgent { */ /** Constructs a simulated SledAgent with the given uuid. */ pub fn new_simulated_with_id( - id: &Uuid, - sim_mode: SimMode, + config: &Config, log: Logger, nexus_client: Arc, ) -> SledAgent { + let id = config.id; + let sim_mode = config.sim_mode; info!(&log, "created simulated sled agent"; "sim_mode" => ?sim_mode); let instance_log = log.new(o!("kind" => "instances")); @@ -71,8 +72,9 @@ impl SledAgent { sim_mode, )), storage: Mutex::new(Storage::new( - *id, + id, Arc::clone(&nexus_client), + config.storage.ip, storage_log, )), } diff --git a/sled-agent/src/sim/storage.rs b/sled-agent/src/sim/storage.rs index 8e3bfbd5b6b..31f8b84293e 100644 --- a/sled-agent/src/sim/storage.rs +++ b/sled-agent/src/sim/storage.rs @@ -16,7 +16,7 @@ use nexus_client::types::{ use nexus_client::Client as NexusClient; use slog::Logger; use std::collections::HashMap; -use std::net::SocketAddr; +use std::net::{IpAddr, SocketAddr}; use std::str::FromStr; use std::sync::Arc; use uuid::Uuid; @@ -137,10 +137,10 @@ pub struct CrucibleServer { } impl CrucibleServer { - fn new(log: &Logger) -> Self { + fn new(log: &Logger, crucible_ip: IpAddr) -> Self { let data = Arc::new(CrucibleData::new()); let config = dropshot::ConfigDropshot { - bind_address: SocketAddr::new("127.0.0.1".parse().unwrap(), 0), + bind_address: SocketAddr::new(crucible_ip, 0), ..Default::default() }; let dropshot_log = log @@ -163,21 +163,22 @@ impl CrucibleServer { } } -pub struct Zpool { +struct Zpool { datasets: HashMap, } impl Zpool { - pub fn new() -> Self { + fn new() -> Self { Zpool { datasets: HashMap::new() } } - pub fn insert_dataset( + fn insert_dataset( &mut self, log: &Logger, id: Uuid, + crucible_ip: IpAddr, ) -> &CrucibleServer { - self.datasets.insert(id, CrucibleServer::new(log)); + self.datasets.insert(id, CrucibleServer::new(log, crucible_ip)); self.datasets .get(&id) .expect("Failed to get the dataset we just inserted") @@ -190,15 +191,17 @@ pub struct Storage { nexus_client: Arc, log: Logger, zpools: HashMap, + crucible_ip: IpAddr, } impl Storage { pub fn new( sled_id: Uuid, nexus_client: Arc, + crucible_ip: IpAddr, log: Logger, ) -> Self { - Self { sled_id, nexus_client, log, zpools: HashMap::new() } + Self { sled_id, nexus_client, log, zpools: HashMap::new(), crucible_ip } } /// Adds a Zpool to the sled's simulated storage and notifies Nexus. @@ -221,7 +224,7 @@ impl Storage { .zpools .get_mut(&zpool_id) .expect("Zpool does not exist") - .insert_dataset(&self.log, dataset_id); + .insert_dataset(&self.log, dataset_id, self.crucible_ip); // Notify Nexus let request = DatasetPutRequest {