Compare commits
	
		
			No commits in common. "e7917843bcce7d1e9cf259d5f18fd2bc9c453504" and "270dd49567d8c5ecafcf9d22551de0ffd5899221" have entirely different histories.
		
	
	
		
			e7917843bc
			...
			270dd49567
		
	
		
@ -1,6 +1,6 @@
 | 
				
			|||||||
use serde::{Deserialize, Serialize};
 | 
					use serde::{Deserialize, Serialize};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
 | 
					#[derive(Debug, Clone, Serialize, Deserialize)]
 | 
				
			||||||
pub struct Id {
 | 
					pub struct Id {
 | 
				
			||||||
    value: String,
 | 
					    value: String,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -7,12 +7,6 @@ use serde::Serialize;
 | 
				
			|||||||
use super::{IpAddress, LogicalHost};
 | 
					use super::{IpAddress, LogicalHost};
 | 
				
			||||||
use crate::executors::ExecutorError;
 | 
					use crate::executors::ExecutorError;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl std::fmt::Debug for dyn LoadBalancer {
 | 
					 | 
				
			||||||
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 | 
					 | 
				
			||||||
        f.write_fmt(format_args!("LoadBalancer {}", self.get_ip()))
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[async_trait]
 | 
					#[async_trait]
 | 
				
			||||||
pub trait LoadBalancer: Send + Sync {
 | 
					pub trait LoadBalancer: Send + Sync {
 | 
				
			||||||
    fn get_ip(&self) -> IpAddress;
 | 
					    fn get_ip(&self) -> IpAddress;
 | 
				
			||||||
@ -38,6 +32,11 @@ pub trait LoadBalancer: Send + Sync {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl std::fmt::Debug for dyn LoadBalancer {
 | 
				
			||||||
 | 
					    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 | 
				
			||||||
 | 
					        f.write_fmt(format_args!("LoadBalancer {}", self.get_ip()))
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
#[derive(Debug, PartialEq, Clone, Serialize)]
 | 
					#[derive(Debug, PartialEq, Clone, Serialize)]
 | 
				
			||||||
pub struct LoadBalancerService {
 | 
					pub struct LoadBalancerService {
 | 
				
			||||||
    pub backend_servers: Vec<BackendServer>,
 | 
					    pub backend_servers: Vec<BackendServer>,
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,6 @@ mod host_binding;
 | 
				
			|||||||
mod http;
 | 
					mod http;
 | 
				
			||||||
mod k8s_anywhere;
 | 
					mod k8s_anywhere;
 | 
				
			||||||
mod localhost;
 | 
					mod localhost;
 | 
				
			||||||
pub mod tenant;
 | 
					 | 
				
			||||||
pub use k8s_anywhere::*;
 | 
					pub use k8s_anywhere::*;
 | 
				
			||||||
pub use localhost::*;
 | 
					pub use localhost::*;
 | 
				
			||||||
pub mod k8s;
 | 
					pub mod k8s;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,46 +0,0 @@
 | 
				
			|||||||
use super::*;
 | 
					 | 
				
			||||||
use async_trait::async_trait;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
use crate::executors::ExecutorError;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[async_trait]
 | 
					 | 
				
			||||||
pub trait TenantManager: Send + Sync + std::fmt::Debug {
 | 
					 | 
				
			||||||
    /// Provisions a new tenant based on the provided configuration.
 | 
					 | 
				
			||||||
    /// This operation should be idempotent; if a tenant with the same `config.name`
 | 
					 | 
				
			||||||
    /// already exists and matches the config, it will succeed without changes.
 | 
					 | 
				
			||||||
    /// If it exists but differs, it will be updated, or return an error if the update
 | 
					 | 
				
			||||||
    /// action is not supported
 | 
					 | 
				
			||||||
    ///
 | 
					 | 
				
			||||||
    /// # Arguments
 | 
					 | 
				
			||||||
    /// * `config`: The desired configuration for the new tenant.
 | 
					 | 
				
			||||||
    async fn provision_tenant(&self, config: &TenantConfig) -> Result<(), ExecutorError>;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /// Updates the resource limits for an existing tenant.
 | 
					 | 
				
			||||||
    ///
 | 
					 | 
				
			||||||
    /// # Arguments
 | 
					 | 
				
			||||||
    /// * `tenant_name`: The logical name of the tenant to update.
 | 
					 | 
				
			||||||
    /// * `new_limits`: The new set of resource limits to apply.
 | 
					 | 
				
			||||||
    async fn update_tenant_resource_limits(
 | 
					 | 
				
			||||||
        &self,
 | 
					 | 
				
			||||||
        tenant_name: &str,
 | 
					 | 
				
			||||||
        new_limits: &ResourceLimits,
 | 
					 | 
				
			||||||
    ) -> Result<(), ExecutorError>;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /// Updates the high-level network isolation policy for an existing tenant.
 | 
					 | 
				
			||||||
    ///
 | 
					 | 
				
			||||||
    /// # Arguments
 | 
					 | 
				
			||||||
    /// * `tenant_name`: The logical name of the tenant to update.
 | 
					 | 
				
			||||||
    /// * `new_policy`: The new network policy to apply.
 | 
					 | 
				
			||||||
    async fn update_tenant_network_policy(
 | 
					 | 
				
			||||||
        &self,
 | 
					 | 
				
			||||||
        tenant_name: &str,
 | 
					 | 
				
			||||||
        new_policy: &TenantNetworkPolicy,
 | 
					 | 
				
			||||||
    ) -> Result<(), ExecutorError>;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /// Decommissions an existing tenant, removing its isolated context and associated resources.
 | 
					 | 
				
			||||||
    /// This operation should be idempotent.
 | 
					 | 
				
			||||||
    ///
 | 
					 | 
				
			||||||
    /// # Arguments
 | 
					 | 
				
			||||||
    /// * `tenant_name`: The logical name of the tenant to deprovision.
 | 
					 | 
				
			||||||
    async fn deprovision_tenant(&self, tenant_name: &str) -> Result<(), ExecutorError>;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,66 +0,0 @@
 | 
				
			|||||||
mod manager;
 | 
					 | 
				
			||||||
pub use manager::*;
 | 
					 | 
				
			||||||
use serde::{Deserialize, Serialize};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
use std::collections::HashMap;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
use crate::data::Id;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] // Assuming serde for Scores
 | 
					 | 
				
			||||||
pub struct TenantConfig {
 | 
					 | 
				
			||||||
    /// This will be used as the primary unique identifier for management operations and will never
 | 
					 | 
				
			||||||
    /// change for the entire lifetime of the tenant
 | 
					 | 
				
			||||||
    pub id: Id,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /// A human-readable name for the tenant (e.g., "client-alpha", "project-phoenix").
 | 
					 | 
				
			||||||
    pub name: String,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /// Desired resource allocations and limits for the tenant.
 | 
					 | 
				
			||||||
    pub resource_limits: ResourceLimits,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /// High-level network isolation policies for the tenant.
 | 
					 | 
				
			||||||
    pub network_policy: TenantNetworkPolicy,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /// Key-value pairs for provider-specific tagging, labeling, or metadata.
 | 
					 | 
				
			||||||
    /// Useful for billing, organization, or filtering within the provider's console.
 | 
					 | 
				
			||||||
    pub labels_or_tags: HashMap<String, String>,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
 | 
					 | 
				
			||||||
pub struct ResourceLimits {
 | 
					 | 
				
			||||||
    /// Requested/guaranteed CPU cores (e.g., 2.0).
 | 
					 | 
				
			||||||
    pub cpu_request_cores: Option<f32>,
 | 
					 | 
				
			||||||
    /// Maximum CPU cores the tenant can burst to (e.g., 4.0).
 | 
					 | 
				
			||||||
    pub cpu_limit_cores: Option<f32>,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /// Requested/guaranteed memory in Gigabytes (e.g., 8.0).
 | 
					 | 
				
			||||||
    pub memory_request_gb: Option<f32>,
 | 
					 | 
				
			||||||
    /// Maximum memory in Gigabytes tenant can burst to (e.g., 16.0).
 | 
					 | 
				
			||||||
    pub memory_limit_gb: Option<f32>,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /// Total persistent storage allocation in Gigabytes across all volumes.
 | 
					 | 
				
			||||||
    pub storage_total_gb: Option<f32>,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
 | 
					 | 
				
			||||||
pub struct TenantNetworkPolicy {
 | 
					 | 
				
			||||||
    /// Policy for ingress traffic originating from other tenants within the same Harmony-managed environment.
 | 
					 | 
				
			||||||
    pub default_inter_tenant_ingress: InterTenantIngressPolicy,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /// Policy for egress traffic destined for the public internet.
 | 
					 | 
				
			||||||
    pub default_internet_egress: InternetEgressPolicy,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
 | 
					 | 
				
			||||||
pub enum InterTenantIngressPolicy {
 | 
					 | 
				
			||||||
    /// Deny all traffic from other tenants by default.
 | 
					 | 
				
			||||||
    DenyAll,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
 | 
					 | 
				
			||||||
pub enum InternetEgressPolicy {
 | 
					 | 
				
			||||||
    /// Allow all outbound traffic to the internet.
 | 
					 | 
				
			||||||
    AllowAll,
 | 
					 | 
				
			||||||
    /// Deny all outbound traffic to the internet by default.
 | 
					 | 
				
			||||||
    DenyAll,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,9 +1,12 @@
 | 
				
			|||||||
use async_trait::async_trait;
 | 
					use async_trait::async_trait;
 | 
				
			||||||
use log::debug;
 | 
					use log::debug;
 | 
				
			||||||
 | 
					use non_blank_string_rs::NonBlankString;
 | 
				
			||||||
use serde::Serialize;
 | 
					use serde::Serialize;
 | 
				
			||||||
use std::collections::HashMap;
 | 
					use std::collections::HashMap;
 | 
				
			||||||
 | 
					use std::env::temp_dir;
 | 
				
			||||||
 | 
					use std::ffi::OsStr;
 | 
				
			||||||
use std::io::ErrorKind;
 | 
					use std::io::ErrorKind;
 | 
				
			||||||
use std::path::PathBuf;
 | 
					use std::path::{Path, PathBuf};
 | 
				
			||||||
use std::process::{Command, Output};
 | 
					use std::process::{Command, Output};
 | 
				
			||||||
use temp_dir::{self, TempDir};
 | 
					use temp_dir::{self, TempDir};
 | 
				
			||||||
use temp_file::TempFile;
 | 
					use temp_file::TempFile;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user