Skip to content

Commit b1e2ca2

Browse files
committed
add app version in database for signer
1 parent 0388418 commit b1e2ca2

File tree

5 files changed

+68
-6
lines changed

5 files changed

+68
-6
lines changed

Cargo.lock

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

mithril-signer/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,22 @@ repository = { workspace = true }
1111

1212
[dependencies]
1313
async-trait = "0.1.52"
14+
chrono = "0.4"
1415
clap = { version = "4.0", features = ["derive", "env"] }
1516
config = "0.13.1"
1617
hex = "0.4.3"
1718
mithril-common = { path = "../mithril-common" }
1819
rand_chacha = "0.3.1"
1920
rand_core = "0.6.3"
2021
reqwest = { version = "0.11", features = ["json", "stream"] }
22+
semver = "1.0"
2123
serde = { version = "1.0", features = ["derive"] }
2224
serde_json = "1.0"
2325
slog = { version = "2.7.0", features = ["max_level_trace", "release_max_level_debug"] }
2426
slog-async = "2.7.0"
2527
slog-bunyan = "2.4.0"
2628
slog-scope = "4.4.0"
29+
sqlite = "0.28.1"
2730
thiserror = "1.0.31"
2831
tokio = { version = "1.17.0", features = ["full"] }
2932

mithril-signer/src/entities.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ use std::path::PathBuf;
44

55
use mithril_common::{entities::PartyId, CardanoNetwork};
66

7+
const SQLITE_FILE: &str = "signer.sqlite3";
8+
79
/// Client configuration
810
#[derive(Debug, Clone, Serialize, Deserialize)]
911
pub struct Config {
@@ -53,4 +55,16 @@ impl Config {
5355
CardanoNetwork::from_code(self.network.clone(), self.network_magic)
5456
.map_err(|e| ConfigError::Message(e.to_string()))
5557
}
58+
59+
/// Create the SQL store directory if not exist and return the path of the
60+
/// SQLite3 file.
61+
pub fn get_sqlite_file(&self) -> PathBuf {
62+
let store_dir = &self.data_stores_directory;
63+
64+
if !store_dir.exists() {
65+
std::fs::create_dir_all(store_dir).unwrap();
66+
}
67+
68+
self.data_stores_directory.join(SQLITE_FILE)
69+
}
5670
}

mithril-signer/src/main.rs

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
1+
use chrono::Local;
12
use clap::Parser;
3+
use semver::{Version, VersionReq};
24
use slog::{o, Drain, Level, Logger};
3-
use slog_scope::debug;
5+
use slog_scope::{debug, warn};
6+
use sqlite::Connection;
47
use std::sync::Arc;
58
use std::time::Duration;
69
use std::{error::Error, path::PathBuf};
710

11+
use mithril_common::database::{
12+
ApplicationNodeType, ApplicationVersion, VersionProvider, VersionUpdaterProvider,
13+
};
814
use mithril_signer::{
915
Config, ProductionServiceBuilder, ServiceBuilder, SignerRunner, SignerState, StateMachine,
1016
};
@@ -60,6 +66,43 @@ fn build_logger(min_level: Level) -> Logger {
6066
Logger::root(Arc::new(drain), o!())
6167
}
6268

69+
fn check_database(filepath: &PathBuf) -> Result<(), Box<dyn Error>> {
70+
let connection = Connection::open(filepath)?;
71+
let provider = VersionProvider::new(&connection);
72+
provider.create_table_if_not_exists()?;
73+
let application_type = ApplicationNodeType::new("aggregator")?;
74+
let maybe_option = provider.get_application_version(&application_type)?;
75+
let current_version = ApplicationVersion {
76+
semver: Version::parse(env!("CARGO_PKG_VERSION"))?,
77+
application_type,
78+
updated_at: Local::now().naive_local(),
79+
};
80+
81+
match maybe_option {
82+
None => {
83+
let provider = VersionUpdaterProvider::new(&connection);
84+
let _ = provider.save(current_version)?;
85+
debug!("application version saved in database");
86+
}
87+
Some(version) => {
88+
let req = VersionReq::parse(&current_version.semver.to_string()).unwrap();
89+
90+
if !req.matches(&version.semver) {
91+
warn!(
92+
"application version '{}' is out of date, new version is '{}'. Upgrading database…",
93+
version.semver, current_version.semver
94+
);
95+
let upgrader_provider = VersionUpdaterProvider::new(&connection);
96+
upgrader_provider.save(current_version)?;
97+
debug!("database updated");
98+
} else {
99+
debug!("database up to date");
100+
}
101+
}
102+
};
103+
Ok(())
104+
}
105+
63106
#[tokio::main]
64107
async fn main() -> Result<(), Box<dyn Error>> {
65108
// Load args
@@ -81,14 +124,13 @@ async fn main() -> Result<(), Box<dyn Error>> {
81124
.map_err(|e| format!("configuration build error: {}", e))?
82125
.try_deserialize()
83126
.map_err(|e| format!("configuration deserialize error: {}", e))?;
127+
let services = ProductionServiceBuilder::new(&config).build()?;
128+
check_database(&config.data_stores_directory)?;
84129
debug!("Started"; "run_mode" => &args.run_mode, "config" => format!("{:?}", config));
85130

86131
let mut state_machine = StateMachine::new(
87132
SignerState::Unregistered(None),
88-
Box::new(SignerRunner::new(
89-
config.clone(),
90-
ProductionServiceBuilder::new(&config).build()?,
91-
)),
133+
Box::new(SignerRunner::new(config.clone(), services)),
92134
Duration::from_millis(config.run_interval),
93135
);
94136
state_machine.run().await

mithril-signer/src/runtime/signer_services.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ impl<'a> ServiceBuilder for ProductionServiceBuilder<'a> {
7272
.map_err(|e| format!("Could not create data stores directory: {:?}", e))?;
7373
}
7474

75-
let sqlite_db_path = Some(self.config.data_stores_directory.join("signer.sqlite3"));
75+
let sqlite_db_path = Some(self.config.get_sqlite_file());
7676
let protocol_initializer_store = Arc::new(ProtocolInitializerStore::new(
7777
Box::new(SQLiteAdapter::new(
7878
"protocol_initializer",

0 commit comments

Comments
 (0)