Skip to content

Commit 698b8f4

Browse files
committed
osrdyne: refresh worker on version changes
Signed-off-by: Élyse Viard <[email protected]>
1 parent fdecde7 commit 698b8f4

11 files changed

+410
-32
lines changed

osrdyne/Cargo.lock

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

osrdyne/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ reqwest = { version = "0.12.4", default-features = false, features = [
3232
schemars = "0.8.21"
3333
serde = "1.0.203"
3434
serde_json = "1.0.117"
35+
sha2 = "0.10.8"
3536
smallvec = { version = "1.13.2", features = ["serde"] }
3637
thiserror = "1.0.63"
3738
thunderdome = "0.6.1"

osrdyne/src/api.rs

+1
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ async fn list_workers(
157157
external_id: "noop".to_string(),
158158
worker_id: uuid::Uuid::nil(),
159159
worker_key: key,
160+
metadata: Default::default(),
160161
}),
161162
// In noop mode, we can't track the worker states.
162163
// We consider them always ready, as this mode is only used when debugging.

osrdyne/src/drivers.rs

+2
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,7 @@ pub mod worker_driver;
77
const LABEL_MANAGED_BY: &str = "osrd/managed_by";
88
const LABEL_WORKER_ID: &str = "osrd/worker_id";
99
const LABEL_WORKER_KEY: &str = "osrd/worker_key";
10+
const LABEL_VERSION_IDENTIFIER: &str = "osrd/version_identifier";
11+
const LABEL_QUEUE_NAME: &str = "osrd/queue_name";
1012

1113
const MANAGED_BY_VALUE: &str = "osrdyne";

osrdyne/src/drivers/docker.rs

+53-3
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@ use bollard::{
99
Docker,
1010
};
1111
use serde::{Deserialize, Serialize};
12+
use sha2::{Digest, Sha256};
1213
use uuid::Uuid;
1314

1415
use crate::Key;
1516

1617
use super::{
1718
worker_driver::{DriverError, WorkerDriver, WorkerMetadata},
18-
LABEL_MANAGED_BY, LABEL_WORKER_ID, LABEL_WORKER_KEY, MANAGED_BY_VALUE,
19+
LABEL_MANAGED_BY, LABEL_VERSION_IDENTIFIER, LABEL_WORKER_ID, LABEL_WORKER_KEY,
20+
MANAGED_BY_VALUE,
1921
};
2022

2123
#[derive(Serialize, Deserialize, Clone, Debug)]
@@ -39,6 +41,7 @@ pub struct DockerDriver {
3941
options: DockerDriverOptions,
4042
amqp_uri: String,
4143
worker_pool: String,
44+
version_identifier: String,
4245
}
4346

4447
impl DockerDriver {
@@ -47,11 +50,17 @@ impl DockerDriver {
4750
amqp_uri: String,
4851
worker_pool: String,
4952
) -> DockerDriver {
53+
let version_identifier = std::env::var("OSRD_GIT_DESCRIBE")
54+
.unwrap_or_else(|_| format!("run-{}", Uuid::new_v4()));
55+
56+
let hashed = format!("{:x}", Sha256::digest(version_identifier))[..16].to_string();
57+
5058
DockerDriver {
5159
client: Docker::connect_with_socket_defaults().expect("Failed to connect to Docker"),
5260
options,
5361
amqp_uri,
5462
worker_pool,
63+
version_identifier: hashed,
5564
}
5665
}
5766
}
@@ -63,14 +72,35 @@ impl WorkerDriver for DockerDriver {
6372
worker_key: Key,
6473
) -> Pin<Box<dyn Future<Output = Result<Uuid, DriverError>> + Send + '_>> {
6574
Box::pin(async move {
75+
let mut current_worker_id = None;
6676
let current_workers = self.list_worker_groups().await?;
77+
6778
for worker in current_workers {
68-
if worker.worker_key == worker_key {
79+
let worker_version = worker
80+
.metadata
81+
.get(LABEL_VERSION_IDENTIFIER)
82+
.expect("version_identifier not found")
83+
.to_owned();
84+
85+
if worker.worker_key == worker_key && worker_version == self.version_identifier {
6986
return Ok(worker.worker_id);
87+
} else if worker.worker_key == worker_key {
88+
current_worker_id = Some(worker.worker_id);
89+
90+
self.client
91+
.remove_container(
92+
&worker.external_id,
93+
Some(RemoveContainerOptions {
94+
force: true,
95+
..Default::default()
96+
}),
97+
)
98+
.await
99+
.map_err(DriverError::DockerError)?;
70100
}
71101
}
72102

73-
let new_id = Uuid::new_v4();
103+
let new_id = current_worker_id.unwrap_or_else(Uuid::new_v4);
74104

75105
let final_env = {
76106
let mut env: Vec<String> = self.options.default_env.clone();
@@ -84,6 +114,10 @@ impl WorkerDriver for DockerDriver {
84114
(LABEL_MANAGED_BY.to_owned(), MANAGED_BY_VALUE.to_owned()),
85115
(LABEL_WORKER_ID.to_owned(), new_id.to_string()),
86116
(LABEL_WORKER_KEY.to_owned(), worker_key.to_string()),
117+
(
118+
LABEL_VERSION_IDENTIFIER.to_owned(),
119+
self.version_identifier.clone(),
120+
),
87121
]);
88122

89123
let container_name = format!(
@@ -183,6 +217,15 @@ impl WorkerDriver for DockerDriver {
183217
.filter_map(|container| {
184218
container.labels.as_ref().and_then(|labels| {
185219
if labels.get(LABEL_MANAGED_BY) == Some(&MANAGED_BY_VALUE.to_string()) {
220+
let mut metadata = HashMap::new();
221+
metadata.insert(
222+
LABEL_VERSION_IDENTIFIER.to_owned(),
223+
labels
224+
.get(LABEL_VERSION_IDENTIFIER)
225+
.expect("version_identifier label missing")
226+
.clone(),
227+
);
228+
186229
Some(WorkerMetadata {
187230
external_id: container.id.clone().expect("container id missing"),
188231
worker_id: Uuid::parse_str(
@@ -196,6 +239,7 @@ impl WorkerDriver for DockerDriver {
196239
.get(LABEL_WORKER_KEY)
197240
.expect("worker_key label missing"),
198241
),
242+
metadata,
199243
})
200244
} else {
201245
None
@@ -207,4 +251,10 @@ impl WorkerDriver for DockerDriver {
207251
Ok(workers)
208252
})
209253
}
254+
255+
fn cleanup_stalled(
256+
&mut self,
257+
) -> Pin<Box<dyn Future<Output = Result<(), DriverError>> + Send + '_>> {
258+
Box::pin(async move { Ok(()) })
259+
}
210260
}

0 commit comments

Comments
 (0)