Skip to main content

ProductOSController

Struct ProductOSController 

Source
pub struct ProductOSController {
    pub on_presence_lost: Option<Arc<dyn Fn() + Send + Sync>>,
    /* private fields */
}
Expand description

Main controller for managing a distributed command and control system.

ProductOSController is the primary interface for coordinating multiple Product OS server instances. It handles node discovery, service management, secure communication, and workload distribution.

§Examples

use product_os_command_control::ProductOSController;
use product_os_command_control::CommandControl;
use product_os_security::certificates::Certificates;

let config = CommandControl::default();
let certs = Certificates::new_self_signed(
    vec![("CN".to_string(), "localhost".to_string())],
    None, None, None, None, None,
);

let controller = ProductOSController::new(
    config,
    certs,
    None,
    #[cfg(feature = "relational_store")]
    None,
);

Fields§

§on_presence_lost: Option<Arc<dyn Fn() + Send + Sync>>

Optional callback invoked when the node loses its presence on the remote registry. If None, std::process::exit(8) is called instead (the legacy behavior).

Implementations§

Source§

impl ProductOSController

Source

pub fn new( command_control: CommandControl, certificates: Certificates, key_value_store: Option<Arc<ProductOSKeyValueStore>>, ) -> Self

Creates a new ProductOSController instance.

Initializes the command and control system with the provided configuration, certificates, and optional data stores.

§Arguments
  • command_control - Command and control configuration
  • certificates - TLS/SSL certificates for secure communication
  • key_value_store - Optional key-value store for node registry persistence
  • relational_store - Optional relational database store (requires relational_store feature)
Source

pub fn get_registry(&self) -> &Registry

Returns a reference to the internal node registry.

The registry contains information about all known nodes in the cluster, including their capabilities, services, and features.

Source

pub async fn discover_nodes(&mut self)

Discovers remote nodes and adds their certificates to the trusted set.

Source

pub fn get_max_servers(&self) -> u8

Returns the maximum number of servers this controller manages.

Source

pub fn upsert_node_local(&mut self, identifier: String, node: Node)

Inserts or updates a node in the local registry.

Source

pub fn get_certificates(&self) -> Vec<&[u8]>

Returns the TLS certificate chain as a vector of byte slices.

Source

pub fn get_private_key(&self) -> &[u8]

Returns the TLS private key as a byte slice.

Source

pub fn get_certificates_and_private_key(&self) -> Certificates

Returns the full certificates and private key structure.

Source

pub fn validate_certificate(&self, certificate: &[u8]) -> bool

Validates that the given certificate matches one of the controller’s certificates.

Source

pub fn validate_verify_tag<T>( &self, query: Option<&BTreeMap<String, String>>, payload: Option<T>, headers: Option<&BTreeMap<String, String>>, verify_identifier: &str, verify_tag: &str, ) -> bool
where T: AsByteVector,

Validates a verification tag against the stored key for the given identifier.

Source

pub fn authenticate_command_control<T>( &self, query: Option<&BTreeMap<String, String>>, payload: Option<T>, headers: Option<&BTreeMap<String, String>>, verify_identifier: Option<&str>, verify_tag: Option<&str>, ) -> Result<bool, CommandControlAuthenticateError>
where T: AsByteVector,

Authenticates a command and control request using the verify identifier and tag.

Returns Ok(true) if authentication succeeds, or an error if the keys are invalid.

Source

pub fn search_and_prepare_command( &self, query: BTreeMap<&str, &str>, module: String, instruction: String, data: Option<Value>, ) -> Result<Command, ProductOSRequestError>

Searches for a node matching the query and prepares a command to send to it.

Source

pub fn find_and_prepare_command( &self, key: &str, manager: &str, instruction: String, data: Option<Value>, ) -> Result<Command, ProductOSRequestError>

Finds a node with a matching manager key/kind and prepares a command.

Source

pub fn find_any_and_prepare_command( &self, capability: &str, manager: &str, instruction: &str, data: Option<Value>, ) -> Result<Command, ProductOSRequestError>

Finds a node with a matching capability and prepares a command.

Source

pub async fn find_kind_and_prepare_command( &self, kind: &str, manager: &str, instruction: &str, data: Option<Value>, ) -> Result<Command, ProductOSRequestError>

👎Deprecated since 0.0.28:

Use find_kind_and_prepare_command_sync instead; this method is not actually async

Finds a node with a matching kind and prepares a command.

Note: despite the async signature, this method performs no asynchronous work. A non-async version is available as find_kind_and_prepare_command_sync.

Source

pub fn find_kind_and_prepare_command_sync( &self, kind: &str, manager: &str, instruction: &str, data: Option<Value>, ) -> Result<Command, ProductOSRequestError>

Finds a node with a matching kind and prepares a command (non-async).

Source

pub fn search_and_prepare_ask( &self, query: BTreeMap<&str, &str>, path: &str, data: Option<Value>, headers: BTreeMap<String, String>, params: BTreeMap<String, String>, method: Method, ) -> Result<Ask, ProductOSRequestError>

Searches for a node matching the query and prepares an HTTP request to send to it.

Source

pub async fn find_feature_and_ask( &self, feature: &str, path: &str, data: &Option<Value>, headers: &BTreeMap<String, String>, params: &BTreeMap<String, String>, method: &Method, ) -> Result<ProductOSResponse<BodyBytes>, ProductOSRequestError>

Finds a node with the specified feature and sends an HTTP request to it.

Source

pub fn find_feature_and_prepare_ask( &self, feature: &str, path: &str, data: Option<Value>, headers: BTreeMap<String, String>, params: BTreeMap<String, String>, method: Method, ) -> Result<Ask, ProductOSRequestError>

Finds a node with the specified feature and prepares an HTTP request to send to it.

Source

pub fn get_configuration(&self) -> CommandControl

Returns a clone of the command and control configuration.

Source

pub fn get_key(&self, identifier: &str) -> Option<Vec<u8>>

Returns the cryptographic key associated with the given node identifier.

Source

pub fn create_key_session(&mut self) -> (String, [u8; 32])

Creates a new Diffie-Hellman key session and returns the session ID and public key.

Source

pub fn generate_key( &mut self, session_identifier: &str, remote_public_key: &[u8], association: String, remote_session_identifier: Option<String>, )

Generates a shared key from a Diffie-Hellman exchange session.

Source

pub fn get_key_value_store(&mut self) -> Arc<ProductOSKeyValueStore>

Returns the key-value store.

Source

pub async fn add_feature( &mut self, feature: Arc<dyn Feature>, base_path: String, router: &mut ProductOSRouter, )

Registers a feature on the local node and updates the router.

Source

pub async fn add_feature_mut( &mut self, feature: Arc<Mutex<dyn Feature>>, base_path: String, router: &mut ProductOSRouter, )

Registers a mutable feature on the local node and updates the router.

Source

pub async fn remove_feature(&mut self, identifier: &str)

Removes a feature from the local node.

Source

pub async fn add_service(&mut self, service: Arc<dyn Service>)

Registers a service on the local node.

Source

pub async fn add_service_mut(&mut self, service: Arc<Mutex<dyn Service>>)

Registers a mutable service on the local node.

Source

pub async fn set_service_active(&mut self, identifier: String, status: bool)

Sets the active status of a service on the local node.

Source

pub async fn remove_service(&mut self, identifier: &str)

Removes a service from the local node.

Source

pub async fn remove_inactive_services(&mut self, query: BTreeMap<&str, &str>)

Removes all inactive services matching the query.

Source

pub async fn start_services(&mut self) -> Result<(), ()>

Starts all registered services on the local node.

Source

pub async fn start_service(&mut self, identifier: &str) -> Result<(), ()>

Starts the service with the given identifier.

Source

pub async fn stop_service(&mut self, identifier: &str) -> Result<(), ()>

Stops the service with the given identifier.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more