worker: structure runtime worker identities
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
use crate::identity::{WorkerId, WorkerRef};
|
||||
use crate::identity::{RuntimeWorkerRef, WorkerId, WorkerRef};
|
||||
use crate::interaction::WorkerInput;
|
||||
use crate::profile_archive::{ProfileSourceArchive, ProfileSourceArchiveRef};
|
||||
use serde::{Deserialize, Serialize};
|
||||
@@ -132,9 +132,8 @@ pub struct WorkingDirectoryCleanupTarget {
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub struct WorkingDirectoryOccupancy {
|
||||
pub runtime_id: String,
|
||||
pub runtime_worker_id: u64,
|
||||
pub worker_id: String,
|
||||
#[serde(flatten)]
|
||||
pub worker: RuntimeWorkerRef,
|
||||
pub display_name: String,
|
||||
pub linked_at: String,
|
||||
}
|
||||
|
||||
@@ -30,6 +30,32 @@ impl fmt::Display for WorkerId {
|
||||
}
|
||||
}
|
||||
|
||||
/// Backend-visible Worker identity, namespaced by the Runtime that owns the Worker record.
|
||||
///
|
||||
/// This is intentionally distinct from [`WorkerRef`], which is meaningful only inside one
|
||||
/// Runtime. Do not flatten this reference into a concatenated string for authority decisions.
|
||||
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
|
||||
pub struct RuntimeWorkerRef {
|
||||
pub runtime_id: String,
|
||||
pub worker_id: String,
|
||||
}
|
||||
|
||||
impl RuntimeWorkerRef {
|
||||
pub fn new(runtime_id: impl Into<String>, worker_id: impl Into<String>) -> Self {
|
||||
Self {
|
||||
runtime_id: runtime_id.into(),
|
||||
worker_id: worker_id.into(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn local_worker_ref(&self) -> Result<WorkerRef, std::num::ParseIntError> {
|
||||
self.worker_id
|
||||
.parse::<u64>()
|
||||
.map(WorkerId::new)
|
||||
.map(WorkerRef::new)
|
||||
}
|
||||
}
|
||||
|
||||
/// Runtime-local authority reference for Worker operations.
|
||||
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
|
||||
pub struct WorkerRef {
|
||||
@@ -41,3 +67,29 @@ impl WorkerRef {
|
||||
Self { worker_id }
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn runtime_worker_ref_preserves_structured_identity_and_json_fields() {
|
||||
let worker = RuntimeWorkerRef::new("arcadia", "30");
|
||||
assert_eq!(worker.runtime_id, "arcadia");
|
||||
assert_eq!(worker.worker_id, "30");
|
||||
assert_eq!(
|
||||
worker.local_worker_ref().unwrap(),
|
||||
WorkerRef::new(WorkerId::new(30))
|
||||
);
|
||||
assert_eq!(
|
||||
serde_json::to_value(&worker).unwrap(),
|
||||
serde_json::json!({"runtime_id": "arcadia", "worker_id": "30"})
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn runtime_worker_ref_does_not_treat_composite_text_as_local_worker_id() {
|
||||
let worker = RuntimeWorkerRef::new("arcadia", "embedded-worker-runtime-5");
|
||||
assert!(worker.local_worker_ref().is_err());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user