move Permission into hive-types, drop swarm-controller's hive-sh4re dep
This commit is contained in:
parent
04786da58f
commit
e4a9005468
27 changed files with 221 additions and 175 deletions
|
|
@ -52,10 +52,10 @@ operator-profiles = ["async-nats/jetstream"]
|
|||
# runs the same way. Explicit for the same reason as `notices`.
|
||||
agent-limits = ["async-nats/jetstream"]
|
||||
# `agent_permissions::AgentPermissions` and `read`, for hive-c0re, the agent
|
||||
# harness, the subagent daemon and swarm-controller. Pulls `hive-sh4re` for the
|
||||
# harness, the subagent daemon and swarm-controller. Pulls `hive-types` for the
|
||||
# `Permission` names, so the crates that only need the bucket name do not link
|
||||
# it.
|
||||
agent-permissions = ["dep:hive-sh4re", "async-nats/jetstream"]
|
||||
agent-permissions = ["dep:hive-types", "async-nats/jetstream"]
|
||||
# `agent_archetype::read`, for hive-c0re, which reads the archetype of each
|
||||
# agent it provisions or rebuilds. Explicit for the same reason as `notices`.
|
||||
agent-archetype = ["async-nats/jetstream"]
|
||||
|
|
@ -68,7 +68,7 @@ agents-md-initial = ["async-nats/jetstream"]
|
|||
# Bare (no `kv`/`jetstream`) unless a consumer opts into the `kv` feature
|
||||
# above - the connect itself needs none of them.
|
||||
async-nats.workspace = true
|
||||
hive-sh4re = { workspace = true, optional = true }
|
||||
hive-types = { workspace = true, optional = true }
|
||||
# `blocking` on top of the workspace default (`form`/`json`/`rustls`) —
|
||||
# `mint_token_for_blocking` needs `reqwest::blocking::Client` for a caller
|
||||
# with no tokio reactor to `.await` an async request on (an OTLP exporter's
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
//! The per-agent permissions KV bucket: one key per agent, holding the
|
||||
//! [`hive_sh4re::permissions::Permission`] set the swarm grants it.
|
||||
//! [`hive_types::Permission`] set the swarm grants it.
|
||||
//!
|
||||
//! **swarm-controller is the only writer**, and creates the bucket when it
|
||||
//! starts. A missing key or an unset `permissions` field leaves the agent on
|
||||
|
|
@ -71,14 +71,14 @@ pub const IMPORT_REPLY_DEADLINE: std::time::Duration = std::time::Duration::from
|
|||
#[derive(Debug, Clone, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
|
||||
pub struct AgentPermissions {
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub permissions: Option<Vec<hive_sh4re::permissions::Permission>>,
|
||||
pub permissions: Option<Vec<hive_types::Permission>>,
|
||||
}
|
||||
|
||||
/// What a hive sends once: the permissions its meta repo held, by agent.
|
||||
#[cfg(feature = "agent-permissions")]
|
||||
#[derive(Debug, Clone, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
|
||||
pub struct Import {
|
||||
pub permissions: std::collections::BTreeMap<String, Vec<hive_sh4re::permissions::Permission>>,
|
||||
pub permissions: std::collections::BTreeMap<String, Vec<hive_types::Permission>>,
|
||||
}
|
||||
|
||||
/// The controller's answer to an [`Import`].
|
||||
|
|
@ -174,22 +174,22 @@ impl HiveCopy {
|
|||
/// What the agent holds before any read of its key has succeeded: the
|
||||
/// stored list, or the default when the hive stored none.
|
||||
#[must_use]
|
||||
pub fn before_read(&self) -> Vec<hive_sh4re::permissions::Permission> {
|
||||
pub fn before_read(&self) -> Vec<hive_types::Permission> {
|
||||
self.stored
|
||||
.permissions
|
||||
.clone()
|
||||
.unwrap_or_else(|| hive_sh4re::permissions::Permission::DEFAULT.to_vec())
|
||||
.unwrap_or_else(|| hive_types::Permission::DEFAULT.to_vec())
|
||||
}
|
||||
|
||||
/// What the agent holds after reading `read` from its key. An unset key
|
||||
/// while the import is pending may only mean the grant is not imported
|
||||
/// yet, so the stored list stands; otherwise unset is the default.
|
||||
#[must_use]
|
||||
pub fn after_read(&self, read: &AgentPermissions) -> Vec<hive_sh4re::permissions::Permission> {
|
||||
pub fn after_read(&self, read: &AgentPermissions) -> Vec<hive_types::Permission> {
|
||||
match &read.permissions {
|
||||
Some(list) => list.clone(),
|
||||
None if self.import_pending => self.before_read(),
|
||||
None => hive_sh4re::permissions::Permission::DEFAULT.to_vec(),
|
||||
None => hive_types::Permission::DEFAULT.to_vec(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -280,7 +280,7 @@ mod tests {
|
|||
#[cfg(feature = "agent-permissions")]
|
||||
#[test]
|
||||
fn unset_and_empty_are_different_values() {
|
||||
use hive_sh4re::permissions::Permission;
|
||||
use hive_types::Permission;
|
||||
assert_eq!(
|
||||
serde_json::to_string(&AgentPermissions::default()).unwrap(),
|
||||
"{}"
|
||||
|
|
@ -297,7 +297,7 @@ mod tests {
|
|||
#[cfg(feature = "agent-permissions")]
|
||||
#[test]
|
||||
fn the_hive_copy_stands_until_read_and_while_the_import_is_pending() {
|
||||
use hive_sh4re::permissions::Permission;
|
||||
use hive_types::Permission;
|
||||
let record = |json: &str| -> AgentPermissions { serde_json::from_str(json).unwrap() };
|
||||
let copy = |json: &str| -> HiveCopy { serde_json::from_str(json).unwrap() };
|
||||
let web = vec![Permission::WebTools];
|
||||
|
|
|
|||
Loading…
Reference in a new issue